ROS局部规划模块分析

BaseLocalPlanner是所有局部路径规划器的基类,所有的局部路径规划器都是它的插件

BaseLocalPlanner接口:

computeVelocityCommands

isGoalReached

setPlan

Initialize

1、以DWAPlannerROS为例:

a) 外部首先调用的是initialize函数,塞入外面弄好的costmap

b) DWAPlannerROS是对DWAPlanner的外部封装,DWAPlanner是实际的DWA算法实现类

c) Costmap会被塞入plannerutils中,然后该util将会传入DWAPlanner的构造函数

d) 实际使用时,会通过一些判断,类似于一个状态机,进行具体方法选择。主要是在快到点以及一些特殊状态时候不用DWA进行计算。

2、ROS中DWA解析

a) DWA其实最重要的就是各种速度评分函数及其权重的设计以及选择

b) 本DWA中主要使用了如下几种评分函数:

base_local_planner::OscillationCostFunction oscillation_costs_;

base_local_planner::ObstacleCostFunction obstacle_costs_;

base_local_planner::MapGridCostFunction path_costs_;

base_local_planner::MapGridCostFunction goal_costs_;

base_local_planner::MapGridCostFunction goal_front_costs_;

base_local_planner::MapGridCostFunction alignment_costs_;

c) 所有的CostFunction都是继承于TrajectoryCostFunction

d) TrajectoryCostFunction的主要接口如下:包含了评分函数所需要的一切接口,初始化,权重设定、获得,评分计算

i. Prepare

ii. scoreTrajectory

iii. setScale

iv. getScale

e) 所有的costfunction都塞在一个TrajectoryCostFunction*的容器中,塞入顺序需要注意,因为任何一个costfunction返回负评分都会让评价速度被抛弃,因此可以利用这个特性提高算法效率

除了costfunction是必须的外,还需要一个轨迹生成器,DWA中使用  base_local_planner::SimpleTrajectoryGenerator,塞在了base_local_planner::TrajectorySampleGenerator*的容器中

Costfunction和generator都初始化好之后,都塞在了scored_sampling_planner_中,该变量为 base_local_planner::SimpleScoredSamplingPlanner类型,继承于纯虚基类base_local_planner::TrajectorySearch

f) 实际供外部调用的接口为

findBestPath(

tf::Stamped<tf::Pose> global_pose,

tf::Stamped<tf::Pose> global_vel,

tf::Stamped<tf::Pose>& drive_velocities,

std::vector<geometry_msgs::Point> footprint_spec)

该函数中,首先进行generator_的初始化,然后调用scored_sampling_planner_的findBestTrajectory接口。findBestTrajectory的第一个参数为轨迹结果,第二个参数为遍历过得所有轨迹。在findBestTrajectory函数中,首先进行generator生成轨迹,之后利用costfunction进行评分。

g) 因此,马上要考虑的问题就出现了,那就是generator如何生成轨迹,以及costfuntion如何进行评分。

h) DWA中的generator如前所述,只有一个,是SimpleTrajectoryGenerator,该类会进行所有轨迹的计算,轨迹中会保存轨迹点、速度、评分等各种因素,最后下发的速度指令也是在这里选择确定的

时间: 2024-12-28 10:32:27

ROS局部规划模块分析的相关文章

ROS 导航包使用分析

转载请注明作者,谢谢 MoveBace.cpp阅读笔记 开放的功能函数: Action Server: executeCb Thread: planThread Sub CallBack : goalCB Srv Callback: planService clearCostMapService reconfigureCB executeCb负责接收新目标点,并设置别是否进行全局规划的标志位(planThread函数中),之后具体的到点在executeCycle中进行 导航实际流程为: 进行全局

css扁平化博客学习总结(一)模块分析

一.模块分析 1.每开发一个项目之前,首先要对项目进行一个大致规划,它到底要做什么功能,它有什么具体需求. 2.所以需要进行模块化分析,把这些东西具象化,把一个问题模块化,对需求有一个宏观的了解. 3.有一个模块的概念后,把模块进行细分,细分成更小的模块,然后逐一击破. 不进行模块分析的恶劣影响: 不做模块分析,一上手就想到哪儿做到哪儿,很容易一叶障目,不能看到全貌,你会发现做着做着就失控了.因为有些地方出现了矛盾,你会发现要修改的成本很高,还不如推倒重写. 新手很容易着眼于细节,首先不应该从细

学生信息管理系统(四)——模块分析

学生信息管理系统已经敲完了,也进行了第一次验收,结果不是太理想.之前的总结也没有及时发表.现在重新复习一遍,把它发表. 从今天开始,我们就进入了代码分析阶段.现在我们就来分析一下模块中的几个函数. Public Function ExecuteSQL(ByVal SQL As String, MsgString As String) As ADODB.Recordset 'executes SQL and returns Recordset Dim cnn As ADODB.Connection

ABP之模块分析

ABP之模块分析 本篇作为我ABP介绍的第三篇文章,这次想讲下模块的,ABP文档已经有模块这方面的介绍,但是它只讲到如何使用模块,我想详细讲解下它模块的设计思路. ABP 框架提供了创建和组装模块的基础,一个模块能够依赖于另一个模块.在通常情况 下,一个程序集就可以看成是一个模块.在 ABP 框架中,一个模块通过一个类来定义,而这 个类要继承自 AbpModule. 其实它的设计思路很简单: 1.加载bin目录下的所有dll 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Android WIFI模块分析

一:什么是WIFI WIFI是一种无线连接技术,可用于手机.电脑.PDA等终端.WIFI技术产生的目的是改善基于IEEE802.11标准的无线网络产品之间的互通性,也就是说WIFI是基于802.11标准的,但WIFI不等同无线网络. 二:Android平台下的WIFI模块 简单介绍一下,WIFI模块的基本功能: 1. 开关WIFI 除了在WIFI设置界面可以开关WIFI,还有其他的方法可以设置,要查看这些开关状态是否一致.还有就是飞行模式对WIFI开关的影响,由于WIFI开和关都有一个时间过程,

基于Android6.0的RIL框架层模块分析

本文与另外一篇分析RIL底层模块的文章是姐妹篇:基于Android6.0的RIL底层模块分析 根据手机网络制式的不同,通常系统中会扩展Phone.java这个类,扩展成GSMPhone和CDMAPhone.这个类主要是抽象整个手机来处理通信过程中与其他模块的交互.我们以GSMPhone为例,分析来电流程如何从底层传递到上层.该分析主要基于代码,所以会比较啰嗦. 以GSMPhone为例,在PhoneFactory类中有实例化该类的方法: public static Phone getGsmPhon

cocos2dx 音频模块分析(2):背景音乐

cocos2dx 音频模块分析(2): 背景音乐部分 我在(1)已经分析了一些东西,这里接着分析,这一篇我们主要分析背景音乐文件的播放, 还是基于android平台: 1. 这里只是背景音乐的预加载,为什么要进行预加载呢? 主要是加载音乐文件是比较耗时的,如果我们没有预加载就直接播放也是可以的, 但是会有一定的延时,因为如果没有预加载,就直接播放,也是会先进行加载音乐文件, 然后进行播放. void SimpleAudioEngine::preloadBackgroundMusic(const

cocos2dx 音频模块分析(3): 背景音乐部分

cocos2dx 音频模块分析(3):背景音乐部分 我在(2)已经分析了背景音乐文件的预加载preloadBackgroundMusic和播放playBackgroundMusic两个函数, 这里接着分析,还是基于android平台: 1. //暂停函数,用于音乐的暂停 void SimpleAudioEngine::pauseBackgroundMusic() { //在SimpleAudioEngineJni.cpp源文件中定义 pauseBackgroundMusicJNI(); } //

drf模块分析

drf请求模块.渲染模板.解析模块.响应模块.异常模块 请求模块 drf的请求模块 1.drf的request是在wsgi的request基础上再次封装 2.wsgi的request作为drf的request一个属性:_request 3.新的request对旧的request做了完全兼容 4.新的request对数据解析更规范化:所有的拼接参数都解析到query_params中,所有数据包数据都被解析到data中 query_params和data属于QueryDict类型,可以 .dict(