ros导航避障

  • move_base
    • 全局路径规划 和 局部路径规划
      • 全局路径规划
      • 局部路径规划
    • 模块
    • 代价地图
    • 配置文件

move_base

它通过订阅激光雷达、map地图、amcl的定位等数据,然后规划出全局和局部路径,再将路径转化为机器人的速度信息,最终实现机器人导航。

move_base包采用action机制接受导航goal,然后移动机器人底座到达指定的goal。 这个过程中move_base node将同时利用局部规划器和全局规划器来完成导航任务:
(1) 全局路径规划(global planner):根据给定的目标位置进行总体路径的规划;
(2) 本地实时规划(local planner):根据附近的障碍物进行躲避路线规划。

支持任何一种继承了nav_core包中nav_core::BaseGlobalPlanner接口的全局规划器和nav_core包中nav_core::BaseLocalPlanner接口的局部规划器。

在此过程中,move_base维护者2个代价地图,一个是用于全局规划器的全局代价地图,另一个是用于局部规划器的局部代价地图。

全局路径规划 和 局部路径规划

目前ROS中可以使用的global planner主要包括:A*和Dijkstra。local planner主要有:dwa、trajectory、teb和eband等。teb local planner效果会好点。
二者如何关联:将global planner作为local planner的一个初始参考或者优化方向。

全局路径规划

在ROS的导航中,首先会通过全局路径规划,计算出机器人到目标位置的全局路线。这一功能是navfn这个包实现的。 navfn通过Dijkstra等最优路径的算法,计算costmap上的最小花费路径,作为机器人的全局路线。http://www.ros.org/wiki/navfn?distro=fuerte

局部路径规划

本地的实时规划(局部路径规划)是利用base_local_planner包实现的。该包使用Trajectory Rollout 和Dynamic Window approaches算法计算机器人每个周期内应该行驶的速度和角度(dx,dy,dtheta velocities)。

base_local_planner这个包通过地图数据,用算法搜索到达目标的多条路经,利用一些评价标准(是否会撞击障碍物,所需要的时间等等)选取最优的路径,并且计算所需要的实时速度和角度。 其中,Trajectory Rollout 和Dynamic Window approaches算法的主要思路如下:
(1) 采样机器人当前的状态(dx,dy,dtheta);
(2) 针对每个采样的速度,计算机器人以该速度行驶一段时间后的状态,得出一条行驶的路线。
(3) 利用一些评价标准为多条路线打分。
(4) 根据打分,选择最优路径。
(5) 重复上面过程。

http://www.ros.org/wiki/base_local_planner?distro=groovy

模块

  • amcl模块是ROS的导航定位模块,amcl通过订阅scan、map和tf信息,发布出机器人的pose,以供move_base使用。(可选)
  • odom,即机器人里程计信息,
  • map,顾名思义,我们需要的先验地图信息,一般通过slam建图后保存。

ROS中主流的slam算法有:

1.gmapping:需要激光雷达scan数据和里程计odom数据,采用的是PF(粒子滤波)。
2.hector :基于优化的算法(解最小二乘问题),优缺点:不需要里程计,但对于雷达帧率要求很高40Hz,估计6自由度位姿,可以适应空中或者地面不平坦的情况。初值的选择对结果影响很大,所以要求雷达帧率较高。
3.Cartographer:累计误差较前两种算法低,能天然的输出协方差矩阵,后端优化的输入项。成本较低的雷达也能跑出不错的效果。
4. rtabmap: RTAB-Map是具有实时约束的RGB-D SLAM方法

  • map_server包通过解析slam建好的地图并发布出去。
  • sensor topic 在局部路径规划时起到作用.

代价地图

costmap为代价地图,目前主要的有inflation_layer、obstacle_layer、static_layer、voxel_layer四个plugins,分别为膨胀层、障碍物层、静态层和体素层。

  • 全局路径一般需要静态层和膨胀层,因为全局规划应该只考虑到地图信息,所以一般都是静态的。
  • 局部路径规划则需要考虑到实时的障碍物信息,所以需要障碍物层和膨胀层

为什么不把静态层放到局部路径规划里呢?因为我们的定位是会存在误差的,比如轮子打滑或其他情况,这个时候amcl会起到纠正作用,如果我们把静态层放到了局部中,这个定位会有问题,而且,假设当前机器人出现了定位的偏差,那么这个引入的静态层肯定是错误的,再加上局部的障碍物层(这里的障碍物层本应该和静态层重合的,但由于定位偏差,不会重合)可能会使得机器人误以为自己在障碍物层内,规划出现问题。

配置文件

move_base使用前需要配置一些参数:运行成本、机器人半径、到达目标位置的距离,机器人移动的速度,这些参数都在配置文件中: base_local_planner_params.yaml ,costmap_common_params.yaml , global_costmap_params.yaml ,local_costmap_params.yaml

local_costmap_params等文件可以配置图层https://blog.csdn.net/qq_41925420/article/details/94379892

https://blog.csdn.net/qq_41925420/article/details/94379892
https://blog.csdn.net/shenghuaijing3314/article/details/80005629
https://www.guyuehome.com/270
https://blog.csdn.net/u013834525/article/details/84627204
http://wiki.ros.org/teb_local_planner/Tutorials

你可能感兴趣的:(ROS,自动驾驶,动态规划,人工智能)