系统门窗品牌10大品牌排行/英文seo实战派
前言
在自主移动机器人路径规划的学习与开发过程中,我接触到Time Elastic Band算法,并将该算法应用于实际机器人,用于机器人的局部路径规划。在此期间,我也阅读了部分论文、官方文档以及多位大佬的文章,在此对各位大佬的分享表示感谢。在本文中,我将分享Time Elastic Band算法的原理、个人对Time Elastic Band算法的理解以及在ROS下通过teb_local_planner对该算法进行演示和讲解。
01
相关论文
以下两篇论文主要介绍了Time Elastic Band算法以及使用稀疏模型进行优化:
[1].C. Rösmann, W. Feiten, T. Wösch, F. Hoffmann and T. Bertram: Trajectory modification considering dynamic constraints of autonomous robots. Proc. 7th German Conference on Robotics, Germany, Munich, 2012, pp 74–79.
[2].C. Rösmann, W. Feiten, T. Wösch, F. Hoffmann and T. Bertram: Efficient trajectory optimization using a sparse model. Proc. IEEE European Conference on Mobile Robots, Spain, Barcelona, 2013, pp. 138–143.
以下两篇论文介绍了同时规划多条轨迹,并选取出当前的全局最优轨迹:
[1].C. Rösmann, F. Hoffmann and T. Bertram: Integrated online trajectory planning and optimization in distinctive topologies, Robotics and Autonomous Systems, Vol. 88, 2017, pp. 142–153.
[2].C. Rösmann, F. Hoffmann and T. Bertram: Planning of Multiple Robot Trajectories in Distinctive Topologies, Proc. IEEE European Conference on Mobile Robots, UK, Lincoln, Sept. 2015.
以下这篇论文介绍了类汽车机器人的轨迹优化:
[1].C. Rösmann, F. Hoffmann and T. Bertram: Kinodynamic Trajectory Optimization and Control for Car-Like Robots, IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), Vancouver, BC, Canada, Sept. 2017.
02
算法原理概述
本文依据Christoph Rösmann在论文中的描述,对eletic band进行定义:将给定的路径视为受内外力影响的弹性橡皮筋,使其变形,而内外力相互平衡,使路径收缩,同时与障碍物保持一定的距离,其中内外力就是对机器人运动的所有约束。而对于time eletic band,则在给定路径中间插入N个控制橡皮筋形状的控制点(机器人姿态),在点与点之间定义运动时间Time,即为Time Elastic Band算法。
通过上述定义我们可以看出,Time Elastic Band算法把路径规划问题描述为一个多目标优化问题,即对最小化轨迹执行时间、与障碍物保持一定距离并遵守运动动力学约束等目标进行优化。因为优化的大多数目标都是局部的,只与机器人的某几个连续的状态有关,所以该优化问题为对稀疏模型的优化。通过求解稀疏模型多目标优化问题,可以有效获得机器人的最佳运动轨迹。
求解稀疏模型多目标优化问题,可通过构建超图(hyper-graph),使用g2o(通用图优化)框架中关于大规模稀疏矩阵的优化算法来求解。机器人状态和时间间隔作为nodes,目标函数和约束函数作为edges,各nodes由edges连接构成hyper-graph。在该hyper-graph中,每个约束为一条edge,且每条edge允许连接的nodes的数目不受限制。
Time Elastic Band算法通俗的解释就是从给定路径中得到一系列带时间信息的离散位姿(pose),通过图优化的方法将这些离散位姿组成满足时间最短、距离最短和远离障碍物等目标的轨迹,同时满足机器人运动动力学的约束。需要注意的是,优化得到的轨迹并不一定满足所有约束,即给定的约束条件实际上都是软约束条件。
03
算法演示与讲解
通过阅读teb_local_planner的源码,我们可以知道teb_local_planner提供了许多参数和权重的配置接口,让用户可以为优化问题提供参数和权重,在不同的约束条件下指定优化目标。下面我们通过对teb_local_planner实现效果的简单演示来加深对Time Elastic Band算法的理解。
前面提到,Time Elastic Band算法可以在给定路径的基础上对轨迹进行优化,实现最小化轨迹时间、与障碍物保持距离等目标。
其中,与障碍物保持距离可以说是一个路径规划算法比较重要的功能,teb_local_planner提供了min_obstacle_dist和inflation_dist两个参数以及相应的权重,使用户可对轨迹与障碍物的距离进行调整,以此来满足不同环境下路径规划的需求。以下为配置不同参数值时,teb_local_planner规划出的不同的轨迹(为了使演示的效果更加明显,参数权重给得比较大):

min_obstacle_dist为0.5,inflation_dist为0.6

min_obstacle_dist为0.5,inflation_dist为1.0

min_obstacle_dist为1.0,inflation_dist为0.6
通过以上效果可以看出,min_obstacle_dist和inflation_dist两个参数的值会导致teb_local_planner规划出不同的轨迹。min_obstacle_dist可以视为比inflation_dist更为严格的约束条件,只有当inflation_dist的值大于min_obstacle_dist时,inflation_dist才会影响teb_local_planner规划出的轨迹。
当然,参数对应权重的大小也会对规划出的轨迹有一定影响。在实际的应用过程中,需要用户对环境以及机器人自身的定位精度进行评估,从而设定合理的参数值,使得teb_local_planner能够规划出较优的路径。
除了与障碍物保持距离,如何合理并有效地跟随全局路径也是衡量一个局部规划算法好坏的重要标准。
teb_local_planner提供global_plan_viapoint_sep参数以及相应的权重,使用户可以根据不同的需求对期望轨迹设定约束条件。为了更好的理解该参数的作用,我首先解释一下viapoint,viapoint可以理解为通过点,即要求teb_local_planner规划出的轨迹必须通过某个点。下面通过一个极端一点的例子来看一下viapoint的效果:

未设置viapoint

在两个障碍物中间设置了viapoint
可以看到,上面两幅图中,带红色箭头的轨迹为teb_local_planner规划出的轨迹。未设置viapoint时,teb_local_planner选取了上方的轨迹为最优轨迹,当在两个障碍物中间设置了viapoint,最优轨迹从两个障碍物中间穿过。由此可以看出,viapoint对teb_local_planner规划选取的最优轨迹有很大的影响。从侧面也反映出,Time Elastic Band算法是尽可能地满足设定的多个约束条件,选取出最优的轨迹。
现在,我们再来看global_plan_viapoint_sep在局部规划中的作用,该参数的描述为“从全局路径中选取的每两个连续通过点之间的最小间隔”,结合对viapoint的理解,从该描述中我们可以知道,该参数影响的是teb_local_planner规划的最优轨迹对全局路径的跟随效果。
当global_plan_viapoint_sep的值比较小时,从全局路径中选取的viapoint比较密集,最优轨迹对全局路径的跟随效果比较好;当global_plan_viapoint_sep的值比较大时,从全局路径中选取的viapoint比较稀疏,最优轨迹对全局路径的跟随效果比较差,但此时的最优轨迹可能更加平滑。
以下为使用Car-like模型时global_plan_viapoint_sep设置不同的值实现的路径规划的效果(同样的,为了使演示效果更加明显,适当地加大参数的权重):

global_plan_viapoint_sep设置为0.1

global_plan_viapoint_sep设置为5.0
从上面的实现效果可以明显看出, 当global_plan_viapoint_sep设置为0.1时,最优轨迹很紧密地跟随全局路径,Car-like模型在转向时需要多次调整角度,当global_plan_viapoint_sep设置为5.0时,最优轨迹并没有严格遵循全局路径,而是更为顺滑地完成转向。这是global_plan_viapoint_sep设置不同值时,teb_local_planner选取最优轨迹的不同效果。
在与障碍物保持距离和跟随全局路径的情况下,Time Elastic Band算法遵循运动动力学约束。teb_local_planner提供了max_vel_x和max_vel_theta等多个参数以及相应的权重,用户可根据实际机器人的性能进行设置。下面我们通过一个示例来简单看一下Time Elastic Band算法对速度约束的效果:

存在障碍物的情况下,teb_local_planner选取的最优轨迹

与上述轨迹对应的线速度和角速度曲线
max_vel_x为0.4m/s,max_vel_theta为0.3rad/s
我们可以发现,轨迹对应的线速度曲线的最大速度大于max_vel_x,这是因为max_vel_x对应的权重设置得较小导致的。由此也可以反映出Time Elastic Band算法遵循的约束条件为软约束,用户可以通过权重设定算法是否严格遵循约束条件。
说到这里,可能也有小伙伴发现了,在上面演示的过程中,teb_local_planner并不仅仅规划出一条路径,而是从多条路径中选取最优轨迹,这就不得不提到teb_local_planner中的Homotopy Class Planner,用户可以将enable_multithreading参数设置为True来开启同时规划多条路径,并从中选取最优轨迹。下面我们也来看一下只规划一条轨迹与同时规划多条路径并选取最优轨迹的对比:

只规划一条轨迹

同时规划多条路径并选取最优轨迹
从上面的对比可以看出,在某些极端条件下,同时规划多条路径并选取最优轨迹得到的轨迹更符合全局最优,也更合理。当然,同时规划多条路径也将消耗更多的机器性能。在实际应用过程中,用户应当根据具体情况合理取舍。
04
总结
通过上面的介绍,可以看出Time Elastic Band算法有很多的优点,可以满足时间最短、距离最短和远离障碍物等目标以及满足机器人运动动力学的约束。那是不是Time Elastic Band算法就没有缺点呢?答案是否定的。
从前文我们可以知道,Time Elastic Band算法的大多数约束都是软约束条件。若参数和权重设置不合理或者环境过于苛刻,都有可能导致Time Elastic Band算法规划失败,出现非常奇怪的轨迹。因此,teb_local_planner中包含了检测冲突的部分,判断轨迹上的点是否与障碍物存在冲突,此时需要考虑机器人的实际轮廓。
在实际的开发过程中,更多地需要考虑机器人自身其他模块的性能,例如电机能够提供的最大加速度,定位算法的精度等,同时也要考虑具体的环境以及选择Time Elastic Band算法是否合理,如此才能将其性能发挥出更好的效果。
在本文中,我分享了我对Time Elastic Band算法的一点理解,但毕竟认知有限,对算法的部分内容的理解还是比较粗浅的,望大家多多包涵,有什么问题也希望能够与大家多交流。在后续的文章中,我会分享ROS自主移动机器人的开发以及各类算法的应用,有机会的话也会对Time Elastic Band算法的原理进行更加深入的解析,希望大家多多支持。
teb_local_planner github项目地址:
https://github.com/rst-tu-dortmund/teb_local_planner.git
在ROS noetic下安装teb_local_planner:
从ROS官方仓库中安装:
sudo apt install ros-noetic-teb-local-planner
从github仓库中下载源码进行编译:
git clone https://github.com/rst-tu-dortmund/teb_local_planner.git
相关文章:

机器人运动|浅谈Time Elastic Band算法
前言在自主移动机器人路径规划的学习与开发过程中,我接触到Time Elastic Band算法,并将该算法应用于实际机器人,用于机器人的局部路径规划。在此期间,我也阅读了部分论文、官方文档以及多位大佬的文章,在此对各位大佬的…...

【Linux】网络基础(1)
前言 相信没有网络就没有现在丰富的世界。本篇笔记记录我在Linux系统下学习网络基础部分知识,从关于网络的各种概念和关系开始讲起,逐步架构起对网络的认识,对网络编程相关的认知。 我的上一篇Linux文章呀~ 【Linux】网络套接字编程_柒海啦的…...

限流算法详解
限流是我们经常会碰到的东西,顾名思义就是限制流量。它能保证我们的系统不会被突然的流量打爆,保证系统的稳定运行。像我们生活中,地铁就会有很多护栏,弯弯绕绕的,这个就是一种限流。像我们抢茅台,肯定大部…...

Spark/Hive
Spark/HiveHive 原理Spark with HiveSparkSession Hive Metastorespark-sql CLI Hive MetastoreBeeline Spark Thrift ServerHive on SparkHive 擅长元数据管理Spark 擅长高效的分布式计算 Spark Hive 集成 : Hive on Spark : Hive 用 Spark 作为底层的计算引擎时Spark w…...

HashMap底层的实现原理(JDK8)
目录一、知识点回顾二、HashMap 的 put() 和 get() 的实现2.1 map.put(k, v) 实现原理2.2 map.get(k) 实现原理三、HashMap 的常见面试题3.1 为何随机增删、查询效率都很高?3.2 为什么放在 HashMap 集合 key 部分的元素需要重写 equals 方法?3.3 HashMap 的 key 为…...

操作系统-整理
进程 介绍 进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大&#…...

系统换行符的思考
各系统换行符 换行符,也即是回车换行,因为表示为Carriage-Return和Line-Feed。 回车用Return-Carrige表示,简写为CR,字符表示为\r。 换行用Line-Feed表示,简写为LF,字符表示为\n。 由于历史原因…...

Wwise集成到unreal
1、Wwise集成到Unreal 1.1 安装必要的软件 安装unreal 5.1;安装Audiokinetic Launcher;集成版本是Wwise 2021.1.12.7973。Audiokinetic Launcher下载地址: https://www.audiokinetic.com/zh/thank-you/launcher/windows/?refdownload&pl…...

前端秘籍之=>八股文经卷=>(原生Js篇)【持续更新中...】
大家好,最近想了想,打算总结归纳一版前端八股文经卷,给大家提供学习参考,如果帮助到大家,请大家,一键三连支持一下,你们的支持会激励我更加努力的更新更多有用的知识,博主先在这里谢…...

【Python安装配置教程】
Python由荷兰数学和计算机科学研究学会的吉多范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台…...

Spring-Retry失败重试
文章目录 重试的场景引入依赖启动类serviceController@Retryable参数@Recover注意事项重试的场景 1、网络波动需要,导致请求失败,需要重发。 2、发送消息失败,需要重发,重发失败要记录日志 … 引入依赖 <!-- spring-retry--> <dependency><groupId>or…...

【目标检测 DETR】通俗理解 End-to-End Object Detection with Transformers,值得一品。
文章目录DETR1. 亮点工作1.1 E to E1.2 self-attention1.3 引入位置嵌入向量1.4 消除了候选框生成阶段2. Set Prediction2.1 N个对象2.2 Hungarian algorithm3. 实例剖析4. 代码4.1 配置文件4.1.1 数据集的类别数4.1.2 训练集和验证集的路径4.1.3 图片的大小4.1.4 训练时的批量…...

项目ER图和资料
常用的数据类型 模型类 一对多 from app import db import datetimeclass BaseModel(db.Model):__abstract__ Truecreate_time db.Column(db.DateTime,defaultdatetime.datetime.now())update_time db.Column(db.DateTime,defaultdatetime.datetime.now())class Role(db.M…...

剑指 Offer 20. 表示数值的字符串(java+python)
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 数值(按顺序)可以分成以下几个部分: 若干空格 一个 小数 或者 整数 (可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数…...

程序员的逆向思维
前要: 为什么你读不懂面试官提问的真实意图,导致很难把问题回答到面试官心坎上? 为什么在面试结束时,你只知道问薪资待遇,不知道如何高质量反问? 作为一名程序员,思维和技能是我们职场生涯中最重要的两个方面。有时候…...

吐血整理学习方法,2年多功能测试成功进阶自动化测试,月薪23k+......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 测试进阶方向 测试进…...

mysql慢查询:pt-query-digest 分析
"某些SQL语句执行效率慢",这个问题总体上分为两类: 出现了慢查询语句某些查询语句没有使用索引 由于数据的写入量非常大,所以要想直接打开慢查询日志来查看到底哪些语句有问题几乎是不可能的,因为日志的刷新速度太快了…...

git的使用整合
git的下载和安装暂时不论述了,将git安装后会自动配置环境变量,所以环境变量也不需要配置。 一、初始化配置 打开git bash here(使用linux系统下运行的口令),弹出一个类似于cmd的窗口。 (1)配置属性 git config --glob…...

XCPC第九站———背包问题!
1.01背包问题 我们首先定义一个二维数组f,其中f[i][j]表示在前i个物品中取且总体积不超过j的取法中的最大价值。那么我们如何得到f[i][j]呢?我们运用递推的思想。由于第i个物品只有选和不选两种情况,当不选第i个物品时,f[i][j]f[i…...

【软考 系统架构设计师】论文范文④ 论基于构件的软件开发
>>回到总目录<< 文章目录 论基于构件的软件开发范文摘要正文论基于构件的软件开发 软件系统的复杂性不断增长、软件人员的频繁流动和软件行业的激烈竞争迫使软件企业提高软件质量、积累和固化知识财富,并尽可能地缩短软件产品的开发周期。 集软件复用、分布式对…...

spring-integration-redis中分布式锁RedisLockRegistry的使用
pom依赖:<!-- redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.integ…...

城市通电(prim算法)
acwing3728 蓝桥杯集训每日一题 平面上遍布着 n 座城市,编号 1∼n。 第 i 座城市的位置坐标为 (xi,yi) 不同城市的位置有可能重合。 现在要通过建立发电站和搭建电线的方式给每座城市都通电。 一个城市如果建有发电站,或者通过电线直接或间接的与建…...

【动态规划】
动态规划1引言题目509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯小结53. 最大子数组和结语引言 蓝桥杯快开始了啊,自从报名后还没认真学过算法有(>﹏<)′,临时抱一下佛脚,一起学学算法。 题目 509. 斐波那契数 斐波那契数 &am…...

秒懂算法 | DP概述和常见DP面试题
动态(DP)是一种算法技术,它将大问题分解为更简单的子问题,对整体问题的最优解决方案取决于子问题的最优解决方案。本篇内容介绍了DP的概念和基本操作;DP的设计、方程推导、记忆化编码、递推编码、滚动数组以及常见的DP面试题。 01、DP概述 1. DP问题的特征 下面以斐波那…...

【C++提高编程】C++全栈体系(二十五)
C提高编程 第四章 STL- 函数对象 一、函数对象 1. 函数对象概念 概念: 重载函数调用操作符的类,其对象常称为函数对象函数对象使用重载的()时,行为类似函数调用,也叫仿函数 本质: 函数对象(仿函数)是一个类&…...

【云原生】k8s核心技术—集群安全机制 Ingress Helm 持久化存储-20230222
文章目录一、k8s集群安全机制1. 概述2. RBAC——基于角色的访问控制二、Ingress三、Helm1. 引入2. 使用功能Helm可以解决哪些问题3. 介绍4. 3个重要概念5. helm 版本变化6. helm安装及配置仓库7. 使用helm快速部署应用8. 自己创建chart9. 实现yaml高效复用四、持久化存储1.nfs—…...

【Linux】实现简易的Shell命令行解释器
大家好我是沐曦希💕 文章目录一、前言二、准备工作1.输出提示符2.输入和获取命令3.shell运行原理4.内建命令5.替换三、整体代码一、前言 前面学到了进程创建,进程终止,进程等待,进程替换,那么通过这些来制作一个简易的…...

再获认可!腾讯安全NDR获Forrester权威推荐
近日,国际权威研究机构Forrester发布最新研究报告《The Network Analysis And Visibility Landscape, Q1 2023》(以下简称“NAV报告”),从网络分析和可视化(NAV)厂商规模、产品功能、市场占有率及重点案例等…...

代码审计之旅之百家CMS
前言 之前审计的CMS大多是利用工具,即Seay昆仑镜联动扫描出漏洞点,而后进行审计。感觉自己的能力仍与零无异,因此本次审计CMS绝大多数使用手动探测,即通过搜索危险函数的方式进行漏洞寻找,以此来提升审计能力…...

ONLYOFFICE中利用chatGPT帮助我们策划一场生日派对
近日,人工智能chatGPT聊天机器人爆火,在去年年底发布后,仅仅两个月就吸引了全球近一亿的用户,成为史上最快的应用消费程序,chatGPT拥有强大的学习和交互能力 可以被学生,教师,上班族各种职业运…...