移动机器人路径规划(三)--- 基于采样的路径规划Sample-basedpath finding

目录

1 基于采样的路径规划的优点和一些重要概念

2 概率路图 Probabilistic Road Map

3 快速搜索随机树Rapidly-exploring Random Tree

3.1 RRT

3.2 RRT Connect

4 RRT算法的优化

4.1 RRT*

4.2 Kinodynamic-RRT*

4.3 Anytime-RRT*

5  Advanced Sampling-based Methods

5.1 Informed RRT*

 5.2 Cross-entropy motion planning

6 实际应用


1 基于采样的路径规划的优点和一些重要概念

  1. 不构建 C 空间及其边界: 与传统的规划方法不同,采样型规划器不需要显式地构建配置空间(C-Space)及其边界。这使得算法更加高效,因为它不需要在内存中存储整个空间的表示。

  2. 只需检测单个机器人配置是否碰撞: 算法只关注单个机器人配置是否与障碍物或环境中其他物体发生碰撞。这样的检测方式更加简洁、高效。

  3. 利用简单的碰撞测试: 采样规划器利用简单的碰撞测试来确定机器人是否与障碍物相碰。这些测试可能是基于几何形状或其他形式的预定义规则,使得计算开销相对较小。

  4. 碰撞检测作为独立模块: 碰撞检测是作为一个独立模块实现的,可以根据具体的应用场景进行定制。这种模块化的设计使得算法更具灵活性和可扩展性。

  5. 随着碰撞检测的改进,算法也改善: 如果碰撞检测方法得到改进,采样规划器的性能也会相应提高。更精确、更快速的碰撞检测方法能够带来算法整体性能的提升。

  6. 单一查询和多次查询请求的不同处理方式: 采样型规划器针对单一查询和多次查询请求采用不同的处理策略。对于单一查询,它可能会采取特定的优化策略以提高规划速度;而对于多次查询,可能会利用之前的计算结果或其他缓存来加速规划过程。

总的来说,基于采样的规划器通过简化碰撞检测和对空间的直觉理解,提供了一种高效、灵活的路径规划方式,特别适用于处理大规模环境下的路径规划问题。

        我们来看几种不同的规划器:

  1. 完备规划器(Complete Planner): 这类规划器总是能在有限时间内正确地回答路径规划查询。无论问题的复杂性如何,它们都能够保证找到一个解(如果解存在的话)。

  2. 概率完备规划器(Probabilistic Complete Planner): 如果存在解,这类规划器最终会找到它,使用随机采样方法进行规划(比如蒙特卡罗采样)。它们不像完备规划器一样绝对确保在有限时间内找到解,但在理论上,长时间运行下,它们能够以高概率找到解。

  3. 分辨率完备规划器(Resolution Complete Planner): 类似于概率完备规划器,但它们基于确定性采样(例如在固定网格上进行采样)。这类规划器也能够在理论上保证找到解(如果存在的话),但采用确定性方法而不是随机方法来达到完备性。

2 概率路图 Probabilistic Road Map

        如何在空间里面构建一个图:

  1. 学习阶段(Learning phase):

    • 这个阶段可能涉及对环境或空Lazy collision-checking
      · Collision-checking process is time-consuming, especially in
      complex or higLazy collision-checking
      · Collision-checking process is time-consuming, especially in
      complex or high-dimensional environments.
      · Sample points and generate segments without considering
      the collision (Lazy).h-dimensional environments.
      · Sample points and generate segments without considering
      the collision (Lazy).间的学习和了解,以便后续的路径规划。
  2. 查询阶段(Query phase):

    • 在这个阶段,图结构被用于规划路径。
    • 通过高效地检查采样的配置和它们之间的连接,以确保碰撞检测的准确性。
    • 仅需采用相对较少的里程碑和局部路径就能够捕捉自由空间的连通性。

        这种方法的关键在于利用图结构的连接性质。在查询阶段,只需要检查采样的配置和它们之间的连接情况,而不需要对整个空间进行详细的碰撞检测。通过选择相对较少的关键点和局部路径,就能够有效地捕捉自由空间的连通性,从而简化了规划过程。

        查询阶段:随机、均匀撒点并删去障碍物区域的点

        采样过后将这些点连接起来:起始点终止点要被连接到网络,并且还要有一定的距离要求,距离太长的不要(计算效率)(红线),经过障碍物的不要(绿线)。

        查询阶段:用A*或Dijkstra算法规划路径。

需登录Nvidia账号才能下载,登一下吧。

       

优点:

  • 具备概率完备性(Probabilistically complete),在一定条件下能够找到解决方案。

缺点:

  • 需要解决两点边界值问题(2 point boundary value problem)。(两点机器人是否可行是否满足运动学约束)
  • 在状态空间上构建图,但没有特别关注路径的生成。
  • 效率不高。

        这种方法的概率完备性意味着在一定概率下能够找到解决方案,但它也存在一些限制,例如需要解决特定类型的问题以及对路径生成的关注不足,可能导致效率较低。

        

  • 碰撞检查过程耗时: 特别是在复杂或高维环境中,碰撞检查是一个耗时的过程。
  • 采样点和段的生成不考虑碰撞(懒惰式): 在这种策略下,路径规划算法会先生成可能的路径段或采样点,而不进行实时的碰撞检查。只有在需要时才会对这些路径段或采样点进行碰撞检查,以减少计算开销。

        懒惰式碰撞检查(Lazy collision-checking)允许算法在生成路径时暂时忽略碰撞检查(只检查距离准则),从而提高了路径规划的速度。然而,这也可能意味着在后续的检查阶段需要更多的计算,以确保生成的路径是collision-free的。

        用A*生成的路径毫无意外有碰撞!当然,这些不可行的路径我们要去删掉。重新进行路径规划!

        可行,但如果又不可行呢??继续迭代!

        概率路图:学习阶段、寻路阶段、改进模式Lazy collision-checking。

3 快速搜索随机树Rapidly-exploring Random Tree

3.1 RRT

        Build up a tree through generating “next states” in the tree by executing random controls.

        伪代码如下:找一条红色点到绿色点的路径。

        第一步就是我先得到一个采样点(蓝色的点),找到了从红色点到蓝色点的路线,由大红色的点向小红色的点移动一小段距离derta,如果这段线没有障碍物,则加入树中完成树的扩展。

        Sample函数在地图中进行随机采样获得了Xrand

        在树中找到一个距离Xrand距离最近的点Xnear。

        我们找到Xnew,如果没有碰撞的话我们加入生成树中。

        如果有碰撞呢?不会连通到树中呗~

‘        树不停的扩展,如果树周围的点被添加,路径规划完成。

        可以看看RRT算法的demo:

https://www.youtube.com/watch?v=pOFtvZ_qVsAicon-default.png?t=N7T8https://www.youtube.com/watch?v=pOFtvZ_qVsA

        那么它的优点和缺点是什么:

        优点:先对于PRM更有针对性的找到一个起点到终点的路径。

        缺点:并不是最短(优秀)路径、也没有那么高效(狭窄区域)、取样区域不明确。

        KD Tree改进算法:

        1.用KDTREE寻找near节点:

        左图产生了RRT的树,假设我们新到了一个采样点,我如何在这个树上找到一个离这个点最近的点呢?

        把所有的点都比较一下???效率太低了。KD tree就是个非常好的工具。

        那么我们首先把所有的点包括起点终点都用KD tree要求的格式去保存,当新到一个点Xrand时候我们可以用KD tree算法找到距离它最近的点。

        我们看看具体原理:

        左图就是KD tree对空间的一个划分,具体方式是横向找一个所有节点x的中位数(4.0,4.7)划分为左右两枝,然后在找到纵坐标两边的中位数(1.9,2.2)(6.7,4.3)继续这样的划分....就构建了KD tree。二叉树在计算机里面搜索效率是非常高的。

3.2 RRT Connect

        这个是从起始点和终点同时构建两棵树。

        我得到了Xrand从左面和右面同时寻找随机邻域同时扩展,也就是撒一个点完成两棵树的构建,那么这个树什么时候生长截止呢?当Xrand同时连接左右两棵树的时候生长截止。

        对于狭窄点RRT Connect同时生长两棵树可以解决问题。但他不是一个唯一的解决方案,很多人通过改进采样函数来解决问题。

4 RRT算法的优化

        我们回顾RRT算法的缺陷:

        1.生成路线并不是最短或者最优的

        2.路径通过直线连接,并不是很光滑的适合机器人去执行的路线

4.1 RRT*

        我们先看RRT*的伪代码:

        看看它的执行过程:

        我们首先通过采样在空间中得到点Xrand,在Xrand周围搜索找到它的最近的邻域节点Xnear,通过Xnear向Xrand移动一定距离我们得到新的节点Xnew。在RRT中我们直接将Xnear和Xnew连起来完成树的扩展。

        在RRT*中,我们不将Xnear和Xnew连起来,我们直接去搜索Xnew周围的范围找到Xnew附近的一些节点,如下图:

        在RRT*中,将这些节点都与Xnew连接起来:

        算一下从起点到Xnew哪一个花费比较小(起点到Xnear -- > Xnew)(起点到Xnear -- > x1 --> Xnew)(起点到Xnear -- > x2 --> Xnew),这时候就可以选择Xnew的父节点添加边了。

        还没完呢....我们现在进行优化树,现在我们已经把Xnew添加到了树里面。现在我们考虑X1,X1原来有一个到达起始点的路径(起始点 --> Xnear --> x1),现在我们判断(起始点 --> Xnear --> Xnew)新路径的代价,如果新的路径短的话,我们X1就通过Xnew到达初始节点了。

        我们对X2进行修改,改变其父节点进行剪枝:

https://www.youtube.com/watch?v=YKiQTJpPFkAicon-default.png?t=N7T8https://www.youtube.com/watch?v=YKiQTJpPFkA        上面的链接可以观看RRT*的demo。

4.2 Kinodynamic-RRT*

        无论是RRT还是RRT*,我们最终生成的路径是一条线段,对于机器人来说是很难实现的。

        这里改进的是steer fuction,我们得到了一个点Xnew,我们之前用直线链接Xnew和Xnear,我们可以看到右面的路径我们生成了更符合运动学约束的曲线。

        直线遇见障碍物在RRT*中会抛弃,而 Kinodynamic-RRT* 会规避。

4.3 Anytime-RRT*

        在导航的过程中还会更新树。Keep optimizing the leaf RRT tree when the robot
executes the current trajectory Anytime Fashion。更好的适应环境的变化。

5  Advanced Sampling-based Methods

5.1 Informed RRT*

        将采样的范围限制在了椭圆中。

        当我们生成路径时,我们将随机采样点限制在椭圆中。

        那么如何去构建一个椭圆呢?

        以起点、终点作为椭圆的交点。以我们生成的轨迹的长度作为椭圆到达两个焦点之和。

 5.2 Cross-entropy motion planning

        首先我们生成了一条路径。

        我们在轨迹的节点周围进行采样,六个圈。构成多条路径。

        生成多个轨迹后,我们对多个轨迹多个节点求均值,可以得到一个新的分布。得到下一轮的采样点。

6 实际应用

        Open Motion Planning Library集成了很多路径规划的算法。

The Open Motion Planning Libraryicon-default.png?t=N7T8https://ompl.kavrakilab.org/        可以和ROS Moveit进行交互。

MoveIt Motion Planning Framework Incorporating the latest advances in motion planning, manipulation, 3D perception, kinematics, control and navigation.icon-default.png?t=N7T8https://moveit.ros.org/        专门给移动机器人的库 Navigation stick - ROS

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PCL 点云超体素分割-SupervoxelClustering

一、概述 原始文档与点云 Clustering of Pointclouds into Supervoxels - Theoretical primer — Point Cloud Library 0.0 documentation 超像素 Superpixels Segmentation algorithms aim to group pixels in images into perceptually meaningful regions which conform…

【Linux】文件系统中inode与软硬链接以及读写权限问题

文章目录 前言一、 简单理解文件系统二、文件操作具体步骤1.新建文件2.删除文件3.查找文件 三、目录的重新理解1.目录下没有w权限,无法对其下的文件进行创建与删除2.目录下没有r权限,无法对其下的文件进行查看3.目录下没有x权限,无法进入这个…

空调能量表

数字化应用场景:空调能量监测 定义 空调能量表产品又被称为冷量积算仪、冷量积分仪、能量积分仪、能量积算仪、空调冷热量表、冷量表、能量表等,现阶段行业内没有统一的名称。 作用 用于计量中央空调能耗的仪表,它通过和空调管道流量计和温…

numpy数据库

numpy中的数组 0、导包 import numpy as np 1、创建数组 >>> # 创建数组,得到darray类型 >>> t1 np.array([1, 2, 3]) >>> t2 np.array(range(8)) >>> t3 np.arange(1, 9, 2) 2、数组为 numpy.ndarray 类型 >>…

基于单片机C51全自动洗衣机仿真设计

**单片机设计介绍, 基于单片机C51全自动洗衣机仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机C51的全自动洗衣机仿真设计是一个复杂的项目,它涉及到硬件和软件的设计和实现。以下是对这…

redis常见问题及解决方案

缓存预热 定义 缓存预热是一种优化方案,它可以提高用户的使用体验。 缓存预热是指在系统启动的时候,先把查询结果预存到缓存中,以便用户后面查询时可以直接从缓存中读取,节省用户等待时间 实现思路 把需要缓存的方法写在初始化方…

Linux三剑客:grep的基本使用

目录 grep介绍 什么是grep和egrep 使用grep 命令格式 命令功能 命令参数 grep配合正则表达式使用 认识正则 基本正则表达式 匹配字符 配置次数 位置锚定:定位出现的位置 分组和后向引用 作为学习一名计算机专业的学生,我想Linux应该需要了解…

HTML5学习系列之实用性标记

HTML5学习系列之实用性标记 前言实用性标记高亮显示进度刻度时间联系信息显示方向换行断点标注 总结 前言 学习记录 实用性标记 高亮显示 mark元素可以进行高亮显示。 <p><mark>我感冒了</mark></p>进度 progress指示某项任务的完成进度。 <p…

Python基础教程之模块介绍及用法,适合新手小白的入门教程~

文章目录 什么是模块&#xff1f;创建模块使用模块模块中的变量为模块命名重命名模块内建模块使用 dir() 函数从模块导入 什么是模块&#xff1f; 请思考与代码库类似的模块。 模块是包含一组函数的文件&#xff0c;希望在应用程序中引用。 创建模块 如需创建模块&#xff…

(C++类的初始化和清理)构造函数与析构函数

目录 1. 类的六个默认成员函数2. 构造函数&#xff08;Constructor&#xff09;2.1 概念2.2 特性 3. 析构函数&#xff08;Destructor&#xff09;3.1 概念3.2 特性 1. 类的六个默认成员函数 一个类中如果什么成员都没有&#xff0c;称为空类 class Date {};但是这并不代表空…

Windows 系统彻底卸载 SQL Server 通用方法

Windows 系统彻底卸载 SQL Server 通用方法 无论什么时候&#xff0c;SQL Server 的安装和卸载都是一件让我们头疼的事情。因为不管是 SQL Server 还是 MySQL 的数据库&#xff0c;当我们在使用数据库时因为未知原因出现问题&#xff0c;想要卸载重装时&#xff0c;如果数据库…

如何分析伦敦金的价格走势预测?

伦敦金作为国际黄金市场的重要指标&#xff0c;其价格走势一直备受投资者关注。但是&#xff0c;黄金市场的价格变化受到多种因素的影响&#xff0c;因此要准确预测伦敦金的价格走势并非易事。在本文中&#xff0c;将介绍一些常用的方法和工具&#xff0c;帮助您分析伦敦金的价…

Docker-compose 下载安装测试完成

源文件-http://t.csdnimg.cn/7NxHchttp://t.csdnimg.cn/7NxHc 1 docker-compose说明 Docker Compose 是Docker的组装工具&#xff0c;用于创建和调试多个Docker容器&#xff0c;并在同一个Docker主机上运行它们。Docker Compose基于YAML文件&#xff0c;描述多个容器之间的相…

在Spring Boot中使用Redis的发布订阅功能

Redis的发布订阅模式是一种消息传递模式&#xff0c;它允许多个订阅者订阅一个或多个频道&#xff0c;同时一个发布者可以将消息发布到指定的频道。这种模式在分布式系统中非常有用&#xff0c;可以解决以下问题&#xff1a; 实时消息传递&#xff1a;发布订阅模式可以用于实时…

django——公众号服务开发

开发过程 项目背景&#xff1a;功能描述&#xff1a;参考文档以及调试链接&#xff1a;技术架构&#xff1a;准备工作公众号的注册以及设置域名的准备服务器的租赁内网穿透微信支付的注册 功能开发细节微信公众号自定义菜单获取access_token创建菜单查询菜单删除菜单 个性化菜单…

Nginx反向代理与负载均衡与504错误

Nginx反向代理与负载均衡概念简介 关于代理 什么是代理 类似中介 在没有代理模式的情况下&#xff0c;客户端和Nginx服务端&#xff0c;都是客户端直接请求服务端&#xff0c;服务端直接响应客户端。 那么在互联网请求里面&#xff0c;客户端往往无法直接向服务端发起请求…

【LeetCode刷题-滑动窗口】--76.最小覆盖子串

76.最小覆盖子串 class Solution {//建立两个hashMap&#xff0c;ori用于存储目标字符串t中每个字符的出现次数//cnt用于存储当前窗口中每个字符的出现次数Map<Character,Integer> ori new HashMap<Character,Integer>();Map<Character,Integer> cnt new H…

PyTorch:计算图

在深度学习和神经网络领域&#xff0c;计算图是一种重要的概念&#xff0c;它在理解和实现神经网络模型的训练过程中起着至关重要的作用。PyTorch作为一款优秀的深度学习框架&#xff0c;自然也包含了计算图的概念和实现。本文将深入探讨PyTorch中计算图的原理、应用以及对深度…

mp4封装格式各box类型讲解及IBP帧计算

作者 —— 靑い空゛ 出处&#xff1a;http://www.cnblogs.com/ailumiyana/ 音视频流媒体高级开发教程 MP4文件封装格式&#xff0c;对应的标准为ISO/IEC 14496-12&#xff0c;即信息技术 视听对象编码的第12部分 ISO 基本媒体文件格式&#xff08;Information technology Codi…

最新版仿东郊到家小程序源码 上门服务小程序源码

最新版仿东郊到家小程序源码 上门服务小程序源码 1、数据概况&#xff08;新增业务城市用户投票功能&#xff0c;更加直观的查看业务城市的关注度、人气和影响力,促进业务开展&#xff09; 2、数据概况 &#xff08;增加可视化数据大盘&#xff0c;代理商端可查看自己下面的技…