ROS局部路径规划器插件teb_local_planner规划流程概括总结

news2025/1/17 22:53:15

在这里插入图片描述


   本部分文章主要用于对ROS局部路径规划器插件teb_local_planner的规划流程进行梳理,并概括总结,本部分计划包含5~6篇文章,各文章主要内容如下:


   ☆第一篇:主要介绍ROS导航包Navigation中的 Movebase节点中的路径规划的相关流程,并对其进行梳理概括

   文章链接如下:

   ROS导航包Navigation中的 Movebase节点路径规划相关流程梳理

   ☆第二篇和第三篇:主要介绍ROS局部路径规划器插件teb_local_planner工作过程的详细流程

   文章链接如下:

   ROS局部路径规划器插件teb_local_planner流程梳理(上)

   ROS局部路径规划器插件teb_local_planner流程梳理(下)

   ☆第四篇:也就是本文,主要对ROS局部路径规划器插件teb_local_planner规划流程进行纯文字的概括总结,是对第二三篇文章的进一步概括和总结,此外还补充了一些使用teb_local_planner过程中常见报错或警告信息发生的阶段。

   文章链接如下:

   ROS局部路径规划器插件teb_local_planner规划流程概括总结

   ☆☆☆第五篇:主要对teb_local_planner规划器插件的各个参数进行详细的介绍,并分析它们在teb的规划流程中发挥着怎样的作用,是怎么发挥作用的,以及各个参数之间的相互影响,我对这篇文章的定位是teb_local_planner路径规划器参数调试的参考手册。

在这里插入图片描述

   目前该手册的初版已完成,目前共38页word,12061字,是根据对teb_local_planner规划器源码进行了详细的阅读及理论分析后,以及加入了我实际调试的一些经验后,编写而成。

   后续会在调试中,根据新的经验,进一步对该手册进行完善,因保密需要,本手册暂不公开,后续合适的时机会进行公开。



   接下来,正式开始本文主要内容的介绍,teb_local_planner规划流程,大体可分为三个阶段,第一部分是调用plan函数进行规划前的准备工作,第二部分是轨迹规划部分,也是核心部分,第三部分是得到经过g2o优化后的轨迹后,计算速度指令,下发给下位机进行控制。

   以下是这三个部分的概括总结:

   第一部分:规划前的准备工作

   首先对插件进行初始化,并获取机器人的当前位姿信息和速度信息,接着从接收到的全局路径点中初步选取局部路径点,然后判断机器人是否到达目标点(正常的迭代停止条件),然后判断是否进入恢复行为模式,然后根据参数判断是否要调整局部目标点的角度使其更加平滑,然后将机器人的当前位姿插入到局部路径点中,并根据参数选择更新障碍物信息的方式对障碍物信息进行更新。

   其中从接收到的全局路径点中初步选取局部路径点的过程,主要包含以下三步,首先裁剪掉已经走过的全局路径中与机器人当前位置到的距离大于设定阈值的点、然后裁剪掉与机器人当前位置的距离大于设定阈值或者从当前位置点开始向前累计的路径点的长度大于设定阈值的点,并同时将路径点的坐标系转换为局部代价地图下的坐标系,最后,对剩下的路径点进行稀疏化处理,即删除间隔小于设定阈值的路径点。在后续过程中还将机器人当前的位姿点插入到了路径点中,至此,初步得到了用于局部路径规划的路径点。

   第二部分:轨迹规划部分

   首先,进行轨迹的初始化,若接收到新的目标点,且新目标点与上一个目标点的距离差或姿态差大于设定阈值时,需要在规划前对轨迹进行初始化,若目标点没有变化,或者变化小于阈值,则认为是机器人移动过程中针对同一目标点的多次规划,此时采用所谓的热启动模式,只需要对已经走过的部分的路径点进行裁剪就可以了,不需要重新进行轨迹初始化。然后从里程计读取当前速度,作为起点处的速度,根据是是否允许在目标点处速度不为0来设定目标点处的速度,若不允许,则将目标点处的速度设为0,接着判断若允许则在构建图之前再优化一下局部路径点,则对局部路径点进行优化,然后正式开始图的构建,包括添加顶点和添加边两个过程,添加的顶点即路径点(包括姿态信息和时间差),添加的边即各种约束条件,构建好图后,便按照设定的内循环次数调用g2o对图进行优化,然后清空图,按照设定外循环次数,循环执行优化局部路径点、构建图、优化图、清空图这几个步骤。执行完外循环后根据参数决定是否计算当前的代价值,包含时间成本和障碍物成本。至此,得到了经过优化后的局部路径点,也就是优化后的轨迹。

   其中,轨迹初始部分包括以下内容:首先将当前位置处的姿态点添加到局部路径点中,并设置为固定,即优化过程中不能被改变。然后根据是否允许开始时后退来执行轨迹设置后退标志位,接着若允许覆盖全局路径中的局部路径点朝向,则根据局部路径点中相邻两个点之间连线的朝向,利用atan2函数重新计算每个局部路径点额朝向,若不允许覆盖,则保留局部路径点的原朝向。然后利用设定的最大线速度和角速度以及相邻两个路径点之间的距离,通过距离/速度,估计出相邻两个路径点之间的线运动时间差和角运动时间差,并取线运动时间差和角运动时间差中的较大值,作为这两个相邻路径点之间的时间差。然后判断是否需要强制添加局部路径点,若当前的局部路径点数量小于设定的阈值,则为了保证生成路径的路径点数量足够多,会不断在当前点与目标点之间取中点添加到局部路径点中(当前点会变化),直至局部路径点的数量等于设定的阈值。最后,将目标点添加到局部路径点的末尾处,并将其设为固定,即在优化中不能被改变。轨迹初始化完成。

   其中,构建图之前对局部路径点的优化包括以下内容:在轨迹初始化部分中,我们根据局部路径点中相邻两点的距离和最大线速度和角速度估计出了该两点间的运动时间,现在我们需要对两点间的运动时间间隔进行检查,如果某个时间间隔大于参考时间间隔加上时间滞后,且采样数小于最大采样数,则在此处插入一个新的路径点;如果时间间隔小于参考时间间隔减去时间滞后,并且采样数大于最小采样数,则删除此处的路径点。在进行这些插入和删除操作后会调整插入和删除点之间的时间间隔。如果参数fast_mode为真( fast_mode由外部参数 include_dynamic_obstacles取反后得到),则会在一次迭代中只进行一次调整,即在本次对局部路径点的优化中,调整过一个路径点后,就返回,否则将进行多次循环,直到没有点需要调整或者达到设定的最大循环次数100才返回。

   其中,构建图时添加的边包括障碍物边、动态障碍物边、经过点的边、速度边、加速度边、最优时间边、最短路径边、机器人运动形式边(运动学约束)、首选旋转方向边、速度障碍物比边。

   第三部分:计算下发给下位机的速度指令

   首先,还是需要进行一些准备工作,首先,若机器人的外形设定为动态外形,则需要更新机器人的外形信息以及从机器人中心到其外形边缘顶点的最小和最大距离,接着检查优化后得到的路径是否可行,可行性检测通过后,正式开始计算速度指令,将得到的速度进行限幅检查,然后根据设定的参数决定是否需要将机器人的角速度指令转换为舵机的角度指令。最后将得到的线速度和角速度/角度发布出去,至此TEB的流程结束。

   其中,检查优化后得到的路径是否可行的过程如下:根据外部参数 feasibility_check_no_poses的值决定检查轨迹中路径点的个数,比如其值为4,则检测轨迹中前4个路径点处是否与障碍物相交,需要注意的是,会把机器人的外形轮廓放置到该路径点处进行碰撞检测,而不是仅仅对该点进行检测,若有碰撞,则返回可行性检测未通过,将线速度和角速度设置为0,重置规划器,开始新的规划。此外,同时还会判断局部路径上每个点之间的距离以及朝向角度差,这个距离不能超过机器人的长度,如果超过了机器人的长度则点上的模型不能完全覆盖机器人路径,可能会存在说两个姿态点处没有碰撞,但是两点间的路径之间存在障碍物的问题,这样仅仅对点进行判断是不能完全保证路径可行的。此时,要对路径按照机器人长度进行插值,直到模型覆盖整条路径为止。角度的问题也是一样的。

   其中,速度的具体计算过程如下:从局部路径点容器中依次累加两点间的时间差直至大于时间分辨率 ,至此找到了局部路径点容器中和起点之间时间差大于时间分辨率的点,该过程还会受参数 control_look_ahead_poses(默认为1)的影响,这个参数决定了最多累加几次,默认为1时,找到的点其实就是局部路径点中起点和其后面的相邻点,无论他们的时间差是否大于dt_ref,因为只允许累加1次。 然后,根据这两个点的位姿信息、时间差、当前的速度信息,调用extractVelocity函数,计算并更新速度信息,对于非完整约束的类车型机器人,其y轴速度为0,x轴速度为两点间距离除以时间差,若为完整约束的机器人,即y轴上的速度可以不为0在,则x轴与y轴速度分别为两点在x轴与y轴的距离差除以时间差,角速度为姿态角差除以时间差。返回true

   其中,速度限幅的具体过程如下:根据参数use_proportional_saturation进行处理,若该参数为默认值false,则对x、y轴速度及角速度分别按各自的比例进行处理,效果等效于若超过其对应的最大值,则限幅为其最大值。若use_proportional_saturation的值为True,则按同比例进行处理,比如当前x,y的速度及角速度分别为2、1、1,其对应最大值分别为 1.5、1.5、0.5,y轴速度未超过最大值,比例设为1,x轴速度超过最大值比例取为最大速度/当前速度,即1.5/2=0.75,同理角度比例为 0.5/1=0.5,取这三个比例的最小值,为共同的比例,即min(1,0.75,0.5)=0.5,则将当前速度都乘以该比例,由 2、1、1,变为1、0.5、0.5。

   其中,角速度转换为角度的具体过程如下:先根据当前x轴的线速度除以角速度得到转向半径radius,若该半径小于最小转弯半径 min_turning_radius,则修正为最小转弯半径,然后根据外部参数车辆模型的前后轮间距 wheelbase与该转弯半径radius的比值取反三角函数即可得到需要的转角。


   补充:使用teb_local_planner过程中常见报错或警告信息发生的阶段

   1、[ WARN] :TebLocalPlannerROS: trajectory is not feasible. Resetting planner

   此警告发生于规划结束后,进行速度计算前的可行性检测部分,调用isTrajectoryFeasible函数进行可行性检测,检测轨迹中前feasibility_check _no_poses个路径点处是否与障碍物相交,需要注意的是,会把机器人的外形轮廓放置到该路径点处进行碰撞检测,而不是仅仅对该点进行检测。

   若有碰撞,则返回可行性检测未通过,将线速度和角速度设置为0,给出报错信息,重置规划器,开始新的规划。

ROS_WARN("TebLocalPlannerROS: trajectory is not feasible. Resetting planner...");

   偷懒型解决思路:减少小车外形参数设定的范围或者改成点模型,减少参数feasibility_check_no_poses的值,或者进一步直接取消可行性检测过程。

   ( 所谓偷懒型解决思路,即治标不治本的解决方法 )


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/896335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1000元到3000元预算的阿里云服务器配置大全

1000元、2000元或3000元预算能够买的阿里云服务器配置有哪些?可以选择ECS通用算力型u1云服务器、ECS计算型c7或通用型g7实例规格,当然,如果选择轻量应用服务器的话,更省钱,阿里云百科分享1000-3000元预算能买的阿里云服…

敏捷项目管理解决方案

Leangoo领歌是一款永久免费的专业敏捷研发管理工具,提供敏捷研发解决方案,解决研发痛点,打造成功产品。帮助团队实现需求、迭代、缺陷、任务、测试、发布等全方位研发管理。 敏捷产品路线图管理: 产品路线图是一个高层次的战略计…

Android 9.0 Vold挂载流程解析(下)

Android 9.0 Vold挂载流程解析(上) 前言 上一篇介绍了Android 文件系统中Vold挂载机制的总体框架,我们分析了vod进程的main.cpp.接下来我们分析下存储卡挂载和卸载的流程。 存储卡挂载 在上篇文章文章提到,监听驱动层挂载和卸…

SOLIDWORKS 2023中装配体配合的正确使用方法 硕迪科技

-SOLIDWORKS 装配体打开时是由不同的阶段和性能检查组成的。如果在创建装配体时未应用基本的配合方法,问题会随着时间的推移而累积,并且在使用时会出现明显的速度减慢。 如果您的装配体运行速度很慢,则很可能是在创建配合时出现了不良操作的症…

腾讯云 CODING 荣获 TiD 质量竞争力大会 2023 软件研发优秀案例

点击链接了解详情 8 月 13-16 日,由中关村智联软件服务业质量创新联盟主办的第十届 TiD 2023 质量竞争力大会在北京国家会议中心召开。本次大会以“聚焦数字化转型 探索智能软件研发”为主题,聚焦智能化测试工程、数据要素、元宇宙、数字化转型、产融合作…

Python入门--变量

变量是指在程序运行期间可以改变其值的数据类型。在Python中,变量可以指定任何数据类型,如字符串、整数、浮点数等。 要创建一个变量,我们必须先指定变量的名称,然后将其赋值。在Python中,变量名可以是任何有意义的名…

分布式基础

1、分布式简介 1.1、分布式定义 分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。 1.2、分布式特点 分布性:分布式系统中的多台计算机都会在空间上随意分布,同时,机器…

本地访问远程web服务

1、 2、以管理员身份运行cmd ssh usernameremote_address -L 127.0.0.1:8888:127.0.0.1:8008 3、在远程服务器上去运行web服务 4、本地访问

【BASH】回顾与知识点梳理(三十六)

【BASH】回顾与知识点梳理 三十六 三十六. 认识与分析登录档36.1 什么是登录档CentOS 7 登录档简易说明登录档的重要性Linux 常见的登录档档名登录档所需相关服务 (daemon) 与程序CentOS 7.x 使用 systemd 提供的 journalctl 日志管理 登录档内容的一般格式 36.2 rsyslog.servi…

C++中String的语法及常用接口用法

在C语言中,string是一个标准库类(class),用于处理字符串,它提供了一种更高级、更便捷的字符串操作方式,string 类提供了一系列成员函数和重载运算符,以便于对字符串进行操作和处理。 一、string…

大模型系列|基于大模型的聊天助手案例(三)

大模型系列|垂直大模型的几种训练策略(一) 大模型系列|基于大模型复杂数据系统架构(二) 本篇主要是采集一些大模型在聊天机器人中的案例,因为目前很多企业都会考虑将LLM与业务结合,L…

LSTM网络模型:从基础到应用播

目录 介绍 LSTM的基础结构 LSTM的训练方法 LSTM的应用场景 总结 LSTM(Long Short-Term Memory)网络模型是一种递归神经网络,被广泛应用于自然语言处理、语音识别、图像处理等领域。本文将从LSTM的基础结构、训练方法、应用场景等方面进行…

LD_RPELOAD环境变量

目录 LD_RPELOAD环境变量 LD_RPELOAD 定义 程序的连接方式 Linux规定动态链接库的文件名规则如下 动态链接库的搜索路径搜索的先后顺序 LD_RPELOAD的劫持 demo 1.定义一个hook.c文件 2.将所写的hook.c 文件编译为动态链接库hook.so 3.劫持检测,查看LD_PREL…

于vue3+vite+element pro + pnpm开源项目

河码桌面是一个基于vue3viteelement pro pnpm 创建的monorepo项目,项目采用的是类操作系统的web界面,操作起来简单又方便,符合用户习惯,又没有操作系统的复杂! 有两个两个分支,一个是web版本,…

DDD诊所——聚合过大综合症

“DDD诊所”是Thoughtworks DDD社区的一项活动,通过对同事们在实施DDD过程中遇到的问题进行分析和解答,共同提高开发水平。我们将其中一些典型案例整理成文供大家参考。之后也会考虑在适当的时候将这一形式对外部开放。 就诊日期:2022年6月8…

基于SpringBoot的在线视频教育平台的设计与实现【附ppt|开题|万字文档(LW)和搭建文档】

主要功能 前台界面: ①首页、课程信息推荐、课程信息展示、查看更多等 ②课程信息类型、课程名称、关键词、教师姓名等 ③添加购物车、立即购买、评论、点我收藏、视频播放等 ④个人中心、我的订单、我的地址、我的收藏、客服等 后台登录: ①首页、个人…

BERT、ERNIE、Grover、XLNet、GPT、MASS、UniLM、ELECTRA、RoBERTa、T5、C4

BERT、ERNIE、Grover、XLNet、GPT、MASS、UniLM、ELECTRA、RoBERTa、T5、C4 ELMOBERTERNIE![在这里插入图片描述](https://img-blog.csdnimg.cn/274e31d0f8274c748d05abe2ec65fc73.png)GroverXLNetGPTMASSUniLMELECTRARoBERTaT5C4ELMO BERT

小航助学GESP_C++一级模拟测试卷第3套(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSD…

Spring中的IOC与DI-细胞内物质与传递

对IOC的认识 Spring Inversion of Control简称Spring IOC,是一种设计原则,通过它可以实现对象之间的解耦。通过Spring DI(Dependency Injection)依赖注入实现对象生命周期管理,为开发者提供对象创建、使用方式。 Spring中的Bean 在Spring框…