自动驾驶运动规划-Reeds Shepp曲线
自动驾驶运动规划-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曲线的更多相关文章
- 自动驾驶运动规划-Dubins曲线
1.Simple Car模型 如下图所示,Simple Car模型是一个表达车辆运动的简易模型.Simple Car模型将车辆看做平面上的刚体运动,刚体的原点位于车辆后轮的中心:x轴沿着车辆主轴方向, ...
- Google Waymo 2017自动驾驶安全技术报告(一)
2017年10月Google Waymo向美国交通部提交了一份43页的安全报告,报告中详细说明了Waymo如何装备和训练自动驾驶车辆,从而避免驾驶中的一般和意外情况发生.这份报告对Waymo的自动驾驶 ...
- zz自动驾驶中轨迹规划的探索和挑战
大家好,今天我们主要介绍一下轨迹规划的探索和挑战,我主要从四个方面介绍: 轨迹规划的概念 决策 横向规划 纵向规划 轨迹规划的概念: 轨迹规划的核心就是要解决车辆该怎么走的问题.比如我们知道了附近有行 ...
- <转载> 从算法上解读自动驾驶是如何实现的?
科技新闻小鹏汽车2016-03-28 10:42 [摘要]车辆路径规划问题中路网模型.路径规划算法和交通信息的智能预测为关键点. 由于驾驶员的驾驶工作繁重,同时随着汽车拥有量的增加,非职业驾驶员的数 ...
- 自动驾驶缺人才?听听David Silver怎么说!
如今自动驾驶在全球范围内的发展势头愈发“凶猛”,该领域人才也一度被视为“香饽饽”. 即使在美国,自动驾驶工程师的起薪也已经突破了25万美元,我国‘“开价”之高更是令人咋舌. 人才.人才.还是人才!重要 ...
- zz自动驾驶复杂环境下高精度定位技术
今天为大家分享下,自动驾驶在复杂环境下的高精度定位技术. 定位/导航负责实时提供载体的运动信息,包括载体的:位置.速度.姿态.加速度.角速度等信息. 自动驾驶对定位系统的基本要求: 1. 高精度:达到 ...
- zz高精地图和定位在自动驾驶的应用
本次分享聚焦于高精地图在自动驾驶中的应用,主要分为以下两部分: 1. 高精地图 High Definition Map 拓扑地图 Topological Map / Road Graph 3D栅格地图 ...
- 第三期 第三期 搜索——1.运动规划(motion_planing)
运动规划的根本问题在于机器人可能存在于一个这样的世界中, 它可能想找到一条到达这个目标的路径,那么就需要指定一个到达那里的计划, 自动驾驶汽车也会遇到这个问题.他可能处于高速公路的附近的街道网络中,他 ...
- 自动驾驶研究回顾:CVPR 2019摘要
我们相信开发自动驾驶技术是我们这个时代最大的工程挑战之一,行业和研究团体之间的合作将扮演重要角色.由于这个原因,我们一直在通过参加学术会议,以及最近推出的自动驾驶数据集和基于语义地图的3D对象检测的K ...
随机推荐
- 深入理解ThreadLocal及其变种
ThreadLocal 定义 ThreadLocal很容易让人望文生义,想当然地认为是一个"本地线程". 其实,ThreadLocal并不是一个Thread,而是Thread的局部 ...
- 怎样快速对二进制和十进制进行互转化——IP地址规划与设计总结
转至:https://blog.csdn.net/erlian1992/article/details/47342189 最近一直在看全国计算机三级网络技术这本书,看到第二章的时候,不免会遇到计算机中 ...
- numpy最后一部分及pandas初识
今日内容概要 numpy剩余的知识点 pandas模块 今日内容详细 二元函数 加 add 减 sub 乘 mul 除 div 平方 power 数学统计方法 sum 求和 cumsum 累计求和 m ...
- 非常详细的python和pycharm下载安装教程
目录 引言 为什么要学python 下载网址 python下载及安装 pycharm下载及安装 你人生中的第一句python 引言 Python诞生于1989年的一个圣诞节,其创作者Guido v ...
- MIPI CSI-2 像素打包格式解析
背景 MIPI CSI-2支持YUV.RGB和RAW data三种数据格式,这里是个笼统的叫法,具体又根据不同的像素打包方式细分为具体的格式,打包是什么概念?就是把Sensor采样得到的RGB三个通道 ...
- 手把手教你使用 Java 在线生成 pdf 文档
一.介绍 在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,例如网银/支付宝/微信购物支付的电子发票.订单的库存打印单.各种电子签署合同等等,以方便用户查 ...
- php 23种设计模型 - 模板方法模式
模板模式 模板模式准备一个抽象类,将部分逻辑以具体方法以及具体构造形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.先制 ...
- C++ STL vector扩容原理分析
扩容特点: 1)新增元素:vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大的内存,将原来的数据复制过来,释放之前的内存,在插入新增的元素: 2)对vector的 ...
- Python列表生成
# For More :http://www.codebelief.com/article/2017/02/python-advanced-programming-list-comprehension ...
- 面试突击32:为什么创建线程池一定要用ThreadPoolExecutor?
在 Java 语言中,并发编程都是依靠线程池完成的,而线程池的创建方式又有很多,但从大的分类来说,线程池的创建总共分为两大类:手动方式使用 ThreadPoolExecutor 创建线程池和使用 Ex ...