39 #include <util/Stride.h>
46 inline void applyOriToState(TrackingSystem
const &sys, BodyState &state,
47 BodyProcessModel &processModel,
48 CannedIMUMeasurement
const &meas) {
49 Eigen::Quaterniond quat;
50 meas.restoreQuat(quat);
52 meas.restoreQuatVariance(var);
53 util::Angle yawCorrection = meas.getYawCorrection();
55 Eigen::Quaterniond quatInCamSpace = getTransformedOrientation(
56 quat, Eigen::Quaterniond(sys.getRoomToCamera().rotation()),
58 OrientationMeasurement kalmanMeas{quatInCamSpace, var};
60 auto correctionInProgress =
63 auto correctionInProgress =
64 kalman::beginUnscentedCorrection(state, kalmanMeas);
66 auto outputMeas = [&] {
67 std::cout <<
"state: " << state.getQuaternion().coeffs().transpose()
68 <<
" and measurement: "
70 << quat.coeffs().transpose();
72 << quatInCamSpace.coeffs().transpose();
75 if (!correctionInProgress.stateCorrectionFinite) {
77 <<
"Non-finite state correction in applying orientation: ";
83 static ::util::Stride s(401);
86 std::cout <<
"delta z\t "
87 << correctionInProgress.deltaz.transpose();
88 std::cout <<
"\t state correction "
89 << correctionInProgress.stateCorrection.transpose()
93 if (!correctionInProgress.finishCorrection(
true)) {
95 <<
"Non-finite error covariance after applying orientation: ";
101 inline void applyAngVelToState(TrackingSystem
const &sys, BodyState &state,
102 BodyProcessModel &processModel,
103 CannedIMUMeasurement
const &meas) {
105 Eigen::Vector3d angVel;
106 meas.restoreAngVel(angVel);
108 meas.restoreAngVelVariance(var);
110 static const double dt = 0.02;
113 Eigen::Quaterniond cTb = state.getQuaternion();
116 Eigen::Quaterniond incrementalQuat =
117 cTb * angVelVecToIncRot(angVel, dt) * cTb.conjugate();
119 angVel = incRotToAngVelVec(incrementalQuat, dt);
123 kalman::AngularVelocityMeasurement<BodyState> kalmanMeas{angVel, var};
126 kalman::IMUAngVelMeasurement kalmanMeas{angVel, var};
127 auto correctionInProgress =
128 kalman::beginUnscentedCorrection(state, kalmanMeas);
129 auto outputMeas = [&] {
130 std::cout <<
"state: " << state.angularVelocity().transpose()
131 <<
" and measurement: " << angVel.transpose();
133 if (!correctionInProgress.stateCorrectionFinite) {
135 <<
"Non-finite state correction in applying angular velocity: ";
140 if (!correctionInProgress.finishCorrection(
true)) {
141 std::cout <<
"Non-finite error covariance after applying angular "
149 void applyIMUToState(TrackingSystem
const &sys,
151 BodyState &state, BodyProcessModel &processModel,
153 CannedIMUMeasurement
const &meas) {
154 if (newTime != initialTime) {
156 kalman::predict(state, processModel, dt);
158 state.externalizeRotation();
161 if (meas.orientationValid()) {
162 applyOriToState(sys, state, processModel, meas);
163 }
else if (meas.angVelValid()) {
164 applyAngVelToState(sys, state, processModel, meas);
AngleRadiansd Angle
Default angle type.
Header for a flexible Unscented-style Kalman filter correction from a measurement.
OSVR_EXTERN_C_END double osvrTimeValueDurationSeconds(const OSVR_TimeValue *tvA, const OSVR_TimeValue *tvB)
Compute the difference between the two time values, returning the duration as a double-precision floa...
::OSVR_TimeValue TimeValue
C++-friendly typedef for the OSVR_TimeValue structure.
CorrectionInProgress< StateType, MeasurementType > beginCorrection(StateType &state, ProcessModelType &processModel, MeasurementType &meas)
bool correct(StateType &state, ProcessModelType &processModel, MeasurementType &meas, bool cancelIfNotFinite=true)
Header for measurements of absolute orientation.