Robust Real-time UAV Replanning Using Guided Gradient-based Optimization and Topological Paths

2023-05-16

fastplanner2

  • 摘要
  • 相关工作
    • 基于梯度的路径优化
    • 拓扑路径规划
  • 路径制导轨迹优化
    • A. 优化失效分析
    • B. 问题公式化
  • 拓扑路径搜索
    • A. 拓扑等价关系
    • B. 拓扑路径图
    • C. 路径缩短和修剪
  • 实时拓扑路径规划

这篇论文是港科大开源的无人机运动规划fast planner的第二版,这里写下我对这篇工作的理解。

摘要

 基于梯度的方法(GTO)容易陷入局部最优,本文就是提出一个新的基于GTO的方法来解决这个问题。

相关工作

基于梯度的路径优化

 GTO是一种主要的路径生成算法,把路径生成看作一个最小化目标函数的非线性优化问题。

拓扑路径规划

 用拓扑路径来进行规划

路径制导轨迹优化

A. 优化失效分析

 GTO规划的失败和不好的初始路径有关。如下图所示,在欧式符号距离场(ESDF)中,梯度会拉动路径让它离开障碍物,但是如果路径穿越“山脊”或者“山谷”,梯度会是两个完全相反的方向,让路径规划出现问题。
在这里插入图片描述
 对于这种情况,仅仅靠ESDF的梯度并不够,需要额外的信息。

B. 问题公式化

 文中提出的PGO方法是对上面GTO的改进,它把路径用B样条来表示。对于PGO方法,分为两步,第一个阶段产生一个过渡的预热轨迹(warmup trajectory),然后对这个warmup trajectory的平滑度和净空度再进行优化。两个阶段如下图:
在这里插入图片描述
 a图的绿色是初始B样条轨迹,橙色的是几何引导路径,几何引导路径把初始轨迹拉到没有碰撞的地方形成warmup 路径(蓝色),然后b图中,对warmup路径再进一步进行平滑度和净空度的优化,得到红色最终轨迹。这个几何引导路径通过A或者RRT等传统方法就可以得到,本文用的是采样的方法得到这条引导路径。
 第一阶段的目标函数是:
在这里插入图片描述
这里 f s f_s fs是平滑度的约束,具体在第一版的fast planner里有描述:
在这里插入图片描述

f g f_g fg是引导路径和B样条路径之间的距离的惩罚函数:
在这里插入图片描述
这里的 Q i Q_i Qi是B样条的控制点, G i G_i Gi是几何引导路径(就是上面图蓝色线)上对应的点,通过均匀采样得到。这个时候的路径周围的梯度变化都比较平滑,就可以用标准的GTO算法来优化轨迹了。
 第二阶段是用B样条曲线对warmup的路径进一步优化,来得到一个安全、平滑、动态可行的路径,这个阶段的目标函数是:在这里插入图片描述
f c f_c fc是碰撞约束,和障碍物近的时候就变得很大。 f a f_a fa f v f_v fv分别是对加速度和速度的惩罚,细节都在第一版fast planner的paper里。

拓扑路径搜索

 上面讲了用一个几何引导路径得到了一条相对最优的路径,但是这条路径可能并不是最好的。本文提出了一个采样的方法来寻找几条不同的路径来引导上面PGO。

A. 拓扑等价关系

 这部分主要是关于路径的等效性,以前的VD算法计算复杂度太大,文章提出了一个均一可视变形方法(UVD)来有效地捕获大量有用的路径,对于路径等效性的检查非常高效。UVD算法流程:
在这里插入图片描述
这里路径等效性的定义就是:对于两条路径,如果起点和终点相同,而且两条路径上对应的采样点,譬如采样点对 Q i Q_i Qi G i G_i Gi,每个采样点对之间的连线都没有碰撞,那么这两条路径就等价。譬如下图:
在这里插入图片描述

B. 拓扑路径图

 这节是引入两种点来构造一个UVD地图,分别叫做guardconnector,guard用来探索新的区域。开始的时候,在起点 s s s和终点 g g g分别构建两个guard点。connector点用来连接两个guard点形成一条路径,或者取代原来的connector点来形成一条更短的路径。整个算法被限制在 t m a x t_{max} tmax的执行时间内和 N m a x N_{max} Nmax采样次数内。在生成UVD地图后,采用深度优先算法来寻找 s s s g g g之间的路径。具体如下图所示:
在这里插入图片描述
任何两个guard节点之间是看不到的,也就是它们的连线是碰撞的。每次在地图上采样一个点,如果这个点另外的任何一个guard都看不到,那么这个点就记作一个新的guard点。然后继续采样,如果一个采样点刚好可以被两个guard点看到,那么就把这个点记作connector,然后把这个connector和这两个guard点连起来。连接好以后做两个事:如果这是一条全新的拓扑路径,那么就保留,否则判断两条拓扑路径的长度,把长的那条去掉。

C. 路径缩短和修剪

 像下面这个图所示:
在这里插入图片描述
通过算法1找到的部分路径很曲折,譬如橙色的那条路径,这节的内容就是让路径更平滑,也就是为上面Alg.1算法找到的所有拓扑路径 P r P_r Pr找到一条拓扑相等的捷径 P s P_s Ps来替代。具体如下图:
在这里插入图片描述
整个流程是:先把Alg.1找到的路径 P r P_r Pr拆分成几个离散的的点 P d P_d Pd,每次循环中,如果 P d P_d Pd里的点 p d p_d pd P s P_s Ps里的最后一个点之间看不到,然后就找到那个阻挡视线的占据体素,把它往外推,然后加到 P s P_s Ps点集合里去。这个循环一直进行直到最后一个点。这个算法具体如下所示:
在这里插入图片描述

实时拓扑路径规划

 第4节中的算法输出了一组有效的路径,可以指导轨迹优化。我们将它们与PGO进行适当的集成,以便实时重新规划。如果检查到碰撞就调用一次拓扑路径地图重建的算法,之后就是缩短路径和剪枝,再之后每条拓扑路径调用PGO算法优化一遍。
 值得注意的是,UVD类路径的等效路径会随着障碍物的增加呈指数增长。所以我们每次只选几条路径,譬如 K m a x K_{max} Kmax条,然后对于长度大于最短路径 r m a x r_{max} rmax倍的路径我们也会丢弃掉。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Robust Real-time UAV Replanning Using Guided Gradient-based Optimization and Topological Paths 的相关文章

  • 计算从现在到今天或明天指定时间的秒数[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我以为这个问题已经有了答案 但似乎没有 在Python中 我想计算从 现在 到指定时间 今天 或 明天 的秒数 无论何时发生 例如 下
  • 如何使用 Ruby 和 MongoId 正确保存时区?

    如果这是一个菜鸟问题 请原谅 我有一个应用程序 用户可以在其个人资料中设置自己的时区 当有人添加阵容 应用程序特定术语 时 我会执行以下操作 time ActiveSupport TimeZone new user timezone par
  • time.struct_time 的 structseq() 错误

    这是给出错误的 python 脚本 gt gt gt import time gt gt gt t gt gt gt t append time struct time tm year 2000 tm mon 11 tm mday 30 t
  • 获取日期 ISO 字符串而不转换为 UTC 时区

    JavaScript 有没有办法获取新 Date 对象的 ISO 字符串 同时保持原始本地时区 即不转换为 UTC 时间部分设置为午夜 无需通过各个日期部分手动重建新日期并重新格式化结果 我一直在努力this https www w3sch
  • 为什么 R 不将“CST”识别为有效时区?

    这段代码的工作原理 ISOdatetime 2011 4 7 12 0 0 tz EST 这段代码没有 ISOdatetime 2011 4 7 12 0 0 tz CST 我想要中央时区 不进行夏令时调整 我究竟做错了什么 在哪里可以找到
  • 计算持续时间

    我有一个小的android问题 我需要一个计时器来计算从特定活动打开到单击该活动中的某个按钮的持续时间 即活动打开的时间 在谷歌搜索时 我发现了 TimerTask 但这似乎只在一定的时间间隔内运行一个线程 从我的 Android 经验来看
  • 限制 PHP 函数或命令的执行时间[重复]

    这个问题在这里已经有答案了 您好 是否可以仅对命令或函数设置时间限制 例如 function doSomething code here function1 some code here 我只想为 function1 设置时间限制 存在 s
  • ical导出的格式化时间

    我在 jquery 中创建了一个导出到 ical 的日历 但是 我对日期时间有一些问题 ical 导出脚本需要以下格式的日期 时间 19970714T170000Z 有谁知道这是什么以及我应该如何准备我的字符串 Thanks 阅读 RFC
  • 输出以秒为单位。在php中转换为hh:mm:ss格式

    我的输出格式为 290 52262423327 秒 如何将其更改为 00 04 51 我想以秒为单位并以 HH MM SS 格式显示相同的输出 所以如果是秒 我只想显示 290 52 秒 小数点后只有两个整数 我怎样才能做到这一点 我正在
  • 使用 print in 循环会减慢循环速度

    Using print in a loop slows down the loop Printing something I tried with Hello 100 times take 2 sec without it it takes
  • 如何将输入类型时间的值传递给 Date 对象?

    此函数将时间转换为 12 小时格式 感谢 Stack Overflow 上此函数的贡献者 JS function ampm date var hours date getHours var minutes date getMinutes v
  • Android 获取日期并插入到文件名

    我有一个非常烦人的问题 我想获取当前日期 时间并将其插入文件名中 但我一生都无法让它工作 我想获取 2011 11 18 12 13 57 的时间 然后将其插入到我的文件名中 文件名 2011 11 18 12 13 57 tar gz 我
  • 在Java中,是否可以执行一个方法一段时间,并在达到时间限制后停止?

    我有下载网页的代码 HttpURLConnection connection private String downloadContent InputStream content Source parser try content conn
  • 如何使用Intent限制录音时间?

    使用意图时如何限制录制 我尝试了这段代码 Intent intent new Intent MediaStore ACTION VIDEO CAPTURE intent putExtra android intent extra durat
  • 如何找到与日期范围最重叠的时间段

    假设您有一个包含标识符 开始时间和结束时间的表 这些开始和结束时间可以是任意时间长度 开始时间始终早于结束时间 假设没有空值 什么样的查询会告诉我最 流行 的时间 即每行中的两个范围与大多数其他行重叠的位置 它的实际应用是它是一个记录用户登
  • C++:如何通过时间和本地时间获取实际时间?

    我正在寻找一种在 C 中以 HH MM SS 方式节省时间的方法 我在这里看到它们有很多解决方案 经过一番研究后我选择了time and localtime 然而 似乎localtime函数有点棘手 因为它says http rabbit
  • PHP 日期/时间格式,需要一些帮助

    你能帮我使用 PHP 格式化以下日期吗 变量 start 包含以下日期 这个日期 Wed Feb 01 2012 05 00 00 GMT 080 应该成为 2012 02 01T13 00 00 我知道如何使用基本的 PHP 日期 时间格
  • 在 python 中计时时,我应该如何考虑 subprocess.Popen() 开销?

    编码社区的成员比我更聪明 我有一个 python 问题要问你们 我正在尝试优化一个 python 脚本 该脚本 除其他外 返回子进程执行和终止的挂钟时间 我想我已经接近这样的事情了 startTime time time process s
  • setTimeout 调用期间超出最大调用堆栈大小

    我试图每 4 秒调用一次我的函数 这样它就会实时增加一个数字 由于某种原因 我不断收到错误 这是我的代码
  • Bash:从给定时间减去 10 分钟

    在 bash 脚本中 如果我有一个代表时间的数字 格式为 hhmmss 或 hmmss 那么减去 10 分钟的最佳方法是什么 即 90000 gt 85000 这有点棘手 日期可以进行一般操作 即您可以执行以下操作 date date 10

随机推荐

  • python lambda表达式详解

    64 python lambda表达式详解 1 lambda简介 先来看一段代码示例 xff1a 第一行是lambda声明 xff0c x y相当于传入的参数 xff0c 整个函数会返回x 43 y的值 lambda作为一个表达式 xff0
  • CNN(卷积神经网络)详解

    CNN卷积神经网络详解 Why CNN局部感受野 local receptive fields 权值共享 Shared weights and biases 池化 Pooling 总的来看 Why CNN 首先回答这样一个问题 xff0c
  • mysql索引笔记 innodb null

    1 列有null 索引不失效 2 is not null 不会用索引 3 模糊查询 左边匹配 不会用索引 4 组合索引最左原则 5 设置索引 不加长度 默认长度为字段长度如varcher 255 单个索引字节不超过767 组合索引不超过30
  • Mysql避免索引失效

    要尽量避免这些不走索引的sql xff1a SELECT 96 sname 96 FROM 96 stu 96 WHERE 96 age 96 43 10 61 30 不会使用索引 xff0c 因为所有索引列参与了计算 SELECT 96
  • MySQL中的semi-join半连接

    MySQL中的semi join半连接
  • JDK8 lamdba

    1 方法调用
  • try catch finally执行顺序

    try catch finally执行顺序 内容简介代码示例执行结果 xff1a 分析 内容简介 代码中经常会在catch 或者finally中再次抛出异常 xff0c 传给调用者 xff08 如文件上传处理工具类 xff09 xff0c
  • C++中全局变量的使用

    在C 43 43 中全局变量的定义与使用做一下下面简单的记录 xff0c 方便日后查阅 xff0c 也与大家一起学习 1 全局变量的声明 1 在头文件 h中进行声明 xff0c 如果在此文件之外也要使用该变量 xff0c 则在变量声明前加e
  • mysql innodb

    mysql s sql优化 io 使用limit返回用到的字段 xff0c 不要返回太多无用字段和一些大字段 避免索引失效 创建索引 dd
  • C语言之什么是大小端,数组大小端,位域大小端,结构体大小端

    公众号 xff1a 嵌入式不难 本文仅供参考学习 xff0c 如有错误之处 xff0c 欢迎留言指正 理解大小端之前必须明白的三点 内存地址始终以字节为单位大小端只针对基本数据类型存在位域的情况下 xff0c 小端模式下先定义的位域从LSB
  • <Linux开发> linux应用开发-之-can通信开发例程

    xff1c Linux开发 xff1e linux应用开发 之 can通信开发例程 一 简介 对于Can通信的相关介绍 xff0c 读作不过多介绍了 xff0c 网上其它网友的介绍有很多 二 环境搭建 本次测试can通信的应用例程是运行在u
  • 使用RGBD相机模拟激光数据,用于move_base中添加新图层避障功能

    参考文章 xff1a ROS depthimage to laserscan ROS导航 向cost map中添加超声波障碍图层 一 RGBD模拟激光雷达数据 我使用的是RealSense双目相机 xff0c 首先使用的是ros自带的功能包
  • 公安视图库1400的协议

    一 平台注册 注销 1 1 注册 注销流程 注册流程1如图所示 图 1 下级平台主动向上级平台注册 xff1b 注册鉴权信息 xff08 用户名和密码 xff09 由上级平台提供 xff1b 1 2 报文说明 1 2 1 下级第一次注册 P
  • linux cmake交叉编译

    linux cmake交叉编译 linux cmake交叉编译下载测试添加依赖库需要注意的问题 linux cmake交叉编译 linux cmake交叉编译 xff0c 使用环境 xff1a ubuntu cmake gcc arm 10
  • OpenCV中使用RANSAC算法实现多张图像拼接

    思路 xff1a xff08 1 xff09 获取图像的特征点 xff0c 将每张图片的特征点保存到一个vector中 xff1b xff08 2 xff09 通过特征点匹配的方法 xff0c 找到每张图片的共有特征点 xff0c 并将其保
  • 数据安全--安全网关

    简介 对于数据安全来说 xff0c 安全网关是数据安全建设中极其重要的一部分 xff0c 我这里把它做了几种分类 xff0c 如下 xff1b 对内 xff1a 零信任安全网关 xff08 7层和4层 xff09 对外 xff1a 应用安全
  • idea使用svn拉取源码,创建分支,合并分支教程

    svn拉取源码 xff0c 创建分支 xff0c 合并分支教程 最近对svn的分支使用比较感兴趣了 xff0c 花时间研究了一下 xff0c 分享给大家 xff1a 此文章记录了idea使用svn的过程 xff1a 包括拉取源码 建立分支
  • Qt中QSS的简单使用

    样式表的组成 样式表由两大元素组成 xff1a 选择器和声明 选择器实际上可以理解为对象 xff0c 声明则是对该对象的属性的设置 样式表的使用 方法一 xff1a 在代码中调用setStyleSheet 来设置样式 xff1b 方法二 x
  • jetson nano pytorch安装及文件系统扩容

    jetson nano扩容 我安装的系统是16GB的 xff0c 如果不扩容的话文件系统只有16GB 首先安装gparted span class token function sudo span span class token func
  • Robust Real-time UAV Replanning Using Guided Gradient-based Optimization and Topological Paths

    fastplanner2 摘要相关工作基于梯度的路径优化拓扑路径规划 路径制导轨迹优化A 优化失效分析B 问题公式化 拓扑路径搜索A 拓扑等价关系B 拓扑路径图C 路径缩短和修剪 实时拓扑路径规划 这篇论文是港科大开源的无人机运动规划fas