ROS学习笔记之——navigation的进一步探索

82 篇文章 121 订阅

之前博客《ROS学习笔记之——Navigation Stack》和《ROS学习笔记之——路径规划及avoid obstacles》已经对ROS中的navigation做了一些学习了,本博文再对其中一些不够深入的知识做查漏补缺~

 

目录

地图

移动/躲避障碍物(move / collision avoidance)

导航所需要的信息

‘/odom’,nav_msgs/Odometry

坐标变换(‘/tf , tf/tfMessage)

距离传感器(‘/scan , sensor_msgs/LaserScan or sensor_msgs/PointCloud)

地图(‘/map , nav_msgs/GetMap)

目标坐标(‘/move_base_simple/goal , geometry_msgs/PoseStamped)

速度命令(‘/cmd_vel , geometry_msgs/Twist)

turtlebot3_navigation导航包的各节点和话题状态

turtlebot3_navigation导航包的一些参数设置

move_base的参数设置

costmap的参数设置

dwa_local_planner参数设置

Dynamic Window Approach(DWA)

参考资料


 

地图

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)。

在这个动态窗口中,通过使用目标函数,获得满足条件的平移速度和旋转速度。满足条件意味着使考虑了机器人的方向、速度和碰撞的目标函数达到最大化。如果绘制出来,则如下图所示,我们可以在各种和中找到最优速度并移动机器人。

 

 

参考资料

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值