自动驾驶运动规划-Reeds Shepp曲线

相比于Dubins Car只允许车辆向前运动,Reeds Shepp Car既允许车辆向前运动,也允许车辆向后运动。

Reeds Shepp Car运动规划

1、车辆模型

车辆运动模型仍然采用Simple Car Model,但增加对车辆运动方向的描述,运动方程如下:

其中,。当时,表示车辆向前运动;时,表示车辆向后运动。

2、Reeds-Shepp Car

J Reeds和L Shepp证明Reeds Shepp Car从起点到终点的最短路径一定是下面的word的其中之一。word中的"|"表示车辆运动朝向由正向转为反向或者由反向转为正向。

图片来源:Planning Algorithm,http://planning.cs.uiuc.edu/node822.html

每个word都由这六种primitives组成,其中表示车辆左转前进;表示车辆左转后退;表示车辆右转前进;表示车辆右转后退;表示车辆直行前进;表示车辆直行后退。

Reeds and Shepp曲线的word所有组合不超过48种,所有的组合一一枚举如下:

图片来源:Planning Algorithm,http://planning.cs.uiuc.edu/node822.html

3、计算优化

3.1 位置姿态统一化

车辆的起点和终点的位置姿态是难以穷举的,所以一般在计算之前,会将车辆的姿态归一化:

起始姿态:

目标姿态:;其中,

车辆的转弯半径: r = 1;

假设车辆的初始姿态为,目标姿态,车辆的转向半径为r = ,如何实现姿态的归一化呢,实际上归一化的过程就是向量的平移和旋转过程。归一化:为了方便起见Reeds-Shepp中最小转向半径强制设置为1,如果车辆的实际最小转向半径不是1,可也通过适当放缩终点坐标来计算该曲线。比如如果一个车辆的最小转向半径为10,终点坐标为x,y,如果我们在计算曲线的时候将终点设为x/10,y/10,计算所得路径放大10倍曲线的转向半径就是10,终点也是x,y,所得曲线就是我们所期望曲线。

首先将向量平移到坐标原点(0,0)。平移到O(0, 0),平移向量为;对应用同样的平移向量:,最后得到平移后的向量:

应用旋转矩阵,将车辆的起点朝向转到x轴正向:

旋转之后,目标位置朝向更新为

将车辆转向半径缩放到1,于是最终得到车辆运动的起始姿态:

目标姿态:

代码如下:

double x1 = s1->getX(), y1 = s1->getY(), th1 = s1->getYaw();
double x2 = s2->getX(), y2 = s2->getY(), th2 = s2->getYaw();
double dx = x2 - x1, dy = y2 - y1, c = cos(th1), s = sin(th1);
double x = c * dx + s * dy, y = -s * dx + c * dy, phi = th2 - th1; return ::reedsShepp(x / rho_, y / rho_, phi)

3.2 利用对称关系降低求解复杂度

Reeds Shepp曲线有48种组合,编程时一一编码计算比较麻烦,因此可以利用其对称性降低求解工作量。

以转向不同的CSC类型为例,它包含4种曲线类型:,我们只需要编码推导得到的计算过程,其它几种直接可以通过对称性关系得到车辆运动路径。

给定车辆起始姿态,目标姿态,可以得到的运动路径如下:

{ Steering: left        Gear: forward    distance: 0.63 }
{ Steering: straight Gear: forward distance: 4.02 }
{ Steering: right Gear: forward distance: 0.11 }

对应的效果如下:

L^{+}S^{+}R^{+}

下面看看利用对称性求解其它几种路径的方法。

3.2.1 timefilp对称性

假设我们推导出从起始姿态达到目标姿态的路径计算方法:

path = calc_path()

利用对称性,将目标Pose修改为,代入同样的Path计算函数:

path = calc_path(, -, -)

就得到从类型的运动路径。

计算出的的车辆运动路径如下:

{ Steering: left        Gear: backward    distance: -2.85 }
{ Steering: straight Gear: backward distance: 4.02 }
{ Steering: right Gear: backward distance: -2.32 }

下面是车辆的运动效果,一路倒车进入另一个车位。

3.2.2 reflect对称性

将目标姿态修改为,代入同样的Path计算函数:

path = calc_path(, -, -)

就得到从类型的运动路径。

计算出的的车辆运动路径如下:

{ Steering: right        Gear: forward    distance: -0.56 }
{ Steering: straight Gear: forward distance: 5.28 }
{ Steering: left Gear: forward distance: -0.03 }

下面是车辆先右转、再直行、再左转从一个车位进入另一个车位的运动效果。

R^{+}S^{+}L^{+}类型曲线

3.2.3 timeflip + reflect

结合timeflip对称性和reflect对称性,将目标姿态修改为,代入同样的Path计算函数:

path = calc_path(, -, -)

就得到从类型的运动路径。

计算出的的车辆运动路径如下:

{ Steering: right    Gear: backward    distance: -1.86 }
{ Steering: straight Gear: backward distance: 5.28 }
{ Steering: left Gear: backward distance: -2.38 }

下面是车辆先右转、再直行、再左转,全程倒车从一个车位进入另一个车位的运动效果。

R^{-}S^{-}L^{-}类型曲线

通过对称性,48种不同的Reeds Shepp曲线通过不超过12个函数就可以得到全部运动路径。

参考链接

1、Optimal paths for a car that goes both forwards and backwards, J Reeds, L Shepp - Pacific journal of mathematics, 1990

2、OMPL的Reeds Sheep实现代码。(https://ompl.kavrakilab.org/ReedsSheppStateSpace_8cpp_source.html)

3、Reeds Sheep的Python代码实现。(https://github.com/nathanlct/reeds-shepp-curves/blob/master/reeds_shepp.py)

转自:https://zhuanlan.zhihu.com/p/122544884

自动驾驶运动规划-Reeds Shepp曲线的更多相关文章

  1. 自动驾驶运动规划-Dubins曲线

    1.Simple Car模型 如下图所示,Simple Car模型是一个表达车辆运动的简易模型.Simple Car模型将车辆看做平面上的刚体运动,刚体的原点位于车辆后轮的中心:x轴沿着车辆主轴方向, ...

  2. Google Waymo 2017自动驾驶安全技术报告(一)

    2017年10月Google Waymo向美国交通部提交了一份43页的安全报告,报告中详细说明了Waymo如何装备和训练自动驾驶车辆,从而避免驾驶中的一般和意外情况发生.这份报告对Waymo的自动驾驶 ...

  3. zz自动驾驶中轨迹规划的探索和挑战

    大家好,今天我们主要介绍一下轨迹规划的探索和挑战,我主要从四个方面介绍: 轨迹规划的概念 决策 横向规划 纵向规划 轨迹规划的概念: 轨迹规划的核心就是要解决车辆该怎么走的问题.比如我们知道了附近有行 ...

  4. <转载> 从算法上解读自动驾驶是如何实现的?

     科技新闻小鹏汽车2016-03-28 10:42 [摘要]车辆路径规划问题中路网模型.路径规划算法和交通信息的智能预测为关键点. 由于驾驶员的驾驶工作繁重,同时随着汽车拥有量的增加,非职业驾驶员的数 ...

  5. 自动驾驶缺人才?听听David Silver怎么说!

    如今自动驾驶在全球范围内的发展势头愈发“凶猛”,该领域人才也一度被视为“香饽饽”. 即使在美国,自动驾驶工程师的起薪也已经突破了25万美元,我国‘“开价”之高更是令人咋舌. 人才.人才.还是人才!重要 ...

  6. zz自动驾驶复杂环境下高精度定位技术

    今天为大家分享下,自动驾驶在复杂环境下的高精度定位技术. 定位/导航负责实时提供载体的运动信息,包括载体的:位置.速度.姿态.加速度.角速度等信息. 自动驾驶对定位系统的基本要求: 1. 高精度:达到 ...

  7. zz高精地图和定位在自动驾驶的应用

    本次分享聚焦于高精地图在自动驾驶中的应用,主要分为以下两部分: 1. 高精地图 High Definition Map 拓扑地图 Topological Map / Road Graph 3D栅格地图 ...

  8. 第三期 第三期 搜索——1.运动规划(motion_planing)

    运动规划的根本问题在于机器人可能存在于一个这样的世界中, 它可能想找到一条到达这个目标的路径,那么就需要指定一个到达那里的计划, 自动驾驶汽车也会遇到这个问题.他可能处于高速公路的附近的街道网络中,他 ...

  9. 自动驾驶研究回顾:CVPR 2019摘要

    我们相信开发自动驾驶技术是我们这个时代最大的工程挑战之一,行业和研究团体之间的合作将扮演重要角色.由于这个原因,我们一直在通过参加学术会议,以及最近推出的自动驾驶数据集和基于语义地图的3D对象检测的K ...

随机推荐

  1. 匿名函数 =匿名方法+ lambda 表达式

    匿名函数的定义和用途 匿名函数是一个"内联"语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿名函数来初始化命名委托[无需取名字的委托],或传递命名委托(而不是命名委托类型 ...

  2. Map格式-joson格式

    mapStr: {CHAR=UTF-8, DATA=eyJNRVJDSEFOVCI6IjEwMDEiLCJWRVJTSU9OIjoiMS4wLjAiLCJUUkFERSI6IjIwMTgwNjEyMT ...

  3. PCL库在Linux环境下的编译安装

    PCL库在Linux环境下的编译安装 PCL库的源码库:https://github.com/PointCloudLibrary/pcl 下载完了之后解压下来 编译库的几个步骤 mkdir build ...

  4. 论文解读(GIN)《How Powerful are Graph Neural Networks》

    Paper Information Title:<How Powerful are Graph Neural Networks?>Authors:Keyulu Xu, Weihua Hu, ...

  5. 哈工大 NLP 实验一 汉语分词系统

    NLP实验代码可见github:NLP实验代码整理 本实验会查重,而且写起来难度比较大,建议早一些开始.实验报告要用顶会论文形式呈现,建议使用overleaf里的ACL论文latex模板比较方便一点.

  6. Chrome:插件安装

    1.首先要下载一油猴插件管理器 得到crx文件 2.打开'扩展程序',在Chrome右上角 3.启动开发者模式(右上角),然后将油猴crx文件拖入界面中,会自动安装油猴 安装完成后,在工具栏中会出现油 ...

  7. MongoDB创建普通账户与admin账户的配置方法

    MongoDB数据库设置账户及权限的方法 1.如果MongoDB服务正在运行的情况下,需先停止该服务 在cmd(命令提示符)下输入net stop MongoDB,按下enter(回车键) 运行结果: ...

  8. .Net Core中无处不在的Async/Await是如何提升性能的?

    一.简介 Async/Await在.Net Core中真的是无处不在,到处都是异步操作,那为什么要用?有什么作用?别人说能提升性能?网上一堆文章看的绕晕了也没说清楚, 所以这里从理论,实践,原理一个个 ...

  9. 被广泛使用的OAuth2.0的密码模式已经废了,放弃吧

    最近一直有同学在问,OAuth2密码模式为啥Spring Security还没有实现,就连新的Spring Authorization Server也没有这个玩意儿. 其实这里可以告诉大家,OAuth ...

  10. 路径查找算法应用之A*算法

    环境:Visual Studio 2017 + .Net Framework 4.5 应用场景:在画板上查找起始点和目标点之间的最短最直路径,最后画出连接两个点之间的折线. 算法简介:A*算法是一种性 ...