mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-01 12:46:12 +00:00
d/vive: Use new 3DOF fusion
This commit is contained in:
parent
3e5da414f7
commit
99eda56d39
|
@ -52,6 +52,8 @@ vive_device_destroy(struct xrt_device *xdev)
|
||||||
os_thread_helper_destroy(&d->sensors_thread);
|
os_thread_helper_destroy(&d->sensors_thread);
|
||||||
os_thread_helper_destroy(&d->mainboard_thread);
|
os_thread_helper_destroy(&d->mainboard_thread);
|
||||||
|
|
||||||
|
m_imu_3dof_close(&d->fusion);
|
||||||
|
|
||||||
if (d->mainboard_dev != NULL) {
|
if (d->mainboard_dev != NULL) {
|
||||||
os_hid_destroy(d->mainboard_dev);
|
os_hid_destroy(d->mainboard_dev);
|
||||||
d->mainboard_dev = NULL;
|
d->mainboard_dev = NULL;
|
||||||
|
@ -258,6 +260,31 @@ oldest_sequence_index(uint8_t a, uint8_t b, uint8_t c)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
calc_dt_raw_and_handle_overflow(struct vive_device *d, uint32_t sample_time)
|
||||||
|
{
|
||||||
|
uint64_t dt_raw =
|
||||||
|
(uint64_t)sample_time - (uint64_t)d->imu.last_sample_time_raw;
|
||||||
|
d->imu.last_sample_time_raw = sample_time;
|
||||||
|
|
||||||
|
// The 32-bit tick counter has rolled over,
|
||||||
|
// adjust the "negative" value to be positive.
|
||||||
|
// It's easiest to do this with 64-bits.
|
||||||
|
if (dt_raw > 0xFFFFFFFF) {
|
||||||
|
dt_raw += 0x100000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (uint32_t)dt_raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint64_t
|
||||||
|
cald_dt_ns(uint32_t dt_raw)
|
||||||
|
{
|
||||||
|
double f = (double)(dt_raw) / VIVE_CLOCK_FREQ;
|
||||||
|
uint64_t diff_ns = (uint64_t)(f * 1000.0 * 1000.0 * 1000.0);
|
||||||
|
return diff_ns;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_imu(struct vive_device *d, struct vive_imu_report *report)
|
update_imu(struct vive_device *d, struct vive_imu_report *report)
|
||||||
{
|
{
|
||||||
|
@ -275,25 +302,22 @@ update_imu(struct vive_device *d, struct vive_imu_report *report)
|
||||||
|
|
||||||
/* From there, handle all new samples */
|
/* From there, handle all new samples */
|
||||||
for (j = 3; j; --j, i = (i + 1) % 3) {
|
for (j = 3; j; --j, i = (i + 1) % 3) {
|
||||||
uint32_t sample_time;
|
|
||||||
float scale;
|
float scale;
|
||||||
uint8_t seq;
|
uint8_t seq;
|
||||||
int32_t dt;
|
|
||||||
|
|
||||||
uint64_t raw_time;
|
|
||||||
|
|
||||||
sample = report->sample + i;
|
sample = report->sample + i;
|
||||||
seq = sample->seq;
|
seq = sample->seq;
|
||||||
|
|
||||||
/* Skip already seen samples */
|
/* Skip already seen samples */
|
||||||
if (seq == last_seq || seq == (uint8_t)(last_seq - 1) ||
|
if (seq == last_seq || seq == (uint8_t)(last_seq - 1) ||
|
||||||
seq == (uint8_t)(last_seq - 2))
|
seq == (uint8_t)(last_seq - 2)) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
sample_time = __le32_to_cpu(sample->time);
|
uint32_t time_raw = __le32_to_cpu(sample->time);
|
||||||
|
uint32_t dt_raw = calc_dt_raw_and_handle_overflow(d, time_raw);
|
||||||
|
uint64_t dt_ns = cald_dt_ns(dt_raw);
|
||||||
|
|
||||||
dt = sample_time - (uint32_t)d->imu.time;
|
|
||||||
raw_time = d->imu.time + dt;
|
|
||||||
|
|
||||||
int16_t acc[3] = {
|
int16_t acc[3] = {
|
||||||
(int16_t)__le16_to_cpu(sample->acc[0]),
|
(int16_t)__le16_to_cpu(sample->acc[0]),
|
||||||
|
@ -365,14 +389,15 @@ update_imu(struct vive_device *d, struct vive_imu_report *report)
|
||||||
default: VIVE_ERROR("Unhandled Vive variant\n"); return;
|
default: VIVE_ERROR("Unhandled Vive variant\n"); return;
|
||||||
}
|
}
|
||||||
|
|
||||||
math_quat_integrate_velocity(
|
d->imu.time_ns += dt_ns;
|
||||||
&d->rot_filtered, &angular_velocity,
|
|
||||||
(float)(dt / VIVE_CLOCK_FREQ), &d->rot_filtered);
|
|
||||||
|
|
||||||
d->last.acc = acceleration;
|
d->last.acc = acceleration;
|
||||||
d->last.gyro = angular_velocity;
|
d->last.gyro = angular_velocity;
|
||||||
d->imu.sequence = seq;
|
d->imu.sequence = seq;
|
||||||
d->imu.time = raw_time;
|
|
||||||
|
m_imu_3dof_update(&d->fusion, d->imu.time_ns, &acceleration,
|
||||||
|
&angular_velocity);
|
||||||
|
|
||||||
|
d->rot_filtered = d->fusion.rot;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1217,6 +1242,9 @@ vive_device_create(struct os_hid_device *mainboard_dev,
|
||||||
d->base.hmd->distortion.models = XRT_DISTORTION_MODEL_VIVE;
|
d->base.hmd->distortion.models = XRT_DISTORTION_MODEL_VIVE;
|
||||||
d->base.hmd->distortion.preferred = XRT_DISTORTION_MODEL_VIVE;
|
d->base.hmd->distortion.preferred = XRT_DISTORTION_MODEL_VIVE;
|
||||||
|
|
||||||
|
// Init here.
|
||||||
|
m_imu_3dof_init(&d->fusion, M_IMU_3DOF_USE_GRAVITY_DUR_20MS);
|
||||||
|
|
||||||
u_var_add_root(d, "Vive Device", true);
|
u_var_add_root(d, "Vive Device", true);
|
||||||
u_var_add_gui_header(d, &d->gui.calibration, "Calibration");
|
u_var_add_gui_header(d, &d->gui.calibration, "Calibration");
|
||||||
u_var_add_vec3_f32(d, &d->imu.acc_scale, "acc_scale");
|
u_var_add_vec3_f32(d, &d->imu.acc_scale, "acc_scale");
|
||||||
|
@ -1228,7 +1256,6 @@ vive_device_create(struct os_hid_device *mainboard_dev,
|
||||||
u_var_add_vec3_f32(d, &d->last.gyro, "gyro");
|
u_var_add_vec3_f32(d, &d->last.gyro, "gyro");
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (d->mainboard_dev) {
|
if (d->mainboard_dev) {
|
||||||
ret = os_thread_helper_start(&d->mainboard_thread,
|
ret = os_thread_helper_start(&d->mainboard_thread,
|
||||||
vive_mainboard_run_thread, d);
|
vive_mainboard_run_thread, d);
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "xrt/xrt_device.h"
|
#include "xrt/xrt_device.h"
|
||||||
|
#include "math/m_imu_3dof.h"
|
||||||
#include "os/os_threading.h"
|
#include "os/os_threading.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -61,8 +62,9 @@ struct vive_device
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
uint64_t time;
|
uint64_t time_ns;
|
||||||
uint8_t sequence;
|
uint8_t sequence;
|
||||||
|
uint32_t last_sample_time_raw;
|
||||||
double acc_range;
|
double acc_range;
|
||||||
double gyro_range;
|
double gyro_range;
|
||||||
struct xrt_vec3 acc_bias;
|
struct xrt_vec3 acc_bias;
|
||||||
|
@ -74,6 +76,8 @@ struct vive_device
|
||||||
struct xrt_pose trackref;
|
struct xrt_pose trackref;
|
||||||
} imu;
|
} imu;
|
||||||
|
|
||||||
|
struct m_imu_3dof fusion;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
struct xrt_vec3 acc;
|
struct xrt_vec3 acc;
|
||||||
|
|
Loading…
Reference in a new issue