草庐IT

路径规划算法之几何建模

无意2121 2023-11-29 原文

目录

1 几何建模简介

1.1 机器人建模

1.2 环境建模

2 多边形和多面体模型

2.1 凸集的定义

2.2 凸集的边界表示与实心表示

2.3 非凸多边形

2.4 逻辑谓词

2.5 多面体模型

2.6 阿拉伯数字半代数模型

2.7 非凸多边形的另一种编码

2.8 3D三角形

2.9 非均匀有理B样条曲线

2.10 位图

2.11 更广义的定义


本文对机器人运动规划的经典书籍《planning algorithm》进行解析,原文请参考3.1 Geometric Modeling (lavalle.pl)

1 几何建模简介

对于运动规划,如何对机器人和环境进行几何建模是非常重要的内容。几何建模的方法和技术多种多样,具体的选择通常取决于应用和问题的难度。在大多数情况下,通常有两种选择:边界表示与实心表示。

1.1 机器人建模

假设我们想要定义一个机器人的模型。利用边界表示法,可以写出与机器人表面大致重合的方程。若用实心表示,我们可以描述机器人实体中包含的所有点的集合。

1.2 环境建模

第一步是定义世界W,有两种可能的选择:(1)2D世界,其中W = R2, (2) 3D世界,其中W = R3。这样的定义足以解决大多数问题,然而,人们也可能希望允许更复杂的世界如更高维度的空间,本篇文章不讨论这些,因为它们目前的应用是有限的。第二步是定义障碍物区域:世界中“永久”被占领的部分,例如建筑的墙壁。

2 多边形和多面体模型

2.1 凸集的定义

首先介绍凸集,当且仅当,对于X中的任何一对点,连接它们的线段上的所有点都包含在X中。因此,x1和x2之间的插值总是在X中产生点。直观地说,X不包含口袋或缩进

2.2 凸集的边界表示与实心表示

O的边界表示是一个m边多边形,它可以用两种特征来描述:顶点和边。每个顶点对应多边形的一个“角”,每个边对应一对顶点之间的线段。多边形可以用R2中m个点的序列(x1, y1), (x2, y2),…,(xm, ym)来表示,按逆时针顺序给出。

O的实心表示可以表示为m个半平面的交。每一个半平面对应于多边形边所共有的直线一侧的所有点的集合。下图显示了一个八边形的例子,它表示为八个半平面的交点。

多边形的边由两点指定,例如(x1, y1)和(x2, y2)。考虑经过(x1, y1)和(x2, y2)的直线方程。可以确定一个方程的形式为ax + by + c = 0,其中a, b, c∈R是由x1, y1, x2, y2确定的常数。设f: R2→R为f(x, y) = ax + by + c给出的函数,注意直线的一边是f(x, y) < 0,另一边是f(x, y) > 0。事实上,f可以解释为(x, y)到直线的有符号欧氏距离,f(x, y)的符号表示以该线为界的半平面,设fi(x, y)表示从(xi, yi)到(xi+1, yi+1)边对应的直线f函数。

Hi对于1≤i≤m定义为W的一个子集。Hi是描述直线fi(x, y) = 0(包括直线上的点)一侧所有点的集合。

 凸的m边多边形障碍区域可以是多个半空间的交集,因此O表示为

2.3 非凸多边形

但O作为多边形障碍区域是凸边形的假设太有限。现在假设O是w的一个非凸多边形。在这种情况下,O可以表示为

其中每个Oi都是一个凸多边形集。使用这种表示,可以定义W中非常复杂的障碍区域。尽管这些区域可能包含多个分量和孔洞,但只要O是有界的,它的边界将由线性段组成。因此,O可以定义为任何有限的并集、交集和差集的组合。

注意,非凸多边形的表示不是唯一的。有很多方法可以将O分解为凸集(经典的三角剖分)。应该仔细选择分解,以优化将使用该模型的任何算法的计算性能。在大多数情况下,组件甚至可能被允许重叠。理想情况下,用最少数量的基元表示O似乎很好,但是自动化这样的分解可能会导致NP-hard问题。分解O的一种高效、实用的方法是应用垂直单元格分解算法

2.4 逻辑谓词

我们可以先定义一个逻辑谓词作为碰撞检测器。设φ是一个谓词,定义为φ: W→{true, false},如果W中的点位于O,则返回true,否则返回false。对于f(x, y) = 0给出的直线,设e(x, y)表示一个逻辑谓词,如果f(x, y)≤0则返回true,否则返回false。与凸多边形区域相对应的谓词用逻辑连接表示

如果点(x, y)位于凸多边形区域,谓词α(x, y)返回真值,否则返回假值。则由n个凸多边形组成的障碍区域用并集的逻辑表示

虽然存在更有效的方法,但φ可以在时间O(n)检查点(x, y)中是否位于O,其中n是O表示中出现的集合的数量。

2.5 多面体模型

对于三维世界,W = R3,前面的概念可以很好地从二维的情况下推广,用多面体代替多边形,用半空间代替半平面。边界表示可以根据三个特征定义:顶点、边和面。每个面都是一个嵌入R3中的“平面”多边形。每条边都构成了两个面之间的边界。每个顶点形成三条或多条边之间的边界。

已经提出了几种数据结构,允许人们方便地绕着多面体特征“走”。例如,双连接边缘列表。数据结构包含三种类型的记录:面、半边和顶点。直观地说,半边是有向边。每个顶点记录保存着点坐标和指向与顶点接触的任意半边的指针。每个面记录都包含一个指向其边界上任意半边的指针。每个面都由半边组成的圆形列表限定。多面体的每条边都有一对有向半边记录。每条半边如图3.3b中的箭头所示。每个半边记录包含指向其他5个记录的指针:1)半边起源于顶点;2)“孪生”半边,限定相邻面,且方向相反;3)以半边为界的面;4)绑定面的圆形边列表中的下一个元素;和5)前一个元素的圆形列表边绑定的脸。一旦定义了所有这些记录,就可以方便地遍历多面体的结构。更多关于该数据结构的介绍请参考lect10-dcel.pdf (umd.edu)

现在考虑一个多面体的实心表示。假设O为凸多面体,可以从顶点构造一个实体表示。O的每个面沿其边界至少有三个顶点。假设这些顶点不共线,通过它们的平面的方程可以确定为

同样可以构造f,除了f: R3→R和f(x, y, z) = ax + by + cz + d。设m为面数。对于O的每一个面,定义一个半空间Hi为W的子集

2.6 阿拉伯数字半代数模型

在多边形和多面体模型中,f 都是线性的。在二维世界的半代数模型的情况下,可以是具有实值系数和变量的任何多项式。构造的方式与上面的交集并集类似。

2.7 非凸多边形的另一种编码

上述方法需要非凸多边形表示为凸多边形的并集。现在提出一种新的方法,可以表示带孔的多边形。 通过使用不同的方向:逆时针为外部边界和顺时针为孔边界。

2.8 3D三角形

最方便的几何模型之一是一组三角形,每个三角形由三个点表示,这在计算机图形学中很流行,因为图形加速硬件主要使用三角形基元。若两个三角形如果有交集,则被视为“碰撞” 另一个。允许三角形基元有交集提供了极大的灵活性,因为没有对三角形表达方式的限制,这产生了表达的多解,然而这也是缺点之一。没有连贯性可以求出一个三角形顶点是否在另一个三角形“内部”来判断。如果至少有一些连贯性, 那么有时最好减少冗余三角形坐标的规范(许多三角形将共享相同的点或边)。删除此冗余的表示称为三角形条带,它是一系列三角形,使得每个相邻的三角形共享一个共同的边。一个三角形扇形,其中所有三角形共享一个共同的顶点。

2.9 非均匀有理B样条曲线

非均匀有理B样条曲线用于许多工程设计系统,以方便曲面的设计和调整,如飞机或汽车车身设计。半代数是隐式方程,而NURBS 和其他样条曲线是参数方程。这使得诸如渲染之类的计算容易;但是,其他功能(例如碰撞检测)变得更加多难。这些模型可以在任何维度上定义。这里给出了 2D 公式,更多B样条曲线细节可以阅读《考虑车辆运动约束的最优避障轨迹规划算法》论文解读二_无意2121的博客-CSDN博客

2.10 位图

对于W = R2或W = R3,都可以将世界的有界部分离散成可能被占用或不被占用的矩形单元格。这种离散化的分辨率决定了每个轴的单元格数量和大小。这种表示可以被认为是一个二值图像,其中图像中的每个“1”对应一个包含至少一个O点的矩形区域,而“0”表示不包含任何O点的区域。尽管位图不像其他模型那样优雅,但它们在应用中经常出现。其中一个例子是由移动机器人通过传感器探索环境而构建的数字地图。位图的一个概括是灰度图或占用网格。在这种情况下,可以为每个单元格分配一个数值,表示诸如“存在障碍的概率”或“穿越单元格的预期难度”等数量。后一种解释常用于为行星漫游车导航的地形图中。更多详细的建图内容可以参考【自动驾驶轨迹规划之地图结构】_无意2121的博客-CSDN博客

2.11 更广义的定义

不仅可以用多项式来定义f ,一个流行的基元是超二次元,它概括了二次曲面。一个例子是超椭球体

广义圆柱是普通圆柱的推广。对于某些参数s∈[0,1],中轴不是局限于一条直线,而是一条连续的脊柱曲线(x(s), y(s), z(s))。沿着脊柱定义了一个半径函数r(s),而不是一个恒定的半径。r(s)的值是作为广义圆柱在点(x(s), y(s), z(s)的截面得到的圆的半径。横截面平面的法线是脊柱曲线在s处的切线。

有关路径规划算法之几何建模的更多相关文章

  1. ruby-on-rails - 建模收藏夹 - 2

    我希望将Favorite模型添加到我的User和Link模型。业务逻辑用户可以有多个链接(即可以添加多个链接)用户可以收藏多个链接(他们自己的或其他用户的)一个链接可以被多个用户收藏,但只有一个所有者我对如何为这种关联建模以及在模型就位后如何创建用户收藏夹感到困惑?classUser 最佳答案 下面的数据模型怎么样:classUser:destroyhas_many:favorite_links,:through=>:favorites,:source=>:linkendclassLink:destroyhas_many:favor

  2. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  3. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  4. ruby-on-rails - Rails - 使用/自定义 URL : '/dashboard' 指定根路径 - 2

    如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b

  5. ruby - 如何根据长度将路径数组转换为嵌套数组或散列 - 2

    我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa

  6. ruby-on-rails - 如何播种图像的路径? - 2

    Organization和Image具有一对一的关系。Image有一个名为filename的列,它存储文件的路径。我在Assets管道中包含这样一个文件:app/assets/other/image.jpg。播种时如何包含此文件的路径?我已经在我的种子文件中尝试过:@organization=...@organization.image.create!(filename:File.open('app/assets/other/image.jpg'))#Ialsotried:#@organization.image.create!(filename:'app/assets/other/i

  7. Ruby 和指南针路径与 yeoman 项目 - 2

    我安装了ruby​​、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom

  8. 对象的 Ruby 方法查找路径 - 2

    是否有内置的Ruby方法或众所周知的库可以返回对象的整个方法查找链?Ruby查看一系列令人困惑的类(如thisquestion中所讨论)以查找与消息对应的实例方法,如果没有类响应消息,则调用接收方的method_missing。我将以下代码放在一起,但我确信它遗漏了某些情况或者它是否100%正确。请指出任何缺陷并指导我找到一些更好的代码(如果存在)。defmethod_lookup_chain(obj,result=[obj.singleton_class])ifobj.instance_of?Classreturnadd_modules(result)ifresult.last==B

  9. ruby-on-rails - rails 中的路径解析 - 2

    我正在寻找这样解析路由路径的方法:ActionController::Routing.new("post_path").parse#=>{:controller=>"posts",:action=>"index"}应该和url_for相反更新我发现:Whatistheoppositeofurl_forinRails?Afunctionthattakesapathandgeneratestheinterpretedroute?ActionController::Routing::Routes.recognize_path("/posts")所以现在我需要将posts_path转换为“/p

  10. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

随机推荐