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、什么时候结束循环?
两种可能: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)可在深蓝学院中找到。
(转载请标明源地址)
相关文章:
Motion Planning学习笔记一:配置空间、图、图搜索、图遍历
学习高飞博士的路径规划课程所总结的学习笔记。 目录 1、配置空间(Configuration Space, C-space) 2、图(Graphs) 3、图搜索(Graph Search Basis) 3.1、总体框架 3.2、两种基本的图遍历算法 3.3、启…...
C语言中如何判断大小端字节序?
大小端(Endian)是指多字节整数在内存中存储的方式。在计算机中,一个多字节整数由多个字节组成,而不同的机器和处理器在存储多字节整数时会有两种不同存储方式,分别为大端字节序和小端字节序。 以一个4字节整数0x12345…...
用spring-boot-starter实现事务的统一配置
一、前言 微服务架构下,多个微服务都需要事务操作,如果在每个微服务下都从头配置事务,将非常繁锁。事务配置具有高度的一致性,可以抽取出来,制作starter,在需要配置事务的服务中引入starter依赖即可。 采用…...
C语言中fopen的详细用法
fopen是C语言中用于打开文件的函数,其原型为: FILE *fopen(const char *filename, const char *mode); 其中,filename是要打开的文件名,mode是打开文件的模式。fopen函数返回一个指向FILE类型的指针,该指针指向打开的…...
C语言——学生信息管理系统(数组)
文章目录 一、前言二、目的三、框架1.菜单1.1主菜单1.2子菜单 2.流程图2.1总流程图2.2开始流程图2.3增加学生信息流程图2.4.删除学生信息流程图2.5修改学生信息流程图2.6查询学生信息流程图2.7对学生信息排序流程图 3.思路 四、代码五、演示视频 一、前言 因为最近是在赶进度总…...
【C语言】基础语法1:变量和数据类型
下一篇:运算符和表达式 ❤️🔥前情提要❤️🔥 欢迎来到C语言基本语法教程 在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家纠错指正。本专栏将以基础出发…...
linux安装和使用jekins
Jenkins详细安装配置部署--超详细_jenkins安装部署_宝贝富贵猪的博客-CSDN博客 1.安装JDK 2.获取安装包 下载页面:https://jenkins.io/zh/download/ 或者Index of /jenkins/redhat/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 3.安装Jenkins sud…...
驼峰式匹配
问题: 如果我们可以将小写字母插入模式串 pattern 得到待查询项 query,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字符。) 给定待查询列表 queries,和模式串 patte…...
第三十七章 立方体贴图总结
立方体贴图:将多个纹理组合起来映射到一张纹理上的一种纹理类型。 一个立方体贴图时包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的一个面,相当于是一个有纹理的立方体。 创建立方体贴图: 首先需要生成一个纹理,将其绑定到纹理目标上,再做其他纹理操作。补充:绑定到…...
哈希(C++)
哈希 unordered系列关联式容器unordered_map介绍 底层结构哈希概念哈希冲突哈希函数哈希冲突解决方式闭散列开散列 模拟实现哈希表的改造 哈希应用位图概念实现 布隆过滤器提出概念 unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器&…...
Spring MVC 的调用(12)
目录 SpringMVC流程 源码分析 第一步:用户发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者…...
死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] args) { System.out.println("sleep .."); try { Thread.sleep(10000000); } catch (InterruptedException e) { e.printStackTrace(); } } } java -…...
信号完整性分析:关于传输线的三十个问题解答(三)
21.FR4 中 50 欧姆传输线的单位长度电感是多少?如果阻抗加倍怎么办?(What is the inductance per length of a 50-Ohm transmission line in FR4? What if the impedance doubles?) FR4 中的所有 50 欧姆传输线的单位长度电感约…...
Java基础:Stream流常用方法
获取Stream流的方式 java.util.stream.Stream 是Java 8新加入的流接口。(并不是一个函数式接口) 获取一个流非常简单,有以下几种常用的方式: 所有 Collection 集合都可通过 stream 默认方法获取流(顺序流)…...
ImageNet使用方法(细节)自用!
学习记录,自用。 1. 下载数据集 点击以下链接下载种子文件,然后使用迅雷进行下载,仅下载勾选的文件即可。 https://hyper.ai/datasets/4889/c107755f6de25ba43c190f37dd0168dbd1c0877e 2. 解压 找到下载好的ILSVRC2012_img_train.tar 和…...
C/C++外观模式解析:简化复杂子系统的高效方法
C外观模式揭秘:简化复杂子系统的高效方法 引言设计模式的重要性外观模式简介与应用场景外观模式在现代软件设计中的地位与价值 外观模式基本概念外观模式的定义与核心思想提供简单接口隐藏复杂子系统设计原则与外观模式的关系外观模式实现外观模式的UML图 外观模式的…...
追梦之旅【数据结构篇】——详解小白如何使用C语言实现堆数据结构
详解小白如何使用C语言实现堆数据结构 “痛”撕堆排序~😎 前言🙌什么是堆?堆的概念及结构 堆的性质:堆的实现堆向下调整算法画图分析:堆向下调整算法源代码分享:向下调整建小堆向下调整建大堆 堆向上调整算…...
cocoscreator性能优化4-Sprite颜色数据去除
前言 Sprite是游戏内容的一个基本组成元素,包括ui、道具、立绘等各种地方都会用到。大部分情况下美术会帮我们调好图片颜色,我们只要把图片直接放到游戏里就行了。Sprite默认的渲染顶点数据中包含了颜色数据,由于我们并不需要去修改颜色&…...
系统接口幂等性设计探究
前言: 刚开始工作的时候写了一个带UI页面的工具,需要设计登录功能,登录功能也很简单,输入用户名密码点击登录,触发后台查询并比对密码,如果登录成功则返回消息给前端,前端把消息弹出提示一下。…...
C learning_7
目录 1.for循环 1.虽然while循环和for循环本质上都可以实现循环,但是它们在使用方法和场合上还是有一些区别的。 2.while循环中存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样 查找修改就不够集中和方便。所以…...
ESP32-S2物联网实战:IPv6配置与Adafruit IO双向通信
1. 项目概述与核心价值如果你手头有一块ESP32-S2开发板,并且已经厌倦了仅仅让它连上Wi-Fi、点个灯,想让它真正“活”起来,成为一个能融入现代互联网、能与云端自由对话的智能节点,那么这篇文章就是为你准备的。我们将深入两个在物…...
别再死记硬背了!用MATLAB手把手教你画根轨迹图(附代码与避坑指南)
MATLAB实战:从零绘制根轨迹图的完整指南与避坑技巧 在控制系统的设计与分析中,根轨迹图是理解系统动态特性的重要工具。传统教学中,学生往往被要求死记硬背绘制规则,却难以理解其实际应用价值。本文将彻底改变这一现状——通过MAT…...
Godot卡牌游戏框架终极指南:3小时从零构建专业级卡牌游戏
Godot卡牌游戏框架终极指南:3小时从零构建专业级卡牌游戏 【免费下载链接】godot-card-game-framework A framework which comes with prepared scenes and classes to kickstart your card game, as well as a powerful scripting engine to use to provide full r…...
终极指南:如何在Mac上免费备份和导出微信聊天记录
终极指南:如何在Mac上免费备份和导出微信聊天记录 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因误删重要微信聊天记录而懊恼?或是需要…...
怎么判断一家工厂还在不在正常生产?6 类活跃度信号,从纸面到现场
跑工厂的销售员都遇到过这种事:手机里存着一份名单,导航开两小时,到门口才发现卷帘门焊死、车间长草、保安说"厂子去年就搬了"。 问题出在哪?大多数人判断"这家工厂在不在",靠的是工商登记——执照…...
智能GUI自动化:从SAG架构到实战部署的完整指南
1. 项目概述与核心价值最近在开源社区里,我注意到一个挺有意思的项目,叫openclaw-skill-sag。乍一看这个标题,可能会觉得有点抽象,但如果你对自动化、机器人流程自动化(RPA)或者智能体(Agent&am…...
IE11富文本兼容——政务系统前端的深渊
IE11富文本兼容——政务系统前端的深渊 背景:为什么还有 IE11 系统要求支持 IE11。 为什么不是 Chrome? 办公电脑全是 Windows 7 IE11单位统一采购,不能随便装浏览器部分内部网站只支持 IE(ActiveX) 现状&#x…...
认识Python数据包套接字
如你所知,数据包格式套接字(Datagram Sockets)也叫“无连接的套接字”,在代码中使用 SOCK_DGRAM 表示。可以将 SOCK_DGRAM 比喻成高速移动的摩托车快递,它有以下特征:强调快速传输而非传输顺序;…...
MQ-3与MiCS-5524气体传感器对比:从原理到实战的选型指南
1. 项目概述与核心价值在嵌入式开发、环境监测乃至一些创意DIY项目中,气体检测是一个常见且关键的需求。无论是为了安全预警(如天然气泄漏),还是进行环境质量评估(如VOC监测),选择一款合适的传感…...
构建团队技能仓库:从知识管理到可执行技能包的系统化实践
1. 项目概述:从“技能包”到高效能工具箱最近在梳理团队内部的技术资产时,我反复思考一个问题:如何让那些散落在个人电脑、项目文档和口头交流中的“隐性知识”和“高效技能”,变成一个团队可以随时取用、持续进化的公共资产&…...
