之前博客《ROS学习笔记之——Navigation Stack》和《ROS学习笔记之——路径规划及avoid obstacles》已经对ROS中的navigation做了一些学习了,本博文再对其中一些不够深入的知识做查漏补缺~
目录
移动/躲避障碍物(move / collision avoidance)
距离传感器(‘/scan , sensor_msgs/LaserScan or sensor_msgs/PointCloud)
目标坐标(‘/move_base_simple/goal , geometry_msgs/PoseStamped)
速度命令(‘/cmd_vel , geometry_msgs/Twist)
地图
ROS中一般采用的是二维占用网格地图(OGM,Occupancy Grid Map)又或者直接称之为栅格地图。如下图所示。白色是机器人可以移动的自由区域(free area),黑色是机器人不能移动的占用区域(occupied area),灰色是未被确认的未知区域(unknown area)。
这些区域用从0到255表达的灰度(gray scale)值表示。该值是通过贝叶斯定理的后验概率获得的,该概率代表占用状态的占用概率。占用概率occ表示为“occ =(255- color_avg)/255.0”。如果图像是24位,则是“color_avg =(一个单元的灰度值/0xFFFFFF×255)”。这个occ越接近1,它被占用的概率越大,越接近0,被占用的概率就越小。
当它以ROS消息(nav_msgs/OccupancyGrid)发布时(所以,理论上这个地图也是可以被ROS发布的?),会被重新定义为占有度,是[0〜100]之间的整数。越接近“0”就越接近移动自由的区域(free area),而越接近“100”就越是不可移动的已占用的区域(occupied area)。此外,“-1”是定义为未知区域(unknown area)。
在ROS中,地图信息以*.pgm文件格式(portable graymap format)存储和使用。它还包含一个*.yaml文件,它也包含地图信息。举个例子如下所示
image: map.pgm
resolution: 0.050000
origin: [-10.000000, -10.000000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196
每个像素代表0.05米。
origin是地图的原点,origin的每个数字代表x、y和yaw。
negate会反转黑白。
每个像素的颜色如下确定:由当占用概率超过占用阈值(occupied_thresh)时表示为黑色的占用区域,而当占用概率小于自由阈值(free_thresh)时表示为白色的自由区域(free area)。
移动/躲避障碍物(move / collision avoidance)
如果按照在运动规划中创建的移动轨迹向机器人发出速度命令,则机器人会根据移动轨迹移动到目的地。由于感应、位置估计和运动规划在移动时仍在被执行,因此使用动态窗口方法(DWA)算法可避免突然出现的障碍物和移动物体。
导航所需要的信息
‘/odom’,nav_msgs/Odometry
机器人的测位信息用于局部路径规划,利用接收到的机器人的当前速度等信息,产生局部移动路径或避开障碍物
坐标变换(‘/tf , tf/tfMessage)
由于机器人传感器的位置根据机器人的硬件配置而变化,所以ROS使用tf相对坐标变换。这只是简单地利用测位获得机器人的位置,例如测位描述“以机器人的位置为原点,传感器在x、y、z坐标坐标系中位于某某位置”。例如,经过odom→base_footprint→base_link→base_scan的变换后以话题来发布。它从move_base节点接收这些信息,并根据机器人的位置和传感器的位置执行移动路径规划。
距离传感器(‘/scan , sensor_msgs/LaserScan or sensor_msgs/PointCloud)
从传感器测量得到的距离值。通常使用LDS和RealSense、Kinect、Xtion等。该距离传感器使用AMCL(adaptive Monte Carlo localization,自适应蒙特卡罗定位)来估计机器人的当前位置,且规划机器人的运动。
地图(‘/map , nav_msgs/GetMap)
导航使用占用网格地图(occupancy grid map)
目标坐标(‘/move_base_simple/goal , geometry_msgs/PoseStamped)
目标坐标由用户直接指定。可以使用如平板电脑的设备创建和使用单独的目标坐标命令功能包,但在本教程中,将在ROS的可视化工具RViz中设置目标坐标。目标坐标由二维坐标(x,y)和姿态θ组成。
速度命令(‘/cmd_vel , geometry_msgs/Twist)
根据最终规划的移动轨迹发布移动机器人的速度命令,而机器人根据该命令移动到目的地。
turtlebot3_navigation导航包的各节点和话题状态
运行了下面命令后,打开rqt_graph查看ROS环境中正在运行的节点和话题信息
roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml
其中move_base_simple/goal需要在rviz中指定目标坐标时才会被发布。
查看发布话题的内容
rostopic echo /topicname
turtlebot3_navigation导航包的一些参数设置
在之前博客《ROS学习笔记之——路径规划及avoid obstacles 》中已经show过导航包的launch文件,接下来看一下参数设置文档
move_base的参数设置
/home/kwanwaipang/catkin_ws/src/turtlebot3/turtlebot3_navigation/param/move_base_params.yaml
# 运动规划的move_base的参数设置文件
shutdown_costmaps: false
# move_base 处于非活动状态时,是否停止 costmap 节点的选项
controller_frequency: 10.0
# 向机器人底座发送速度命令的控制周期( Hz )
planner_patience: 5.0
# 在 space - clearing 操作之前等待查询可用规划的时间上限(以秒为单位)
controller_patience: 15.0
# 控制器在执行 space - clearing 操作之前等待接收控制信息的最长时间(以秒为单位)
conservative_reset_dist: 3.0
planner_frequency: 5.0
# 全局规划的重复周期( Hz )
oscillation_timeout: 10.0
# 在执行还原操作( recovery behavior )之前,允许机器人来回移动的时间(以秒为单位)
oscillation_distance: 0.2
# 为使机器人不被认为是在来回移动而需要挪动的最小距离
# 以 meter 为单位,若移动大于或等于下面的距离则 oscillation_timeout 会被初始化)。
costmap的参数设置
导航使用占用网格地图。基于这种网格地图,根据机器人的位置和从传感器获得的周围信息,将各像素计算为障碍物、不可移动区域和可移动区域。这时用到的概念就是costmap。costmap由三种文件组成:公共的costmap_common_params.yaml文件、全局区域运动规划所需的global_costmap_params.yaml文件以及本地所需的local_costmap_params.yaml文件。
costmap_common_params.yaml文件根据TurtleBot3的型号分为costmap_common_params_burger.yaml文件、costmap_common_params_waffle_pi.yaml文件和costmap_common_params_waffle.yaml文件。
首先对文件/home/kwanwaipang/catkin_ws/src/turtlebot3/turtlebot3_navigation/param/costmap_common_params_burger.yaml进行设定
# 公共的costmap_common_params.yaml文件
obstacle_range: 3.0
# 当物体与机器人的距离在如下距离内时,将物体视为障碍物
raytrace_range: 3.5
# 传感器值大于如下距离的数据被视为自由空间( freespace )
# 机器人的外部尺寸
footprint: [[-0.105, -0.105], [-0.105, 0.105], [0.041, 0.105], [0.041, -0.105]]
#robot_radius: 0.105
inflation_radius: 1.0
cost_scaling_factor: 3.0
map_type: costmap
# 指定要使用的传感器
observation_sources: scan
# 激光扫描的数据类型、话题类型、是否反映到 costmap 、是否设置障碍物高度
scan: {sensor_frame: base_scan, data_type: LaserScan, topic: scan, marking: true, clearing: true}
然后看/home/kwanwaipang/catkin_ws/src/turtlebot3/turtlebot3_navigation/param/global_costmap_params.yaml的设置
global_costmap:
global_frame: map #地图框架
robot_base_frame: base_footprint #机器人的底座
update_frequency: 10.0 #更新周期
publish_frequency: 10.0 #发布周期
transform_tolerance: 0.5 #允许的转换时间
static_map: true #是否使用给定地图的设置
然后查看/home/kwanwaipang/catkin_ws/src/turtlebot3/turtlebot3_navigation/param/local_costmap_params.yaml
local_costmap:
global_frame: odom #地图框架设置
robot_base_frame: base_footprint #机器人底座框架设置
update_frequency: 10.0 #更新周期
publish_frequency: 10.0 #发布周期
transform_tolerance: 0.5 #允许的转换时间
static_map: false #是否使用给定地图的设置
rolling_window: true #局部地图窗口设置
width: 3 #局部地图窗口宽度
height: 3 #局部地图窗口高度
resolution: 0.05 #局部地图窗口分辨率(米/单元格)
dwa_local_planner参数设置
dwa_local_planner是一个最终将移动速度命令传给机器人的功能包,会设置其参数。
/home/kwanwaipang/catkin_ws/src/turtlebot3/turtlebot3_navigation/param/dwa_local_planner_params_burger.yaml
DWAPlannerROS:
# Robot Configuration Parameters
# X轴的最大与最小速度
max_vel_x: 0.22
min_vel_x: -0.22
# Y轴的最大与最小速度(仅适用于全向机器人,因此省略)
max_vel_y: 0.0
min_vel_y: 0.0
# The velocity when robot is moving in a straight line 机器人直线运动时速率的控制
# 最大的平移速率
max_trans_vel: 0.22
min_trans_vel: 0.11
# 最大的旋转速度
max_rot_vel: 2.75
min_rot_vel: 1.37
# 加速度的限制
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: 1.5
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
Dynamic Window Approach(DWA)
动态窗口方法(Dynamic Windows Approach,DWA)是在规划移动路径和躲避障碍物时常用的方法,具体是指在机器人的速度搜索空间(velocity search space)中选择适当的速度,以躲避可能碰撞的障碍物的同时能迅速到达目的地。在ROS中,局部移动规划中曾广泛使用Trajectory planner,而最近由于DWA的性能优越,因此DWA在逐渐代替Trajectory planner。
首先,如下图所示。用平移速度v和旋转速度~为轴的速度搜索空间(velocity search space)来表示机器人,而不是用x轴和y轴的位置坐标系表示。在这个空间中,由于硬件限制,机器人具有最大允许速度,这被称为动态窗口(Dynamic Window)。
在这个动态窗口中,通过使用目标函数,获得满足条件的平移速度和旋转速度。满足条件意味着使考虑了机器人的方向、速度和碰撞的目标函数达到最大化。如果绘制出来,则如下图所示,我们可以在各种和中找到最优速度并移动机器人。
参考资料