代价地图参数设定
通过机器人准备工作阶段,使得机器人满足导航的先决条件,接下来可以确保代价地图的设置和配置正确。如下建议来调整代价地图文件的参数:
- 根据传感器实际发布的速率为每个观测源(observation_sources)设置expected_update_rate参数(如果没有这个参数可以自己加上),可以设置成自己期望值的两倍。(当传感器低于预期速率时,会在终端中发出警告)
- 为系统适当设置transform_tolerance参数。使用
rosrun rqt_tf_tree rqt_tf_tree
查看系统tf树,观察transform from the “base_link” frame to the “map” frame的时延,然后设置保守的参数。或者使用rosrun tf tf_monitor
在终端打印当前的坐标系转换关系,并设置保守的参数值。另外,当tf_monitor报告的延迟过大时,需要找找其中的原因。 - 在缺乏计算能力的移动小车上,可以考虑关闭代价地图参数文件里的map_update_rate参数。但如此一来,会导致传感器数据无法及时反映在地图中,这会降低机器人对障碍物的反应速度。
- publish_frequency参数作用是在rviz可视化costmap。对于大型全局地图,该参数设置过高可能会导致性能变慢。当我需要可视化非常大的地图时,尽量设置速度真的很低。
- 是否对代价地图使用voxel_grid或costmap模型:取决于机器人具有的传感器设备和需求。调整代价地图为基于3D-based代价地图更多是涉及未知空间的考虑。如果机器人只有一个二维激光雷达,我则会使用costmap模型的地图。
- 我倾向于根据机器人的尺寸和处理能力选择我使用的地图的分辨率。在具有很多处理能力并需要适应狭窄空间的机器人,如PR2,我会使用细粒度的地图,将分辨率设置为0.025米。对于像roomba这样的东西,可以以0.1米的分辨率来降低计算量。
- Rviz是验证代价地图正常工作的好方法。我通常从代价地图中查看障碍物数据,并确保在操纵杆控制下驱动机器人时,它与地图和激光扫描相一致。这是对传感器数据以合理的方式进入代价地图的合理检查。
- 当导航包仅运行costmap时,可以检查系统负载,如
top
命令,如果计算机在这个时候陷入僵局,就知道如果想要再同时运行规划器的话,需要做一些参数调整。
局部规划器
如果上部分代价地图设定,接下来调整局部规划器参数。在具有加速度限制的机器人上,可以使用dwa_local_planner,对于那些具有较低加速度限制的机器人,并且可以从每个步骤考虑到加速限制的,可以使用base_local_planner。调整相关参数的建议:
- 获得最大速度。可以参考小车的手册,例如,SCITOS G5 的最大速度是 1.4m/s。或者在 ROS 中,你可以订阅odom话题打印获取到的信息,手动控制机器人尝试向前运行,直到达到恒定速度,观察平移速度(m/s)的最大值即可。旋转速度(rad/s)等效于角速度,它的最大值是机器人旋转到位时的速度。为了获得最大角速度,同样可以通过控制操纵杆来让机器人旋转 360°,直到它的角速度达到恒定值。 为了安全起见,我们建议设定最大平移速度和旋转速度低于它们的实际值。
- 正确设置了加速度限制参数。可以参考小车的手册。或者如果不知道机器人的加速度极限是什么,可以花点时间写出一个脚本,让电机以最大平移和旋转速度命令运行一段时间,看看报告的里程计速度,并从中求得出加速度极限,多做几次实验求平均值。合理设置这些参数可以节省很多时间。
如:
V=V1+at (速度=初速度+加速度*时间)
a=(V-V1)/t 单位:m/s^2
- 如果我正在使用的机器人的定位并不是很好,我将目标公差参数xy_goal_tolerance设置得比我想象的要高一些。让机器人避免在目标点的振荡运动,那么可以提高yaw_goal_tolerance。
- 如果我使用低分辨率的CPU原因,我有时会提高sim_granularity参数,增大在轨迹上的点之间的步长,以节省计算资源。
- 我实际上很少发现自己改变了path_distance_bias和goal_distance_bias。当我这样做时,通常是因为我试图限制本地规划器自由,让计划的路径与除NavFn以外的全局规划器合作。将path_distance_bias参数增大,将使机器人更紧密地跟随路径,同时以快速向目标向前移动。如果这个值设置得太高,机器人将会拒绝移动,因为移动的代价大于停留在路径上的。简单来说就是让实际移动更接近全局路径还是局部路径。
path_distance_bias表示的是,局部路径规划应该跟随全局路径规划的比重。这个值越高,那么久会让局部的路径规划的轨迹和全局规划的轨迹越接近。goal_distance_bias,表示的是,机器人到底目标距离的偏差的容忍程度。实验经验表明:goal_distance_bias的值越大,那么机器人越接近目标。
-
如果我想以智能的方式推理成本函数,我将确保将meter_scoring参数设置为true。这使得它在代理函数中的距离以米而不是单元格,也意味着我可以调整一个地图分辨率的代价函数。此外,您现在可以通过将publish_cost_grid参数设置为true来显示本地计划程序在rviz中生成的代价函数。可以计算向目标移动 1 米的成本与我离计划路径的距离的权衡。这往往让我对如何调整事物有一个不错的想法。
-
将sim_time参数设置为不同的值会对机器人的行为有很大的影响。我通常将此参数设置在1-2秒之间,将其设置得更高会导致轨迹稍微平滑。确保最小速度乘以 sim_period 小于我对目标的容忍度的两倍。否则,机器人将更喜欢在其目标位置范围外的原地旋转,而不是朝着目标移动。
-
准确的轨迹模拟还取决于从里程计中获得合理的速度估计。这是因为 dwa_local_planner 和 base_local_planner 都使用此速度估计值以及机器人的加速度限制来确定规划周期的可行速度空间。虽然来自里程计的速度估计不一定是完美的,但重要的是要确保它至少接近获得最佳行为。
-
如果使用的是base local planner,里面有两个参数pdist_scale 和gdist_scale ,要理解这两个参数,设想一下两个极端情况,pdist_scale很大,gdist_scale很小,这时候小车会不动,因为所有规划出的局部路径都将导致离开全局路径,小车还不如停在原地不动,得分高;如果pdist_scale很小,gdist_scale很大,这时候小车将朝着局部目标点(如果全局目标点在局部规划范围外,局部目标点就是全局路径在局部规划范围外的第一个点)或者全局目标点跑,完全不照全局路径走;这时候有个不好的影响是,狭窄通道或者避障转不过弯,因为局部路径规划给出的路径全部都是朝着目标走,而朝着目标走的局部路径都被障碍物挡住了,因此全部被否决,小车原地转圈。因此实际中还是应当将pdist_scale取得大一点,gdist_scale取得小一点。
-
amcl粒子云在小车持续转弯后迅速发散问题,或者迟迟不收敛。这时候你需要调试你的里程计,确保有一定的准度。如果你觉得里程计还是挺准的,记得要将amcl参数配置的关于里程计的参数odom_alpha1~5 这几个参数调节小一点,因为它是设定里程计方差的,如果你设置过大,那就意味着要amcl不相信你的里程计,全部靠amcl来估计,因此粒子云会表现得不太稳定。
-
如果你发现在rviz中小车完全没有按照局部规划路径跑,那就是你的里程计给出的twist信息错误了。好好找找问题。
至此,准备完毕,可以进行导航
英文版来源:http://wiki.ros.org/navigation/Tutorials/Navigation%20Tuning%20Guide
中文版来源:https://www.ncnynl.com/archives/201708/1882.html
TF学习资料:http://wiki.ros.org/cn/navigation/Tutorials/RobotSetup/TF
ROS 导航调优的指南 https://kaiyuzheng.me/documents/navguide.pdf,涵盖范围包括设置速度和加速度、全局规划器、局部规划器(特别是DWA 本地规划器)、代价图、AMCL(简要)、恢复行为等。
ROS中局部规划器介绍:https://blog.csdn.net/lh2008xp/article/details/89214582
视频学习资料https://www.youku.com/profile/index/?spm=a2hbt.13141534.1_1.1&uid=UMTMxMjkxNzM0NA==