diff --git a/Modules/IGT/IGTFilters/mitkNavigationDataHandEyeCalibrationFilter.cpp b/Modules/IGT/IGTFilters/mitkNavigationDataHandEyeCalibrationFilter.cpp new file mode 100644 index 0000000000..cc0f37c365 --- /dev/null +++ b/Modules/IGT/IGTFilters/mitkNavigationDataHandEyeCalibrationFilter.cpp @@ -0,0 +1,92 @@ +/*========================================================================= + +Program: Medical Imaging & Interaction Toolkit +Language: C++ +Date: $Date: $ +Version: $Revision: $ + +Copyright (c) German Cancer Research Center, Division of Medical and +Biological Informatics. All rights reserved. +See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. + +This software is distributed WITHOUT ANY WARRANTY; without even +the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#include "mitkNavigationDataHandEyeCalibrationFilter.h" + +#include "mitkDataStorage.h" + + +mitk::NavigationDataHandEyeCalibrationFilter::NavigationDataHandEyeCalibrationFilter() +: NavigationDataToNavigationDataFilter(), +m_ObjectsToTransform(),m_HandEyeTransformations() +{ +} + + +mitk::NavigationDataHandEyeCalibrationFilter::~NavigationDataHandEyeCalibrationFilter() +{ + m_ObjectsToTransform.clear(); + m_HandEyeTransformations.clear(); +} + +void mitk::NavigationDataHandEyeCalibrationFilter::SetObjectToTransform(unsigned int index, BaseData* data) +{ + m_ObjectsToTransform[index] = data; +} + +void mitk::NavigationDataHandEyeCalibrationFilter::SetHandEyeTransformation(unsigned int index, QuaternionRigidTransformType::Pointer handEyeTransformation) +{ + m_HandEyeTransformations[index] = handEyeTransformation; +} + +void mitk::NavigationDataHandEyeCalibrationFilter::GenerateData() +{ + /*get each input, lookup the associated BaseData and transfer the data*/ + unsigned int numberOfInputs = this->GetNumberOfInputs(); + for (unsigned int index=0; index < numberOfInputs; index++) + { + //get the needed variables + const mitk::NavigationData* nd = this->GetInput(index); + assert(nd); + + mitk::NavigationData* output = this->GetOutput(index); + assert(output); + + //check if the data is valid + if (!nd->IsDataValid()) + { + output->SetDataValid(false); + continue; + } + output->Graft(nd); // copy all information from input to output + // get the object to transform for current input index + mitk::BaseData::Pointer objectToTransform = m_ObjectsToTransform[index]; + if (!objectToTransform) + { + continue; + } + // get the transformation of the hand-eye calibration for current input index + QuaternionRigidTransformType::Pointer handEyeTransform = m_HandEyeTransformations[index]; + if (!handEyeTransform) + { + continue; + } + // get the transformation of the current navigation data + QuaternionRigidTransformType::Pointer ndTransform = QuaternionRigidTransformType::New(); + ndTransform->SetRotation(nd->GetOrientation()); + ndTransform->SetOffset(nd->GetPosition().GetVectorFromOrigin()); + // compose hand-eye transformation and transformation of NavigationData to final transformation to be applied + mitk::AffineTransform3D::Pointer transform = mitk::AffineTransform3D::New(); + transform->SetIdentity(); + transform->Compose(handEyeTransform); + transform->Compose(ndTransform); + // apply final transformation to BaseData + objectToTransform->GetGeometry()->SetIndexToWorldTransform(transform); + objectToTransform->Modified(); + // operation was successful, therefore data of output is valid. + output->SetDataValid(true); + } +} diff --git a/Modules/IGT/IGTFilters/mitkNavigationDataHandEyeCalibrationFilter.h b/Modules/IGT/IGTFilters/mitkNavigationDataHandEyeCalibrationFilter.h new file mode 100644 index 0000000000..4c0511ba77 --- /dev/null +++ b/Modules/IGT/IGTFilters/mitkNavigationDataHandEyeCalibrationFilter.h @@ -0,0 +1,95 @@ +/*========================================================================= + +Program: Medical Imaging & Interaction Toolkit +Language: C++ +Date: $Date: $ +Version: $Revision: $ + +Copyright (c) German Cancer Research Center, Division of Medical and +Biological Informatics. All rights reserved. +See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. + +This software is distributed WITHOUT ANY WARRANTY; without even +the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ + + +#ifndef MITKNavigationDataHandEyeCalibrationFilter_H_HEADER_INCLUDED_ +#define MITKNavigationDataHandEyeCalibrationFilter_H_HEADER_INCLUDED_ + +#include "mitkNavigationDataToNavigationDataFilter.h" +#include "mitkNavigationData.h" +#include "mitkBaseData.h" +#include "itkQuaternionRigidTransform.h" + +namespace mitk { + + /** + * \brief IGT filter applying a Hand-Eye transformation to a given BaseData according to the current NavigationDataTransformation. + * The resulting BaseData is then given in tracking coordinates. + * + * Inputs: NavigationData(s), object(s) to transform (BaseData), hand-eye transformation (itk::QuaternionRigidTransform) + * + * Derived from NavigationDataToNavigationDataFilter + * + * \ingroup IGT + */ + class MitkIGT_EXPORT NavigationDataHandEyeCalibrationFilter : public NavigationDataToNavigationDataFilter + { + public: + mitkClassMacro(NavigationDataHandEyeCalibrationFilter, NavigationDataToNavigationDataFilter); + + itkNewMacro(Self); + + /*! + \brief transformation type for itk::QuaternionRigidTransforms + */ + typedef itk::QuaternionRigidTransform QuaternionRigidTransformType; + /** + * \brief Set the object that will be transformed to tracking coordinates using the current NavigationData + * and the given transformation of the HandEyeCalibration + * + * \param index index corresponding to the NavigationData and hand-eye transformation to be applied to this BaseData + * \param data BaseData to be associated to the index + */ + void SetObjectToTransform(unsigned int index, BaseData* data); + + /** + * \brief Set the transformation of the HandEyeCalibration that should be applied to the BaseData + * with the current transformation of the Navigation Data + * + * \param index index corresponding to the NavigationData applied with this hand-eye transformation + * \param handEyeTransform transformation of a previously performed hand-eye calibration corresponding to the NavigationData + * at index + */ + void SetHandEyeTransformation(unsigned int index, QuaternionRigidTransformType::Pointer handEyeTransform); + /* + * \brief Transfer the information from the input to the associated BaseData + */ + virtual void GenerateData(); + + + protected: + /** + * \brief Constructor + **/ + NavigationDataHandEyeCalibrationFilter(); + + /** + * \brief Destructor + **/ + ~NavigationDataHandEyeCalibrationFilter(); + + /** + * \brief Map of the BaseDatas that should be transformed. + */ + std::map m_ObjectsToTransform; + /** + * \brief Map of the hand-eye transformations that should be applied to the BaseDatas + */ + std::map m_HandEyeTransformations; + }; +} // namespace mitk +#endif /* MITKNavigationDataHandEyeCalibrationFilter_H_HEADER_INCLUDED_ */ diff --git a/Modules/IGT/files.cmake b/Modules/IGT/files.cmake index a48bc06c54..49d577cb33 100644 --- a/Modules/IGT/files.cmake +++ b/Modules/IGT/files.cmake @@ -1,59 +1,60 @@ SET(CPP_FILES IGTFilters/mitkNavigationDataLandmarkTransformFilter.cpp IGTFilters/mitkNavigationDataReferenceTransformFilter.cpp IGTFilters/mitkNavigationDataTransformFilter.cpp IGTFilters/mitkNavigationDataRecorder.cpp IGTFilters/mitkNavigationDataPlayer.cpp IGTFilters/mitkNavigationDataPlayerBase.cpp IGTFilters/mitkNavigationDataObjectVisualizationFilter.cpp IGTFilters/mitkCameraVisualization.cpp IGTFilters/mitkNavigationData.cpp IGTFilters/mitkNavigationDataDisplacementFilter.cpp IGTFilters/mitkNavigationDataSequentialPlayer.cpp IGTFilters/mitkNavigationDataSource.cpp IGTFilters/mitkNavigationDataToMessageFilter.cpp IGTFilters/mitkNavigationDataToNavigationDataFilter.cpp IGTFilters/mitkNavigationDataToOpenGLFilter.cpp IGTFilters/mitkNavigationDataToPointSetFilter.cpp + IGTFilters/mitkNavigationDataHandEyeCalibrationFilter.cpp IGTFilters/mitkTrackingDeviceSource.cpp IGTFilters/mitkTrackingVolumeGenerator.cpp IGTFilters/mitkTimeStamp.cpp IGTFilters/mitkRealTimeClock.cpp IGTFilters/mitkTrackingDeviceSourceConfigurator.cpp IGTTrackingDevices/mitkClaronTool.cpp IGTTrackingDevices/mitkClaronTrackingDevice.cpp IGTTrackingDevices/mitkInternalTrackingTool.cpp IGTTrackingDevices/mitkNDIPassiveTool.cpp IGTTrackingDevices/mitkNDIProtocol.cpp IGTTrackingDevices/mitkNDITrackingDevice.cpp IGTTrackingDevices/mitkSerialCommunication.cpp IGTTrackingDevices/mitkTrackingDevice.cpp IGTTrackingDevices/mitkTrackingTool.cpp IGTTrackingDevices/mitkVirtualTrackingDevice.cpp IGTTrackingDevices/mitkVirtualTrackingTool.cpp IGTToolManagement/mitkNavigationToolStorage.cpp IGTToolManagement/mitkNavigationToolStorageSerializer.cpp IGTToolManagement/mitkNavigationToolStorageDeserializer.cpp IGTToolManagement/mitkNavigationTool.cpp IGTToolManagement/mitkNavigationToolReader.cpp IGTToolManagement/mitkNavigationToolWriter.cpp ) IF(MITK_USE_MICRON_TRACKER) SET(CPP_FILES ${CPP_FILES} IGTTrackingDevices/mitkClaronInterface.cpp) ELSE() SET(CPP_FILES ${CPP_FILES} IGTTrackingDevices/mitkClaronInterfaceStub.cpp) ENDIF(MITK_USE_MICRON_TRACKER) IF(MITK_USE_MICROBIRD_TRACKER) SET(CPP_FILES ${CPP_FILES} IGTTrackingDevices/mitkMicroBirdTrackingDevice.cpp) ENDIF(MITK_USE_MICROBIRD_TRACKER) IF(WIN32) SET(CPP_FILES ${CPP_FILES} IGTFilters/mitkWindowsRealTimeClock.cpp) ELSE() SET(CPP_FILES ${CPP_FILES} IGTFilters/mitkLinuxRealTimeClock.cpp) ENDIF(WIN32)