gmapping建图,然后可以利用建好的图来定位和避障。如果你来做这个任务,会很自然的想到,静态障碍和动态障碍分层处理,这也就是为啥会有,静态层、障碍物层和膨胀层。而让机器人到达目标位置,当前点和目标点之间如何到达,需要一个全局的“天眼”——global_planner,在全局规划的过程中,遇到障碍了,需要局部做调整,因此引入了local planer。
根据官网nav_core这里的描述,ROS1内置三种全局规划算法: global_planner、navfn和carrot planner。
其中navfn是最常见的也是默认的全局规划器,使用的是Dijkstra’s算法来计算初始位置和目标位置之间的最短路径。carrot_planner的适用性不强,一般在某些特定的场景较为有效(比如让机器人移动到离障碍物尽可能近的场景)。global_planner可以说是navfn的升级版本,虽然navfn内置有Dijkstra’s和A的两种算法的实现,但是在早期版本中A算法的实现有些bug未修复,故认为navfn使用的是Dijkstra’s算法,而在之后版本的升级中为了兼容老版本,所以保留了navfn但也推出了global_planner,global_planner既提供了Dijkstra’s和A*算法的实现,还支持自定义的全局规划器插件,可以说比navfn更为灵活。
实际来看就一种,第二种因为有遗留bug被第一种替代,第三种主要是当目标非常靠近障碍或在障碍里才使用,实际比较少见人配置使用。根据后面搜索还有这两种global planner,感兴趣的可以研究下:
http://wiki.ros.org/dlux_global_planner
https://github.com/ros-planning/navigation_experimental/tree/melodic-devel/sbpl_lattice_planner
总的来说move_base的配置离不开这6个文件,最多也就这几个了。
在启动move_base节点时,前四个参数是配置代价地图相关参数,首先加载了costmap_common_params.yaml到global_costmap和local_costmap两个命名空间中,因为该配置文件是一个通用的代价地图配置参数,即local_costmap和global_costmap都需要配置的参数。然后下面的local_costmap_params.yaml是专门为了局部代价地图配置的参数,global_costmap_params.yaml是专门为全局代价地图配置的参数。而后面三个是配置路径规划相关参数。
#robot_radius: 0.20
footprint: [[0.22, 0.22], [-0.22, 0.22], [-0.22, -0.22], [0.22, -0.22]] # Real is 0.2
# map_type: voxel # From turtlebot2, 3D map
# map_type: costmap # From turtlebot3, 2D map
obstacle_layer:
enabled: true
obstacle_range: 3.0 # 规划考虑几米内障碍物
raytrace_range: 3.5 # 实时清除几米内障碍物
max_obstacle_height: 0.5
unknown_threshold: 15
mark_threshold: 0
combination_method: 1
track_unknown_space: true #true needed for disabling global path planning through unknown space
origin_z: 0.0
z_resolution: 0.2
z_voxels: 2
publish_voxel_map: false
observation_sources: scan
scan:
data_type: LaserScan
topic: scan
marking: true
clearing: true
min_obstacle_height: 0.05
max_obstacle_height: 0.5
# 膨胀层,用于在障碍物外标记一层危险区域,在路径规划时需要避开该危险区域
inflation_layer:
enabled: true
cost_scaling_factor: 4.0 # 由于在公式中cost_scaling_factor被乘了一个负数,所以增大比例因子反而会降低代价 (default: 10)
inflation_radius: 0.5 # max. distance from an obstacle at which costs are incurred for planning paths.
static_layer:
enabled: true
下面来依次解释下各参数的意义:
![[Pasted image 20220704173900.png]]
global_costmap:
global_frame: map
robot_base_frame: base_link
update_frequency: 1.0 # 全局地图,通常会设定一个相对较小、在1.0到5.0之间的值。 单位为赫兹
publish_frequency: 0.5 # 对于静态的全局地图来说,不需要不断发布
static_map: true
transform_tolerance: 0.5
plugins:
- {name: static_layer, type: "costmap_2d::StaticLayer"}
- {name: obstacle_layer, type: "costmap_2d::VoxelLayer"}
- {name: inflation_layer, type: "costmap_2d::InflationLayer"}
下面是该全局代价地图配置文件中各参数的意义:
local_costmap:
global_frame: odom
robot_base_frame: base_link
update_frequency: 10.0
publish_frequency: 10.0
static_map: false
rolling_window: true
width: 4.0
height: 4.0
resolution: 0.05
transform_tolerance: 0.5
plugins:
- {name: obstacle_layer, type: "costmap_2d::ObstacleLayer"}
- {name: inflation_layer, type: "costmap_2d::InflationLayer"}
下面是详细解释每个参数的意义:
move_base - ROS Wiki
这里的参数可以在这里设置,也可以在顶层的launch文件中设置。比如有的时候会见到在launch中指定global或者local planner 。
base_global_planner—— default: navfn/NavfnROS
base_local_planner—— default: base_local_planner/TrajectoryPlannerROS
>
>
>
另一个需要注意的是service: make_plan; 当你只需要规划的路径结果而不需要机器人实际去执行,可以call 这个service去获得。比如你需要一条路径,再用其他的跟踪器去跟踪就可以这么办。
#base_global_planner: navfn/NavfnROS
#base_global_planner: global_planner/GlobalPlanner
#base_local_planner: base_local_planner/TrajectoryPlannerROS
#base_local_planner: dwa_local_planner/DWAPlannerROS
controller_frequency: 10.0 # default 20.0
planner_patience: 5.0
controller_patience: 15.0
conservative_reset_dist: 3.0
recovery_behavior_enabled: true
clearing_rotation_allowed: true
shutdown_costmaps: false
oscillation_timeout: 10.0
oscillation_distance: 0.2
planner_frequency: 5.0
下面是详细解释每个参数的意义:
global_planner - ROS Wiki 官方解释
GlobalPlanner:
allow_unknown: false #默认true,是否允许路径穿过未知区域
default_tolerance: 0.2 #默认0.0,目标容差
visualize_potential: false #默认false,是否显示从PointCloud2计算得到的势区域
use_dijkstra: true #默认true,true表示使用dijkstra's否则使用A*
use_quadratic: true #默认true,true表示使用二次函数近似函数
use_grid_path: false #默认false,true表示使路径沿栅格边界生成,否则使用梯度下降算法
old_navfn_behavior: false #默认false,是否复制navfn规划器的结果
lethal_cost: 253 #默认253,致命代价值
neutral_cost: 50 #默认50,中等代价值
cost_factor: 3.0 #默认3.0,代价因子
publish_potential: true #默认true,是否发布costmap的势函数
orientation_mode: 0 #默认0,设置点的方向
orientation_window_size: 1 #默认1,根据orientation_mode指定的位置积分确定窗口方向
下面来依次解释下各参数意义:
这里以常用的DWA 为例,DWA相较于TEB而言参数比较少,含义也很清晰,网上的资源会比较多一些。
dwa_local_planner - ROS Wiki
DWAPlannerROS:
# Robot Configuration Parameters
max_vel_x: 0.26
min_vel_x: 0.0
max_vel_y: 0.0
min_vel_y: 0.0
# The velocity when robot is moving in a straight line
max_vel_trans: 0.26
min_vel_trans: 0.13
max_vel_theta: 1.82
min_vel_theta: 0.9
acc_lim_x: 2.5
acc_lim_y: 0.0
acc_lim_theta: 3.2
# Goal Tolerance Parametes
xy_goal_tolerance: 0.05
yaw_goal_tolerance: 0.17
latch_xy_goal_tolerance: false
# Forward Simulation Parameters
sim_time: 2.0
vx_samples: 20
vy_samples: 0
vth_samples: 40
controller_frequency: 10.0
# Trajectory Scoring Parameters
path_distance_bias: 32.0
goal_distance_bias: 20.0
occdist_scale: 0.02
forward_point_distance: 0.325
stop_time_buffer: 0.2
scaling_speed: 0.25
max_scaling_factor: 0.2
# Oscillation Prevention Parameters
oscillation_reset_dist: 0.05
# Debugging
publish_traj_pc : true
publish_cost_grid_pc: true
感谢大佬的分享,转载文链接:https://blog.csdn.net/yaked/article/details/125503202