41#ifndef UTILS_POLHEMUS_COREGISTRATION_H
42#define UTILS_POLHEMUS_COREGISTRATION_H
102 return m_trackerStation;
110 return m_probeStation;
119 m_penTipOffset = offset;
123 return m_penTipOffset;
127 m_tipOffsetEnabled = on;
131 return m_tipOffsetEnabled;
176 void startPivotCalibration();
177 void cancelPivotCalibration();
184 return static_cast<int>(m_pivotPositions.size());
188 return m_pivotResidualMm;
202 void setTrackerToDeviceOffset(
const QVector3D& translation,
203 const QQuaternion& rotation);
207 return m_offsetTranslation;
211 return m_offsetRotation;
243 return static_cast<int>(m_opticalCalibSamples.size());
247 void clearOpticalCalibSamples();
259 bool captureObjectiveCenter();
264 return m_hasObjectiveCenter;
268 void clearObjectiveCenter();
277 return m_objectiveCenterLocal;
288 bool solveOpticalCalibration();
302 m_knownTrackerToObjectiveDist = metres;
306 return m_knownTrackerToObjectiveDist;
312 return m_opticalCalibValid;
322 return m_opticalAxisLocal;
332 return m_opticalCenterLocal;
342 return m_opticalCalibResidualMm;
352 return m_opticalCalibDepthSpreadMm;
368 bool applyOpticalAxisFineAdjust(
const QVector3D& targetWorldPos,
369 float& correctionDeg);
374 return m_opticalFineAdjustApplied;
380 return m_opticalFineAdjustDeg;
384 void clearOpticalFineAdjust();
393 bool opticalRayInWorld(QVector3D& origin, QVector3D& direction)
const;
404 bool opticalUpInWorld(QVector3D& up)
const;
429 bool captureCurrentPenPositionAsFiducial(
FiducialId id);
430 bool captureCurrentPenPositionAsHeadShape();
436 void setModelFiducial(
FiducialId id,
const QVector3D& posInModel);
438 bool hasAllModelFiducials()
const;
441 bool hasAllPenFiducials()
const;
450 m_hasModelVertex =
true;
454 return m_hasModelVertex;
458 return m_modelVertex;
461 bool captureCurrentPenPositionAsVertex();
464 return m_hasPenVertex;
482 bool computeRegistration();
488 void resetRegistration();
494 void saveSessionState(QSettings& settings,
const QString& prefix = QStringLiteral(
"polhemus"))
const;
495 bool restoreSessionState(QSettings& settings,
const QString& prefix = QStringLiteral(
"polhemus"));
499 return m_registrationValid;
508 return m_deviceToWorld;
512 return m_headToWorld;
516 return m_headToDevice;
520 return m_worldToModel;
524 return m_penPosition;
528 return m_penOrientation;
537 return m_probePosition;
541 return m_probeOrientation;
545 return m_haveProbePos;
560 void onPointReceived(
int station,
const QVector3D& position,
const QQuaternion& orientation);
561 void onPenButtonPressedFromConn(
int station,
const QVector3D& position,
const QQuaternion& orientation);
564 QMatrix4x4 buildDevicePose(
const QVector3D& trackerPos,
565 const QQuaternion& trackerOri)
const;
566 QMatrix4x4 buildHeadFrame()
const;
568 int m_trackerStation = 2;
569 int m_penStation = 1;
570 int m_probeStation = 3;
572 QVector3D m_offsetTranslation;
573 QQuaternion m_offsetRotation;
574 QVector3D m_penTipOffset;
575 bool m_tipOffsetEnabled =
false;
576 bool m_mirrorX =
false;
577 bool m_mirrorY =
false;
582 QVector3D m_penPosition;
583 QQuaternion m_penOrientation;
584 bool m_havePenPos =
false;
586 QVector3D m_probePosition;
587 QQuaternion m_probeOrientation;
588 bool m_haveProbePos =
false;
590 QMatrix4x4 m_deviceToWorld;
591 QMatrix4x4 m_headToWorld;
592 QMatrix4x4 m_headToDevice;
593 QMatrix4x4 m_worldToModel;
594 bool m_registrationValid =
false;
597 QVector3D m_penFid[4];
598 bool m_hasPenFid[4] = {};
601 QVector3D m_modelFid[4];
602 bool m_hasModelFid[4] = {};
605 QVector3D m_modelVertex;
606 bool m_hasModelVertex =
false;
607 QVector3D m_penVertex;
608 bool m_hasPenVertex =
false;
611 PivotState m_pivotState = PivotState::Idle;
612 std::vector<QVector3D> m_pivotPositions;
613 std::vector<QQuaternion> m_pivotOrientations;
614 float m_pivotResidualMm = 0.0f;
617 std::vector<OpticalCalibSample> m_opticalCalibSamples;
618 QVector3D m_opticalAxisLocal;
619 QVector3D m_opticalCenterLocal;
620 float m_opticalCalibResidualMm = 0.0f;
621 float m_opticalCalibDepthSpreadMm = 0.0f;
622 bool m_opticalCalibValid =
false;
626 QVector3D m_objectiveCenterLocal;
627 bool m_hasObjectiveCenter =
false;
632 QVector3D m_opticalAxisPreFineAdjust;
633 float m_opticalFineAdjustDeg = 0.0f;
634 bool m_opticalFineAdjustApplied =
false;
638 float m_knownTrackerToObjectiveDist = 0.200f;
640 bool solvePivotCalibration();
Shared digitised-point store for Polhemus digitizer sessions.
Polhemus digitizer connection abstraction.
Public umbrella header for UTILSLIB exposing the UTILSSHARED_EXPORT macro and build-info accessors.
#define UTILSSHARED_EXPORT
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
FiducialId
Identifier for the three cardinal fiducials.
In-memory store of all points captured during a session.
Polhemus digitizer connection (mock + serial-port backends).
QMatrix4x4 deviceToWorld() const
float opticalCalibDepthSpreadMm() const
~PolhemusCoregistration() override=default
int pivotSampleCount() const
QVector3D penVertex() const
void penPoseChanged(const QVector3D &position, const QQuaternion &orientation)
bool hasModelVertex() const
AcquiredPoints * acquiredPoints() const
QVector3D penTipOffset() const
void setTrackerStation(int station)
void opticalCalibrationChanged()
PolhemusConnection * connection() const
bool opticalFineAdjustApplied() const
QVector3D modelVertex() const
bool haveLivePenPosition() const
bool opticalCalibrationValid() const
void setTipOffsetEnabled(bool on)
QMatrix4x4 worldToModel() const
float knownTrackerToObjectiveDistance() const
bool tipOffsetEnabled() const
void setPenStation(int station)
bool hasObjectiveCenter() const
PivotState pivotState() const
bool haveLiveProbePosition() const
QVector3D opticalAxisLocal() const
void penButtonPressed(const QVector3D &position, const QQuaternion &orientation)
void devicePoseChanged(const QMatrix4x4 &deviceToWorld)
QVector3D trackerToDeviceTranslation() const
QVector3D objectiveCenterLocal() const
void setKnownTrackerToObjectiveDistance(float metres)
Set the known perpendicular distance from tracker sensor to the objective center (metres).
void setProbeStation(int station)
QQuaternion trackerToDeviceRotation() const
void setModelVertex(const QVector3D &pos)
void pivotCalibrationDone(const QVector3D &offset, float residualMm)
void pivotStateChanged(PolhemusCoregistration::PivotState state)
bool captureOpticalCalibSample()
Record one calibration sample (current tracker pose + current pen position).
int opticalCalibSampleCount() const
bool hasPenVertex() const
void setPenTipOffset(const QVector3D &offset)
PolhemusCoregistration(QObject *parent=nullptr)
float opticalCalibResidualMm() const
QMatrix4x4 headToDevice() const
bool registrationValid() const
void setAxisMirror(bool mirrorX, bool mirrorY)
Negate X and/or Y of incoming Polhemus positions.
QVector3D opticalCenterLocal() const
float opticalFineAdjustDeg() const
float pivotResidualMm() const
int trackerStation() const
QMatrix4x4 headToWorld() const
void probePoseChanged(const QVector3D &position, const QQuaternion &orientation)
QQuaternion probeOrientation() const
QVector3D penPosition() const
QVector3D probePosition() const
void pivotSampleCollected(int sampleCount, float angularSpanDeg)
void registrationChanged()
QQuaternion penOrientation() const
QVector3D focusPoint
Stylus focus point in world frame (metres).
QVector3D trackerPos
Tracker position in world frame (metres).
QQuaternion trackerOri
Tracker orientation in world frame.