33 #include <boost/assert.hpp>
40 TrackedBodyIMU::TrackedBodyIMU(TrackedBody &body,
41 double orientationVariance,
42 double angularVelocityVariance)
43 : m_body(body), m_yaw(0),
44 m_useOrientation(getParams().imu.useOrientation),
45 m_orientationVariance(orientationVariance),
46 m_useAngularVelocity(getParams().imu.useAngularVelocity),
47 m_angularVelocityVariance(angularVelocityVariance) {}
50 Eigen::Quaterniond
const &quat) {
53 Eigen::Quaterniond rawSmoothQuat = quat;
55 util::flipQuatSignToMatch(rawSmoothQuat, m_rawQuat);
59 rawSmoothQuat = Eigen::Quaterniond(-quat.coeffs());
63 m_rawQuat = rawSmoothQuat;
72 m_quat = transformRawIMUOrientation(rawSmoothQuat);
73 m_hasOrientation =
true;
76 if (!getParams().imu.useOrientation) {
80 updatePoseFromMeasurement(tv, preprocessOrientation(tv, rawSmoothQuat));
90 if (!m_useAngularVelocity) {
94 updatePoseFromMeasurement(tv,
95 preprocessAngularVelocity(tv, deltaquat, dt));
98 Eigen::Quaterniond TrackedBodyIMU::transformRawIMUOrientation(
99 Eigen::Quaterniond
const &input)
const {
101 calibrationYawKnown(),
102 "transform called before calibration transform known!");
103 return m_yawCorrection * input;
107 Eigen::Quaterniond TrackedBodyIMU::transformRawIMUAngularVelocity(
108 Eigen::Quaterniond
const &deltaquat)
const {
110 calibrationYawKnown(),
111 "transform called before calibration transform known!");
124 Eigen::Quaterniond
const &quat) {
126 auto ret = CannedIMUMeasurement{};
127 ret.setYawCorrection(m_yaw);
128 ret.setOrientation(transformRawIMUOrientation(quat),
129 Eigen::Vector3d::Constant(m_orientationVariance));
134 CannedIMUMeasurement TrackedBodyIMU::preprocessAngularVelocity(
137 Eigen::Vector3d rot =
138 incRotToAngVelVec(transformRawIMUAngularVelocity(deltaquat), dt);
139 auto ret = CannedIMUMeasurement{};
140 ret.setYawCorrection(m_yaw);
142 Eigen::Vector3d::Constant(m_angularVelocityVariance));
146 bool TrackedBodyIMU::updatePoseFromMeasurement(
148 if (!meas.orientationValid() && !meas.angVelValid()) {
155 ConfigParams
const &TrackedBodyIMU::getParams()
const {
void updatePoseFromOrientation(util::time::TimeValue const &tv, Eigen::Quaterniond const &quat)
Processes an orientation.
::OSVR_TimeValue TimeValue
C++-friendly typedef for the OSVR_TimeValue structure.
ConfigParams const & getParams() const
void updatePoseFromAngularVelocity(util::time::TimeValue const &tv, Eigen::Quaterniond const &deltaquat, double dt)
Processes an angular velocity.
Standardized, portable parallel to struct timeval for representing both absolute times and time inter...
void calibrationHandleIMUData(BodyId id, util::time::TimeValue const &tv, Eigen::Quaterniond const &quat)
void incorporateNewMeasurementFromIMU(util::time::TimeValue const &tv, CannedIMUMeasurement const &meas)