move_base的参数注释
<node pkg="move_base" type="move_base" name="move_base">
<!--
--costmap_common_params.yaml这个文件描述了代价地图的形状,用单一文件描述可以避免分发给全局规划器和局部规划器的形状不一致。
--ns表示命名空间,可以分别给不同的地图
--global_costmap_params.yaml和local_costmap_params.yaml这个文件主要描述地图的计算范围和频率,全局和局部不一样,所以用两个文件
--这个文件主要描述地图的计算范围和频率
-->
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/global_costmap_params.yaml" command="load" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/local_costmap_params.yaml" command="load" />
<param name="base_global_planner" value="global_planner/GlobalPlanner" />
<param name="base_local_planner" value="wpbh_local_planner/WpbhLocalPlanner" />
</node>
全局代价地图和局部代价地图相同的参数
costmap_common_params.yaml
<!--机器人底盘半径-->
robot_radius: 0.25
<!--膨胀区域的半径-->
inflation_radius: 0.5
<!--6m内扫描到的障碍物都会被加入到代价地图-->
obstacle_range: 6.0
<!--6m内被穿透的栅格都会从代价地图中清除-->
raytrace_range: 6.0
<!--动态障碍物的观测来源,底盘上的激光雷达,头上的观测相机-->
observation_sources: base_lidar head_kinetc2
base_lidar: {
<!--消息包的类型-->
data_type: LaserScan,
topic: /scan,
<!--是否将扫描到的障碍物添加到代价地图-->
marking: true,
<!--是否把扫描到的障碍物残影清除掉-->
clearing: true
}
<!--将相机得到的障碍物信息投影到代价地图里-->
head_kinect2: {
data_type:PointCloud2,
topic: /kinect2/sd/points,
marking:true,
clearing:true,
max_obstacle_height:1.5,
min_obstacle_height:0.2
}
全局代价地图独有的参数
global_costmap_params.yaml
global_costmap:
<!--地图的坐标系名称-->
global_frame: map
<!--机器人底盘的坐标系名称-->
robot_base_frame: base_footprint
<!--是否将map_server发来的地图数据做为初始地图
--如果设置为false,初始为空的地图,需要建立一套动态建图机制来为它提供导航依据
--在有些导航目标点所在的场景是未知区域,就需要设置为false,一边建图一边导航。
-->
static_map: true
<!--传感器观测到的障碍物添加到代价地图里的频率,1秒钟添加1次-->
update_frequency: 1.0
<!--发送频率,发送给rviz进行显示的频率,和更新频率保持一致-->
publish_frequency: 1.0
<!--tf延时的容忍值
--传感器到机器人坐标系的tf(laser_frame==========base_footprint)
--里程计的tf(base_footprint===========odom)
--amcl节点发布的tf(map=========odom)
-->
transform_tolerance: 1.0
局部代价地图独有的参数
local_costmap_params.yaml
local_costmap:
<!--地图的坐标系名称
--这里不是map是因为amcl输出的tf会跳变,会导致运动不平滑
--而odom输出的tf相对稳定并且平滑,已于运动控制的实现
-->
global_frame: odom
robot_base_frame: base_footprint
<!--不使用slam之前建好的全局地图,使用激光雷达当前扫描到的临时地图-->
static_map: false
<!--局部地图的范围是否跟着机器人一起移动-->
rolling_window: true
<!--局部地图的范围尺寸3米-->
width: 3.0
height: 3.0
<!--局部地图的更新频率,设置为激光雷达扫描的频率-->
update_frequency: 10.0
publish_frequency: 10.0
transform_tolerance: 1.0
如图是:robot_radius和inflation_radius的区别
Recovery Behaviors
导航流程图
参数设置
global_costmap_params.yaml
recovery_behaviors:
- name: 'conservative_reset'
type: 'clear_costmap_recovery/ClearCostmapRecovery'
- name: 'rotate_recovery'
type: 'rotate_recovery/RotateRecovery'
- name: 'aggressive_reset'
type: 'clear_costmap_recovery/ClearCostmapRecovery'
- name: 'reset_recovery'
type: 'clear_costmap_recovery/ClearCostmapRecovery'
conservative_reset:
<!--清除范围,以机器人为中间的正方形边长为2米
--如果设置为0.0
--则清除所有地图的障碍层地图
-->
reset_distance: 2.0
<!--要清除哪一层地图:这里是障碍物层
-->
layer_names: ["obstacle_layer"]
aggressive_reset:
reset_distance: 0.0
layer_names: ["obstacle_layer"]
reset_recovery :
reset_distance: 1.84
<!--要清除哪一层地图:这里是障碍物层
--必须改这个,因为ros里有一个bug
-->
layer_names: ["obstacle_layer"]
新的恢复行为流程:
地图分层
Static 静态层
Obstacles 障碍物层
Inflation 膨胀层
Master 最终的代价地图
全局规划器
ros的3种全局规划器
各个全局规划器之间的区别
下图为Global_planner切换A*算法需要加入的参数
局部规划器
Trajectory Planner 是ros默认使用的规划器内部使用DWA算法(代码可读性不高)
DWA Planner 是Trajectory Planner的替代的规划器,具有较好的效果
Eband Planner和TEB Planner的原理基本一样
TEB Planner 加入了时间因素的考虑,提供了代价地图的优化插件,运动平滑性和执行效率更高(与Eband Planner对比一般选用这个)
WpbhLocalPlanner的原理是将激光雷达采集到的障碍点信息,把代价地图和Dijkstra算法在局部规划器里又实现一遍
DWA规划器
生成轨迹的考虑因素:
底盘加速度的限制
与障碍物保持有效的刹车距离
尽快运动到轨迹终点
挑选轨迹的考虑因素:
运动轨迹和全局导航路线的贴合程度
轨迹末端和目标点的距离
轨迹路线和障碍物之间的距离
可以使用实时动态调参工具设定dwa的参数
rosrun rqt_reconfigure rqt_reconfigure
将动态调参后的值写入dwa_local_planner_params.yaml后保存,就可以下次继续使用
dwa_local_planner_params.yaml
DWAPlannerROS:
# 速度参数
max_vel_x: 0.3 # 最大x方向速度
#!!!比较有争议!!!
min_vel_x: -0.05 # 最小x方向速度(设置负数将会允许倒车)
max_vel_y: 0.0 # 差分驱动机器人的最大y方向速度为 0.0
min_vel_y: 0.0 # 差分驱动机器人的最小y方向速度为 0.0
max_vel_trans: 0.3 # 最大平移速度
min_vel_trans: 0.01 # 最小平移速度(建议不要设置为 0.0 )
trans_stopped_vel: 0.1 # 当平移速度小于这个值,就让机器人停止
acc_lim_trans: 2.5 # 最大平移加速度
acc_lim_x: 2.5 # x方向的最大加速度上限
acc_lim_y: 0.0 # y方向的加速度上限(差分驱动机器人应该设置为 0.0 )
max_vel_theta: 1.0 # 最大旋转速度,略小于基座的功能
min_vel_theta: -0.01 # 当平移速度可以忽略时的最小角速度
theta_stopped_vel: 0.1 # 当旋转速度小于这个值,就让机器人停止
acc_lim_theta: 6.0 # 旋转的加速度上限
# 目标容差参数
yaw_goal_tolerance: 0.1 # 目标航向容差
xy_goal_tolerance: 0.05 # 目标xy容差
latch_xy_goal_tolerance: false # 到达目标容差范围后,停止移动,只旋转调整航向
# 向前模拟参数
sim_time: 1.7 # 模拟时间,默认值 1.7
vx_samples: 3 # x方向速度采样数,默认值 3
vy_samples: 1 # 差分驱动机器人y方向速度采样数,只有一个样本
vtheta_samples: 20 # 旋转速度采样数,默认值 20
# 轨迹评分参数
#!!!!这几个最为重要!!!
path_distance_bias: 32.0 # 靠近全局路径的权重,默认值 32.0
goal_distance_bias: 24.0 # 接近导航目标点的权重,默认值 24.0
occdist_scale: 0.01 # 控制器避障的权重,默认值 0.01
forward_point_distance: 0.325 # 从机器人到评分点的位置,默认值 0.325
stop_time_buffer: 0.2 # 在碰撞前机器人必须停止的时间长度,留出缓冲空间,默认值 0.2
scaling_speed: 0.25 # 缩放机器人速度的绝对值,默认值 0.25
max_scaling_factor: 0.2 # 机器人足迹在高速时能缩放的最大系数,默认值 0.2
# 防振动参数
oscillation_reset_dist: 1.05 # 重置振动标志前需要行进的距离,默认值 0.05
# 辅助调试选项
publish_traj_pc : true # 是否在 RViz 里发布轨迹
publish_cost_grid_pc: true # 是否在 RViz 里发布代价网格
global_frame_id: odom # 基础坐标系
# 差分驱动机器人配置
holonomic_robot: false # 是否全向移动机器人
WpbhLocalPlanner规划器
AMCL
释放出多个粒子分身,经过匹配和淘汰,保留最优的粒子。
参数文件:
~/catkin_ws/src/wpb_home/wpb_home_tutorials/nav_lidar/
amcl_diff.launch
amcl_omni.launch