void FilterApiTest::testFaceInterpretationFilter() { // Input data to feed to the filter TimedXyzData inputData[] = { TimedXyzData( 0, 0, 0,-981), TimedXyzData(1000000, 0, 0, 981), TimedXyzData(2000000, 0, 0,-981), TimedXyzData(2100000, 0, 0, 981), TimedXyzData(2200000, 0, 0,-981) }; // Expected output data PoseData expectedResult[] = { PoseData( 0, PoseData::FaceUp), PoseData(1000000, PoseData::FaceDown), PoseData(2000000, PoseData::FaceUp), }; int numInputs = (sizeof(inputData) / sizeof(TimedXyzData)); int numOutputs = (sizeof(expectedResult) / sizeof(PoseData)); FilterBase* faceInterpreterFilter = OrientationInterpreter::factoryMethod(); Bin filterBin; DummyAdaptor<TimedXyzData> dummyAdaptor; RingBuffer<PoseData> outputBuffer(10); filterBin.add(&dummyAdaptor, "adapter"); filterBin.add(faceInterpreterFilter, "filter"); filterBin.add(&outputBuffer, "buffer"); filterBin.join("adapter", "source", "filter", "accsink"); filterBin.join("filter", "face", "buffer", "sink"); DummyDataEmitter<PoseData> dbusEmitter; Bin marshallingBin; marshallingBin.add(&dbusEmitter, "testdataemitter"); outputBuffer.join(&dbusEmitter); // Setup data dummyAdaptor.setTestData(numInputs, inputData); dbusEmitter.setExpectedData(numOutputs, expectedResult); marshallingBin.start(); filterBin.start(); for (int j=1; j < numInputs; j++){ dummyAdaptor.pushNewData(); } filterBin.stop(); marshallingBin.stop(); QVERIFY2(numOutputs == dbusEmitter.numSamplesReceived(), "Too many/few outputs from filter."); delete faceInterpreterFilter; }
//-------------------------------------------------------------------------------------------------- void initialiseTestPositions() { // Set up positions so that the high resolution camera can be calibrated gHighResCalibrationPositions.clear(); gHighResCalibrationPositions.push_back( PoseData( cv::Vec3d( 0.0, 0.1, 0.8 ), cv::Vec3d( 0.0, Utilities::degToRad( 180.0 ), 0.0 ) ) ); // Rotate around X gHighResCalibrationPositions.push_back( PoseData( cv::Vec3d( 0.0, 0.1, 0.8 ), cv::Vec3d( 0.0, Utilities::degToRad( 140.0 ), 0.0 ) ) ); gHighResCalibrationPositions.push_back( PoseData( cv::Vec3d( 0.0, 0.1, 0.8 ), cv::Vec3d( 0.0, Utilities::degToRad( 220.0 ), 0.0 ) ) ); // Rotate around Y gHighResCalibrationPositions.push_back( PoseData( cv::Vec3d( 0.0, 0.1, 0.8 ), cv::Vec3d( Utilities::degToRad( -40.0 ), Utilities::degToRad( 180.0 ), 0.0 ) ) ); gHighResCalibrationPositions.push_back( PoseData( cv::Vec3d( 0.0, 0.1, 0.8 ), cv::Vec3d( Utilities::degToRad( 40.0 ), Utilities::degToRad( 180.0 ), 0.0 ) ) ); // Rotate around Z gHighResCalibrationPositions.push_back( PoseData( cv::Vec3d( 0.0, 0.1, 0.8 ), cv::Vec3d( 0.0, Utilities::degToRad( 180.0 ), Utilities::degToRad( -40.0 ) ) ) ); gHighResCalibrationPositions.push_back( PoseData( cv::Vec3d( 0.0, 0.1, 0.8 ), cv::Vec3d( 0.0, Utilities::degToRad( 180.0 ), Utilities::degToRad( 40.0 ) ) ) ); // Set up positions so that the relative camera poses can be found gRelativeCalibrationPositions.clear(); gRelativeCalibrationPositions.push_back( PoseData( cv::Vec3d( 0.0, 0.1, 0.8 ), cv::Vec3d( 0.0, Utilities::degToRad( 180.0 ), 0.0 ) ) ); // Rotate around X gRelativeCalibrationPositions.push_back( PoseData( cv::Vec3d( 0.0, 0.1, 0.7 ), cv::Vec3d( 0.0, Utilities::degToRad( 140.0 ), 0.0 ) ) ); gRelativeCalibrationPositions.push_back( PoseData( cv::Vec3d( 0.0, 0.1, 0.9 ), cv::Vec3d( 0.0, Utilities::degToRad( 220.0 ), 0.0 ) ) ); // Rotate around Y gRelativeCalibrationPositions.push_back( PoseData( cv::Vec3d( 0.0, 0.1, 0.8 ), cv::Vec3d( Utilities::degToRad( -40.0 ), Utilities::degToRad( 180.0 ), 0.0 ) ) ); gRelativeCalibrationPositions.push_back( PoseData( cv::Vec3d( 0.0, 0.1, 0.7 ), cv::Vec3d( Utilities::degToRad( 40.0 ), Utilities::degToRad( 180.0 ), 0.0 ) ) ); // Rotate around Z gRelativeCalibrationPositions.push_back( PoseData( cv::Vec3d( 0.0, 0.1, 0.8 ), cv::Vec3d( 0.0, Utilities::degToRad( 180.0 ), Utilities::degToRad( -40.0 ) ) ) ); gRelativeCalibrationPositions.push_back( PoseData( cv::Vec3d( 0.0, 0.1, 0.9 ), cv::Vec3d( 0.0, Utilities::degToRad( 180.0 ), Utilities::degToRad( 40.0 ) ) ) ); }
void FilterApiTest::testOrientationInterpretationFilter() { // Input data to feed to the filter TimedXyzData inputData[] = { TimedXyzData( 0,-981, 0, 0), TimedXyzData(1000000, 981, 0, 0), TimedXyzData(2000000, 0,-981, 0), TimedXyzData(3000000, 0, 981, 0), TimedXyzData(4000000, 0, 0, -981), TimedXyzData(5000000, 0, 0, 981) }; // Expected output data PoseData expectedResult[] = { PoseData( 0, PoseData::RightUp), PoseData(1000000, PoseData::LeftUp), PoseData(2000000, PoseData::BottomDown), PoseData(3000000, PoseData::BottomUp), PoseData(4000000, PoseData::FaceUp), PoseData(5000000, PoseData::FaceDown) }; QVERIFY2((sizeof(inputData) / sizeof(TimedXyzData)) == (sizeof(expectedResult) / sizeof(PoseData)), "Test function error: Input and output count does not match."); int numInputs = (sizeof(inputData) / sizeof(TimedXyzData)); // Build data pipeline Bin filterBin; DummyAdaptor<TimedXyzData> dummyAdaptor; FilterBase* orientationInterpreterFilter = OrientationInterpreter::factoryMethod(); RingBuffer<PoseData> outputBuffer(10); filterBin.add(&dummyAdaptor, "adapter"); filterBin.add(orientationInterpreterFilter, "orientationfilter"); filterBin.add(&outputBuffer, "buffer"); filterBin.join("adapter", "source", "orientationfilter", "accsink"); filterBin.join("orientationfilter", "orientation", "buffer", "sink"); DummyDataEmitter<PoseData> dbusEmitter; Bin marshallingBin; marshallingBin.add(&dbusEmitter, "testdataemitter"); outputBuffer.join(&dbusEmitter); // Setup data dummyAdaptor.setTestData(numInputs, inputData); dbusEmitter.setExpectedData(numInputs, expectedResult); marshallingBin.start(); filterBin.start(); // Start sends data once, so start from index 1. for (int i = 0; i < numInputs; ++i) { dummyAdaptor.pushNewData(); } filterBin.stop(); marshallingBin.stop(); QCOMPARE (dummyAdaptor.getDataCount(), dbusEmitter.numSamplesReceived()); delete orientationInterpreterFilter; }