monado/src/xrt/auxiliary/math/m_imu_pre.h
2021-01-15 13:50:32 +00:00

89 lines
2.2 KiB
C

// Copyright 2020, Collabora, Ltd.
// SPDX-License-Identifier: BSL-1.0
/*!
* @file
* @brief IMU pre filter struct.
* @author Jakob Bornecrantz <jakob@collabora.com>
* @ingroup aux_math
*/
#pragma once
#include "xrt/xrt_defines.h"
#ifdef __cplusplus
extern "C" {
#endif
/*!
* This is a common IMU pre-filter which takes raw 'ticks' from a 3 axis IMU
* measurement and converts it into degrees per secs and meters per floats.
*
* One of these is used per gyro, accelerometer and magnometer.
*
* The formula used is: `v = ((V * ticks_to_float) - bias) * gain`. For
* @ref ticks_to_float the same value used for all channels, where as for
* @ref gain and @ref bias the value is per channel.
*/
struct m_imu_pre_filter_part
{
//! Bias for the imu part.
struct xrt_vec3 bias;
float _pad;
//! Gain for the imu part.
struct xrt_vec3 gain;
//! Going from IMU 'ticks' to a floating value.
float ticks_to_float;
};
/*!
* This is a common IMU pre-filter which takes raw 'ticks' from an IMU
* measurement and converts it into floats representing radians per second and
* meters per second^2 floats.
*/
struct m_imu_pre_filter
{
struct m_imu_pre_filter_part accel;
struct m_imu_pre_filter_part gyro;
/*!
* A transform on how to flip axis and rotate the IMU values into device
* space.
*/
struct xrt_matrix_3x3 transform;
};
/*!
* A simple init function that just takes the two ticks_to_float values, all
* other values are set to identity.
*/
void
m_imu_pre_filter_init(struct m_imu_pre_filter *imu, float ticks_to_float_accel, float ticks_to_float_gyro);
/*!
* Sets the transformation to flip X and Y axis. This changes the handedness
* of the coordinates.
*/
void
m_imu_pre_filter_set_switch_x_and_y(struct m_imu_pre_filter *imu);
/*!
* Pre-filters the values, taking them from ticks into float values.
*
* See description of @ref m_imu_pre_filter_part for formula used. Also rotates
* values with the imu_to_head pose.
*/
void
m_imu_pre_filter_data(struct m_imu_pre_filter *imu,
const struct xrt_vec3_i32 *accel,
const struct xrt_vec3_i32 *gyro,
struct xrt_vec3 *out_accel,
struct xrt_vec3 *out_gyro);
#ifdef __cplusplus
}
#endif