如何进行转换以从线性加速度 IMU 数据中获得正确的线速度?

Posted

技术标签:

【中文标题】如何进行转换以从线性加速度 IMU 数据中获得正确的线速度?【英文标题】:How to do transformation to get correct linear velocity from linear acceleration IMU data? 【发布时间】:2021-11-15 21:13:44 【问题描述】:

我有 IMU 传感器,可以为我提供方向、角度和线性加速度等原始数据。我正在使用 ROS 并做一些 Gazebo UUV 模拟。此外,我想从原始 IMU 数据中获得线速度。如果我随着时间的推移进行积分,则会累积误差,并且在机器人转弯时会不准确。 所以如果我使用

acceleration_x = (msg->linear_acceleration.x + 9.81 * sin(pitch)) * cos(pitch); 
acceleration_y = (msg->linear_acceleration.y - 9.81 * sin(roll)) * cos(roll);

所以集成线性加速度是很糟糕的,

Velocity_x= Velocity_old_x+acceleration_x*dt;

因为在没有考虑传感器任何可能旋转的情况下对加速度进行积分,这意味着如果传感器完全旋转,结果可能会很糟糕。 所以我需要一些 ROS 包来考虑所有这些转换并给我最准确的线速度估计。有什么帮助吗?谢谢

【问题讨论】:

我会从这里开始:github.com/Wojtek120/IMU-velocity-and-displacement-measurements 好的。但那是一个完整的设备。在这个阶段我不需要额外的设备。我已经有 IMU,它提供 x,y,z 线性 (x,y,z) 、角速度(x,y,z) 和线性加速度 (x,y,z) 的方向。需要算法进行正确的变换和滤波以获得真实的线速度 这是什么类型的设备(机械臂、车辆、直升机、飞机等?) 它的 UUV,水下机器人。但目前仅在 Gazebo 模拟中。但会在现实中拥有它。所以我已经在机器人上安装了一个传感器单元。只需要算法或更好的一整包即可使用 IMU 数据获得线速度 你读到最后的链接了吗?有用于单个 IMU 的算法的描述。 【参考方案1】:

我首先建议您尝试将输入传感器数据拟合到 robot_localization 包中的 EKF 或 UKF 节点中。该软件包是 ROS 生态系统中使用最多、优化程度最高的姿态估计软件包。

它旨在处理 3D 传感器输入,但您必须配置参数(没有真正的默认值,所有配置)。除了上面的配置文档,github 有很好的 yaml 参数配置示例(Ex.)(你需要一个独立于启动文件的文件)和示例启动文件(Ex.)。

如果您正在谈论最小化累积误差,将 IMU 或里程计-速度数据输入 EKF/UKF 将为您提供 odom->base_link 帧变换,这是您能做的最好的事情,根据定义。除非您有绝对参考系测量,否则绝对位姿误差会逐渐累积并累积。 (例如 GPS 或相机/激光雷达处理的位置估计)。具体到您如何要求速度,后退导数,除非您对您的速度或姿势有一个绝对参考系估计,否则您将累积误差只是整合您的加速度,这是你能做的最好的 em>,根据定义。

如果是水下机器人,您可以在车辆上安装速度/水流速度传感器。或者您可以使用相机/激光雷达/声纳进行处理以获得绝对参考帧或至少执行周期之间的位置差异。否则,您的精度和结果将受限于您拥有的传感器。

【讨论】:

以上是关于如何进行转换以从线性加速度 IMU 数据中获得正确的线速度?的主要内容,如果未能解决你的问题,请参考以下文章

用于传感器融合(IMU 和压力)数据的 Ros 包?

了解imu以及imu的标定

将 IMU 角速度准确转换为四元数

利用GPS与IMU怎样在摄影瞬间直接获得方位元素?

从设备坐标系到绝对坐标系的加速度

基于 IMU 的位姿解算