当前位置: 首页 > news >正文

[1]-基于图搜索的路径规划基础

基于搜索的路径规划

1.0 图搜索基础

1.1 Configuration Space(配置空间)

  • Robot configuration
    机器人配置,简单来说就是将机器人在空间中用一个点来描述,忽略了其外观信息,例如形状不管是圆形还是方形,都均会抽象成一个点进行表示。
  • Robot degree of freedom (DOF)
    在进行轨迹规划的时候是要考虑机器人的一个实际的运动模型的,不同的运动模型需要的输入和输出变量是不同的,即对应的控制变量的维度是不同的,尽可能的使用一个较小的自由度去表示机器人在配置空间中的位姿。
  • Robot configuration space
    一个 n n n 维的空间,包含着机器人的所有可能位置,称为 C-Space
  • 简单来说,每个机器人的位姿在 C-space 中就是一个点而已。

1.2 C-space Obstacle

  • Planning in workspace
    首选解释一下什么事工作空间即什么是 workspace,简单来说其实就是机器人真实的一个工作空间,就是我们所处的物理世界。如果在物理世界中进行机器人的一个路径规划,其实是一个比较麻烦的事情,有如下两个原因:
    • 每个机器人拥有不同的形状和大小(different shape and size)
    • 碰撞检测需要指导机器人的几何信息
      这样进行规划是非常耗时和困难的,因此引入 C-space 这一概念
  • Planning in C-space
    • C-space 中,机器人被抽象为了一个 C-space 中的一个点,例如三维空间中机器人可以由 position(a point in R 3 R^3 R3),pose (a point in S O ( 3 ) SO(3) SO(3))
    • 至于真实世界中感知到的障碍物信息则需要提前展示部署到 C-space 中去,是一个在规划前要完成的工作,我们称这些障碍物为 C-space 中的障碍物,或者称为 C-obstacle
    • C s p a c e = ( C o b s t a c l e )   U   ( C f r e e ) C_{space} = (C_{obstacle})\ U\ (C_{free}) Cspace=(Cobstacle) U (Cfree)
    • 而我们通常所说的路径规划此时就可以说成是在 C-free 中找一个连接 q s t a r t q_{start} qstart q g o a l q_{goal} qgoal 的路径

1.3 总结

  • In workspace
    机器人是一个拥有形状和大小的实体 (hard for motion planning)
  • In configuration space
    • 机器人是一个点 (easy for motion planning)
    • 障碍物提前加入到 C-space 中去,其实严格上来说也不算是加入,只是以某种方式对规划时使用的地图进行了一定方式的变动,使得在后续的路径规划中可以忽略机器人的一个形状和大小的约束,从而简化规划问题的难度。
  • C-space 表示障碍物可能非常复杂。 因此在实践中使用了近似(但更保守)的表示,例如下图所示是将机器人通建模为一个半径为 r r r 的球形:

在这里插入图片描述

2.0 图和搜索技术

2.1 图

  • 首先图这个概念相信大家或多或少的在本科学习中都会接触到图论相关的内容,简单来说图是由节点和边构成的。根据节点和边的不同形式还可以分成无向图,有向图,赋权图等等。下面是一些例子。

    • 无向图

      在这里插入图片描述

    • 有向图

      在这里插入图片描述

    • 赋权图

      在这里插入图片描述

  • 状态空间图 (state sapce graph)
    搜索算法的数学表示,即将一张图抽象成数学上的表达形式

    • 对于每一个搜索问题,都有一个对应的 state space graph
    • 图中节点之间的联系自然由链接两个节点之间的边所表示
    • 下面两张图分别代表了在基于栅格地图搜索是和基于概率路线图搜索是所对应的 state space graph
      在这里插入图片描述

2.2 图搜索概述

  • 图搜索技术总是从一个起点 X S X_S XS 出发
    • 可以将搜索图画成一颗树(数据结构中的树),树的父节点就是起点
    • 然后对该树进行遍历,当在树中找到目标点的时候,通过该节点进行回溯,即可找到一条从起点到终点的路径。
    • 然而对于许多问题,我们永远无法真正构建整棵树,太大或效率低下——我们只想尽快到达目标节点。
    • 下面展示的则是一个简单的将图转换为树的过程
      在这里插入图片描述

一个基于图搜索的大致流程可以归结为如下步骤

  • 维持一个 container 去存储将要访问的节点
  • container 初始化的时候只有 X S X_S XS 节点
  • LOOP
    • containerRemove 一个节点,移除的规则需要遵循提前定义好的 score function
      • Visit a node
    • Expansion: 获得移除节点的邻居节点
      • Discover all its neighbors
    • Push them (neighbors) into the container
  • End LOOP

2.3 图搜索回顾

  • Question 1: When to end the loop? 什么时候终止上述的 LOOP
    • Possible Option: 当所维护的 container 为空的时候
  • Question 2: What if the graph is cyclic? 如果图是循环的呢?
    • 当一个节点从容器中移除(扩展/访问)时,它不应该再次添加回容器。
  • Question 3: 以什么方式删除正确的节点,以便尽快达到目标状态,从而减少图节点的扩展。

\quad 显而易见,问题3则是解决图搜索问题或者说基于搜索的路径规划问题的核心问题,起初,我们并不知道目标点在图中的哪个位置,因此我们只能尝试去遍历图中的所有节点,当到达目标节点的时候则停止遍历即可,那么下面的一个问题则变成了如何高效的进行图的遍历,从而快速的找到目标点。

2.4 图的遍历 (Graph Traversal)

\quad 学过一点关于图论的同学可能知道,图的遍历遍历一般是基于两种方法,即我们通常所说的深度优先遍历(DFS)和广度优先遍历(BFS),两者的遍历方式有一定的区别,首先在编程实现的时候,所对应的数据结构一个对应的是堆,一个对应的则是栈,具体如下图所示:
在这里插入图片描述

在这里插入图片描述

2.4.1 Depth First Search (DFS)

\quad 策略:移除/扩展容器中深度最大的节点,若深度一样,则根据自定义的策略进行选择移除(即后文所说的 Heuristic Function)
\quad 具体的实现如下图所示,维护一个 last in first output container (i.e. statck)
在这里插入图片描述

\quad 下面通过一个动图来展示这一过程,根据图中的编号,节点会依次的进行扩展和遍历。
在这里插入图片描述

2.4.2 Breadth First Search (BFS)

\quad 广度优先搜索的策略:移除/扩展容器中最浅层的节点。
\quad 实现方式:维护一个 first in first output container (i.e. queue)
在这里插入图片描述

\quad 下面通过一个动图来展示这一过程,根据图中的编号,节点会依次的进行扩展和遍历。
在这里插入图片描述

2.4.3 BFS VS DFS

  • BFSDFS 的对比如下图所示:

在这里插入图片描述

\quad 从图中可以明显的看到虽然两个方法都可以找到最终的目标点,但是 DFS 明显找到的不是最优解,即并不是最短路。这里我们只是直观上说明 DFS 不能找到最优路径,事实上也确实不行因此在后面的讨论中,我们值讨论基于 BFS 的遍历方式。

3.0 启发式搜索 (Heuristic Search)

3.1 贪心搜索

\quad BFSDFS 在选择下一个节点的时候,仅仅是依靠当前 container 中谁是 “first in” 或者谁是 last in 进行判断。

\quad 贪心算法进行搜索则是根据一种 heuristic function 进行选择,从而选择认为(最好的节点)

  • Heuristic Definition:

    A heuristic is a guess of how close to you are to the target。即启发式是一个对当前点距离目标点多远的猜测,那么我们自然就可以使用两点之间的一个范式距离来判断猜测了,下图就表示了利用欧式距离和曼哈顿距离当作 heuristic 时所猜测的距离。

    在这里插入图片描述

    heuristic 应当满足以下两点:

  • 启发式搜索可以指导你朝着一个尽可能正确的方向向目标点靠近。

  • 启发式函数应当是非常简单进行计算的,因为本身我们在不使用启发式搜索时,单单通过广度优先遍历是可以找到一个起点到目标点的最有解的,但是其速度比较慢,因此才加入启发式搜索,但如果启发式函数计算较为复杂,反而会增加计算时间,得不偿失,启发式搜索也就是去了意义。

\quad 下面对 BFS 和 Greedy Best-First Search 通过一张动图进行简单对比(环境过于简单,起点和终点之间没有障碍物)。

在这里插入图片描述

\quad 看起来贪心搜索的表现确实不错。接下来看看如果在图中加入障碍物会怎么样。

在这里插入图片描述

\quad 很遗憾,贪心搜索失败了,并没有找到最优路径,太过于注重眼前利益。

\quad 导致这种问题i的原因是什么呢?在接下来的讨论中揭晓。

Reference

  • 待补充

相关文章:

  • 工业相机飞拍模式介绍及相机曝光值计算
  • spring cloud 使用oauth2 问题收集
  • vscode-pretter 插件支持 styled-components 格式化问题
  • 搭建微服务项目框架环境
  • 与MySQL的纠缠(卸载与安装)
  • nodejs+vue+elementui影城选座管理系统python518
  • 机器学习笔记之支持向量机(一)模型构建思路
  • python-(4-3)数据类型的应用(元组、集合)
  • Hbase基本概念
  • cmake是什么,为什么现在都用cmake,cmake编译原理和跨平台示例
  • IDEA中使用JIRA
  • 物联网-物联前端安全加密技术简介
  • 怎样在LaTeX中方便输入带圆圈的数字
  • 如何在 SAP ABAP ALV 报表里以交通灯的方式显示某一列的值
  • 【C++实现】浅聊定时器的实现,最小堆配合map实现定时器
  • 【RocksDB】TransactionDB源码分析
  • 0x05 Python数据分析,Anaconda八斩刀
  • es6--symbol
  • Git的一些常用操作
  • Gradle 5.0 正式版发布
  • node学习系列之简单文件上传
  • 测试开发系类之接口自动化测试
  • 对象引论
  • 近期前端发展计划
  • 看域名解析域名安全对SEO的影响
  • 如何利用MongoDB打造TOP榜小程序
  • 数据结构java版之冒泡排序及优化
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 用 Swift 编写面向协议的视图
  • # Apache SeaTunnel 究竟是什么?
  • #laravel 通过手动安装依赖PHPExcel#
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (1) caustics\
  • (10)STL算法之搜索(二) 二分查找
  • (12)目标检测_SSD基于pytorch搭建代码
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (七)c52学习之旅-中断
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)可以带来幸福的一本书
  • ***详解账号泄露:全球约1亿用户已泄露
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET 指南:抽象化实现的基类
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .Net8 Blazor 尝鲜
  • .Net接口调试与案例
  • @Autowired @Resource @Qualifier的区别