ROS入门 7.2.4 导航实现04_路径规划


《ROS入门-理论与实践》视频教程镇楼


毋庸置疑的,路径规划是导航中的核心功能之一,在ROS的导航功能包集navigation中提供了 move_base 功能包,用于实现此功能。

1.move_base简介

move_base 功能包提供了基于动作(action)的路径规划实现,move_base 可以根据给定的目标点,控制机器人底盘运动至目标位置,并且在运动过程中会连续反馈机器人自身的姿态与目标点的状态信息。如前所述(7.1)move_base主要由全局路径规划与本地路径规划组成。

move_base已经被集成到了navigation包,navigation安装前面也有介绍,命令如下:

sudo apt install ros-<ROS版本>-navigation

2.move_base节点说明

move_base功能包中的核心节点是:move_base。为了方便调用,需要先了解该节点action、订阅的话题、发布的话题、服务以及相关参数。

2.1动作

动作订阅

move_base/goal(move_base_msgs/MoveBaseActionGoal)

  • move_base 的运动规划目标。

move_base/cancel(actionlib_msgs/GoalID)

  • 取消目标。

动作发布

move_base/feedback(move_base_msgs/MoveBaseActionFeedback)

  • 连续反馈的信息,包含机器人底盘坐标。

move_base/status(actionlib_msgs/GoalStatusArray)

  • 发送到move_base的目标状态信息。

move_base/result(move_base_msgs/MoveBaseActionResult)

  • 操作结果(此处为空)。
2.2订阅的Topic

move_base_simple/goal(geometry_msgs/PoseStamped)

  • 运动规划目标(与action相比,没有连续反馈,无法追踪机器人执行状态)。
2.3发布的Topic

cmd_vel(geometry_msgs/Twist)

  • 输出到机器人底盘的运动控制消息。
2.4服务

~make_plan(nav_msgs/GetPlan)

  • 请求该服务,可以获取给定目标的规划路径,但是并不执行该路径规划。

~clear_unknown_space(std_srvs/Empty)

  • 允许用户直接清除机器人周围的未知空间。

~clear_costmaps(std_srvs/Empty)

  • 允许清除代价地图中的障碍物,可能会导致机器人与障碍物碰撞,请慎用。
2.5参数

请参考官网。

3.move_base与代价地图

3.1概念

机器人导航(尤其是路径规划模块)是依赖于地图的,地图在SLAM时已经有所介绍了,ROS中的地图其实就是一张图片,这张图片有宽度、高度、分辨率等元数据,在图片中使用灰度值来表示障碍物存在的概率。不过SLAM构建的地图在导航中是不可以直接使用的,因为:

  1. SLAM构建的地图是静态地图,而导航过程中,障碍物信息是可变的,可能障碍物被移走了,也可能添加了新的障碍物,导航中需要时时的获取障碍物信息;
  2. 在靠近障碍物边缘时,虽然此处是空闲区域,但是机器人在进入该区域后可能由于其他一些因素,比如:惯性、或者不规则形体的机器人转弯时可能会与障碍物产生碰撞,安全起见,最好在地图的障碍物边缘设置警戒区,尽量禁止机器人进入…

所以,静态地图无法直接应用于导航,其基础之上需要添加一些辅助信息的地图,比如时时获取的障碍物数据,基于静态地图添加的膨胀区等数据。

3.2组成

代价地图有两张:global_costmap(全局代价地图) 和 local_costmap(本地代价地图),前者用于全局路径规划,后者用于本地路径规划。

两张代价地图都可以多层叠加,一般有以下层级:

  • Static Map Layer:静态地图层,SLAM构建的静态地图。
  • Obstacle Map Layer:障碍地图层,传感器感知的障碍物信息。
  • Inflation Layer:膨胀层,在以上两层地图上进行膨胀(向外扩张),以避免机器人的外壳会撞上障碍物。
  • Other Layers:自定义costmap。

多个layer可以按需自由搭配。

3.3碰撞算法

在ROS中,如何计算代价值呢?请看下图:

上图中,横轴是距离机器人中心的距离,纵轴是代价地图中栅格的灰度值。

  • 致命障碍:栅格值为254,此时障碍物与机器人中心重叠,必然发生碰撞;
  • 内切障碍:栅格值为253,此时障碍物处于机器人的内切圆内,必然发生碰撞;
  • 外切障碍:栅格值为[128,252],此时障碍物处于其机器人的外切圆内,处于碰撞临界,不一定发生碰撞;
  • 非自由空间:栅格值为(0,127],此时机器人处于障碍物附近,属于危险警戒区,进入此区域,将来可能会发生碰撞;
  • 自由区域:栅格值为0,此处机器人可以自由通过;
  • 未知区域:栅格值为255,还没探明是否有障碍物。

膨胀空间的设置可以参考非自由空间。

4.move_base使用

路径规划算法在move_base功能包的move_base节点中已经封装完毕了,但是还不可以直接调用,因为算法虽然已经封装了,但是该功能包面向的是各种类型支持ROS的机器人,不同类型机器人可能大小尺寸不同,传感器不同,速度不同,应用场景不同…最后可能会导致不同的路径规划结果,那么在调用路径规划节点之前,我们还需要配置机器人参数。具体实现如下:

  1. 先编写launch文件模板
  2. 编写配置文件
  3. 集成导航相关的launch文件
  4. 测试
4.1launch文件

关于move_base节点的调用,模板如下:

<launch><node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true"><rosparam file="$(find 功能包)/param/costmap_common_params.yaml" command="load" ns="global_costmap" /><rosparam file="$(find 功能包)/param/costmap_common_params.yaml" command="load" ns="local_costmap" /><rosparam file="$(find 功能包)/param/local_costmap_params.yaml" command="load" /><rosparam file="$(find 功能包)/param/global_costmap_params.yaml" command="load" /><rosparam file="$(find 功能包)/param/base_local_planner_params.yaml" command="load" /></node></launch>

launch文件解释:

启动了 move_base 功能包下的 move_base 节点,respawn 为 false,意味着该节点关闭后,不会被重启;clear_params 为 true,意味着每次启动该节点都要清空私有参数然后重新载入;通过 rosparam 会载入若干 yaml 文件用于配置参数,这些yaml文件的配置以及作用详见下一小节内容。

4.2配置文件

关于配置文件的编写,可以参考一些成熟的机器人的路径规划实现,比如: turtlebot3,github链接:https://github.com/ROBOTIS-GIT/turtlebot3/tree/master/turtlebot3_navigation/param,先下载这些配置文件备用。

在功能包下新建 param 目录,复制下载的文件到此目录: costmap_common_params_burger.yaml、local_costmap_params.yaml、global_costmap_params.yaml、base_local_planner_params.yaml,并将costmap_common_params_burger.yaml 重命名为:costmap_common_params.yaml。

配置文件修改以及解释:

4.2.1costmap_common_params.yaml

该文件是move_base 在全局路径规划与本地路径规划时调用的通用参数,包括:机器人的尺寸、距离障碍物的安全距离、传感器信息等。配置参考如下:

#机器人几何参,如果机器人是圆形,设置 robot_radius,如果是其他形状设置 footprint
robot_radius: 0.12 #圆形
# footprint: [[-0.12, -0.12], [-0.12, 0.12], [0.12, 0.12], [0.12, -0.12]] #其他形状obstacle_range: 3.0 # 用于障碍物探测,比如: 值为 3.0,意味着检测到距离小于 3 米的障碍物时,就会引入代价地图
raytrace_range: 3.5 # 用于清除障碍物,比如:值为 3.5,意味着清除代价地图中 3.5 米以外的障碍物#膨胀半径,扩展在碰撞区域以外的代价区域,使得机器人规划路径避开障碍物
inflation_radius: 0.2
#代价比例系数,越大则代价值越小
cost_scaling_factor: 3.0#地图类型
map_type: costmap
#导航包所需要的传感器
observation_sources: scan
#对传感器的坐标系和数据进行配置。这个也会用于代价地图添加和清除障碍物。例如,你可以用激光雷达传感器用于在代价地图添加障碍物,再添加kinect用于导航和清除障碍物。
scan: {sensor_frame: laser, data_type: LaserScan, topic: scan, marking: true, clearing: true}
4.2.2global_costmap_params.yaml

该文件用于全局代价地图参数设置:

global_costmap:global_frame: map #地图坐标系robot_base_frame: base_footprint #机器人坐标系# 以此实现坐标变换update_frequency: 1.0 #代价地图更新频率publish_frequency: 1.0 #代价地图的发布频率transform_tolerance: 0.5 #等待坐标变换发布信息的超时时间static_map: true # 是否使用一个地图或者地图服务器来初始化全局代价地图,如果不使用静态地图,这个参数为false.
4.2.3local_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 #是否使用动态窗口,默认为false,在静态的全局地图中,地图不会变化width: 3 # 局部地图宽度 单位是 mheight: 3 # 局部地图高度 单位是 mresolution: 0.05 # 局部地图分辨率 单位是 m,一般与静态地图分辨率保持一致
4.2.4base_local_planner_params

基本的局部规划器参数配置,这个配置文件设定了机器人的最大和最小速度限制值,也设定了加速度的阈值。

TrajectoryPlannerROS:# Robot Configuration Parametersmax_vel_x: 0.5 # X 方向最大速度min_vel_x: 0.1 # X 方向最小速速max_vel_theta:  1.0 # min_vel_theta: -1.0min_in_place_vel_theta: 1.0acc_lim_x: 1.0 # X 加速限制acc_lim_y: 0.0 # Y 加速限制acc_lim_theta: 0.6 # 角速度加速限制# Goal Tolerance Parameters,目标公差xy_goal_tolerance: 0.10yaw_goal_tolerance: 0.05# Differential-drive robot configuration
# 是否是全向移动机器人holonomic_robot: false# Forward Simulation Parameters,前进模拟参数sim_time: 0.8vx_samples: 18vtheta_samples: 20sim_granularity: 0.05
4.2.5参数配置技巧

以上配置在实操中,可能会出现机器人在本地路径规划时与全局路径规划不符而进入膨胀区域出现假死的情况,如何尽量避免这种情形呢?

全局路径规划与本地路径规划虽然设置的参数是一样的,但是二者路径规划和避障的职能不同,可以采用不同的参数设置策略:

  • 全局代价地图可以将膨胀半径和障碍物系数设置的偏大一些;
  • 本地代价地图可以将膨胀半径和障碍物系数设置的偏小一些。

这样,在全局路径规划时,规划的路径会尽量远离障碍物,而本地路径规划时,机器人即便偏离全局路径也会和障碍物之间保留更大的自由空间,从而避免了陷入“假死”的情形。

4.3launch文件集成

如果要实现导航,需要集成地图服务、amcl 、move_base 与 Rviz 等,集成示例如下:

<launch><!-- 设置地图的配置文件 --><arg name="map" default="nav.yaml" /><!-- 运行地图服务器,并且加载设置的地图--><node name="map_server" pkg="map_server" type="map_server" args="$(find mycar_nav)/map/$(arg map)"/><!-- 启动AMCL节点 --><include file="$(find mycar_nav)/launch/amcl.launch" /><!-- 运行move_base节点 --><include file="$(find mycar_nav)/launch/path.launch" /><!-- 运行rviz --><node pkg="rviz" type="rviz" name="rviz" args="-d $(find mycar_nav)/rviz/nav.rviz" /></launch>
4.4测试

1.先启动 Gazebo 仿真环境(此过程略);

2.启动导航相关的 launch 文件;

3.添加Rviz组件(参考演示结果),可以将配置数据保存,后期直接调用;

全局代价地图与本地代价地图组件配置如下:

全局路径规划与本地路径规划组件配置如下:

4.通过Rviz工具栏的 2D Nav Goal设置目的地实现导航。

5.也可以在导航过程中,添加新的障碍物,机器人也可以自动躲避障碍物。


另请参考:

  • http://wiki.ros.org/move_base

7.2.4 导航实现04_路径规划相关推荐

  1. 导轮式机器人_轮式移动机器人导航控制与路径规划研究

    摘要: 随着计算机,网络,机械电子,信息,自动化以及人工智能等技术的飞速发展,移动机器人的研究进入了一个崭新的阶段.同时,太空资源,海洋资源的开发与利用为移动机器人的发展提供了广阔的空间. 本文结合& ...

  2. 机器人导航(仿真)(三)——路径规划(更新中)

    参考视频:[奥特学园]ROS机器人入门课程<ROS理论与实践>零基础教程_哔哩哔哩_bilibili 参考文档:http://www.autolabor.com.cn/book/ROSTu ...

  3. 地图导航中的路径规划算法(综述)

    综述介绍+本人研究与实践结果--实际是论文 相关的路径规划算法,静态路网中,通常使用双向A*算法 常见的其他搜索算法,IA*(迭代A*),内存限定A*,分层路网A*(将高速路网构建成一个新的路网), ...

  4. ROS 教程2 机器人雷达建图 蒙特卡洛定位 导航 路径规划 仿真

    ros 机器人雷达建图 蒙特卡洛定位 导航 路径规划 仿真 move_base gmapping acml 博文github 一.安装 turtlebot 移动机器人底座 进行导航 1.安装系统依赖 ...

  5. android高德地图线路,独立路径规划-路线规划-开发指南-Android 导航SDK | 高德地图API...

    基本介绍 独立路径规划是指路径规划的结果不会自动应用于当前导航,也不会干扰当前的导航,需要手动调用API传入路径规划结果来开始导航.可用于不干扰本次导航的单独路径规划场景,比如路线预览等.适用于驾车/ ...

  6. 学习笔记之——路径规划

    最近在做移动机器人路径规划相关的topic,打算对路径规划算法做一个调研,并写下这篇记录.本博文的大部分内容来源于网络的博客或者论文,相关的参考也会给出来.本博文仅作本人学习记录用. 目录 引言 什么 ...

  7. 招聘路径规划算法工程师岗位

    工作职责: 1.负责导航定位领域路径规划相关算法的研发平台搭建和仿真验证: 2.负责将相关算法实现到产品的嵌入式系统中. 任职要求: 1.自动化.电子工程.计算机科学或相关专业硕士及以上学历,拥有汽车 ...

  8. ROS入门(九)——机器人自动导航(介绍、地图、定位和路径规划)

    所用的学习链接: [奥特学园]ROS机器人入门课程<ROS理论与实践>零基础教程P289-314 [以上视频笔记见http://www.autolabor.com.cn/book/ROST ...

  9. ROS探索总结(十三)(十四)(十五)——导航与定位框架 move_base(路径规划) amcl(导航与定位)

    ROS探索总结(十三)--导航与定位框架 导航与定位是机器人研究中的重要部分.         一般机器人在陌生的环境下需要使用激光传感器(或者深度传感器转换成激光数据),先进行地图建模,然后在根据建 ...

最新文章

  1. ogg mysql的原理_OGG基础原理了解
  2. jQuery队列控制方法详解queue()/dequeue()/clearQueue()
  3. python基础知识点-Python基础中的29个知识点
  4. Linux阶段总结shell脚本
  5. java9.0.1教学,零基础Java基础教程【9天入门】
  6. 计算机技术基础 VB 答案,《计算机技术基础(VB)》武汉理工大学20春作业一
  7. linux 服务器间通信,Linux 下的进程间通信:套接字和信号 | Linux 中国
  8. GPUImage使用之stillCamera多滤镜
  9. paip.提升性能---mysql 性能 测试以及 参数调整.txt
  10. 生命游戏(Anylogic实现)
  11. 矩阵求导法则,梯度求导方式
  12. 批量保存网页_一键下载网页所有图片,把美丽存下来
  13. Redis集群之Redis-Cluster实践详解
  14. Vue脚手架安装与使用
  15. 几种 Proximity Graphs 的单调性分析
  16. IP更新、释放、清除DNS的详细操作方法
  17. 最严“22条措施”打击市场乱象 云南旅游“浴火重生”
  18. JS 滚动屏幕至顶端
  19. Android图片处理之Fresco初实践
  20. 基辛格和张忠谋对骂,源于Intel已到生死关头

热门文章

  1. GMT、UTC与24时区 等时间概念
  2. 程序崩溃导致火卫一土壤火星探测器失败
  3. 卷积神经网络模型研究
  4. C++ move()函数
  5. Python灰度图像和彩色图像的读取、显示。图像求反。
  6. 领:西安交通大学MBA提前面试真题
  7. asn1c linux使用方法,asn1c工具使用
  8. C++面试知识-计算机网络
  9. 树莓派做无线打印服务器,怎样用树莓派制作无线打印机
  10. jquery实现计算两个日期之间天数