ROS 导航包使用分析

转载请注明作者,谢谢

MoveBace.cpp阅读笔记

开放的功能函数:

Action Server:

executeCb

Thread:

planThread

Sub CallBack :

goalCB

Srv Callback:

planService

clearCostMapService

reconfigureCB

executeCb负责接收新目标点,并设置别是否进行全局规划的标志位(planThread函数中),之后具体的到点在executeCycle中进行

导航实际流程为:

进行全局路径规划,在进行局部路径规划,然后发布速度

全局路径规划在makePlan函数中,该函数中调用了planner_的makePlan和empty接口。

planner_为继承于BaseGlobalPlanner的实例,由pluginlib通过具体类的名字进行装载。

之后,调用tc_的setPlan接口,对局部路径规划器进行全局路径设置,然后,调用tc_的isReached接口进行判断,然后调用tc_的computeVelocityCommands接口,进行速度计算,然后进行速度下发。

tc_为继承于BaseLocalPlanner的实例,也是由pluginlinb通过具体类的名字进行装载。

下面带来两个问题,planner_怎么进行路径规划,以及tc_如何计算速度。

planner_在初始化时候,被塞入了planner_costmap_ros_

tc_在初始化时,被塞入了controller_costmap_ros_

在global planner的包中,注册了插件:global planner::GlobalPlanner

分层地图分析:

CostMap2D在外部被实例化的过程:

通过params读取plugins参数,遍历每个plugin,得到name和type,然后先声明一个Layer的指针,然后通过initialize函数初始化具体的Layer,其他的实例,比如StaticLayer都是继承于Layer的插件

StaticLayer首先继承于CostmapLayer,CostMapLayer继承于Layer和Costmap2D

在StaticLayer中,会申请接收maptopic,然后接收对应的地图信息,然后进行初始化继承于Costmap2D的成员变量costmap_,为char*类型,因此就可以进行占用栅格的初始化,maptopic通过参数指定,也就是外部指定接收哪副地图

其他所有的不同层地图同StaticLayer一样,为最终的具体的分层地图

每个具体的分层地图肯定都有updateCosts函数,用于更新他们的总包地图,而他们总包地图用于规划或者别的拥堵,总包地图的类型为LayerdCostmap

现有分层地图分析:

Static_layer: 继承于CostmapLayer

Obstacle_layer:继承于CostmapLayer

Footprint_layer:继承于Layer

Inflation_layer:继承于Layer

Voxel_layer:继承于Obstacle_Layer

分层地图使用总结:

最外层为Costmap2DROS, 成员变量layered_costmap_类型为LayeredCostmap

layered_costmap_中添加各层地图插件;

因此layered_costmap_为用于某一用途的总分层地图

在具体使用过程中,会调用Costmap2DROS的getCostmap接口,里面是返回了layered_costmap_的getCostmap接口,返回形式为Costmap2D的指针。在LayeredCostmap中,costmap_会被所有的添加过的plugin进行update,因此确实得知layered_costmap_确实为总cost地图,地图中的cost通过已经添加过得分层插件都分别进行了更新。

LayeredCostmap中的成员变量,Costmap2D*类型的costmap_,是实际被外部算法所使用的代价地图

全局规划模块分析

GlobalPlanner为BaseGlobalPlanner的插件

1、PlannerWithCostmap继承于GlobalPlanner,GlobalPlanner继承于BaseGlobalPlanner

接收goal,并且在poseCallback函数中,调用makePlan函数

2、costmap:

通过Costmap2DROS实例化,在Costmap2DROS的构造函数中,

new了LayeredCostmap类,并且进行了一系列初始化,

并且会进行Costmap2DPublisher的创建,

LayeredCostmap会通过plugin_loader进行多层地图的创建以及加载

进行footprint的接收

3、costmap和goal都塞在了GlobalPlanner中,costmap是初始化,goal是接收别的模块的发送

4、GlobalPlanner的构造函数中,存储外部new的costmap,并且进行类的Initialize,初始化函数中,进行全局规划算法的选择,dijkstra或者astar,存在成员变量planner_中,为在BaseGlobalPlanner中的成员变量

5、GlobalPlanner中的makePlan函数:进行规划,并且发布plan

6、makePlan解析:

a) 将start和goal世界坐标转化成costmap中的序号索引坐标worldToMap

b) 设置各种规划器尺寸 setSize(nx,ny)

c) 设置规划地图边框:outlineMap

d) 计算Potentials,根据具体路径规划算法比如AStar,Dijkstra进行

e) 根据初始位置,目标位置,potential,根据具体路径类型,继承于TraceBack的路径类型,计算路径

时间: 2024-12-26 11:22:26

ROS 导航包使用分析的相关文章

ROS 导航包各功能汇总

1.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 bitwis

(转)ROS导航之参数配置和自适应蒙特卡罗定位

我们的机器人使用两种导航算法在地图中移动:全局导航(global)和局部导航(local).这些导航算法通过代价地图来处理地图中的各种信息,导航stack使用两种costmaps http://www.cnblogs.com/zjiaxing/p/5543386.html存储环境的障碍信息.一个costmap进行全局规划,在整个环境做长期的规划,而另一个是用于局部规划和避障. 全局导航: 在已建立的地图上做一个远距离目标的路径规划. 局部导航: 在正在建立的地图上做近距离目标同时要实时避开障碍物

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

我们的机器人使用两种导航算法在地图中移动:全局导航(global)和局部导航(local).这些导航算法通过代价地图来处理地图中的各种信息,导航stack使用两种costmaps http://www.cnblogs.com/zjiaxing/p/5543386.html存储环境的障碍信息.一个costmap进行全局规划,在整个环境做长期的规划,而另一个是用于局部规划和避障. 全局导航: 在已建立的地图上做一个远距离目标的路径规划. 局部导航: 在正在建立的地图上做近距离目标同时要实时避开障碍物

ROS导航与定位框架

导航与定位是机器人研究中的重要部分. 一般机器人在陌生的环境下需要使用激光传感器(或者深度传感器转换成激光数据),先进行地图建模,然后在根据建立的地图进行导航.定位.在ROS中也有很多完善的包可以直接使用. 在ROS中,进行导航需要使用到的三个包是: (1) move_base:根据参照的消息进行路径规划,使移动机器人到达指定的位置: (2) gmapping:根据激光数据(或者深度数据模拟的激光数据)建立地图: (3) amcl:根据已经有的地图进行定位. 参考链接:http://www.ro

理解ROS导航软件包集

ROS导航软件包的主要目的是将机器人从初始位置移动到目标位置,在移动的过程中不会与周围环境发生任何碰撞. ROS导航软件包附带了几种导航相关的算法实现,它们可以帮助我们轻松实现移动机器人的自主导航. 用户只需要提供机器人的目标位置和来自轮子编码器.IMU.GPS等传感器获得的测量数据,激光扫描器的数据流, 以及其他传感器的数据流,例如激光雷达数据或者来自Kinect等传感器的3D点云数据,导航软件包的输出是控制移动的 速度命令,这些命令将控制机器人移动到目标位置.导航软件包集包含了一些标准算法的

TCP粘包问题分析和解决(全)

TCP通信粘包问题分析和解决(全) 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小.数据量小的数据,合并成一个大的数据块,然后进行封包.这样,接收端,就难于分辨出来了,必须提供科学的拆包机制. 对于UDP,不会使用块的合并优化算法,这样,实际上目前认为,是由于UDP支持的是一对多的模式,

编译ros程序包--4

编译程序包(原创博文,转载请标明出处--周学伟) 1.编译程序包: 一旦安装了所需的系统依赖项,我们就可以开始编译刚才创建的程序包了. 注意: 如果你是通过apt或者其它软件包管理工具来安装ROS的,那么系统已经默认安装好所有依赖项. 记得事先source你的环境配置(setup)文件,在Ubuntu中的操作指令如下: [email protected]: source /opt/ros/indigo/setup.bash 2.使用使用 catkin_make catkin_make 是一个命令

java.util.concurrent包详细分析

java.util.concurrent包详细分析 java.util.concurrent 包含许多线程安全.测试良好.高性能的并发构建块.不客气地说,创建java.util.concurrent 的目的就是要实现 Collection 框架对数据结构所执行的并发操作.通过提供一组可靠的.高性能并发构建块,开发人员可以提高并发类的线程安全.可伸缩性.性能.可读性和可靠性.

浅谈使用tcpdump、wireshark对Android应用程序进行抓包并分析

本文主要介绍如何使用tcpdump和wireshark对Android应用程序进行抓包并分析,需要说明的是在抓包之前,你的Android设备必须root过了,另外你的电脑必须有Android SDK环境. 下载并安装tcpdump tcpdump链接:http://www.ijiami.cn/ 选择一个版本下载并解压提取出其中呃tcpdump文件,然后push到你的手机上去: adb push c:\tcpdump /data/local/tcpdump 进一步操作: adb shell su