学习笔记来源于:ROS机器人开发与实践(古月居)

一、导航框架
导航的关键是机器人定位和路径规划两大部分

move_base:实现机器人导航中的最优路径规划
amcl:实现二维地图中的机器人定位
在上述两个功能包的基础上,ROS提供一系列完整的导航框架:

机器人发布必要的传感器信息和导航的目标位置,ROS即可完成导航功能。在该框架中,move_base功能包提供导航的主要运行、交互接口。amcl功能包保障路径的准确性,对自己所处的位置进行精确定位。

首先,导航功能包采集机器人的传感器信息,达到实时避障的效果。机器人通过ROS发布sensor_msgs/LaserScan或者是三维点云的信息

其次,导航功能包发布nav_msgs/Odometry格式的里程计信息,同时发布相应的TF变换

最后,导航功能包的输出是geometry_msgs/Twist格式控制命令,机器人通过这些指令完成任务

二、move_base功能包
路径规划主要有下面的两大规划器组成:

全局路径规划(global_planner):根据给定的目标位置和全局地图进行总体的路劲规划。在导航中,使用迪特斯克或者A*算法进行全局路径的规划,计算出最佳路径
本地实施规划(local_planner):实际情况下,由于可能出现障碍物,无法完美按照全局路径规划。本地实施规划由local_planner模块实现,使用Dynamic Window Approaches算法搜索躲避障碍物行进的多条路径,综合评价标准(是否撞击障碍物,所需的时间)选取最优路径,并且计算行驶周期内的线速度和角速度,避免与动态的障碍物发生碰撞。
1.话题和服务

2.参数配置

三、amcl功能包

自主定位:机器人在任意状态下都可以推算自己在地图中的所处的位置

ROS提供一种自适应(或kld采样)的蒙特卡罗定位方法(amcl),这是一种概率统计的方法,针对已有地图使用粒子滤波器跟踪一个机器人的姿态

1.话题和服务

2.参数配置

总体过滤器参数

激光参数模型

里程计模型参数

3.坐标变换

里程计可以帮助机器人定位,而amcl也可以实现机器人定位,但是两者具有区别:

里程计定位:只是通过里程计的数据来处理/base和/odom之间的TF变换
amcl定位:可以估计及机器人在地图坐标系/map下的位姿信息,提供/base,/odom,/map之间的TF转换

四、代价地图的配置

导航地图使用两种代价地图存储周围环境的障碍信息:

全局路径规划-代价地图(global_costmap)
本地路径规划和实时避障(local_costmap)
两种代价地图需要使用一些共用的或独立的配置文件:通用配置文件、全局规划配置文件和本地规划配置文件呢

1.通用配置文件

代价地图用来存储周围环境的障碍信息,其中需要申明地图关注的机器人传感器消息,以便于地图信息更新。针对两种代价地图通用的配置选型,创建名为costmap_common_params.yaml的配置文件,解析如下:

#这两个参数用来设置代价地图中障碍物的相关阀值
obstacle_range: 2.5#用来设置障碍物的最大范围,若设置为2.5,则表在2.5m范围内检测到的障碍信息才会在地图中更新
raytrace_range: 3.0#用来设置检测自由空间的最大范围,设置为3,.0,表示在3m的范围内机器人将根据传感器的信息清楚范围内的自由空间
 
 
#footprint: [[0.175, 0.175], [0.175, -0.175], [-0.175, -0.175], [-0.175, 0.175]]
#footprint_inflation: 0.01
robot_radius: 0.175
inflation_radius: 0.1#这个是机器人和障碍物保持的最小安全距离为0.1m以上
#这个footprint参数设置机器人在二维地图上的占用的面积,参数以机器人的中心作为坐标原点
#要是机器人外形是圆形,则需要设置机器人的外形半径robot_radius
 
 
max_obstacle_height: 0.6
min_obstacle_height: 0.0
#这两个参数描述障碍物的最大高度和最小高度
 
observation_sources: scan#这里以激光雷达为例
scan: {data_type: LaserScan, topic: /scan, marking: true, clearing: true, expected_update_rate: 0}
#observation_sources参数列出了代价地图需要关注的所有的传感器信息,每个传感器信息都会在后面列出来
#data_type表示激光数据或者是点云数据使用的消息
#topic:表示传感器发布的话题的名称
#marking和clearing:表示是否需要使用传感器的实时信息来添加或清除代价地图中的障碍物信息

2.全局规划配置文件

全局规划配置文件用于存储配置全局代价地图的参数,命名为global_costmap_params.yaml,代码详解:

global_costmap:
   global_frame: map 
#用来表示全局代价地图需要在哪个参考系下运行,这里选择了map参考系
 
   robot_base_frame: base_footprint 
#参数用来表示代价地图可以参考的机器人本体的坐标系
 
   update_frequency: 1.0
#参数用来决定全局地图信息更新的频率,单位是Hz
 
   publish_frequency: 1.0
 
   static_map: true
#参数用来决定代价地图是否需要根据map_server提供的地图信息进行初始化,如果不需要使用已有的地图这最好设置为false
 
   rolling_window: false
   resolution: 0.01#分辨率
   transform_tolerance: 1.0#转换容忍
   map_type: costmap#地图类型

3.本地规划配置文件

本地规划配置文件用来存储代价地图的配置参数,命名为local_costmap_params.yaml,代码详解如下:

local_costmap:
    #下面的这几个参数和全局规划配置文件中的参数相同
   global_frame: map
   robot_base_frame: base_footprint
   update_frequency: 3.0
   publish_frequency: 1.0#参数用于设置代价地图发布可视化信息的频率,单位是Hz
   static_map: true
 
   rolling_window: false
#参数是用来设置在机器人移动过程中是否可以需要滚动窗口以保持机器人在中心位置
 
   width: 6.0
   height: 6.0
   resolution: 0.01
#这三个参数分别设置代价地图的长(米)高(米)和分辨率(米/格)虽然分辨率设置和静态地图的不同,但是一般条件下是相同的
 
   transform_tolerance: 1.0

五、本地规划器配置

本地规划器base_local_planner的主要作用是,根据规划的全局路径计算发布给机器人的速度控制指令。

该规划根据机器人的规格配置相关参数,创建名为base_local_planner_params.yaml的配置文件,代码如下:

controller_frequency: 3.0#控制频率
recovery_behavior_enabled: false
clearing_rotation_allowed: false
 
TrajectoryPlannerROS:#声明机器人本地规划采用Trajectory Rollout算法
#下面是设置算法需要用到的机器人的速度、加速度阀值等参数
   max_vel_x: 0.5
   min_vel_x: 0.1
   max_vel_y: 0.0  # zero for a differential drive robot(0是为差动机器人设置的)
   min_vel_y: 0.0
   max_vel_theta: 1.0
   min_vel_theta: -1.0
   min_in_place_vel_theta: 0.4
   escape_vel: -0.1
   acc_lim_x: 1.5
   acc_lim_y: 0.0  # zero for a differential drive robot(0是为差动机器人设置的)
   acc_lim_theta: 1.2
 
   holonomic_robot: false
   yaw_goal_tolerance: 0.1 # about 6 degrees(偏航的角度容忍度大约是6°)
   xy_goal_tolerance: 0.05  # 5 cm
   latch_xy_goal_tolerance: false
   pdist_scale: 0.4
   gdist_scale: 0.8
   meter_scoring: true
 
   heading_lookahead: 0.325
   heading_scoring: false
   heading_scoring_timestep: 0.8
   occdist_scale: 0.05
   oscillation_reset_dist: 0.05
   publish_cost_grid_pc: false
   prune_plan: true
 
   sim_time: 1.0
   sim_granularity: 0.05
   angular_sim_granularity: 0.1
   vx_samples: 8
   vy_samples: 0  # zero for a differential drive robot
   vtheta_samples: 20
   dwa: true
   simple_attractor: false