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

news2025/1/23 6:03:24

文章目录

  • 前言
    • 相关代码整理:
    • 相关文章:
  • 可视化网址:
  • 常用地图基础
    • 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.coloradmin.cn/o/812540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CAN转ETHERCAT网关将CAN 总线和 ETHERCAT 网络连接方法

由于好多现场会出现将CAN总线的设备接到EtherCAT网络中&#xff0c;由于协议的不相同&#xff0c;不能直接进行连接&#xff0c;现需一种能同时兼容CAN 总线和ETHERCAT网络的一种设备&#xff0c;由此捷米JM-ECT-CAN 是自主研发的一款 ETHERCAT 从站功能的通讯网关。该产品主要…

深入浅出:大语言模型中必不可少的技术——Embedding简介

今天&#xff0c;推特上一位科技博主SullyOmarr分享了一个关于embedding的内容十分火爆。主要介绍为什么embedding对于在目前的AI大模型中很重要。这是一个十分不错的关于embedding知识的介绍。本文将根据SullyOmarr的内容也对embedding做一个简单的介绍&#xff0c;并解释为什…

Linux启动流程详解

Linux 开机启动流程 Linux 启动顺序是指 Linux 系统从开机到进入用户登录界面的过程&#xff0c;它可以分为以下几个步骤&#xff1a; 加载 BIOS&#xff1a;BIOS 是基本输入输出系统&#xff0c;它负责检测硬件设备&#xff0c;设置启动顺序&#xff0c;读取第一个启动设备的…

Java小型操作系统模拟(采用策略模式结合反射进行搭建,支持一些简单的命令)

Java小型操作系统模拟 项目说明第一阶段&#xff1a;反射结合策略模式搭建基本的命令结构第二阶段&#xff1a;注解结合反射与策略模式&#xff0c;将结构进一步规范第三阶段&#xff1a;开启新的窗口&#xff0c;将控制台输入切换到新窗口中&#xff0c;同时创建右键菜单&…

如何理解Diffusion

Diffusion算法可以有多个角度进行理解&#xff0c;不同的理解方式只是对目标函数进行了不同的解释。其主体思想是不变的&#xff0c;可以归纳为&#xff1a; 训练时通过图片逐步添加噪声&#xff0c;变为一个纯噪声。然后学习每一步的噪声。推理时给定一个随机噪声图片&#x…

Leetcode | Binary search | 22. 74. 162. 33. 34. 153.

22. Generate Parentheses 要意识到只要还有左括号&#xff0c;就可以放到path里。只要右括号数量小于左括号&#xff0c;也可以放进去。就是valid的组合。recurse两次 74. Search a 2D Matrix 看成sorted list就好。直接用m*n表示最后一位的index&#xff0c;并且每次只需要 …

Android启动速度优化

本节主要内容&#xff1a;了解APP启动流程、启动状态、查看启动时间、CPU Profile定位启动耗时代码、StrictMode严苛模式检测不合理写法、解决启动黑白屏问题。 一、APP启动流程 ①用户点击桌面App图标&#xff0c;Launcher进程采用Binder IPC向system_server进程发起startAc…

Spring Boot集成Swagger3.0,Knife4j导出文档

文章目录 Spring Boot集成Swagger3.0,Knife4j导出文档效果展示如何使用简要说明添加依赖添加配置类测试接口token配置位置 官网 说明情况 demo Spring Boot集成Swagger3.0,Knife4j导出文档 效果展示 如何使用 简要说明 Knife4j的前身是swagger-bootstrap-ui,前身swagger-boo…

day48-Random Image Feed(随机图片显示)

50 天学习 50 个项目 - HTMLCSS and JavaScript day48-Random Image Feed&#xff08;随机图片显示&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport&…

msvcp120.dll丢失的解决方法?有什么解决方法比较推荐?

第一&#xff1a;介绍几种可能导致msvcp120.dll文件丢失或损坏的原因 损坏的程序安装&#xff1a;在安装某个程序时&#xff0c;可能会出现意外中断或其他错误&#xff0c;导致msvcp120.dll文件未能正确地被安装或被破坏。这可能是由于软件安装过程中的错误、病毒感染或硬件问题…

OSPF协议RIP协议+OSPF实验(eNSP)

本篇博客主要讲解单区域的ospf&#xff0c;多区域的仅作了解。 目录 一、OSPF路由协议概述 1.内部网关协议和外部网关协议 二、OSPF的应用环境 1.从以下几方面考虑OSPF的使用 2.OSPF的特点 三、OSPF重要基本概念 3.1&#xff0c;辨析邻居和邻接关系以及七种邻居状态 3…

BPMNJS插件使用及汉化(Activiti绘制流程图插件)

BPMNJS插件运行最重要的就是需要安装nodejs插件,这不一定要安装和测试好。 主要是使用npm命令 1、配置BPMNJS插件绘制activiti7工作流 1.1、安装和配置nodejs 插件 1.1.1、下载nodejs 下载地址:https://nodejs.org/en 1.1.2、安装nodejs,傻瓜式安装 安装之后在安装…

【etcd】docker 启动单点 etcd

etcd: v3.5.9 etcd-browser: rustyx/etcdv3-browser:latest 本文档主要描述用 docker 部署单点的 etcd&#xff0c; 用 etcd-browser 来查看注册到 etcd 的 key 默认配置启动 docker run -d --name ai-etcd --networkhost --restart always \-v $PWD/etcd.conf.yml:/opt/bitn…

一文搞懂mysql(安装、基础命令、存储文件)

1、安装 除此之外&#xff0c;windows在安装前需要额外补加两个东西 dxwebsetup.exe、 vcredist_x64.exe 这俩随便一搜就能找到 在安装前者时要注意取消勾选bing工具栏 mysql下载链接 2、初始化 管理员身份打开cmd >> "path_to_mysql/bin/msqld.exe" --initi…

Windows11+Opencv+Clion编译源码

Windows11OpencvClion编译源码 参考&#xff1a;https://www.robotsfan.com/posts/69395e08.html 注意事项 编译过程中使用的软件&#xff0c;开源码等所有工具的安装路径一定不要有中文和空格。cmake过程会下载一些文件&#xff0c;如果是局域网的话可能下载不下来&#xf…

力扣 70. 爬楼梯

题目来源&#xff1a;https://leetcode.cn/problems/climbing-stairs/description/ C题解&#xff08;来源代码随想录&#xff09;&#xff1a; 本质上是一道斐波那契数题。 动规五部曲&#xff1a;定义一个一维数组来记录不同楼层的状态 确定dp数组以及下标的含义。dp[i]&am…

【Java】JDBC快速入门及详解(MySQL版)

文章目录 1. JDBC概述2. JDBC快速入门2.1 下载驱动jar包2.2 数据准备2.3 创建工程2.4 编写代码 3. JDBC API详解3.1 DriverManager3.2 Connection3.2.1 获取执行SQL对象3.2.1 管理事务 3.3 Statement3.3.1 执行DML语句3.3.2 执行DDL语句 3.4 ResultSet3.4.1 ResultSet对象方法3…

统信UOS V20桌面专业版(1060)

统信UOS V20桌面专业版&#xff08;1060&#xff09;也是发布许久我来发一下体验感受吧。 1.如果你是首次接触统信UOS&#xff0c;1060版本提供了快速上手指南&#xff0c;可以帮助你快速了解统信UOS的基础功能和办公实用小技巧&#xff0c;让你快速上手&#xff0c;降低使用门…

Dockerfile简介

1、什么是Dockerfile 要获得镜像&#xff0c;可以从Docker仓库中进行下载。那如果我们想自己开发一个镜像&#xff0c;那该如何做呢&#xff1f;答案是&#xff1a;Dockerfile Dockerfile其实就是一个文本文件&#xff0c;由一系列命令和参数构成&#xff0c;Docker可以读取Do…

Pytest自动化测试 - 必知必会的一些插件

这可能是B站最详细的pytest自动化测试框架教程&#xff0c;整整100小时&#xff0c;全程实战&#xff01;&#xff01;&#xff01; ​ Pytest拥有丰富的插件架构&#xff0c;超过800个以上的外部插件和活跃的社区&#xff0c;在PyPI项目中以“ pytest- *”为标识。 本篇将列举…