ROS系统的路径规划由move_base统筹,在move_base中集成了代价地图模块costmap_2d,全局规划器(此处使用global_planner/GlobalPlanner)和局部规划器(dwa_local_planner/DWAPlannerROS),其中costmap_2d分别衍生了全局代价地图和局部代价地图,此外还有恢复模块recovery_behaviors,采用默认值即可。
因此move_base实际需要设置六个部分的参数
- move_base自身参数
- 全局代价地图(global_costmap)
- 局部代价地图(local_costmap)
- 全局规划器(global_panner)
- 局部规划器(local_planner)
- recovery_behaviors(使用默认值先不讲述)
以上参数在move_base节点加载时全部加载,用以下参数文件格式
<launch> <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen"> <rosparam file="$(find myrobot)/param/navigation_omi/omi/costmap_common_params.yaml" command="load" ns="global_costmap" /> <rosparam file="$(find myrobot)/param/navigation_omi/omi/costmap_common_params.yaml" command="load" ns="local_costmap" /> <rosparam file="$(find myrobot)/param/navigation_omi/local_costmap_params.yaml" command="load" /> <rosparam file="$(find myrobot)/param/navigation_omi/global_costmap_params.yaml" command="load" /> <rosparam file="$(find myrobot)/param/navigation_omi/omi/base_local_planner_params.yaml" command="load" /> <rosparam file="$(find myrobot)/param/navigation_omi/omi/base_global_planner_params.yaml" command="load" /> <rosparam file="$(find myrobot)/param/navigation_omi/move_base_params.yaml" command="load" /> <remap from="/cmd_vel" to="/raw_cmd_vel"/> </node> </launch>
PART1 move_base参数
move_base自身的参数也是为了控制其他模块,有着相应的关联性,下面逐一解析
1.1 ~base_global_planner
(string, default: "navfn/NavfnROS" For 1.1+ series)
全局规划器,用于规划最优路径,但是默认值中没有没有实现A*算法的全局规划,在版本迭代优化后通常设置为global_planner/GlobalPlanner,同时可以设置A*或者D*
1.2 ~base_local_planner
(string, default: "base_local_planner/TrajectoryPlannerROS" For 1.1+ series)
局部规划器,用于运动过程中的动态避障,默认值现在通常设置为dwa_local_planner/DWAPlannerROS
1.3 ~recovery_behaviors
(list, default: [{name: conservative_reset, type: clear_costmap_recovery/ClearCostmapRecovery}, {name: rotate_recovery, type: rotate_recovery/RotateRecovery}, {name: aggressive_reset, type: clear_costmap_recovery/ClearCostmapRecovery}] For 1.1+ series)
恢复模块,一个是恢复行为rotate_recovery,一个是地图清理clear_costmap_recovery,通常使用默认值即可
注意:当全局路径规划无法到达目标点时,才会执行这个恢复模块
1.4 ~controller_frequency
(double, default: 20.0)
向机器人底盘发送的控制速度的频率,这个速度由base_local_planner计算
1.5 ~planner_patience
(double, default: 5.0)
进行全局规划的时间间隔,如果超时则认为规划失败
1.6 ~controller_patience
(double, default: 15.0)
等待控制速度的时间间隔,如果控制速度的发布超过设置时间,则认为局部路径规划失败
1.7 ~conservative_reset_dist
(double, default: 3.0)
在恢复模块执行后,重置的代价地图范围
1.8 ~recovery_behavior_enabled
(bool, default: true)
是否使用恢复模块,默认值为true
1.9 ~clearing_rotation_allowed
(bool, default: true)
是否允许旋转恢复行为,默认为true
1.10 ~shutdown_costmaps
(bool, default: false)
当move_base不活动时,是否关闭代价地图的加载
1.11 ~oscillation_timeout
(double, default: 0.0)
在执行恢复行为之前允许振荡的时间(秒)。
1.12 ~oscillation_distance
(double, default: 0.5)
机器人必须移动多远(以米计)才能被视为不摆动。
如果出现摆动则说明全局规划失败,那么将在超时后执行恢复模块。
1.13 ~planner_frequency
(double, default: 0.0)
全局规划器的执行频率,如果为0则只有出现新的目标点,才会重新规划
1.14 ~max_planning_retries
(int32_t, default: -1)
在执行恢复行为之前允许计划重试的次数.默认为-1,表示全局规划失败后立即执行恢复模块。
PART2 全局代价地图参数
全局代价地图和局部代价地图都衍生于costmap_2d功能包,参数设置也是一样的,但是考虑到路径规划和避障的职能不同,可以采用不同的参数策略。
全局代价地图可以将膨胀半径设置更大,障碍物系数设置更高,从而使得路径规划中,能够得到远离障碍物的规划路径。而在局部规划中,为了避免避障陷入困境,可以设置小一点的膨胀半径和障碍物系数,使得机器人能够绕过障碍物。
2.1 ~<name>/plugins
(sequence, default: pre-Hydro behavior)
地图序列,每层一个。每个地图都是一个包含名称和类型字段的字典。
2.2 ~<name>/global_frame
(string, default: "/map")
代价地图的世界坐标系
2.3 ~<name>/robot_base_frame
(string, default: "base_link")
机器人底座的局部坐标系
2.4 ~<name>/transform_tolerance
(double, default: 0.2)
等待坐标变换发布信息的超时时间
2.5 ~<name>/update_frequency
(double, default: 5.0)
代价地图的更新频率
2.6 ~<name>/publish_frequency
(double, default: 0.0)
代价地图的发布频率
2.7 ~<name>/rolling_window
(bool, default: false)
是否使用动态窗口,默认为false,在静态的全局地图中,地图不会变化
2.8 ~<name>/always_send_full_costmap
(bool, default: false)
是否发布全部代价地图,默认false,只会发布部分的代价地图,加载全图耗费计算资源
2.9 下面为设置代价地图的尺寸和精度参数
~<name>/width (int, default: 10)
- 代价地图宽度
~<name>/height (int, default: 10)
- 代价地图高度
~<name>/resolution (double, default: 0.05)
- 代价地图精度,即每个网格的尺寸
~<name>/origin_x (double, default: 0.0)
- 代价地图原点x坐标在世界坐标系中的位置
~<name>/origin_y (double, default: 0.0)
- 代价地图原点y坐标在世界坐标系中的位置
2.10 全局坐标到机器人底座的变换信息,可由AMCL等发布
2.11 代价地图包含多个地图层
- Static Map Layer
- Obstacle Map Layer
- Inflation Layer
- Other Layers
下面举例说明,在Inflation Layer中需要设置两个计算障碍物代价值的参数
~<name>/inflation_radius (double, default: 0.55)
膨胀半径,扩展在碰撞区域以外的代价区域,使得机器人规划路径避开障碍物
~<name>/cost_scaling_factor (double, default: 10.0)
代价比例系数,越大则代价值越小
公式如下
exp(-1.0 * cost_scaling_factor * (distance_from_obstacle - inscribed_radius))
* (costmap_2d::INSCRIBED_INFLATED_OBSTACLE - 1)
其中costmap_2d::INSCRIBED_INFLATED_OBSTACLE=254
也就是说代价值最大为253
PART3 局部代价地图参数
参数设置与全局相似,只是参数的策略上可能会不同
PART4 全局规划器参数
4.1 ~<name>/allow_unknown
(bool, default: true)
是否允许规划路径穿越未知区域
4.2 ~<name>/default_tolerance
(double, default: 0.0)
路径规划的终点与目标点的偏差距离
4.3 ~<name>/visualize_potential
(bool, default: false)
是否允许发布点云表达的代价趋势
4.4 ~<name>/use_dijkstra
(bool, default: true)
是否使用D*全局规划算法,默认为true,如果为false,则使用A*算法
4.5 ~<name>/use_quadratic
(bool, default: true)
是否使用二次逼近的趋势,默认为true,否则使用简单的线性方法
4.6 ~<name>/use_grid_path
(bool, default: false)
是否沿着网格规划路径,默认为false,false时使用最速下降法计算路径
4.7 ~<name>/old_navfn_behavior
(bool, default: false)
是否使用旧版本导航功能,默认false
4.8 ~<name>/lethal_cost
(int, default: 253)
最高的代价值,默认253
4.9 ~<name>/neutral_cost
(int, default: 50)
中性代价系数
4.10 ~<name>/cost_factor
(double, default: 3.)
占用网格的系数
4.11 ~<name>/publish_potential
(bool, default: True)
是否发布趋势,默认为true
4.12 ~<name>/orientation_mode
(int, default: 0)
方向设置,默认0,采用默认坐标系
4.13 ~<name>/orientation_window_size
(int, default: 1)
方向窗口大小,默认为1
PART5 局部规划器参数
局部规划器使用局部代价地图,实现在全局规划路径上的避障功能
5.1 速度参数配置
~<name>/acc_lim_x (double, default: 2.5)
- x轴方向最高加速度
~<name>/acc_lim_y (double, default: 2.5)
- y轴方向最高加速度
~<name>/acc_lim_th (double, default: 3.2)
- 最高旋转加速度
~<name>/max_trans_vel (double, default: 0.55)
- 最大线速度
~<name>/min_trans_vel (double, default: 0.1)
- 最小线速度
~<name>/max_vel_x (double, default: 0.55)
- 最大x轴方向线速度
~<name>/min_vel_x (double, default: 0.0)
- 最小x轴方向线速度
~<name>/max_vel_y (double, default: 0.1)
- 最大y轴方向线速度
~<name>/min_vel_y (double, default: -0.1)
- 最小y轴方向线速度
~<name>/max_rot_vel (double, default: 1.0)
- 最大旋转角速度
~<name>/min_rot_vel (double, default: 0.4)
- 最小旋转角速度
5.2 目标误差参数
~<name>/yaw_goal_tolerance (double, default: 0.05)
- 路径规划到达点与目标点的角度允许偏差
~<name>/xy_goal_tolerance (double, default: 0.10)
- 路径规划到达点与目标点的距离允许偏差
~<name>/latch_xy_goal_tolerance (bool, default: false)
- 通常不使用
5.3 前向仿真系数
~<name>/sim_time (double, default: 1.7)
- 仿真时间,仿真距离=sim_time*vel
~<name>/sim_granularity (double, default: 0.025)
- 轨迹的碰撞检测距离
~<name>/vx_samples (integer, default: 3)
- x轴方向速度采样数量
~<name>/vy_samples (integer, default: 10)
- y轴方向速度采样数量
~<name>/vth_samples (integer, default: 20)
- 角速度采样数量
~<name>/controller_frequency (double, default: 20.0)
- 发布控制速度的频率
5.4 轨迹评分参数
~<name>/path_distance_bias (double, default: 32.0)
- 局部规划路径与全局路径保持一致的权重系数
~<name>/goal_distance_bias (double, default: 24.0)
- 无论从什么路径以多大权重尝试到达目标点,增大后于全局规划路径一致性降低
~<name>/occdist_scale (double, default: 0.01)
- 权衡机器人以多大的权重躲避障碍物。该值过大会导致机器人陷入困境
~<name>/forward_point_distance (double, default: 0.325)
- 将机器人与目标点连线并延长forward_point_distance距离作为一个评分点
~<name>/stop_time_buffer (double, default: 0.2)
- 为防止碰撞,机器人必须提前停止的时间长度
~<name>/scaling_speed (double, default: 0.25)
- 开始缩放机器人足迹时的速度的绝对值,单位为m/s
~<name>/max_scaling_factor (double, default: 0.2)
- 最大缩放因子
~<name>/publish_cost_grid (bool, default: false)
- 是否发布规划器在规划路径时的代价网格.如果设置为true,那么就会在~/cost_cloud话题上发布sensor_msgs/PointCloud2类型消息
5.5 避免振荡参数
~<name>/oscillation_reset_dist (double, default: 0.05)
机器人运动多远距离才会重置振荡标记
PART6 总结
以上为move_base各个模块的参数设置说明,针对部分官网手册说明不清楚的参数,根据网友对源码的分析和工程检验,进行了更为具体的补充说明
以上的参数说明只是一个概念上的介绍,具体到导航中各个参数对导航效果的影响,需要工程经验的积累,参数的设置和计算机性能、障碍物尺寸、传感器探测距离等因素息息相关
例如在局部路径规划中,仿真时间sim_time如果设置为4s,普通计算机无法负担如此高的性能耗费,发布速度controller_frequency将会大大降低