132 enum class PivotState { Idle, WaitingForStart, Collecting, Done };
134 void startPivotCalibration();
135 void cancelPivotCalibration();
151 void setTrackerToDeviceOffset(
const QVector3D& translation,
152 const QQuaternion& rotation);
186 void clearOpticalCalibSamples();
198 bool captureObjectiveCenter();
204 void clearObjectiveCenter();
217 bool solveOpticalCalibration();
258 bool applyOpticalAxisFineAdjust(
const QVector3D& targetWorldPos,
259 float& correctionDeg);
268 void clearOpticalFineAdjust();
277 bool opticalRayInWorld(QVector3D& origin, QVector3D& direction)
const;
288 bool opticalUpInWorld(QVector3D& up)
const;
307 bool captureCurrentPenPositionAsFiducial(
FiducialId id);
308 bool captureCurrentPenPositionAsHeadShape();
314 void setModelFiducial(
FiducialId id,
const QVector3D& posInModel);
316 bool hasAllModelFiducials()
const;
319 bool hasAllPenFiducials()
const;
325 void setModelVertex(
const QVector3D& pos) { m_modelVertex = pos; m_hasModelVertex =
true; }
329 bool captureCurrentPenPositionAsVertex();
344 bool computeRegistration();
350 void resetRegistration();
356 void saveSessionState(QSettings &settings,
const QString &prefix = QStringLiteral(
"polhemus"))
const;
357 bool restoreSessionState(QSettings &settings,
const QString &prefix = QStringLiteral(
"polhemus"));
389 void onPointReceived(
int station,
const QVector3D& position,
const QQuaternion& orientation);
390 void onPenButtonPressedFromConn(
int station,
const QVector3D& position,
const QQuaternion& orientation);
393 QMatrix4x4 buildDevicePose(
const QVector3D& trackerPos,
394 const QQuaternion& trackerOri)
const;
395 QMatrix4x4 buildHeadFrame()
const;
397 int m_trackerStation = 2;
398 int m_penStation = 1;
399 int m_probeStation = 3;
401 QVector3D m_offsetTranslation;
402 QQuaternion m_offsetRotation;
403 QVector3D m_penTipOffset;
404 bool m_tipOffsetEnabled =
false;
405 bool m_mirrorX =
false;
406 bool m_mirrorY =
false;
411 QVector3D m_penPosition;
412 QQuaternion m_penOrientation;
413 bool m_havePenPos =
false;
415 QVector3D m_probePosition;
416 QQuaternion m_probeOrientation;
417 bool m_haveProbePos =
false;
419 QMatrix4x4 m_deviceToWorld;
420 QMatrix4x4 m_headToWorld;
421 QMatrix4x4 m_headToDevice;
422 QMatrix4x4 m_worldToModel;
423 bool m_registrationValid =
false;
426 QVector3D m_penFid[4];
427 bool m_hasPenFid[4] = {};
430 QVector3D m_modelFid[4];
431 bool m_hasModelFid[4] = {};
434 QVector3D m_modelVertex;
435 bool m_hasModelVertex =
false;
436 QVector3D m_penVertex;
437 bool m_hasPenVertex =
false;
440 PivotState m_pivotState = PivotState::Idle;
441 std::vector<QVector3D> m_pivotPositions;
442 std::vector<QQuaternion> m_pivotOrientations;
443 float m_pivotResidualMm = 0.0f;
446 std::vector<OpticalCalibSample> m_opticalCalibSamples;
447 QVector3D m_opticalAxisLocal;
448 QVector3D m_opticalCenterLocal;
449 float m_opticalCalibResidualMm = 0.0f;
450 float m_opticalCalibDepthSpreadMm = 0.0f;
451 bool m_opticalCalibValid =
false;
455 QVector3D m_objectiveCenterLocal;
456 bool m_hasObjectiveCenter =
false;
461 QVector3D m_opticalAxisPreFineAdjust;
462 float m_opticalFineAdjustDeg = 0.0f;
463 bool m_opticalFineAdjustApplied =
false;
467 float m_knownTrackerToObjectiveDist = 0.200f;
469 bool solvePivotCalibration();