ros-navigation概述

通过git clone下载的navigation包内包含以下内容:


下面简述以下各个包的功能:

amcl :

              AMCL是机器人在二维地图移动过程中的概率定位系统。它应用自适应的蒙特卡洛定位方式(或者KLD采样),采用粒子滤波方法来跟踪已知地图中机器人的位姿。使用时需要在 base_scan 话题中指定数据类型: 

amcl scan:=base_scan
                AMCL以激光扫描地图,激光扫描数据,位姿变换信息为输入,输出姿态信息。因此订阅节点

 ros-navigation概述_第1张图片

发布:

ros-navigation概述_第2张图片

        AMCL参数配置见 ROS/AMCL

dwa_local_planner  :

            动态窗口方法(ros中用于局部路径规划)         

Published Topics

~/global_plan (nav_msgs/Path)

  • The portion of the global plan that the local planner is currently attempting to follow. Used primarily for visualization purposes.
~/local_plan  ( nav_msgs/Path )
  • The local plan or trajectory that scored the highest on the last cycle. Used primarily for visualization purposes.

Subscribed Topics

odom  ( nav_msgs/Odometry )
  • Odometry information that gives the local planner the current speed of the robot. The velocity information in this message is assumed to be in the same coordinate frame as the robot_base_frame of the costmap contained within the TrajectoryPlannerROS object. See the costmap_2d package for information about the robot_base_frame parameter.

move_slow_and_clear :

         move_slow_and_clear::MoveSlowAndClear是一种简单的修复机制,用来清除代价地图中信息并且限制机器人移动速度。注意,这种修复技术是非安全技术,机器人可能会撞上东西,它只以用户指定速度移动。 此外,这种修复机制仅仅兼容可以通过dynamic_reconfigure配置最大速度局部规划器(如dwa_local_planner)。

robot_pose_ekf:

                    Robot Pose EKF 包用于评估机器人的3D位姿,基于来自不同来源的位姿测量信息。它使用带有6D(3D position and 3D orientation)模型信息的扩展卡尔曼滤波器来整合来自轮式里程计,IMU传感器和视觉里程计的数据信息。基本思路就是用松耦合方式融合不同传感器信息实现位姿估计。

base_local_planner    :

        完成局部窗口内的路径规划任务,机器人行动速度的具体生成在此包当中完成。目前有两种局部路径规划算法实现,
一是航迹推算法(TrajectoryROS),一是动态窗口法(DWA),该包内部的默认实现是航迹推算法,但是留出了DWA的定义接口,DWA的实现在dwa_local_planner中。

fake_localization  :

fake_localization包提供一个节点:fake_localization,用以替代定位系统,节点也提供了amcl定位算法的API接口子集。因此该节点常常用在仿真环境中。

    具体来说,该包将里程计数据转化为姿态,粒子云,以及amcl所发布的那种tf数据格式。其订阅和发布节点如下:

Subscribed Topics

base_pose_ground_truth  ( nav_msgs/Odometry )
  • The position of the robot as published by a simulator.
initialpose  ( geometry_msgs/PoseWithCovarianceStamped )
  • Allows for setting the pose of fake_localization using tools like rviz or nav_view to give a custom offset from the ground truth source being published. New in 1.1.3

Published Topics

amcl_pose  ( geometry_msgs/PoseWithCovarianceStamped )
  • Just passes through the pose reported by a simulator.
particlecloud  ( geometry_msgs/PoseArray )
  • A particle cloud used to visualize the robot's pose in rviz and nav_view.

nav_core        :   

        nav_core包包含了导航功能包集的关键接口。他使所有规划器(planner)和修复行为机制可以插件方式在move_base node中使用,且必须继承这些接口。

ros-navigation概述_第3张图片

nav_core::BaseGlobalPlanner支持了供导航中全局规划器使用的接口。 move_base node中使用的所有全局规划器插件都必须继承这个接口。目前使用了nav_core::BaseGlobalPlanner接口的全局规划器有:

  • global_planner - 一个快速内插值全局规划器,是对navfn的更灵活的替代(pluginlib name: "global_planner/GlobalPlanner")

  • navfn - 一个基于grid的全局规划器,使用navigation函数计算机器人路径global planner that uses a navigation function to compute a path for a robot. (pluginlib name: "navfn/NavfnROS")

  • carrot_planner - 一个简单的全局规划器,移动机器人到用户定义的目标点,即使目标在障碍中也会靠近目标。 (pluginlib name: "carrot_planner/CarrotPlanner")

nav_core::BaseLocalPlanner给导航中使用的具体规划器提供接口。 move_base中所有局部规划器插件必须继承该接口。目前nav_core::BaseLocalPlanner接口包括:

  • base_local_planner - 提供用Dynamic Window and Trajectory Rollout approaches来做本地规划控制

  • eband_local_planner - 实现了Elastic Band method on the SE2 manifold

  • teb_local_planner - 实现了Timed-Elastic-Band method for online trajectory optimization

 nav_core::RecoveryBehavior提供了导航中修复机制接口。 move_base中所有修复机制插件必须继承该接口。目前使用了nav_core::RecoveryBehavior接口的主要有:

  • clear_costmap_recovery - 将用户定义的某个范围外的代价地图回退到静态地图

  • rotate_recovery - 执行360度旋转来清理出空间

rotate_recovery

执行360度旋转来清理出空间

carrot_planner        

            carrot_planner::CarrotPlanner是一个简单的全局路径规划器(遵循nav_core包中的nav_core::BaseGlobalPlanner接口),可以作为move_base 节点全局路径规划的插件。CarrotPlanner规划期从外部用户获取目标,检查这个用户指定的目标是否在障碍物中,若是,规划器就会在机器人与指定位置的已规划路径中寻找一个在障碍区外的可行的目标位置,然后再将此目标位置发送给局部规划器或者控制器。用此办法使机器人竟可能接近用户指定目标。

ros-navigation概述_第4张图片

global_planner  :   

        这个包提供了一个快速、内插的全局规划器的实现。这个类遵循nav_core 包的nav_core::BaseGlobalPlanner接口。这建立了一个比navfn 更灵活的替代。  

Standard Behavior

All parameters default.GlobalPlanner.png

Grid Path

use_grid_path=True GridPath.pngPath follows the grid boundaries.

Simple Potential Calculation

use_quadratic=False Nonquad.pngSlightly different calculation for the potential. Note that the original potential calculation from navfn is a quadratic approximation. Of what, the maintainer of this package has no idea.

A* Path

use_dijkstra=False AStar.pngNote that a lot less of the potential has been calculated (indicated by the colored areas). This is indeed faster than using Dijkstra's, but has the effect of not necessarily producing the same paths. Another thing to note is that in this implementation of A*, the potentials are computed using 4-connected grid squares, while the path found by tracing the potential gradient from the goal back to the start uses the same grid in an 8-connected fashion. Thus, the actual path found may not be fully optimal in an 8-connected sense. (Also, no visited-state set is tracked while computing potentials, as in a more typical A* implementation, because such is unnecessary for 4-connected grids). To see the differences between the behavior of Dijkstra's and the behavior of A*, consider the following example.

Dijkstra's

Dijkstra.png

A*

AStar2.png

Old Navfn Behavior

old_navfn_behavior=True For reproducing paths just like NavFn did.OldNavFn.png  

navfn   :             

        navfn提供一个快速内插导航函数(函数可用于创建移动路径规划)。navfn规划器假定机器人是圆形,并会在起点到终点之间寻找代价最小的规划。它的导航功能支持了Dijkstra和A*算法。此外,navfn也提供了ROS封装接口供调用,也继承了接口nav_core::BaseGlobalPlanner

        本package实现了快速内插值导航功能,使用navfn::NavFn 类给机器人底座创建导航规划。navfn::NavfnROS对象是navfn::NavFn类的ROS封装,其继承了nav_core包中接口nav_core::BaseGlobalPlannernavfn::NavfnROS 对象在move_base中被作为全局规划器插件使用。

            注意:如果你使用带有体素或障碍层的分层 costmap_2d 代价地图,那么需将该图层的track_unknown_space参数设置为true,否则所有未知空间将转换为自由空间(which navfn will then happily go right through)。

通过配置其参数可以:

  • 指定可选窗口的x大小以限定规划器工作空间。

  • 其有利于限定NavFn在大型代价地图的小窗口下工作。

voxel_grid

voxel_grid provides an implementation of an efficient 3D voxel grid. The occupancy grid can support 3 different representations for the state of a cell: marked, free, or unknown. Due to the underlying implementation relying on bitwise and and or integer operations, the voxel grid only supports 16 different levels per voxel column. However, this limitation yields raytracing and cell marking performance in the grid comparable to standard 2D structures making it quite fast compared to most 3D structures.

clear_costmap_recovery 

This package provides a recovery behavior for the navigation stack that attempts to clear space by reverting the costmaps used by the navigation stack to the static map outside of a given area.

map_server     :    

map_server提供map_server ROS节点,提供地图数据作为ROS服务。它还提供了map_saver命令行实用程序,它允许动态生成的地图被保存到文件。

主要功能是读取pgm和yaml配套的地图文件,并将之转换到/map话题发送出来(比如rviz中显示的地图就是订阅了该话题), 
另外还提供地图保存等增值服务

地图格式

    使用该包中提供的工具可以操控的地图被存储在2个文件中。 一个是YAML格式的文件描述地图meta-data,另一个命名为image文件,用来编码occupancy-data。

1、Image format

 image用不同的像素颜色描述世界中每个cell的占用状态。白色像素表示free,黑色像素表示occupied, 其它颜色像素表示unknown。 彩色图和灰度图都可以,但是多数是灰度图。在YAML文件中使用阈值来区分3种类别。

   当image中像素与阈值参数比较时候,需要先按照公式occ = (255 - color_avg) / 255.0计算占用概率, 这里color_avg是用8位数表示的来自于所有通道的平均值。例如,如果image是24-bit颜色,拥有0x0a0a0a颜色的像素,其概率是0.96,这意味着几乎完全占用。如果像素颜色是0xeeeeee,则占用概率是0.07, 这意味着几乎没有被占用。

   当使用ROS消息通信时候,这种占用被表示为范围[0,100]之内的一个整数, 0的意思是完全free, 100的意思是完全occupied, -1表示完全unknown。

   Image data被 SDL_Image库读取, 依赖在特定平台上SDL_Image将提供什么东西,SDL_Image相应支持格式也会有差异。一般来讲,多数常用image格式都已经被支持了。一个必须要注意的例外是PNG格式在OS X平台上不能被支持。

2、YAML format

一个例子:

image: testmap.png
resolution: 0.1
origin: [0.0, 0.0, 0.0]
occupied_thresh: 0.65
free_thresh: 0.196
negate: 0
  • image : 指定包含occupancy data的image文件路径; 可以是绝对路径,也可以是相对于YAML文件的对象路径

  • resolution : 地图分辨率,单位是meters / pixel

  • origin : The 2-D pose of the lower-left pixel in the map, 表示为 (x, y, yaw), 这里yaw是逆时针旋转角度(yaw=0意味着没有旋转)。目前多数系统忽略yaw值。

  • occupied_thresh : 像素的占用概率比该阈值大被看做完全占用

  • free_thresh : 像素的占用概率比该阈值小被看做完全free

  • negate : Whether the white/black free/occupied semantics should be reversed (interpretation of thresholds is unaffected)

navigation


costmap_2d:              

http://wiki.ros.org/costmap_2d?distro=kinetic

This package provides an implementation of a 2D costmap that takes in sensor data from the world, builds a 2D or 3D occupancy grid of the data (depending on whether a voxel based implementation is used), and inflates costs in a 2D costmap based on the occupancy grid and a user specified inflation radius. This package also provides support for map_server based initialization of a costmap, rolling window based costmaps, and parameter based subscription to and configuration of sensor topics.

层的概念来组织图层,用户可以根据需要自己配置,默认的层有static_layer(通过订阅map_server的/map主题)来生成, 
obstacle_layer根据传感器获得的反馈来生成障碍物图层 inflation_layer则是将前两个图层的信息综合进行缓冲区扩展。
该包可进行动态窗口的生成(比如base_local_planner中使用的就是动态的局部窗口地图)也可以生成静态地图
(比如global_planner中使用的就是全局静态地图)。(有待验证的疑问,是否静态地图中obstacle_layer不起作用,而动态地图中static_layer不起作用)。 
此外,该包还在实时发送自己的地图信息,通过nav_msgs::OccupancyGrid发送消息给rviz。所以可以仿照该写法来发送自己想要的数据到rviz中去。

move_base  :

这个是整个navigation stack当中进行宏观调控的看得见的手。
它主要干的事情是这样的: 维护一张全局地图(基本上是不会更新的,一般是静态costmap类型),维护一张局部地图(实时更新,costmap类型),
维护一个全局路径规划器global_planner完成全局路径规划的任务, 维护一个局部路径规划器base_local_planner完成局部路径规划的任务。
然后提供一个对外的服务,负责监听nav_msgs::goal类型的消息,然后调动全局规划器规划全局路径,再将全局路径送进局部规划器,
局部规划器结合周围障碍信息(从其维护的costmap中查询),全局路径信息,目标点信息采样速度并评分获得最高得分的轨迹(即是采样的最佳速度),
然后返回速度值,由move_base发送Twist类型的cmd_vel消息上,从而控制机器人移动。完成导航任务。

  • move_base节点将全局路径和局部路径规划程序链接在一起,以完成其全局导航任务。

  • 它支持连接符合nav_core包中指定的nav_core::BaseGlobalPlanner接口的任一全局路径规划器和符合nav_core::BaseLocalPlanner接口的任一局部路径规划器。

  • move_base节点还维护两个costmaps,一个用于全局路径规划器,一个用于局部路径规划器(参见costmap_2d软件包),用于完成导航任务。

ros-navigation概述_第5张图片



你可能感兴趣的:(移动机器人/ROS)