ROS—进行建图或者move_base路径规划时出现打滑现象(雷达匹配不上地图)的解决方法—本人多次实验的出的结论
之前我的车会经常出现打滑现象,图也建不了,就算勉强建好了图,在进行路径规划的时候也是匹配不上,然后不停的进行行为恢复,很是苦恼。但后来我用我学长的车的时候发现他的匹配程度可以说是99%,基本不动,这就给建图和导航提供了很大的帮助,后来在抠他源码和不断实验之后发现他在运行算法之前通过调节线速度和角速度,使线速度和角速度达到标准,然后再运行算法精度非常高,这会我去测试自己线速度和imu精度的时候发现根本就是一坨屎,误差达到60%,这才缓过来,各种pid调,然后就是各种imu滤波,才达到了90%以上的精度,随后雷达的匹配程度也同样上来了,现在建图和导航基本无压力。很开心,在这里我也简单分析一下原因吧:
经过测试得知,打滑现象的产生都是因为里程计数据和陀螺仪数据的误差所造成的。
里程计的误差是因为cmd_vel数据或者键盘操作给出时如果机器人的线速度达不到给定的线速度就会产生里程计误差。
比如给liner线速度为0.3m/s,但实际却跑了0.1m,那么这0.1m/s的线速度通过你底盘算出来之后就会往ROS发,
但实际地图更新是根据你下发给32的线速度为准,而雷达坐标系和底盘坐标系却是和上层给的线速度为准,
所以在地图上一秒会更新0.3m,而车上雷达却只走了0.1m,
所以上下就产生了0.2m的误差在图上,所以就会出现坐标往前走了0.3m,而图却只走了0.1m,但雷达会尽力去匹配,
但误差太过大的话就匹配不回来。
解决方法就是pid调好,在32模拟给定线速度为0.3,然后要走到0.3误差才最小,而且要走直线。
角速度的话就是imu的问题,只要角度正确,发送角速度下去可以转指定角度就好。
再分享一份我自己的gmapping建图配置参数:
<launch>
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
<param name="base_frame" value="base_link"/> <!--机器人底盘坐标系基框架,附带在移动底盘的框架,原点-->
<param name="odom_frame" value="odom"/> <!--里程计坐标系里程计框架,附带在里程计的框架-->
<param name="map_frame" value="map"/> <!--地图坐标系地图框架,附带在地图上的框架-->
<param name="map_update_interval" value="0.01"/><!--地图更新速度,秒0.01-->
<param name="maxUrange" value="10.0"/><!--jiguang zuida keyongjuli, danwei:mi ,dayu jiu buyong-->
<param name="maxRange" value="12.0"/><!--zuida juli-->
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="3"/><!--moren:1-->
<param name="lstep" value="0.05"/>
<param name="astep" value="0.05"/>
<param name="iterations" value="5"/>
<param name="lsigma" value="0.075"/>
<param name="ogain" value="3.0"/>
<param name="lskip" value="0"/>
<param name="srr" value="0.1"/>
<param name="srt" value="0.2"/>
<param name="str" value="0.1"/>
<param name="stt" value="0.2"/>
<param name="minimumScore" value="0"/>
<param name="linearUpdate" value="0.05"/><!--线速度角速度在地图的更新-->
<param name="angularUpdate" value="0.0436"/>
<param name="temporalUpdate" value="-1"/><!--moren:-1-->
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="8"/><!--moren:30 gaicheng:8-->
<param name="xmin" value="-50.0"/>
<param name="ymin" value="-50.0"/>
<param name="xmax" value="50.0"/>
<param name="ymax" value="50.0"/>
<param name="delta" value="0.05"/>
<param name="llsamplerange" value="0.01"/>
<param name="llsamplestep" value="0.01"/>
<param name="lasamplerange" value="0.005"/>
<param name="lasamplestep" value="0.005"/>
<!--param name="transform_publish_period" value="0.01"/-->
</node>
</launch>
希望可以帮到跟我遇到同样问题的同学。