博客转载自:https://blog.csdn.net/handsome_for_kill/article/details/53130707#t3

ROS导航包的应用

利用ROS Navigation功能包集跑通基于rplidar 的slam

开发环境

Ubuntu14.04+ROS indigo 
Navigation stack:amcl | base_local_planner | carrot_planner | clear_costmap_recovery | costmap_2d | dwa_local_planner | fake_localization | global_planner | map_server | move_base | move_base_msgs | move_slow_and_clear | nav_core | navfn | robot_pose_ekf | rotate_recovery | voxel_grid

Navigation功能包集概述

这是2D的导航功能包集,通过接收里程计数据、tf坐标变换树以及传感器数据,为移动机器人输出目标位置以及安全速度。概念层面上讲,导航功能包集是相当简单的。 它从里程计和传感器数据流获取信息,并将速度命令发送给移动基站(比如你的机器人)。但是,想要在任意机器人上使用导航功能包集可能有点复杂。使用导航功能包集的先决条件是,机器人必须运行ROS,有一个tf变换树,使用正确的ROS Message types发布传感器数据。而且,我们需要在高层为一个具有一定形状和动力学特点的机器人配置导航功能包集。

acml:是一个针对在二维移动的机器人的基于概率定位系统。它实现了自适应蒙特卡罗滤波的定位方法,并使用粒子滤波器去跟踪在已知地图中机器人的位置。

base_local_planner:这个包提供了Trajectory Rollout以及Dynamic Window两种在2D平面局部导航的方法。通过提供一个跟随的规划路径和一个代价地图,控制器生成速度指令并发送至机器人。它支持全向和非全向机器人,以及任何可以用多边形或圆描述的机器人轮廓,并且可以在launch文件中设置这些参数。这个包已经被封装好,可以通过nav_core包的BaseLocolPlanner接口来调用。

carrot_planner:这个规划器是一个简单的全局规划器,可以通过nav_core::BaseGlobalPlanner 来进行调用,并且被move_base节点用作一个全局规划的插件。这个规划器从用户处采集到一个目标点,之后检查用户指定的目标点是否是障碍物,如果是的话沿着robot与目标点构成的向量向后退,直到找到一点没有障碍物位置。之后它会将此目标点作为目标发送给局部规划器和控制器。这个规划器允许机器人尽可能到达离用户指定的目标点最近的位置。

clear_costmap_recovery:为导航包提供了一种自救行为,试图通过将代价地图还原成已知区域外的静态地图从而清除出空间。

costmap_2d:通过激光或点云的数据,投影到2D平面上,创建代价地图,并可以设置膨胀半径。

dwa_local_planner:局部规划器,提供动态窗口方法( Dynamic Window Approach)在平面上局部导航。与base_local_planner类似。

fake_localization:提供了一个简单节点fake_localization node,可以代替一个定位系统,并提供了acml包的ROS API的子集。由于较低的计算量,这个节点非常频繁的用于在仿真环境中提供完美的定位。这个节点将里程计数据转换为位置、粒子云,并以acml发布的数据格式发布。

global_planner:全局路径规划节点。

map_server:将代价地图作为ROS Service发布,提供了map_saver节点,可以通过命令行存储地图。

move_base:提供了action动作的实现(actionlib包),即给定一个世界系下的目标位置,机器人会试图移动到该位置。另外,move_base节点中包含了两个代价地图(全局、局部),以及一个全局规划器和一个局部规划器,以便实现导航任务。

move_base_msgs: 通过MoveBase.action文件定义产生的消息文件,用于actionlib与move_base的通信。

move_slow_and_clear:为robot提供一种自救行为,即清除代价地图的信息并限制机器人速度,但这不绝对安全,robot可能会撞到某些障碍。但这是唯一一种可以与允许最大速度动态设置的局部规划器兼容的自救行为。

nav_core:为robot实现导航任务提供了通用的接口,包括BaseGlobalPlanner,BaseLocalPlanner,, RecoveryBehavior interfaces等,这有利于方便的更新规划器或者自救行为的版本。

navfn:全局规划器,提供了一个快速插值的函数,可以在起始点到目标点之间快速插值,并找到代价最小的一条路径。

robot_pose_ekf:这个包用于估计robot的三维位置,利用扩展卡尔曼滤波的方法,建立了一个六维模型,联合了轮子里程计、IMU、视觉里程计的数据。

rotate_recovery:提供了一种自救行为,通过旋转360度来清除空间。

voxel_grid:提供一个有效的三维体素网格的实现。

导航框架

这幅图描述了使用Navigation导航包的一个整体框架,其核心是move_base节点,包含了global_planner、local_planner、global_costmap、local_costmap、recovery_behaviors五个模块,move_base节点订阅tf(坐标系转换)、odom(里程计数据)、map(地图)、sensor datas(激光数据或点云)以及goal等话题,之后发布cmd_vel话题。

tf:利用ROS的tf工具发布坐标系之间的转换关系,包括:/map->/odom,/odom->/base_link,/base_link->/sensor等
odom:导航包需要用到里程计的数据,故需将其用tf工具和nav_msgs/Odometry消息发布出来
map:在导航前,最好可以提供一张全局的地图,因此需要我们提前创建(但这不是必须的)
sensor data:用于避障,建图等等,可以是激光雷达的平面数据或者是点云数据(sensor_msgs/LaserScan or sensor_msgs/PointCloud )
goal:目标在全局地图中的坐标,用geometry_msgs/PoseStamped消息格式发布

此外,move_base节点还提供了action动作的接口(即SimpleActionServer的实现,详细可见actionlib包),包括订阅了move_base/goal (move_base_msgs/MoveBaseActionGoal),move_base/cancel (actionlib_msgs/GoalID)两个话题,并发布了move_base/feedback (move_base_msgs/MoveBaseActionFeedback)、move_base/status (actionlib_msgs/GoalStatusArray)、move_base/result (move_base_msgs/MoveBaseActionResult)等三个话题。因此用户可以自己写一个利用actionlib库写一个发布目标位置的节点。

在熟悉完整个导航框架后,我们就可以开始依次做好相应的准备工作了。需要的步骤如下: 
1、搭建一个移动平台,使其订阅/cmd_vel话题,并发布odom里程计数据以及/odom->/base_link的tf数据?? 
2、将传感器数据(激光数据或RGB-D点云数据)发布出来 
3、创建地图,利用slam_gmapping或hector_slam的方法 
4、配置Navigation包,进行导航

ROS导航包的介绍的更多相关文章

  1. ROS功能包- rrt_exploration

    一种基于RRT实现的多机器人地图探测算法的ROS软件包. 它还具有使用图像处理提取边界点.基于图像的边界检测等功能. 适用版本:indigo.jade.kinetic.lunar. 注意事项:官网文档 ...

  2. ROS机器人导航一 : 从英雄联盟到ROS导航

    写在前面: 这是这个系列的第一篇 本系列主要从零开始深入探索ROS(机器人操作系统)的导航和规划. 这个系列的目标,是让大家了解: 1.ROS的导航是怎么实现的 2.认识ROS里各种已有的导航算法,清 ...

  3. ROS导航之参数配置和自适应蒙特卡罗定位

    我们的机器人使用两种导航算法在地图中移动:全局导航(global)和局部导航(local).这些导航算法通过代价地图来处理地图中的各种信息,导航stack使用两种costmaps http://www ...

  4. ROS Learning-006 beginner_Tutorials 编译ROS程序包

    ROS Indigo beginner_Tutorials-05 编译 ROS 程序包 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.04 ...

  5. ROS Learning-005 beginner_Tutorials 创建ROS程序包(就是软件包)

    ROS Indigo beginner_Tutorials-04 创建ROS程序包(就是软件包) 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu ...

  6. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇—多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

  7. SSH框架应用中常用Jar包用途介绍

    struts2需要的几个jar包:1)xwork-core-2.1.62)struts2-core-2.1.83)ognl-2.7.34)freemarker-2.3.155)commons-io-1 ...

  8. jar包和war包的介绍和区别

    jar包和war包的介绍和区别 Java程序员的日常 关注 做Java开发,jar包和war包接触的挺多的,有必要对它们做一个深入的了解,特总结整理如下: 1.jar包的介绍 JAR(Java Arc ...

  9. 在ros功能包CMakeLists.txt中获取所在功能包的路径 便于添加第三方库的相对路径

    在 ros 功能包中要使用第三方的动态库,将其放在系统默认库路径和使用绝对路径均不可取,这样的话可移植性较差,将该功能包移到其它电脑时要重新配置依赖库的路径,太麻烦了. 于是找到下面这个方法,解决了R ...

随机推荐

  1. 51nod 1298 圆与三角形

    给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0).       输入 第1行:一个数 ...

  2. 自定义springmvc统一异常处理器(实现HandlerExceptionResolver接口)不起作用的一种情况

    ExceptionResolverCustom 这个是自定义的异常处理器类. 在springmvc中注册 在web.xml文件中屏蔽springmvc自动注册的异常处理器 网上的资料就是这么配置的,可 ...

  3. 关于Spring框架你解多少?

    类似于谈谈你对Spring的了解的题目,在很多面试中都会被提到的. Spring,英文意思是春天的意思.在java的世界里,Spring是一个现时非常流行的开源应用框架. Spring 框架是一个分层 ...

  4. mysql之 explain、optimizer_trace 执行计划

    一.explain mysql> explain select host,user,plugin from user ;+----+-------------+-------+------+-- ...

  5. numpy之初探排序和集合运算

    排序 排序 numpy与python列表内置的方法类似,也可通过sort方法进行排序. 用法如下: In [1]: import numpy as np In [2]: x = np.random.r ...

  6. 洛谷 1600 (NOIp2016) 天天爱跑步——树上差分

    题目:https://www.luogu.org/problemnew/show/P1600 看TJ:https://blog.csdn.net/clove_unique/article/detail ...

  7. bzoj 4566 找相同字符 —— 广义后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4566 建出两个串的广义后缀自动机: 统计每个点在两个串中出现次数的子树和,其实就是在两个串中 ...

  8. C语言中的printf函数的输入输出问题

    这个问题是个很基础,但是我一直不知道的问题,是同学问了之后才知道的,长知识了. 这里要注意的是,printf函数是从右向左计算,从左向右输出. 距离如下: #include <stdio.h&g ...

  9. PMODB GT202 WIFI的使用

    pHTTPSession = (P_HTTP_SESSION)malloc(ALIGN(sizeof(HTTP_SESSION))) PMODA/PMODB都可做WIFI使用,现介绍PMODB WIF ...

  10. CAN总线远程帧和错误帧

    远程帧 通常,数据传输是由数据源节点(例如,传感器发出数据帧)自主完成的.但也可能存在目标节点向源节点请求发送数据的情况.要做到这一点,目标节点需发送一个远程帧,其中的标识符应与所需数据帧的标识符相匹 ...