Motion Planning学习笔记一:配置空间、图、图搜索、图遍历

        学习高飞博士的路径规划课程所总结的学习笔记。

目录

1、配置空间(Configuration Space, C-space)

2、图(Graphs)

3、图搜索(Graph Search Basis)

3.1、总体框架

3.2、两种基本的图遍历算法

3.3、启发式搜索(Heuristic search)

3.4、移动的代价


1、配置空间(Configuration Space, C-space)

        首先解释一下机器人的工作空间这个概念,机器人的工作空间是指机器人所能达到的空间点的集合,在此空间中,机器人是有大小和形状的,因此很难进行运动规划。

        配置空间是学习路径规划的基础,绝大多数路径规划算法都是基于配置空间提出的。如下图,配置空间中,机器人将变成一个质点,而机器人本身的大小和形状将会与障碍物做一个结合,以便进行碰撞检测。

图1-1. 圆形机器人的工作空间与配置空间

图1-2 方形机器人的工作空间与配置空间

       图1-1和图1-2是两种简单的机器人在配置空间中的表示。需要注意的是,因为机器人在工作空间中可能存在多个自由度,这时候将其转换到配置空间就会变得很复杂。因此,实际上经常采用近似的表示方法,即将机器人看作一个球体,然后再到配置空间中以球体半径为长度膨胀所有障碍物,如图1-3。

图1-3. 无人机的配置空间

2、图(Graphs

        图是有节点和边的表达方式,节点与节点之间的关系:

        1)无向:机器人可以在任意连接的节点之间移动。

图2-1. 无向示意图

        2)有向:节点与节点只能根据箭头方向移动,例如图中机器人可以从节点S移动到节点A,但不能从节点A移动到节点S。

图2-2. 有向示意图

        3)权重:机器人在节点间移动的代价,代价可以是机器人移动的距离,也可以是机器人移动需要消耗的能量、时间等,可以根据问题自定义。

图2-3. 权重示意图

       对于任何一个路径规划的问题,必须先人为构造一个图。以下为两种常用地图:图2-4(a)为栅格地图,栅格地图每个节点之间天然形成了连接,栅格地图是基于搜索的路径规划方法用的地图;图2-4(b)为基于采样生成的地图,本身是只有障碍物而不具备任何节点,需要基于采样生成节点然后连接生成地图,是基于采样的路径规划方法用的地图。

   

(a)                                                                   (b)

图2-4. 两种常用地图。(a)栅格地图,(b)基于采样生成的地图

3、图搜索(Graph Search Basis

3.1、总体框架

  1. 建立一个容器,这个容器用以包含所有要访问的节点;
  2. 容器由初始节点进行初始化;
  3. 循环过程:
    1. 根据预先设定好的目的或指标弹出一个节点(访问一个节点);
    2. 拓展:获取所有该节点的相邻节点;
    3. 将这些相邻节点储存到容器中。
  4. 结束循环。

     两个问题:

        1、什么时候结束循环?

        两种可能:a)当容器是空的时候会结束循环;b)得到目标路径。

        2、如果图是循环的那该怎么办?(两个节点互通)

        为了防止死循环,可以新建一个容器,这个容器会包含所有已经被访问过的节点,这些节点不会被再次访问。

3.2、两种基本的图遍历算法

1)深度优先搜索(Depth First Search,DFS):后进先出(LIFO)

图3-1. 深度优先搜索示意图

特点:每次访问都会优先访问容器中(如图3-1中的栈)最深(后)的节点。通俗地讲,深度优先搜索会一条路径搜索到底(深),没有找到目标则回溯再搜索其他路径。

图3-2. 搜索示意图

图3-3. 深度优先搜索流程

        举例:假设S为起始节点,G为目标节点。图3-2、图3-3中,容器首先由初始节点S初始化,随后弹出S进行扩展有A、V,按照某种规则将它们依次放入容器中(假设先入A),则容器中有V、A;弹出V,进一步拓展有C、F,按照某种规则依次放入容器中(假设先入C),则容器中现有F、C、A;下一步弹出F,无拓展则回溯;之后弹出C,拓展可得Z,放入容器中;弹出Z,Z拓展有G,G为目标节点,则循环结束,返回该路径SVCZG。事实上,可以看出SADG才是最短路径,因此,深度优先搜索找到的路径可能不是最优解

       动图展示:

2)广度优先搜索(Breadth First Search,BFS):先进先出(FIFO)

图3-4. 广度优先搜索示意图

特点:每次访问都会优先访问容器中(如图3-4中的队列)最先进入的节点。通俗地讲,广度优先搜索会如图3-5中的树状图一层一层地搜索完,直到找到目标。

图3-5. 搜索示意图

图3-6. 广度优先搜索流程

        举例:图3-5、图3-6中,可以看出,与深度优先搜索从容器顶部弹出节点不同,广度优先搜索是从容器底部弹出节点的。容器首先由初始节点S初始化,弹出S进行扩展有A、V,按照某种规则将它们依次放入容器中(假设A先入容器),则容器中有V、A;弹出A,拓展有C、D,按照某种规则依次放入容器中(假设C先放入),则此时容器中有D、C、V;下一步弹出V拓展可得C、F,按照某种规则依次放入容器中(假设C先放入),此时容器中有F、C、D、C;弹出节点C,……。如此循环直至搜索到目标G这一层则结束循环返回路径。按图3-5来,则会在ZGZ这一层结束循环,返回路径为SADG,该路径为最短路径。广度优先搜索会找到全局最优路径。

       动图展示:

        以上可以看出,深度优先搜索和广度优先搜索都是遵循3.1中的总体框架进行的。

3)广度优先搜索VS.深度优先搜索:使用哪一种?

        上述动画展示可以看出,按照两种搜索方式的特点,广度优先搜索更有利于找到最短路径,因此将广度优先搜索作为图搜索的基础。

3.3、启发式搜索(Heuristic search

       前面提到的深度优先搜索和广度优先搜索是按照FIFO或者LIFO的方式将节点弹出容器。启发式搜索(贪心算法)与这两种不同的是,它弹出节点的方式是靠自定义的规则弹出的,这种规则称为启发(Heuristic)。启发的本质是猜测目标节点与当前节点有多近。注意这里说的是猜测,因为搜索过程中无法知道目标节点与当前节点的距离。如图3-7,一般合理的猜测有:1)欧式距离(Euclidean Distance),即两个节点间的距离(忽略障碍物);2)曼哈顿距离(Manhattan Distance),即两个点在标准坐标系上的绝对轴距总和。启发会引导节点到正确的方向,但必须容易计算,否则反而降低搜索效率。

图3-7. 欧式距离与曼哈顿距离的示意图

       动图展示(无障碍物):

       

 Greedy Best-First Search                    Breadth First Search

       动图展示(有障碍物):

      

 Greedy Best-First Search                    Breadth First Search

       总结:启发式搜索(贪心算法)在无障碍物的情况下可以快速地得到最优全局路径,具有很强的目的性,会优先拓展离终点更近的节点;相对应地,广度优先搜索算法是层层递进地找最优全局路径。然而,实际中是有很多障碍物的,在这种情况下,广度优先搜索算法虽然花了更多的时间找到路径,但所找到的路径是最优的;启发式算法快速地找到了路径,但所找到的路径确是次优的(局部最优)。这是因为启发式算法在估计当前点到终点的距离时是忽略障碍物的。

3.4、移动的代价

图3-8. 深度优先搜索/广度优先搜索地图

        事实上,深度优先搜索与广度优先搜索使用的地图节点间的边是有权重的,且所有边的权重是相同的,如图3-8。在这种地图上,深度优先搜索与广度优先搜索才能成功实施。然而,对于一个机器人搜索问题,地图上节点间的边权重通常都是不同的。对于这种情况,则需要其他算法来进行搜索,例如:Dijkstra和A*等,在下篇笔记中会分析。

 此处给出两个路径规划算法可视化的网址,以便理解:

1、PathFinding.js

2、Pathfinding Visualizer

注:以上部分图片截取自高飞博士课件,高飞博士的教学视频(Motion Planning for Mobile Robots)可在深蓝学院中找到。

(转载请标明源地址)

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

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

相关文章

【Python】【进阶篇】十七、Python爬虫实现实时翻译

目录十七、Python爬虫实现实时翻译17.1 JS代码slat与sign17.2 Python代码表示参数17.3 完整程序实现十七、Python爬虫实现实时翻译 YD翻译是以异步方式实现数据加载的,要实现数据抓取,其过程极其繁琐。 上一节《Python爬虫的浏览器实现抓包》&#xff…

【hello Linux】Linux开发工具

目录 1. vim:文本编辑器 1.1 各种模式的切换 补充:ctrl r命令 1.2 命令模式的操作 1.3 插入模式的操作 1.4 底行模式的操作 1.5 配置vim环境 1.6 配置亲属关系 2. gcc/g:编译器 2.1 预处理: 2.2 编译: 2.3 汇编&#x…

如何利用ChatGPT辅助优化刷题性能

根据土著刷题共建群里的一个小伙伴反馈,刷题会出现切题卡顿的情况,有时会出现滑不动的情况。 定位问题 为了定位切题卡顿问题的具体原因,测试了高低端手机📱、切换2G、3G、4G低网络状态等各种影响切题的现实情况,经过借…

STM32F4_定时器精讲(TIM)

目录 1. 什么是定时器? 2. STM32定时器简介 2.1 高级控制定时器 TIM1和TIM8 2.1.1 TIM1和TIM8简介 2.1.2 时基单元 2.1.3 计数器模式 2.1.4 重复计数器 2.1.5 时钟选择 2.1.6 捕获/比较通道 2.1.7 输入捕获模式 2.1.8 其他功能 2.2 通用定时器 TIM2到TI…

Mysql 你还在一个字段一个索引吗

今天看到某系统的mysql在某时段存在thread_running线程数飙高触发告警,挤时间分析了该异常时间段的慢日志记录,并进行了sql优化 慢日志记录主要归为3个慢sql (编号1,2,3) 一、 1号sql原文 select * from feeds where topics_id &…

【MySQL数据库原理】MySQL Community安装与配置

目录 安装成功之后查看版本验证1、介绍、安装与配置数据库2、操作MySQL数据库3、MySQL数据库原理安装成功之后查看版本验证 SELECT VERSION();查看mysql版本号 1、介绍、安装与配置数据库 下载安装包:https://download.csdn.net/download/weixin_41194129/87672588 MySQL…

Visual studio C#中通过nuget安装sqlite库及C#中sliqte的用法

以前在Visual studio 的2017版中讲过如何使用sqlite,这里我们再次说说如何使用sqlite,以前Nuget使用还不是很流行很普及,大多数人不知道,但随着VS的升级,Nuget成为安装插件或者引用库文件标准的获取手段,所…

Qt Quick - TabBar

Qt Quick - TabBar使用总结一、概述二、调整选项卡三、Flickable标签三、定制化一、概述 TabBar其实就是选项卡,TabBar是由TabButton控件填充,TabBar可以与任何提供currentIndex属性的布局或容器控件一起使用,如StackLayout或SwipeView。Tab…

Vector - CAPL - CAN x 总线信息获取

在CAN&CANFD测试中,我们经常需要获取到CAN总线的负载、错误帧、过载帧、发送错误等等CAN总线上面的信息,这些信息如此重要,但是如果真的要写代码去实现也是相当不易的,那我们该如何去获取到的呢?下面我们就来一起看…

Object方法

私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版,配图更多,CSDN博文图片需要手动上传,因此文章配图较少,看不懂的可以去菜鸡博客参考一下配图! 系列文章目录 前端系列文章——传送门 JavaScript系列文章—…

柔性数组【结构体和动态内存的结合】

全文目录前言柔性数组的定义语法柔性数组的特点柔性数组的使用柔性数组的优势前言 很多人可能没有听过柔性数组这个概念,但是在C99中柔性数组是确实存在的。我个人感觉有点像动态内存和结构体的结合。 柔性数组的定义语法 结构中的最后一个元素允许是未知大小的数…

NumPy 秘籍中文第二版:三、掌握常用函数

原文:NumPy Cookbook - Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 在本章中,我们将介绍许多常用函数: sqrt(),log(),arange(),astype()和sum()ceil(),modf()&…

《Java8实战》第1章 Java 8、9、10 以及 11 的变化

如想了解 Oracle 公司对 JDK 的最新支持情况,请访问https://www.oracle.com/technetwork/java/java-se-supportroadmap.html。所有的示例代码均可见于图灵社区本书主页 http://ituring.com.cn/book/2659“随书下载”处。 1.1 为什么要关心 Java 的变化 Java8做的…

[MAUI 项目实战] 手势控制音乐播放器(三): 动画

文章目录吸附动画确定位置平移动画回弹动画使用自定义缓动函数多重动画点击动画项目地址上一章节我们创建了手势容器控件PanContainer,它对拖拽物进行包装并响应了平移手势和点击手势。拖拽物现在虽然可以响应手势操作,但视觉效果较生硬,一个…

总结一下Redis的缓存雪崩、缓存击穿、缓存穿透

缓存是提高系统性能的一种常见手段,其中Redis是一种常用的高性能缓存数据库。但是在使用缓存时,可能会遇到一些问题,比如缓存击穿、缓存穿透、缓存雪崩等问题,本文将介绍这些问题的概念、原因以及解决方案。 缓存击穿 缓存击穿指…

SQL Server 连接查询和子查询

提示: 利用单表简单查询和多表高级查询技能,并且根据查询要求灵活使用内连接查询、外连接查询或子查询等。同时还利用内连接查询的两种格式、三种外连接查询语法格式和子查询的语法格式。 文章目录前言1.查询所有学生的学号、姓名、选修课程号和成绩方法…

Vue学习——【第四弹】

前言 上一篇文章 Vue学习——【第三弹】 中我们了解了MVVM模型,这篇文章接着学习Vue中的数据代理。 简单介绍 数据代理就是**一个对象(A)来代理对另一个对象(B)的属性操作(A一定要包含B)。**直接看定义大家可能觉得有些抽象,我们可以用代码来实现。 …

全景丨0基础学习VR全景制作,后期篇:嵌入视频前期注意事项及后期处理

大家好,欢迎观看蛙色官方系列全景摄影课程! 一、前期拍摄要点 嵌入视频的简介和用途 livepano即完全无缝融合到全景图中的热点嵌入视频。 这种无缝融合是真正无缝,从而让观者产生沉浸感和真实感。例如在场景中放入宠物、让喷泉动起来、灯光…

MPAM中PARTID的虚拟化(Virtualization)

MPAM支持对PARTID的virtualization,需要在满足所有以下条件下才能使用: 在当前的security状态下有实现EL2;支持MPAM virtualization,也就是MPAMIDR_EL1.HAS_HCR等于1; 以下是MPAM中使用virtual-to-physical PARTID ma…

Scala之面向对象

目录 Scala包: 基础语法: Scala包的三大作用: 包名的命名规范: 写包的好处: 包对象: 导包说明: 类和对象: 定义类: 封装: 构造器: 主从…