navigation是ROS的二维导航功能包,简单来说,就是根据输入的里程计等传感器的信息流和机器人的全局位置,通过导航算法,计算得出安全可靠的机器人速度控制指令。
代码库:https://github.com/ros-planning/navigation
代码里文件较多,进行梳理后如下图
- map_server:地图服务器,主要功能是保存地图和导入地图。
- costmap_2d:可以生产代价地图,以及提供各种相关的函数。
- robot_pose_ekf:扩展卡尔曼滤波器,输入是里程计、IMU、VO中的任意两个或者三个,输出是一个融合之后的pose。
- localization:这里是两个定位用的package。fake_localization一般是仿真用的,amcl才是实际定位用的package。
- nav_core:这里面只有三个文件,对应的是全局路径规划、局部路径规划、recovery_action的通用接口定义,具体功能实现则是在各个对应的规划器package里。
- move_base:这里实现的是整个导航的流程。什么时候调用全局路径规划、什么时候调用局部路径规划、什么时候调用recovery_action都是这个package管的。就是下图中间方框里做的事情,可以说是整个navigation stack的核心。
总体框架图中可以看到,
一、move_base
move_base提供了ROS导航的配置、运行、交互接口,它主要包括两个部分:
(1) 全局路径规划(global planner):根据给定的目标位置进行总体路径的规划.
在ROS的导航中,首先会通过全局路径规划,计算出机器人到目标位置的全局路线。这一功能是navfn这个包实现的。
navfn通过Dijkstra最优路径的算法,计算costmap上的最小花费路径,作为机器人的全局路线。将来在算法上应该还会加入A*算法。
(2) 本地实时规划(local planner):根据附近的障碍物进行躲避路线规划。
本地的实时规划是利用base_local_planner包实现的。该包使用Trajectory Rollout 和Dynamic Window approaches算法计算机器人每个周期内应该行驶的速度和角度(dx,dy,dtheta velocities)。
base_local_planner这个包通过地图数据,通过算法搜索到达目标的多条路经,利用一些评价标准(是否会撞击障碍物,所需要的时间等等)选取最优的路径,并且计算所需要的实时速度和角度。
二、map_server
map_server提供map_server ROS节点,它提供地图数据作为一个ROS服务器。
也提供map_saver命令行功能,能动态生成保存到文件中的地图。 包中通过工具操作的地图是以成堆的文件存储的。YAML文件描述地图的元数据,并命名image文件。Image文件编码占用数据。
Image 以对应单元的颜色描述世界中每个单元的占用状态。白色单元格表示自由,黑色单元格表示占用,两种颜色之间的单元表示未知。接受彩色图像,但颜色值平均为灰度值。
三、costmap_2d
costmap_2d包提供了一种2D代价地图的实现方案,该方案从实际环境中获取传感器数据,构建数据的2D或3D占用栅格(取决于是否使用基于体素的实现),以及基于占用栅格和用户定义膨胀半径的2D代价地图的膨胀代价。
该包也支持基于map_server初始化代价地图,基于滚动窗口的代价地图,以及基于参数化订阅和配置传感器主题。
costmap_2d包提供了一种可配置框架来维护机器人在占用栅格应该如何导航的信息。代价地图使用传感器数据和来自静态地图的信息,通过costmap_2d :: Costmap2DROS对象来存储和更新实际环境中的障碍物信息。
初始化costmap_2d :: Costmap2DROS对象的方法主要有两种。
- 第一种是使用用户生成的静态地图进行初始化(有关构建地图的文档,请参阅map_server包)。在这种情况下,代价地图被初始化来匹配与静态地图提供的宽度,高度和障碍物信息。这种方式通常与定位系统(如AMCL)结合使用,允许机器人在地图坐标系注册障碍物,并且当基座在环境中移动时可以根据传感器数据更新其代价地图。
- 第二种是给出一个宽度和高度,并将rolling_window参数设置为true。当机器人在移动时,rolling_window参数将机器人保持在代价地图的中心。然而当机器人在给定区域移动得太远时,障碍物信息将会被从地图中丢弃。这种方式的配置最常用于里程计坐标系中,机器人只关注局部区域内的障碍物
四、robot_pose_ekf
Robot Pose EKF 包用于评估机器人的3D位姿,基于来自不同来源的位姿测量信息。
它使用带有6D(3D position and 3D orientation)模型信息的扩展卡尔曼滤波器来整合来自轮式里程计,IMU传感器和视觉里程计的数据信息。
基本思路就是用松耦合方式融合不同传感器信息实现位姿估计。
五、acml
amcl是一种机器人在2D中移动的概率定位系统。 它实现了自适应(或KLD采样)蒙特卡罗定位方法,该方法使用粒子滤波器来针对已知地图跟踪机器人的位姿。
参考资料:
https://blog.csdn.net/tansir94/article/details/83720740
http://wiki.ros.org/navigation
https://blog.csdn.net/bazinga_IIIIII/article/details/79369451
https://blog.csdn.net/jinking01/article/details/79455962
https://www.ncnynl.com/archives/201708/1911.html