我目前正在从事一个平衡机器人项目,该项目具有相当低成本的传感器,例如带有测量状态的9-Dof IMU
左[a_x,a_y,a_z,g_x,g_y,g_z,m_x,m_y,m_z \ right] ^ \ text {T} $。

当前,我使用加速度计和陀螺仪读数,由a融合辅助滤波器,以获取机器人直立(稳定)位置的角度偏差。磁力计的值经过倾斜补偿,并产生相对于地磁场的机器人方向(接近磁畸变时是可闻的)。此外,我在车轮上安装了相当不错的旋转编码器,可提供有关车轮速度的信息。 \ text {T} $。

鉴于这些测量值,我想尝试获取机器人的姿势(位置+方向)。 {ROB} = \ left [x,y,\ theta \ right] ^ \ text {T} $

我对EKF或KF的理论知识不多,但我不足实际得出一个实际的实现。请注意,我的计算资源非常有限(带有RTOS的Raspberry Pi B +),并且我想避免使用ROS或任何其他非std库。有人可以帮助我解决实际问题吗?


评论

欢迎来到Robotics Flo Ryan,第一个伟大的问题,我期待阅读您所获得的答案。

#1 楼

因此,您可以从IMU中获得加速度读数(线性和角度),而从车轮编码器获得速度读数(仅线性)。 > $$
v = v + a * \ mbox {dT}
$$

通过利用车辆的几何形状从车轮编码器获取角速度

$$
\ dot {\ theta} = \ mbox {atan2}((v_r-v_l),\ mbox {轴距})
$$

现在您有两种线速度和角速度的来源-IMU和车轮编码器。通过

$$
x = x + v * \ mbox {dT}
$$

到达线性和角位置使用了$ x $,但是当然,它只是一个变量,可用于您想要使用的任何位置。陀螺仪),您可以从车轮编码器获得航向和位置,并通过磁力计进行航向。

我建议在集成之前对IMU输出进行过滤,但是您可以使用任何需要的过滤器-滞后,卡尔曼或更复杂的东西。如果优先考虑简化计算,我强烈建议您检查滞后滤波器。它基本上是一个使用当前样本和先前样本而不是两个不同传感器的免费滤波器。

最后,您可以将传感器读数与免费过滤器融合在一起。我认为无法建议您应该重点强调哪个输入,因为这主要取决于车轮打滑(您“信任”车轮编码器的程度)。

评论


$ \ begingroup $
谢谢!陀螺仪为我们提供角速度。我可以关注您的帖子,但是Imu的框架围绕其x轴倾斜的事实使我想起来更加困难。您是否忽略了磁力计读数的准确性?我添加了一个小草图。希望能帮助到你!
$ \ endgroup $
– Flo Ryan
15年8月15日在19:16

$ \ begingroup $
不,您可以将磁力计与陀螺仪和车轮编码器的航向估计值一起使用。您可以使用免费滤波器一次将三个估计值全部合并,也可以合并前两个,然后将该输出与第三个合并(级联免费滤波器)。
$ \ endgroup $
–卡盘
15年8月15日在19:43

$ \ begingroup $
关于IMU旋转,您的机器人会保持平衡,因此旋转应尽可能小。您可以对余弦$ 1-\ theta ^ 2/2 $使用小角度近似值,其中角度为弧度。但是,如果您在此处进行数学运算,则5度为$ 5 *(\ pi / 180)= 0.087 $弧度。平方除以2得到0.0038,因此5度的余弦小角近似值为0.9962。我发现,除非需要非常精确,否则 cos $ \ theta \ approx $ 通常是一个安全的小角度近似值。
$ \ endgroup $
–卡盘
15年8月15日在19:54

$ \ begingroup $
关于小角度近似的最后评论-将上面显示的内容与IMU的测量误差进行比较。允许$​​ \ cos {\ theta} = 1 $引入的误差高达0.4%,与测量误差相比可以忽略不计。此外,该误差是对称的(向前和向后应用相同的误差),因此在向前运动期间引入的任何误差将在向后运动期间被抵消。当然,您总是可以进行适当的触发补偿,但是我不知道您的申请是否必要。
$ \ endgroup $
–卡盘
15年8月15日在20:01

$ \ begingroup $
再次感谢。仍然存在一个问题。由于重力恒定,IMU的atan2计算出的绕x和y轴的旋转会产生相当好的结果。但是,由于机器人运动产生的力太小,无法估计与重力矢量平行的绕z轴旋转。我将考虑为此使用磁力计。我也对小角度近似值有您的看法,我不知道为什么,但是我觉得事情过于复杂了。我想我会坚持你的建议
$ \ endgroup $
– Flo Ryan
15年8月15日在21:09