通过 IMU 绘制物体移动的空间轨迹

发布时间 2023-08-03 13:02:11作者: wonderhoi

通过 IMU 绘制物体移动的空间轨迹

一般 IMU 由加速度传感器、陀螺仪组成,也叫 6 轴 IMU。还可以外加一个磁力计,构成 9 轴 IMU。关于加速度传感器和陀螺仪的工作原理,可以参考:

  1. 加速度传感器的原理和应用-手机翻转、失重检测、运动检测、位置识别
  2. MEMS 三轴加速计、三轴陀螺仪、三轴磁力计)6轴IMU+磁力计,9轴传感器讲解
  3. IMU与惯性导航基础知识介绍

加速度传感器测得加速度(acc)积分得到速度,再积分得到位移:

  1. Gyroscope and Accelerometer Calibration with Raspberry Pi
  2. 【翻译】利用加速度求解位置的算法——三轴传感器

陀螺仪测得角速度(gyr)积分得到姿态:

  1. 三维旋转:欧拉角、四元数、旋转矩阵、轴角之间的转换
  2. 四元数微分方程的推导和解算实现
  3. 三维旋转笔记:欧拉角/四元数/旋转矩阵/轴角-记忆点整理

所以可以通过加速度传感器+陀螺仪的组合得到比较准确姿态,在去除重力加速度分量影响下二次积分可以得到位置。

其中的难点在于:

  1. 姿态不准导致重力影响去除不了;
  2. MEMS 器件本身的零点漂移不能去除。

这导致使用 IMU 定位时,始终存在不可避免的漂移,且漂移会随着积分越来越大。所以需针对具体应用设计相应的处理算法。目前使用较多的步态定位

  1. Oscillatory-Motion-Tracking-With-x-IMU,Matlab开源项目;
  2. Gait-Tracking-With-x-IMU,Matlab开源项目;
  3. Gait-Tracking-With-x-IMU,Python开源项目;
  4. Gait Tracking with x-imu Python,Python开源项目;
  5. Gait-Tracking,Python开源项目。

就目前来说,第二个项目的算法效果最好。但需要注意的是:

  1. Script 中 samplePeriod 需要与传感器采样频率一致;

  2. 注意单位转化,我这里传感器采集的角速度单位为rad/s,但是项目中角速度的单位为deg/s。两者的转化关系为:

    \[π/180*deg = rad \]

  3. 算法对于 IMU 的放置和运动模式都做了要求。IMU 必须放置在脚背上,不能是脚踝。在脚踝上 IMU 抖动会导致数据漂移。出于同样原因,算法不适用于跑步,只能用于步行。事实上,对于简单、低频的动作,算法都能够绘制出较为精准的空间运动轨迹。但是对于复杂、高频的动作,算法没有表现出很好的兼容性,数据漂移很严重。