自动驾驶运动规划-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. LeetCode-046-全排列

    全排列 题目描述:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 .你可以 按任意顺序 返回答案. 示例说明请见LeetCode官网. 来源:力扣(LeetCode) 链接:http ...

  2. (数据科学学习手札134)pyjanitor:为pandas补充更多功能

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 pandas发展了如此多年,所包含的功能已 ...

  3. Laravel自定义错误提示,自定义异常类提示,自定义错误返回信息,自定义错误页面

    方法一 新增CustomException.php文件 App\Exceptions\CustomException.php <?php namespace App\Exceptions; us ...

  4. C/C++语言读取SEGY文件(二)

    SEGY IO (2D) 本文档将介绍SEGY的读取与写入过程,即SEGY文件的复制,并且在实现过程采用采样点×道数二维数组的形式读写. 新建头文件SegyDataIO2D.h与C++文件SegyDa ...

  5. JavaSE 千寻简学习笔记

    JavaSE 千寻简学习笔记 简介 TIOBE:编程语言排行榜 官网:https://hellogithub.com/report/tiobe/ 如何高效的学习Java 多写(代码)多写(笔记)多写( ...

  6. ArcGIS温泉数据聚类分析、核密度分析

    这期博主给大家介绍下ArcGIS中的Riple's K 函数.与Kernel核密度分析. 首先从百度获取了湖南省的温泉数据.如图: 湖南省温泉数据 1.数据处理 (1)复制粘贴x.y坐标. (2)用快 ...

  7. QQ密码防盗5招

    第一招:复制粘贴防木马 每次登录QQ前,新建一个文本文件,并键入密码后复制,关闭文本文件后(不要保存)打开QQ,用"Ctrl+V"把密码粘贴到密码栏里,这样可以防范绝大部分的QQ木 ...

  8. 配置阿里云RepoForge 镜像

    镜像下载.域名解析.时间同步请点击阿里云开源镜像站 一.RepoForge 镜像介绍 Repoforge 是 RHEL 系统下的软件仓库,拥有 10000 多个软件包,被认为是最安全.最稳定的一个软件 ...

  9. 【Calculate】Calculate Linux安装操作记录

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 一.Calculate简介 Calculate Linux 是一个基于 Gentoo的发行版本. Calculate 目录服务器 (CDS) 是一 ...

  10. windows服务器怎么将证书添加到受信任证书颁发机构

    1.键盘输入win+r 快键键,出现运行,输入mmc. 2.打开控制台根节点,点击上方导航栏的文件-->添加删除管理单元.如下图. 3.在可用的管理单元中选择"证书",计算机 ...