AMCL中轮式里程计误差模型参数
用了很久的AMCL,也偶尔会思考odom_alpha1,odom_alpha2,odom_alpha3,odom_alpha4这些如何参数如何根据我们轮子的精度来给出理论上比较准的值,而不是凭借实验中调出来的值(总感觉不专业),因此这次决定好好理一理。
一.diff模型与diff-corrected区别
结论:diff-corrected模型才是《概率机器人》中里程模型的实现!!!强烈建议AMCL新用户直接使用diff-corrected模型,两个模型参数数量级完全不一样。
diff模型:pf_ran_gaussian()函数产生服从高斯分布值,注意参数为高斯分布的标准差(不是方差)。再看看图片括号里的参数是平方值像不像方差表达形式,于是矛盾产生了。(当时本人看源码就是发现这点,所以也去github上找了相关问题)
diff-corrected模型:注意传给pf_ran_gaussian()函数的参数为是开根后,看起来是不是像标准差的表达式。想更详细了解的一些链接。
链接AMCL mixes units when sampling the gaussian distribution
链接Is AMCL’s implementation of the odometry model correct?
二.各个odom_alpha如何影响粒子的预测更新
先给出odom_alpha参数的字面意义,默认值看看就好。
1.odom_alpha3 考虑里程计只有位移累计误差,那么理论上AMCL中的里程计实现粒子预测更新应该只表现粒子整体纵向拉长*(仿真走起)*
第一张图初始生成的粒子,角度的误差给的很小,所以看起来像🏹。
第二张图直线行走,更新的粒子逐渐被拉长,表示位移的误差越来越多,此处给的odom_alpha3 = 0.04,折算到我们通常说的轮式里程计累计误差在20%(别忘了代码中的odom_alpha3有求开根号的),基本满足我们理论中的预设。其中还是变胖了,主要是即使角度误差为0作为高斯分布的标准差,也会产生不为0 的误差。
2.odom_alpha1 考虑里程计只有旋转累计误差,那么理论上AMCL中的里程计实现粒子预测更新应该主要只表现粒子整体横向变胖*(仿真走起)****
基本上跟理论上一致,角度发散严重。
3.odom_alpha2 位移的变化引起角度变化的系数
假如我只控制小车直行,理论上小车运行是一条直线(此时odom_alpha2=0.0)但由于底盘精度,小车运行轨迹可能是条斜线(odom_alpha2=0.04)。
三.里程计的精度在AMCL中很重要很重要很重要
还得再唠叨几句!!
3.1.里程计的存在的重要性:接触不少入门不久的SLAM的技术人员,往往沉迷于激光ICP的精度。但是我们做产品在精度达到一定阈值情况下,鲁棒性才是着重考虑的问题,因为不管是服务性机器人还是搬运机器人大部分情况下得面临经常性的动态干扰和环境的轻微的改变,这时候里程计的存在就显得尤为重要(当然轮子会打滑,但这一般在非常极端条件下,类似人会摔倒一样)。
3.2.里程计的精度的重要性:假如里程计精度不高,那么对应的参数odom_alpha值就大,这从理论上就表明你的下一可能位置分散程度就大(好比落在一个半径1m的圆内),假如里程计精度高,那么对应的参数odom_alpha值就小,这从理论上就表明你的下一可能位置分散程度就小(好比落在一个半径0.1m的圆内),然后你都是用min_particles个粒子来描述这两个圆,那1m圆内出现更接近真实位姿的粒子可能性小很多,久而久之,有可能出现粒子退化,定位跟踪失败。(此情况下,或许你可以在odom预测阶段增加粒子)。
3.3.里程计误差分析的重要性: 假如你的AMCL运行过程中,激光SCAN不能完全跟踪地图,总是差点,不一定是里程计误差模型的问题,有可能只是你的update_min_d update_min_a这两个参数不够小。
结论:以上就是各个参数怎么影响粒子的更新形状。所以我们可以通过测试我们自己的里程计的误差特性,从而能计算出odom_alpha各个参数的值。欢迎各位爱好者加微信讨论(15112119047)
广告一波~ 欢迎加入高新兴机器人!!