16#include <berryISelectionService.h>
17#include <berryIWorkbenchWindow.h>
37#include <vtkSphereSource.h>
50 m_Controls.m_RegistrationLandmarkWidget->SetPointSetNode(
nullptr);
51 m_Controls.m_CalibrationLandmarkWidget->SetPointSetNode(
nullptr);
68 if (index == 0 || index == 3) {
79 m_Controls.m_CalibrationMethodsWidget->setCurrentIndex(index);
121 m_PivotPoses = std::vector<mitk::NavigationData::Pointer>();
144 mitk::NavigationData::Pointer ToolTipTransform = mitk::NavigationData::New();
146 if (
m_Controls.m_CalibratePosition->isChecked())
160 this->
m_Controls.m_ResultOfCalibration->setText(
169 if (
m_Controls.m_CalibrateOrientation->isChecked())
172 mitk::Quaternion meanOrientation;
173 std::vector <mitk::Quaternion> allOrientations = std::vector <mitk::Quaternion>();
176 this->
m_Controls.m_ResultOfCalibrationOrientation->setText(
177 QString(
"qx: ") + QString(QString::number(meanOrientation.x(), 103, 3)) +
178 QString(
"; qy: ") + (QString::number(meanOrientation.y(), 103, 3)) +
179 QString(
"; qz: ") + (QString::number(meanOrientation.z(), 103, 3)) +
180 QString(
"; qr: ") + (QString::number(meanOrientation.r(), 103, 3)));
182 ToolTipTransform->SetOrientation(meanOrientation);
185 MITK_INFO <<
"Computed calibration: ";
186 MITK_INFO <<
"Translation Vector: " << ToolTipTransform->GetPosition();
187 MITK_INFO <<
"Quaternion: (" << ToolTipTransform->GetOrientation() <<
")";
188 MITK_INFO <<
"Euler Angles [rad]: (" << ToolTipTransform->GetOrientation().rotation_euler_angles() <<
")";
189 MITK_INFO <<
"Matrix:";
190 vnl_matrix_fixed<double, 3, 3> rotMatrix = ToolTipTransform->GetOrientation().rotation_matrix_transpose();
191 MITK_INFO << rotMatrix[0][0] <<
" " << rotMatrix[0][1] <<
" " << rotMatrix[0][2] << std::endl;
192 MITK_INFO << rotMatrix[1][0] <<
" " << rotMatrix[1][1] <<
" " << rotMatrix[1][2] << std::endl;
193 MITK_INFO << rotMatrix[2][0] <<
" " << rotMatrix[2][1] <<
" " << rotMatrix[2][2] << std::endl;
196 mitk::NavigationData::Pointer ToolTipInTrackingCoordinates = mitk::NavigationData::New();
197 ToolTipInTrackingCoordinates->Compose(ToolTipTransform);
200 m_Controls.m_SetNewToolTipPosButton->setEnabled(
true);
215 m_Controls.m_CollectNavigationDataButton->setEnabled(
false);
228 m_Controls.m_CollectionStatus->setText(labelText);
235 mitk::NavigationData::Pointer differenceND = mitk::NavigationData::New();
236 differenceND->Compose(referenceTool);
237 differenceND->Compose(toolToCalibrate->GetInverse());
240 if (
m_Controls.m_InvertQuaternions->isChecked())
243 differenceND = differenceND->GetInverse();
256 m_Controls.m_CollectNavigationDataButton->setEnabled(
true);
257 m_Controls.m_RunCalibrationButton->setEnabled(
true);
260 m_Controls.m_CollectionStatus->setText(labelText);
272 mitk::NavigationData::Pointer tempND = mitk::NavigationData::New();
292 mitk::NavigationData::Pointer currentPose = mitk::NavigationData::New();
307 mitk::PivotCalibration::Pointer myPivotCalibration = mitk::PivotCalibration::New();
308 for (std::size_t i = 0; i < this->
m_PivotPoses.size(); i++)
310 myPivotCalibration->AddNavigationData(
m_PivotPoses.at(i));
312 QString resultString;
313 if (myPivotCalibration->ComputePivotResult())
315 mitk::NavigationData::Pointer markerTransformationTrackingCoordinates =
m_PivotPoses.at(0);
319 mitk::NavigationData::Pointer ToolTipToTool = mitk::NavigationData::New();
320 ToolTipToTool->SetPosition(myPivotCalibration->GetResultPivotPoint());
321 ToolTipToTool->SetOrientation(mitk::Quaternion(0,0,0,1));
322 mitk::NavigationData::Pointer TrackerToTool = mitk::NavigationData::New();
323 TrackerToTool->SetOrientation(markerTransformationTrackingCoordinates->GetOrientation());
324 TrackerToTool->SetPosition(markerTransformationTrackingCoordinates->GetPosition());
325 TrackerToTool->Compose(ToolTipToTool);
328 mitk::NavigationData::Pointer ToolTipToTracker = mitk::NavigationData::New();
329 ToolTipToTracker->Compose(ToolTipToTool);
330 ToolTipToTracker->Compose(markerTransformationTrackingCoordinates);
336 resultString = QString(
"Pivot computation succeeded!\n")
337 + QString(
"RMS Error: ") + QString::number(myPivotCalibration->GetResultRMSError()) + QString(
"\n")
338 + QString(
"Pivot Point: ") + QString::number(myPivotCalibration->GetResultPivotPoint()[0]) +
";" + QString::number(myPivotCalibration->GetResultPivotPoint()[1]) +
";" + QString::number(myPivotCalibration->GetResultPivotPoint()[2]) + QString(
"\n");
345 m_Controls.m_UseComputedPivotPoint->setEnabled(
true);
349 resultString =
"Pivot computation failed!";
351 MITK_INFO << resultString.toStdString().c_str();
352 m_Controls.m_ResultText->setText(resultString);
368 QString resultString = QString(
"Pivoted tool tip transformation was written to the tool ") +
m_ToolToCalibrate->GetToolName().c_str();
370 m_Controls.m_ResultText->setText(resultString);
379 m_ToolToCalibrate->SetToolTipPosition(ToolTipTransformInToolCoordinates->GetPosition());
380 m_ToolToCalibrate->SetToolAxisOrientation(ToolTipTransformInToolCoordinates->GetOrientation());
383 mitk::TrackingDeviceSource::Pointer trackingDeviceSource;
387 mitk::TrackingTool::Pointer TrackingToolToCalibrate = trackingDeviceSource->GetTrackingDevice()->GetTool(
m_IDToolToCalibrate);
388 TrackingToolToCalibrate->SetToolTipPosition(ToolTipTransformInToolCoordinates->GetPosition(), ToolTipTransformInToolCoordinates->GetOrientation());
390 catch (std::exception& e)
392 MITK_ERROR <<
"Error while trying to set the tool tip to the running tracking device. Aborting! (" << e.what() <<
")";
394 MITK_INFO << message;
406 mitk::Surface::Pointer mySphere = mitk::Surface::New();
408 vtkData->SetRadius(3.0f);
409 vtkData->SetCenter(0.0, 0.0, 0.0);
411 mySphere->SetVtkPolyData(vtkData->GetOutput());
416 m_ToolTipPointPreview->GetData()->GetGeometry()->SetIndexToWorldTransform(ToolTipInTrackingCoordinates->GetAffineTransform3D());
427 std::stringstream translation;
428 std::stringstream orientation;
430 orientation <<
"Quaternion: (" <<
m_ToolToCalibrate->GetToolAxisOrientation() <<
")" << std::endl;
431 orientation << std::endl;
432 orientation <<
"Euler Angles [rad]: (" <<
m_ToolToCalibrate->GetToolAxisOrientation().rotation_euler_angles() <<
")" << std::endl;
433 orientation << std::endl;
434 orientation <<
"Matrix:" << std::endl;
435 vnl_matrix_fixed<double, 3, 3> rotMatrix =
m_ToolToCalibrate->GetToolAxisOrientation().rotation_matrix_transpose();
436 orientation << rotMatrix[0][0] <<
" " << rotMatrix[0][1] <<
" " << rotMatrix[0][2] << std::endl;
437 orientation << rotMatrix[1][0] <<
" " << rotMatrix[1][1] <<
" " << rotMatrix[1][2] << std::endl;
438 orientation << rotMatrix[2][0] <<
" " << rotMatrix[2][1] <<
" " << rotMatrix[2][2] << std::endl;
439 m_Controls.m_ManualCurrentTranslation->setText(translation.str().c_str());
440 m_Controls.m_ManualCurrentOrientation->setPlainText(orientation.str().c_str());
460 mitk::NavigationData::Pointer tempND = mitk::NavigationData::New(toolTip);
461 QString resultString = QString(
"Manual edited values are written to ") +
m_ToolToCalibrate->GetToolName().c_str();
463 m_Controls.m_ResultText->setText(resultString);
484 MITK_DEBUG <<
"Positions for tool axis calibration:";
492 m_Controls.m_ToolAxisPositionLabel->setText(_label);
499 MITK_ERROR <<
"Please compute tool tip first.";
500 QMessageBox::information(
nullptr,
"Error",
"Please compute / specify tool tip first");
505 MITK_ERROR <<
"Please record position first.";
506 QMessageBox::information(
nullptr,
"Error",
"Please record position first");
532 QString calibratedToolAxisString =
"Tool Axis: " + QString::number(
m_CalibratedToolAxis.GetElement(0),
'f', 3) +
", " +
534 m_Controls.m_ToolAxisCalibrationLabel->setText(calibratedToolAxisString);
568 m_Controls.m_StatusWidgetToolToCalibrate->RemoveStatusLabels();
577 m_Controls.m_StatusWidgetToolToCalibrate->RemoveStatusLabels();
578 m_Controls.m_StatusWidgetToolToCalibrate->SetShowPositions(
true);
579 m_Controls.m_StatusWidgetToolToCalibrate->SetTextAlignment(Qt::AlignLeft);
581 m_Controls.m_StatusWidgetToolToCalibrate->ShowStatusLabels();
585 mitk::Surface::Pointer ToolSurface =
dynamic_cast<mitk::Surface*
>(
m_ToolToCalibrate->GetDataNode()->GetData())->Clone();
612 m_Controls.m_StatusWidgetCalibrationPointer->RemoveStatusLabels();
620 m_Controls.m_StatusWidgetCalibrationPointer->RemoveStatusLabels();
621 m_Controls.m_StatusWidgetCalibrationPointer->SetShowPositions(
true);
622 m_Controls.m_StatusWidgetCalibrationPointer->SetTextAlignment(Qt::AlignLeft);
624 m_Controls.m_StatusWidgetCalibrationPointer->ShowStatusLabels();
639 if (referenceToolND->IsDataValid() && toolToCalibrateND->IsDataValid())
643 mitk::NavigationData::Pointer differenceND = mitk::NavigationData::New();
644 differenceND->Compose(referenceToolND);
645 differenceND->Compose(toolToCalibrateND->GetInverse());
649 QString(
"x: ") + QString(QString::number(differenceND->GetPosition()[0], 103, 3)) +
650 QString(
"; y: ") + (QString::number(differenceND->GetPosition()[1], 103, 3)) +
651 QString(
"; z: ") + (QString::number(differenceND->GetPosition()[2], 103, 3)));
653 m_Controls.m_OrientationOffsetCoordinates->setText(
654 QString(
"qx: ") + QString(QString::number(differenceND->GetOrientation().x(), 103, 3)) +
655 QString(
"; qy: ") + (QString::number(differenceND->GetOrientation().y(), 103, 3)) +
656 QString(
"; qz: ") + (QString::number(differenceND->GetOrientation().z(), 103, 3)) +
657 QString(
"; qr: ") + (QString::number(differenceND->GetOrientation().r(), 103, 3)));
662 mitk::NavigationData::Pointer ToolTipTransform = mitk::NavigationData::New();
664 mitk::NavigationData::Pointer ToolTipInTrackingCoordinates = mitk::NavigationData::New();
666 ToolTipInTrackingCoordinates->Compose(ToolTipTransform);
667 m_ToolTipPointPreview->GetData()->GetGeometry()->SetIndexToWorldTransform(ToolTipInTrackingCoordinates->GetAffineTransform3D());
674 m_Controls.m_StatusWidgetToolToCalibrate->Refresh();
675 m_Controls.m_StatusWidgetCalibrationPointer->Refresh();
693 itk::Vector<double, 3> translation;
694 for (
int k = 0; k < 3; k++) translation[k] = navDataTool->GetPosition()[k];
695 itk::Matrix<double, 3, 3> rotation;
696 for (
int k = 0; k < 3; k++)
for (
int l = 0; l < 3; l++) rotation[k][l] = navDataTool->GetOrientation().rotation_matrix_transpose()[k][l];
697 rotation = rotation.GetTranspose();
698 itk::Vector<double> landmarkItk;
699 landmarkItk[0] = landmark[0];
700 landmarkItk[1] = landmark[1];
701 landmarkItk[2] = landmark[2];
704 itk::Matrix<double, 3, 3> rotationInverse;
705 for (
int k = 0; k < 3; k++)
for (
int l = 0; l < 3; l++) rotationInverse[k][l] = rotation.GetInverse()[k][l];
706 landmarkItk = rotationInverse * (landmarkItk - translation);
709 landmark[0] = landmarkItk[0];
710 landmark[1] = landmarkItk[1];
711 landmark[2] = landmarkItk[2];
722 mitk::NavigationToolWriter::Pointer myWriter = mitk::NavigationToolWriter::New();
723 QString filename = QFileDialog::getSaveFileName(
nullptr,tr(
"Save Navigation Tool"),
"/",
"*.IGTTool");
724 if (filename.isEmpty())
return;
727 QFileInfo file(filename);
728 if (file.suffix().isEmpty())
730 filename +=
".IGTTool";
733 if (myWriter->DoWrite(filename.toStdString(), calibratedTool)) MITK_INFO <<
"Saved calibrated tool to file " << filename;
734 else MITK_WARN <<
"Can't write tool to file " << filename;
738 MITK_ERROR <<
"Did not find navigation tool storage of calibrated tool, aborting!";
745 ((CalibrationPointerRequired) &&
751 msgBox.setText(
"Tool to calibrate and/or calibration pointer not initialized, cannot proceed!");
755 else {
return true; }
static mitk::Quaternion CalcAverage(const std::vector< Quaternion > &quaternions, Mode mode=SimpleMean)
Connects a mitk::TrackingDevice to a MITK-IGT NavigationData-Filterpipeline.