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

Posted

技术标签:

【中文标题】将 IMU 角速度准确转换为四元数【英文标题】:Accurately converting IMU angular velocities into a quaternion 【发布时间】:2020-02-26 08:22:36 【问题描述】:

给定三个角速度 vxvyvz 关于 xyyz 轴,以弧度每秒测量,从 IMU 的速率陀螺仪得出,我该怎么做为一个样本和下一个样本之间的整个旋转产生一个等效的四元数,即当前样本和前一个样本之间的旋转时间积分dt

主要问题是这三个角速度是相互独立测量的,但旋转不是可交换的。这意味着在积分期间应用角速度的顺序会影响计算的四元数,就像将欧拉角转换为四元数会根据应用欧拉旋转的顺序产生不同的四元数(例如x,然后y,然后是 z,而不是其他顺序)。

我认为正确的做法是将时间步 dt 拆分为多个较短时间段的样本,例如比如N=10,然后将每个速度除以那个数字,得到vx' = vx/Nvy' = vy/Nvz' = vz/N,然后以循环方式应用旋转N次数,从大到小顺序,计算实际旋转在每种情况下都在间隔dt/N 上,并将其累积到最终的旋转四元数中。

当被问及相关问题时,我看到很多对四元数导数的引用,我想知道是否有可能将角速度(欧拉角的导数)直接转换为四元数导数(尽管可能会受到影响)从轴排序灵敏度),然后以某种方式整合四元数导数以转换回四元数跨越时间dt

似乎应该有一个“正确”的方法来做到这一点,因为每个使用速率陀螺仪的​​ IMU 都必须解决这个问题。对此的任何见解将不胜感激!

【问题讨论】:

你读过例如Efficient quaternion angular velocity吗?顺便说一下,与旋转本身不同,角速度是可交换的:在角速度“期间”没有旋转发生,它是一个瞬时量 - 一个垂直于瞬时旋转平面的伪向量。 谢谢,你关于瞬时速度的观点澄清了很多困惑!我很欣赏另一个答案的链接。这相当于我链接到 Ashwin Narayan 的帖子,但采用了实用的代码形式。 【参考方案1】:

我在 Ashwin Narayan 的 this excellent post 中找到了答案。

更新 (1):rowan library 在 Python 中实现了必要的四元数求幂。

更新(2):用户harold 指向this answer,它在 C++ 代码中显示了相同的四元数求幂,这比在 rowan 中的 NumPy 代码更易读。

【讨论】:

以上是关于将 IMU 角速度准确转换为四元数的主要内容,如果未能解决你的问题,请参考以下文章

将方向向量转换为四元数旋转

Eigen:将 Matrix3d 旋转转换为四元数

怎么把向量转化为四元数或欧拉角

相机IMU融合四部曲:误差状态四元数详细解读

欧拉角到四元数然后四元数到欧拉角

如何缩放四元数的旋转