前言
在自主移动机器人路径规划的学习与开发过程中,我接触到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
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame
文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk=Var(yt)Cov(yt,yt−k)其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标
一、机器人介绍 此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接
2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动
我一直在尝试用Ruby实现Luhn算法。我一直在执行以下步骤:该公式根据其包含的校验位验证数字,该校验位通常附加到部分帐号以生成完整帐号。此帐号必须通过以下测试:从最右边的校验位开始向左移动,每第二个数字的值加倍。将乘积的数字(例如,10=1+0=1、14=1+4=5)与原始数字的未加倍数字相加。如果总模10等于0(如果总和以零结尾),则根据Luhn公式该数字有效;否则无效。http://en.wikipedia.org/wiki/Luhn_algorithm这是我想出的:defvalidCreditCard(cardNumber)sum=0nums=cardNumber.to_s.s