机器人控制算法——TEB算法—Obstacle Avoidance and Robot Footprint Model(避障与机器人足迹模型)
1.How Obstacle Avoidance works
1.1处罚条款
避障是作为整体轨迹优化的一部分来实现的。显然,优化涉及到找到指定成本函数(目标函数)的最小成本解(轨迹)。简单地说:如果一个计划的(未来)姿势违反了与障碍物的期望分离,那么成本函数的成本必须增加。理想情况下,在这些情况下,成本函数值必须是无穷大的,否则优化器可能会更好地完全拒绝这些区域。然而,这将需要优化器处理硬约束(即求解非线性程序)。teb_local_planner放弃了考虑硬约束的能力,以便更好地考虑效率。将硬约束转化为软约束,从而得到具有有限代价的二次罚项。

上图显示了一个示例处罚条款(针对避障)。到障碍物的允许最小欧几里得距离(参数 m i n o b s t a c l e d i s t min_obstacle_dist minobstacledist)设置为0.2米。因此,0.2米以下的距离会导致非零成本。现在假设优化问题包含更多的成本项。其中一些是相互冲突的,例如时间最优性。因此,优化器可能会考虑到一个小的违规(因此也会考虑到小的惩罚),以最小化整个组合成本函数。这里有两个选项可以调整行为:
1. 调整优化权重(按比例缩放单个成本,此处为参数weight_obstacle)。但是,如果选择过高的值,优化问题就会变得病态,从而导致较差的便利性行为。
2. 通过添加“额外边距”来改变参数。通过在min_obstacle_dist参数中添加一个小的额外裕度,您可以将成本值隐式地增加到0.2m。您可以使用单个参数penalty_ epsilon同时移动所有惩罚项,但要小心,因为这样做会极大地影响优化结果。
1.2 局部最优解
请注意,优化器本身只能找到局部最优的解决方案。想象一下,机器人可能被两个障碍物横向包裹。惩罚项确实是非零的,但优化器会被卡住(达到这个局部最小值),因为将相应的姿势横向移动到其中一个障碍物会进一步增加总成本。您可以使用test_optim_node轻松尝试(请参阅教程设置和测试优化,并关闭同源类规划)。行为应类似于下图中的行为:

轨迹无法跳过障碍物。即使是姿势本身也被推离障碍物之间的区域(红色箭头)。显然,在实践中应该避免这种情况。因此,同源类规划算法寻求(拓扑)替代解决方案,而可行性检查(见下文)在实际指挥机器人之前拒绝了这样的解决方案。
1.3位势和障碍之间的关联
下图显示了一个常见规划场景的快照:
该场景由一个移动机器人组成,该机器人在前往当前目标时接近多边形障碍物。计划(离散)轨迹由多个机器人姿态组成。规划者的目标是根据所需的时间分辨率(参数dt_ref)来安排每两个连续的姿势。请注意,实际分辨率不是固定/冻结的,因为优化器需要调整转换时间以寻求时间最优性。
对于避障,计划姿势和障碍物之间的距离必须从下方界定。图中的示例轨迹由8个可变姿势组成(起始姿势和目标姿势是固定的)。您可能同意,为了实现无碰撞轨迹,需要进行多次距离计算(优化器多次调用成本函数值的计算)。为了加速优化,实现了专用的关联策略。
对于每个障碍物(点/占用的成本图单元、线、多边形),定位计划轨迹的最接近姿态(见图)。根据参数obstacle_poses_affected的值,还考虑了最近姿态的受影响邻居。在随后的优化步骤中只考虑该选定的姿态子集(这里是3个姿态,因此是3个惩罚项)。分别在no_inner_iterations(参数)之后重复关联过程。在每个外部优化迭代obstacle_poses_affected的值会略微影响障碍物周围轨迹的平滑度。此外,更大的障碍需要更多的连接姿势,以避免不可错过的捷径。您也可以选择一个较高的值(>轨迹长度),以便将所有姿势与每个障碍物连接起来。
注意,机器人足迹模型被考虑用于距离计算,因此对于所需的计算资源至关重要。以下部分对详细信息进行了总结。
2.Robot Footprint Model 机器人足迹模型
出于优化目的,机器人足迹模型近似机器人的2D轮廓。该模型对于距离计算的复杂性以及计算时间至关重要。因此,机器人足迹模型构成了一个专用参数,而不是从通用的costmap_2d参数加载足迹。优化占地面积模型可能与成本图占地面积模型不同(后者用于可行性检查,请参阅下一节)。
封装外形模型是使用参数服务器选择和配置的。您可以将以下参数结构添加到teb_local_planner配置文件中:
TebLocalPlannerROS:footprint_model: # types: "point", "circular", "line", "two_circles", "polygon"type: "point"radius: 0.2 # for type "circular"line_start: [-0.3, 0.0] # for type "line"line_end: [0.3, 0.0] # for type "line"front_offset: 0.2 # for type "two_circles"front_radius: 0.2 # for type "two_circles"rear_offset: 0.2 # for type "two_circles"rear_radius: 0.2 # for type "two_circles"vertices: [ [0.25, -0.05], [0.18, -0.05], [0.18, -0.18], [-0.19, -0.18], [-0.25, 0], [-0.19, 0.18], [0.18, 0.18], [0.18, 0.05], [0.25, 0.05] ] # for type "polygon"
默认示意图模型的类型为“点”。注意,封装外形发布到~/teb_markers,并且可以在rviz中可视化(例如用于验证)。
重要提示:对于类似汽车的机器人,姿态[0,0]位于后轴(旋转轴)!
以下段落描述了所有不同的类型:
2.1迹线类型:点
机器人被建模为单个点。对于这种类型,需要最少的计算时间。
2.2迹线类型:圆形
机器人被建模为一个具有给定半径~/footprint_model/radius的简单圆。距离计算类似于点型机器人的计算,但有了例外,机器人的半径被添加到每个函数调用的参数min_obstacle_dist中。你可以通过选择一个点型机器人并事先将半径添加到最小障碍物距离来消除这种额外的添加。
2.3示意图类型:线条
直线机器人适用于在纵向和横向方向上表现出不同扩展/长度的机器人。可以使用参数/footprint_model/line_start和/footprint _model/line _end(每个[x,y]坐标)来配置线(段)。机器人(旋转轴)假定为[0,0](单位:米)。请确保通过进一步调整参数min_obstacle_dist来封装整个机器人(参见以下示例)。
你也可以看看“两个圆”模型。
2.4示意图类型:两个圆圈
另一种近似机器人轮廓的可能性包括定义两个圆。每个圆由沿机器人x轴的偏移和半径来描述:/footprint_model/front_offset、/footprint _model/front_radius、~/foot print_model/rear_offset和~/footprint_model/rear_radius。偏移可能为负。
请参考下图作为示例:
对于每个相关的机器人姿势,需要进行两次距离计算。
2.5迹线类型:多边形
可以通过定义闭合多边形来合并复杂模型。多边形是根据顶点列表定义的(为每个顶点提供x和y坐标)。假设机器人的旋转轴位于[0,0](单位:米)。请不要重复第一个顶点,因为多边形是自动关闭的。请记住,每增加一条边都会显著增加所需的计算时间!您可以从成本图通用参数文件中复制足迹模型。
3可行性检查
在优化器返回轨迹之后,在将速度命令发送到机器人之前,进行可行性检查。此检查的目的是识别优化器可能产生的无效/不可行轨迹(请记住:软约束、局部极小值等)。
目前,该算法从当前机器人姿势开始迭代前n个姿势(n=~/pability_check_no_poses(parameter!)),并检查这些姿势是否没有碰撞。为了检测是否发生碰撞,将使用成本图足迹(请参见导航教程)!因此,这个验证模型可能比用于优化的封装外形更复杂(请参阅上面的一节)。
由于优化器可能无法完全收敛,因此不应选择过高的值~/probability_check_no_poses:形象地说,当机器人向目标移动时,可以纠正(遥远)未来的小障碍违规行为。
如果您在狭窄的环境中驾驶,请确保正确配置避障行为(本地规划器和全局规划器)。否则,局部规划器可能会拒绝不可行的轨迹(从它的角度来看),但相比之下,全局规划器可能进一步认为所选的(全局)计划是可行的:机器人可能会被卡住。
Reference
1.Obstacle Avoidance and Robot Footprint Model
相关文章:
机器人控制算法——TEB算法—Obstacle Avoidance and Robot Footprint Model(避障与机器人足迹模型)
1.How Obstacle Avoidance works 1.1处罚条款 避障是作为整体轨迹优化的一部分来实现的。显然,优化涉及到找到指定成本函数(目标函数)的最小成本解(轨迹)。简单地说:如果一个计划的(未来&…...
谷歌浏览器报错:VM108:5 crbug/1173575, non-JS module files deprecated.
报错 解决 控制台调整为fast 3G...
Google Colab免费GPU使用教程
目录 前言一、Google Colab介绍二、使用步骤1、创建谷歌云盘2、创建一个新的Colab Notebook3、设置免费的GPU4、挂载Google Drive5、运行代码 三、防止掉线措施四、参考 前言 有时候本地跑代码可能耗时比较久,而且还会耽误你本地电脑的使用,购买云服务器…...
C++标准模板(STL)- 类型支持 (数值极限,C 数值极限接口)
C 数值极限接口 参阅 std::numeric_limits 接口 定义于头文件 <cstdint> PTRDIFF_MIN (C11) std::ptrdiff_t 类型对象的最小值 (宏常量) PTRDIFF_MAX (C11) std::ptrdiff_t 类型对象的最大值 (宏常量) SIZE_MAX (C11) std::size_t 类型对象的最大值 (宏常量) SIG_ATOMI…...
Eclipse Xtext 实现PLC ST 语言到C的转换
Eclipse Xtext 是开发领域专用语言(DSL)的工具。例如数据库的SQL 语言,PLC 的ST 语言都是一种领域专用语言。在开放自动化领域,提倡基于模型的设计方法。DSL 是描述模型的强有力工具。 在开发PLC 程序IDE时,开发ST编译…...
Django中ORM框架的各个操作
我们会好奇,python这么简洁的语言,数据查询是如何做的呢?我将进一步详细和深入地介绍Django中ORM框架的各个方面,包括MySQL的增删改查和复杂查询。让我们分步骤进行。 ORM框架介绍 Django的ORM框架是一个用于与数据库进行交互的工…...
leetcode 583. 两个字符串的删除操作、72. 编辑距离
两个字符串的删除操作 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 示例 1: 输入: word1 "sea", word2 "eat" 输出: 2 解释: 第一步将 "sea…...
flutter 创建插件
资料: flutter与原生通信的方式简介 - 简书 完整流程 Flutter 集成 Golang 多语言跨端开发基础案例 - 知乎 https://www.cnblogs.com/webabcd/p/flutter_lib_plugin_plugin_ios.html 步骤1、创建插件 我创建的插件名字是konnect_im_sdk 选择的语言是 java和swi…...
Framework之旅 -- 后台Recent基础扫盲篇
如果想了解一个事物,是需要展开然后在优化记忆结构的,优化记忆在于后期的个人领悟能力,展开流水账如下,仅为个人记忆笔记,梳理结构有待优化。 TaskDescription,直译看就是task相关的说明了。 看看包含什么…...
全光谱护眼灯有哪些?2023全光谱护眼台灯推荐
随着电子设备的不断普及,手机、平板电脑、显示器、电视机等几乎是家家户户的必备品,也正因为眼睛有那么多时间、那么多机会去盯着屏幕,所以如今近视低龄化现象也越来越严重了。随着科技的不断发展,台灯的发展也越来越多样化&#…...
【JavaEE初阶】 定时器详解与实现
文章目录 🌴定时器是什么🎋Java标准库中的定时器🌲模拟实现定时器🚩定时器的构成📌第一步:MyStack类的建立📌第二步:创建MyTimer类📌第三步:解决相关问题 &am…...
基于YOLOv8模型和WiderPerson数据集的行人目标检测系统(PyTorch+Pyside6+YOLOv8模型)
摘要:基于YOLOv8模型和WiderPerson数据集的行人目标检测系统可用于日常生活中检测与定位行人目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标…...
COSCon'23 开源社文创丨 给开源人一点“color see see”
成都城市限定 “小O在成都”行李箱贴纸 成都限定行李箱贴纸把小O和特色元素相融合 当小O遇到成都 在云端漫步的蓝色小章鱼 掉落到这座热情似火的城市, 结识了大熊猫朋友 学会了四川麻将 吃到了红油串串... 快带着小O来一场自由的旅游吧! “你也要尝尝竹子…...
C++前缀和算法的应用:从仓库到码头运输箱子原理、源码、测试用例
本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 双指针 单调双向队列 题目 你有一辆货运卡车,你需要用这一辆车把一些箱子从仓库运送到码头。这辆卡车每次运输有 箱子数目的限制 和 总重量的限制 。 给你…...
【面试HOT100】链表树
系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于LeetCodeHot100进行的,每个知识点的修正和深入主要参考…...
了解 Elasticsearch 自动生成的文档 _id:重复是一个问题吗?
Elasticsearch 中自动生成的文档 ID 当你在未指定 ID 的情况下对文档建立索引时,Elasticsearch 会自动为该文档生成唯一的 ID。 该 ID 是 Base64 编码的 UUID,由多个部分组成,每个部分都有特定的用途。 ID 生成过程针对索引速度和存储效率进…...
量子信息处理器可能能够提供高度压缩的生成对抗学习任务的版本
量子信息处理在生成对抗学习任务中的应用可能性,以及量子信息处理器在表示高维向量和执行线性代数运算上的优势。 举个例子 假设底层数据由M个在N维实数或复数空间中的归一化向量~vj组成,使得数据的(归一化)协方差矩阵为C (1/M…...
linux-守护进程daemon
linux-守护进程daemon 代码实现 main.c运行结果 代码实现 main.c //pName:程序名 //facility: 守护进程,输出日志类型 302页 #include<signal.h> #include<syslog.h> #include<fcntl.h> static int daemon_proc 0; #defin…...
Kafka Tool(Kafka 可视化工具)安装及使用教程
Kafka Tool(Kafka 可视化工具)安装及使用教程 Kafka Tool 工具下载 下载地址 http://www.kafkatool.com/download.html 下载界面 不同版本的Kafka对应不同版本的工具,个人使用的是2.11,所以下载的是最新的2.0.8版本ÿ…...
【大揭秘】美团面试题:ConcurrentHashMap和Hashtable有什么区别?一文解析!
正文 亲爱的小伙伴们,大家好!我是小米,一个热爱技术分享的程序员,今天我为大家带来了一篇有关美团面试题的热门话题:ConcurrentHashMap 和 Hashtable 有什么区别。这个问题在Java面试中常常被拿来考察对多线程编程的理…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
