【移动机器人运动规划】01 —— 常见地图基础 |图搜索基础

news/2024/5/16 5:14:56

文章目录

  • 前言
    • 相关代码整理:
    • 相关文章:
  • 可视化网址:
  • 常用地图基础
    • Occupancy grid map
    • Octo-map
    • Voxel hashing
    • Point cloud map
    • TSDF map
    • ESDF map
    • Free-space Roadmap
    • Voronoi Diagram Map
  • 图搜索基础
    • 配置空间
    • 图搜索基本概念
    • Dijkstra
    • AStar
      • Astar的一些变种(次优算法)
      • AStar在工程实践中的注意点
    • Jump Point Search(JPS)
      • Look Ahead Rule
      • Jumping Rules
      • 示例
      • 伪代码
      • 结论
  • 一些问题与解决方案
    • 问题1 PCL requires C++14 or above

前言

本文部分内容参考了深蓝学院的移动机器人运动规划,依此做相关的笔记与整理。

相关代码整理:

  1. https://gitee.com/lxyclara/motion-plan-homework/
  2. https://github.com/KailinTong/Motion-Planning-for-Mobile-Robots/blob/master

相关文章:

  1. 自动驾驶路径规划——Dijkstra算法
  2. 自动驾驶路径规划——A*(Astar)算法
  3. 【ROS-Navigation】—— Astar路径规划算法解析
  4. 【Apollo学习笔记】—— Routing模块

可视化网址:

  1. http://qiao.github.io/PathFinding.js/visual/
  2. https://github.com/daohu527/osm-pathfinding或https://daohu527.github.io/

常用地图基础

规划时需要对环境信息进行处理,构建相应的数学模型,依据不同的策略处理环境信息,以便于对环境进行分析和计算,对路径进行搜索和优化。合理的地图建模方法有利于减少路径规划的计算量,从而加快运算速度,减少存储空间。下面将会介绍常用的地图。

Occupancy grid map

占据栅格地图
GitHub地址: https://github.com/ANYbotics/grid_map
地图特点:

  1. Most Dense稠密
  2. Structural结构化
  3. Direct Index Query可以直接进行坐标索引查询
  4. 栅格划分越细,所占用的内存空间越大

在进行路径规划时采用栅格表示地图,处理障碍物的边界时,避免了复杂的计算。它具有表示不规则障碍物的能力,并适用于所有类型的传统或智能路径搜索算法。

具体细节可参考:自动驾驶路径规划——基于MATLAB的栅格地图

在这里插入图片描述

2D栅格地图
在这里插入图片描述
2.5D栅格地图(海拔地图)

Octo-map

八叉树地图
github地址: https://octomap.github.io/
地图特点:
• Sparse 稀疏
• Structural 结构化
• Indirect Index Query 非直接的查询,递归查询
在这里插入图片描述

在这里插入图片描述

Voxel hashing

哈希建图
github: https://github.com/niessner/VoxelHashing
地图特点:
• Most Sparse
• Structural
• Indirect Index Query

具体细节详见:Voxel Hashing阅读笔记
在这里插入图片描述

Point cloud map

点云地图
地址:http://pointclouds.org/
地图特点:
• Un-ordered 无序
• No Index Query 
在这里插入图片描述

TSDF map

Truncated Signed Distance Functions
截断符号距离
地址: https://github.com/personalrobotics/OpenChisel
地图特点:

  1. 障碍物之外距离场值为正,反之为负。
  2. 只关注视锥之内

可以参考这篇博客:截断符号距离 | TSDF, Truncated Signed Distance以及这篇论文《Truncated Signed Distance Function: Experiments on Voxel Size》
在这里插入图片描述

ESDF map

欧几里得符号距离场
Euclidean Signed Distance Functions Incremental Update, Global Map
参考地址:
voxblox https://github.com/ethz-asl/voxblox
地图特点:
与TSDF相比不仅仅只关注视锥内。
在这里插入图片描述

Free-space Roadmap

地址:https://github.com/HKUST-Aerial-Robotics/Teach-Repeat-Replan
在这里插入图片描述

Voronoi Diagram Map

地址:https://github.com/ethz-asl/mav_voxblox_planning

图搜索基础

配置空间

机器人配置:对机器人一系列点的位置的描述
自由度(DOF):用最少的坐标数量 n n n去描述机器人配置
机器人配置空间:一个 n n n维的空间包括了所有机器人配置的可能,被表示为 C-space ,任何一个可能的位姿在C-space中表述为一个点。

为什么需要配置空间呢?如下图所示,不同的机器人有着不同的形状和大小,若在一般的工作空间中进行碰撞检测,需要知道机器人的几何信息,这是十分浪费时间、算力且复杂的。
在这里插入图片描述
在配置空间C-space中,机器人被描述为一个质点(位置 p o s i t i o n position position被描述为 R 3 R^3 R3空间中的一个点,位姿 p o s e pose pose被描述为 S O ( 3 ) SO(3) SO(3)空间中的一个点)。通过将机器人视为一个质点,同时对障碍物按照机器人的形状进行适当碰撞,可以得到配置障碍空间,称为C-obstacle。C-obstacle需要在规划之前完成设置,且是一次性的。其余没有障碍物的空间,描述为自由空间C-free。显然, C s p a c e = C o b s t a c l e ∪ C f r e e C_{space}=C_{obstacle} \cup C_{free} Cspace=CobstacleCfree

因此规划可以直接在C-free空间中进行,而不用考虑机器人自身的几何信息。
在这里插入图片描述

图搜索基本概念

图、有向图、无向图等等概念在图论、数据结构中已有不少阐述,这里就不赘述了。

对于图搜索问题,首先便是要构造图用以状态描述。在栅格地图中,每个栅格可以用作节点,栅格之间的连接距离可以用作边;在采样图中,通常将采样点作为节点,节点之间的连接被认为边。

有了图之后,便可以进行搜索。对于图搜索问题,其实就是从起点到终点寻得一条代价值最小的路径的问题。图搜索可以产生一个搜索树,二者是等效的。通过回溯(back-tracing)终点到起点的节点,便可以得到相应的路径。但通常图搜索问题难以被完全描述,搜索树也难以被完全建立,因此如何快速、有效地搜索到路径便是图搜索算法所面临的问题。
在这里插入图片描述
图搜索算法大体有如下一个框架:设置一个集合用以存储待访问的节点,集合首先会初始化,将起点作为第一个节点,接着会进入以下循环:

  • 移出节点:节点被访问过后,移出这个节点
  • 扩展:搜索这个节点的邻居
  • 放入节点:将这些邻居节点放入集合中

不断进行以上循环,直到达到目标或相应的判断条件。循环终止条件可以是当上述集合为空时;对于已访问过的节点,通常加入到closed集中,防止再次访问。

经典的搜索算法有BFS、DFS、Dijkstra等等,可以参考这篇博客自动驾驶路径规划——Dijkstra算法。Greedy Best First Search和AStar可以参考这篇博客自动驾驶路径规划——A*(Astar)算法

Dijkstra

算法伪代码
在这里插入图片描述
PS1:设置一个优先队列(小顶堆应该也行)
PS2:Cnm为从n到m的cost

示例:

在这里插入图片描述

优点:完备性且最优
缺点:1. 均匀扩散性地搜索;2. 没有目标点的信息,盲目性。
在这里插入图片描述

AStar

在这里插入图片描述
伪代码
在这里插入图片描述

示例:
在这里插入图片描述
PS:AStar的重点在于启发函数的设计,估计值需要满足小于等于实际值

启发函数可行性
Euclidean distance (L2 norm)可行
Manhattan distance (L1 norm)不一定,依据机器人运动学具体情况
L∞ norm distance可行
0 distanc可行

Astar的一些变种(次优算法)

在这里插入图片描述
Weighted AStar: 代价函数 f ( n ) = g ( n ) + ε h ( n ) , ε > 1 f(n)=g(n)+εh(n),ε>1 f(n)=gn+εh(n),ε>1
用最优换速度:得到次优解,但速度提升大
其代价值大致可估算为:cost(solution)<=εcost(optimal solution)
可视化的一个网站:http://qiao.github.io/PathFinding.js/visual/
在这里插入图片描述

AStar在工程实践中的注意点

  1. 如何将栅格地图描述为图(4邻域/8邻域)
    在这里插入图片描述
  2. Priority queue in C++的构造技巧
    • std::priority_queue
    • std::make_heap
    • std::multimap
  3. 合适的启发函数(尽可能贴近实际值)在这里插入图片描述
    栅格地图高度结构化,可以计算出最近的距离,设计最tight的启发函数(对角启发函数)。
    d x = a b s ( n o d e . x − g o a l . x ) dx=abs(node.x −goal.x) dx=abs(node.xgoal.x)
    d y = a b s ( n o d e . y − g o a l . y ) dy=abs(node.y −goal.y) dy=abs(node.ygoal.y)
    h = ( d x + d y ) + ( √ 2 − 2 ) ∗ m i n ( d x , d y ) h=(dx+dy)+(√2−2)∗min(dx,dy) h=(dx+dy)+(√22)min(dx,dy)
    在这里插入图片描述
    path具有对称性
  4. Tie Breaker(打破平衡)
    轻微放大启发函数。理论上可能会出现非完备性,实际上轻微的放大几乎不会有影响。
    在这里插入图片描述
    相同f比较h/增加固定的随机cost,并用哈希表实现/增加倾向性
    在这里插入图片描述在这里插入图片描述

Jump Point Search(JPS)

找到对称性并打破它们
在这里插入图片描述

Look Ahead Rule

在这里插入图片描述

Jumping Rules

在这里插入图片描述
PS1:pruning rule就是 Look Ahead Rule
PS2:先走垂直方向,再走对角线
PS3:Jumping Straight情况下,移动到y时,z是y的force neighbor,可以认定y节点是关键节点,加入到openlist中;Jumping Diagonally情况下,z是一个特殊节点,具有force neighbor,返回到上一节点y,将y加入到openlist中。

示例

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

伪代码

与AStar的唯一的区别在于如何寻找邻居
在这里插入图片描述

结论

  1. 大多数情况下,JPS要比AStar快
  2. JPS减少了OpenList的节点,但增加了节点查询的代价,在部分场景会比AStar慢不少。
  3. JPS大多只能在结构化的地图上进行搜索。

一些问题与解决方案

本文基于ROS neotic进行相关实验(本来机子是Ubuntu18.04的,因为显卡驱动的问题,重新安装了Ubuntu20.04),和原教程相比会遇到一些问题,现给出可能遇到的问题以及相应的解决方案,也期待与大家一同解决棘手的问题,共同探讨与进步。

问题1 PCL requires C++14 or above

初次编译,遇到一系列报错,其中不乏类似于以下的内容。

/usr/include/pcl-1.10/pcl/........
error: #error PCL requires C++14 or above

问题原因:PCL版本产生的问题。对功能包CmakeLists中C++11的部分替换为C++14。主要替换的文件有 grid_path_searcherwaypoint_generatorCmakeLists.txt

# 如grid_path_searcher的CmakeLists中
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS} -O3 -Wall") # -# # Wextra -Werror
# 替换为
set(CMAKE_CXX_FLAGS "-std=c++14 ${CMAKE_CXX_FLAGS} -O3 -Wall") # -# # Wextra -Werror

再次编译,抛了一个warning
在这里插入图片描述
不做更改,再次编译,无误
在这里插入图片描述
按照步骤加载地图,如下

在这里插入图片描述


http://www.mrgr.cn/p/64700643

相关文章

NoSQL-Redis集群

NoSQL-Redis集群 一、集群&#xff1a;1.单点Redis带来的问题&#xff1a;2.解决&#xff1a;3.集群的介绍&#xff1a;4.集群的优势&#xff1a;5.集群的实现方式&#xff1a; 二、集群的模式&#xff1a;1.类型&#xff1a;2.主从复制&#xff1a; 三、搭建主从复制&#xff…

操作系统专栏1-内存管理from 小林coding

操作系统专栏1-内存管理 虚拟地址内存管理方案分段分页页表单级页表多级页表TLB 段页式内存管理Linux内存管理 malloc工作方式操作系统内存回收回收的内存种类 预读失败和缓存污染问题预读机制预读机制失效解决方案缓存污染 内核对虚拟内存的表示内核对内核空间的表示直接映射区…

网络安全(黑客)自学

前言 1.不要试图以编程为基础的学习开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而且实际向安全过渡后可用到的关键知识并不多 一般人如果想要把编程学好再开…

使用docker部署springboot微服务项目

文章目录 1. 环境准备1. 准备好所用jar包项目2.编写相应的Dockerfile文件3.构建镜像4. 运行镜像5. 测试服务是否OK6.端口说明7.进入容器内8. 操作容器的常用命令 1. 环境准备 检查docker是否已安装 [rootlocalhost /]# docker -v Docker version 1.13.1, build 7d71120/1.13.…

SSIS对SQL Server向Mysql数据转发表数据 (完结)

1、对于根据主键进行更新和插入新的数据&#xff0c;根据前面的文章&#xff0c;对于组件已经很熟悉了&#xff0c;我们直接加入一个 查找 组件 &#xff0c;如下所示 2、右键点击"查找"&#xff0c;然后“编辑” &#xff0c;选择“连接”,选中我们的目标连接器&…

Session、Cookie 与 Application

目录 简介cookiecookie生命周期 sessionsession生命周期 application 简介 cookie、seesion、application三个都会缓存我们用户状态的数据&#xff0c;使得我们在浏览器访问网站时可以更快速的获取到信息。 主要原因在于HTTP协议是无状态的&#xff0c;我们每次访问服务器&…

订单30分钟未支付自动取消怎么实现?

目录 了解需求方案 1&#xff1a;数据库轮询方案 2&#xff1a;JDK 的延迟队列方案 3&#xff1a;时间轮算法方案 4&#xff1a;redis 缓存方案 5&#xff1a;使用消息队列 了解需求 在开发中&#xff0c;往往会遇到一些关于延时任务的需求。最全面的Java面试网站 例如 生…

亚马逊、wish如何构建稳定、高效的自养号测评环境?

我们都知道的跨境几个平台速卖通、shopee、Lazada、亚马逊、wish、煤炉、拼多多Temu、敦煌、eBay、Etsy、Newegg、美客多、Allegro、阿里国际、沃尔玛、OZON、Cdiscount等等如何测评而不会轻易被检测风控呢&#xff1f;需要用到什么样的网络环境&#xff1f;准备哪些资源呢&…

基于单片机的语音识别智能垃圾桶垃圾分类的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前信息和状态&#xff1b;通过语音识别模块对当前垃圾种类进行语音识别&#xff1b; 通过蜂鸣器进行声光报警提醒垃圾桶已满&#xff1b;采用舵机控制垃圾桶打开关闭&#xff1b;超声波检测当前垃圾桶满溢程度&#xff1…

c++11 标准模板(STL)(std::basic_ifstream)(二)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ifstream : public std::basic_istream<CharT, Traits> 类模板 basic_ifstream 实现文件流上的高层输入操作。它将 std::basic_istrea…

流控平台Sentinel搭建和接入教程

流量控制和限流是大型系统必不可少的组成部分&#xff0c;Sentinel是Alibaba提供的一款特别好用的专业工具&#xff0c;属于那种看起来很牛&#xff0c;用起来也很牛的工具&#xff0c;下面记录一下接入的过程。 一&#xff0c;搭建平台 1&#xff0c;下载jar包 地址&#x…

报表工具有哪些?奥威BI+方案,快速搞定数据分析

报表工具有很多&#xff0c;如Excel、 Tableau、Power BI、帆软BI、思迈特BI等都是中国企业常用的报表工具&#xff0c;但要说能够成熟使用“BI方案”&#xff0c;更快地完成部署&#xff0c;推动企业大数据分析的却寥寥无几。“奥威BI方案”&#xff0c;低风险、高效率、高性价…

Mysql sql优化

目录 目的 目标 explain 优化 避免使用select * 用union all代替union 小表驱动大表&#xff08;in与exists&#xff09; 批量操作 多使用limit in中值太多 不使用%前缀模糊查询 不在where子句中进行表达式操作 避免隐式类型转换 联合索引遵守最左前缀法则 inne…

文心一言大数据模型-文心千帆大模型平台

官网&#xff1a; 文心千帆大模型平台 (baidu.com) 文心千帆大模型 (baidu.com) 模型优势 1、模型效果优&#xff1a;所需标注数据少&#xff0c;在各场景上的效果处于业界领先水平 2、生成能力强&#xff1a;拥有丰富的AI内容生成&#xff08;AIGC&#xff09;能力 3、应用…

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域的数据分析

一、 空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门 1.5 Geodatabase地理数据库 二、 ArcGIS专题地图制作 2.1专题地图制作规范 2.2 空间数据的准备与处理 2.3 空间数据可视化&#xff1a;地图符号与注记 …

strcat,strcmp,strcpy,memcpy的用法

1、 打印hello&#xff0c;world 2、比较str1和str2的大小 int main() {char arr1[100];char arr2[100];char a[] "hello,";char b[] "world";int ret 0;strcpy(arr1, a);//字符串赋值。必须用strcpystrcpy(arr2, b);char c[100] { 0 };strcat(arr1, a…

make/makefile的使用

make/makefile 文章目录 make/makefile初步认识makefile的工作流程依赖关系和依赖方法make的使用 总结 make是一个命令&#xff0c;是一个解释makefile中指令的命令工具&#xff0c;makefile是一个文件&#xff0c;当前目录下的文件&#xff0c;两者搭配使用&#xff0c;完成项…

【前端知识】React 基础巩固(四十二)——React Hooks的介绍

React 基础巩固(四十二)——React Hooks的介绍 一、为什么需要Hook? Hook 是 React 16.8 的新增特性&#xff0c;它可以让我们在不编写class的情况下使用state以及其他的React特性&#xff08;比如生命周期&#xff09;。 class组件 VS 函数式组件&#xff1a; class的优势…

MySQL 数据库 【增删查改(二)】

目录 一、表的设计 1、一对一 2、一对多 3、多对多 二、新增 三、查询 1、聚合查询 &#xff08;1&#xff09;聚合函数&#xff1a; &#xff08;2&#xff09; group by 子句 &#xff08;3&#xff09;having 2、联合查询 (1)内连接 (2)外连接 (3)自链接 (4)…

Web3将自己写在合约中的代币添加到MetaMask中管理

上文 Web3带着大家根据ERC-20文档编写自己的第一个代币solidity智能合约 带着大家在智能合约中创建了一个自己的代币系统 我们可以在MetaMask中去导入 ganache环境下模拟出来的第一和第二个账号 我们这里 可以看到他们的 ETH 但看不到自己的代币符号 没关系 我们点击这下面的…