本篇博客主要记录在学习Reeds-Shepp曲线过程中的笔记及相关思考和概括总结

一、主要参考资料
     1、提出Reeds-Shepp曲线的原始论文:【点击此处跳转】
     2、路径规划 - ReedsShepp 曲线:【点击此处跳转】
     3、Reeds-Shepp和Dubins曲线简介:【点击此处跳转】
     4、自动驾驶-路径规划-ReedsShepp 曲线总结:【点击此处跳转】
     5、【自动驾驶轨迹规划之dubins曲线与reeds-shepp曲线】:【点击此处跳转】
     6、OMPL中给出的ReedsSheppStateSpace.cpp源码:【点击此处跳转】
     7、Reeds-Shepp 曲线的Matlab实现:【点击此处跳转】
     8、自动驾驶运动规划-Reeds Shepp曲线:【点击此处跳转】
     9、HJ Sussman 和 G Tang的论文:【点击此处跳转】


二、Reeds-Shepp曲线简介

   关于Dubins曲线的相关内容可查看我之前的笔记【点击此处跳转】

   Reeds-Shepp曲线由 J.AReeds 和 L.A.Sheep 于 1990 年发表的论文 optimal path for a car that goes both forward and backwards中提出,是一种基于 Dubins 算法的改进算法, 详情见主要参考资料1。
   相比于Dubins曲线只允许车辆向前运动,Reeds-Shepp曲线运动模型既允许车辆向前运动,也允许车辆向后运动。这就使得在某些情况下可以得出比 Dubins 曲线更优的解。如下图所示,其中左图为Dubins曲线,右图为Reeds-Shepp曲线

   J Reeds和L Shepp证明Reeds Shepp Car从起点到终点的最短路径一定是下面的word的其中之一。word中的"|"表示车辆运动朝向由正向转为反向或者由反向转为正向,带π/2下标表示该段轨迹的弧长/弧长对应的角度为π/2。带β下标的相邻两段轨迹的弧长/弧长对应的角度相等,加号代表前行,减号代表倒车

   展开后对应以下48种组合,尽管HJ Sussman 和 G Tang在70多页的论文中已经证明L-R+L-和R-L+R-这两种是多余的,依然还有46种组合, 详情见主要参考资料9。 相比于Dubins曲线只有6种可能的组合,Reeds-Shepp要复杂很多。

三、Reeds-Shepp曲线轨迹求解思路

  1、位姿变化

   在求解轨迹前,为方便运算,需要先对当前位姿和目标位姿进行变换,假设起始姿态为qi=(xi, yi,ψi),目标姿态为qg=(xg,yg, ψg),车辆转弯半径为r=ρ。首先将向量qiqg,平移到原点(0,0),平移量为(-x1,-y1)。则qi平移到(0,0),qg平移到(x2-x1,y2 -y1),然后再将向量qiqg旋转-ψ1度,(注意,是–ψ1度,很多参考资料里写的是ψ1度,是错误的),旋转后再将向量qiqg进行缩放,使其除以最小转弯半径ρ,这样就可以把最小转弯半径归一化为1,变换过程的公式如下所示:

  2、六种基础运动公式

   Reed-Shepp曲线允许进行倒车,因此车辆存在六种最基础的运动,即左转前进,右转前进ψ,直行前进,左转倒车,右转倒车,直行倒车,车辆从当前位姿(x,y,ψ)分别按照以上基础运动来运动弧长t(直行时代表直线距离)后对应的姿态如下所示:

   (注:计算时会将最小转弯半径归一化为1,所以弧长t也对应转过的弧度制角度)

  3、轨迹求解

   假设经过位姿变化后的起点和目标点位姿分别为(0,0,0)和(x,y,ψ),假设要求解从起点到目标点的L+S+L+轨迹,则只需要将起点(0,0,0)代入到上面六种基础运动中的L+公式中,将结果再代入S+公式中,再将结果代入L+公式中,得到的结果与已知的目标点位姿(x,y,ψ)等价,因此可以得到3个等式,未知数便是基础运动公式中的t,代入了3次,即t1、t2、t3,或者可以用t、u、v来表示,如下面的公式所示:

   同理,我们可以对其他的轨迹进行分析求解,上面举例的L+S+L+轨迹是较容易的一种,在求解其他轨迹时可能需要用到一些复杂的求解方法,我尚未找到完整的9种轨迹求解过程(为什么是9种,而不是48或46种将在下文中介绍), 主要参考资料2 中也仅仅给出了2种。(L+S+L+和L+S+R+)

  4、类型变换

   事实上,我们并不需要将48或者46种轨迹的求解公式都求出来,我们可以通过以下几种变换,以转换的形式以某种轨迹的求解公式来求其他轨迹的解,常见的变换有以下3种及其组合。

  (1)时间变换 (timeflip)

   时间变换通过交换轨迹字母上标符号+和- ,即车取反向的行进方向。举个例子, 从起点(0,0, 0)到目标点(x,y,ψ)的L-S-L-轨迹 可以通过从起点(0, 0,0)到点(-x,y,-ψ)的L+S+L+轨迹求得,因为两者关于x轴对称,如果感觉以上描述有些抽象,可以看一下 主要参考资料4 中给出的示意图。
   再通俗一点讲,当我们需要求解 从起点(0,0, 0)到目标点(x,y,ψ)的L-S-L-轨迹 的时候,我们可以选择求解从起点(0, 0,0)到点(-x,y,-ψ)的L+S+L+轨迹,由于两个轨迹关于x轴对称,将得到的L+S+L+轨迹关于x轴对称变化后,即可得到我们真正想要求的轨迹,通过以上的转换,我们不再需要求解L-S-L-轨迹的求解公式,就可以得到L-S-L-轨迹。

  (2)反射变换 (reflect)

   反射变换通过交换轨迹字母中的R和L ,即将R变成L,将L变成R,举个例子, 从起点(0,0, 0)到目标点(x,y,ψ)的R+S+R+轨迹 可以通过从起点(0, 0,0)到点(x,-y,-ψ)的L+S+L+轨迹求得,因为两者关于y轴对称。

  (3)逆向变换 (backwards)

  5、类型变换的应用

   通过反射变换,我们可以去掉表中所有R开头的轨迹(当然去掉L开头的轨迹也是可以的,为了与 主要参考资料6中给出的参考代码对应,我们以去掉R为例),直接去掉了24个,再通过时间变换,可以去掉剩下24个中L-开头的12种轨迹,只剩下了12种以L+开头的轨迹,如下图所示:

   就拿c|c|c轨迹举例,去掉36种轨迹后,只剩下L+R-L+轨迹,利用时间变换可求被去掉的L-R+L-轨迹,通过反射变换可求被去掉的R+L-R+轨迹,通过时间+反射变换,可求被去掉的R-L+R-轨迹。
   在剩下的12种轨迹中,通过时间变换+逆向变换,可以再次去掉轨迹L+R+L-和轨迹L+R-L-中的一种,这里以去掉L+R+L-为例,通过时间变换+反射变换+逆向变换,可以再次去掉轨迹8和9或去掉10和11,这里以去掉10和11为例,也就是说整个CSCC轨迹均被去掉了,这也解释了很多人疑问的程序中为什么没有CSCC轨迹代码,其实这并不是程序缺失,而是不需要有。现在就只剩下下图所示的9种轨迹了

   也就是说,所有的48种轨迹均可以通过以上9种轨迹的求解公式,直接或间接的求解出来。

四、Reeds-Shepp曲线解是否一定存在

   Reeds-Shepp曲线和Dubins曲线都是指没有障碍物时的最短路径。 主要参考资料3 中提到当存在障碍物时,只要存在连接起止位姿的无碰撞路径,那么就存在无碰撞的Reeds-Shepp曲线。然而这个结果对Dubins曲线却不适用。

Reeds-Shepp曲线学习笔记及相关思考相关推荐

  1. Dubins曲线学习笔记及相关思考

       本篇博客主要记录在学习Dubins曲线过程中的笔记及相关思考和概括总结 一.主要参考资料      1.Andy G's Blog:[点击此处跳转]      2.Andy G's Blog的P ...

  2. 好记性不如烂笔头-linux学习笔记4apache相关知识

    好记性不如烂笔头-linux学习笔记4apache相关知识 apache 启动有2种模式 1是prefork模式,每个进程对应一个线程,如果是比较稳定的平台,那么prefork模式是worker模式 ...

  3. Reeds Shepp曲线

    Reeds_Shepp 曲线Reeds, J. A.; Shepp, L. 在1990发布的A. Optimal paths for a car that goes both forwards and ...

  4. STM32F103学习笔记-AFIO相关

    一.背景   在写外部中断及其配置的笔记时候,发现无论是开发攻略还是官方手册里都提到了这么一句话:   虽然在学习GPIO的时候,看到了AFIO表示的是复用功能IO的意思,但对于它的理解完全是字面上的 ...

  5. Html入门学习笔记05—相关补充和映射、数字移动

    很久很久以前学习html的笔记记录,很随意,但都是自己记录的,希望对需要的人有所帮助. 本文使用word2013编辑并发布 Postbird | There I am , in the world m ...

  6. 北大肖臻老师《区块链技术与应用》系列课程学习笔记[10]BTC思考

    1.BTC在设计的过程中很多地方用到了哈希指针,如块头就包含指向前一个区块的哈希指针,指针保存的是本地内存的地址,只在这台计算机上才有意义,发送到其他计算机上就没有意义了,那么在发布区块的时候哈希指针 ...

  7. jQuery学习笔记--JqGrid相关操作 方法列表 备忘 重点讲解(超重要)

    JqGrid相关操作备忘 方法列表 特别推荐:怎样获取某一方某一列的值: [html] view plaincopy var rowdata=jQuery("#list").jqG ...

  8. PPT学习笔记,相关好用软件吐血推荐

    这是我的人生第一篇博客,喜欢的点个关注,给个小红心,谢谢大家! 优秀的设计网站:站酷,花瓣,pixabay(免费),bing(像素高),千图(logo最大的),iconfont(图标) 商务场合:黑体 ...

  9. Python学习笔记-字符串相关

    字符串有 下标(索引) ,从0开始,到n-1结束 len() 获取字符串长度 s = 'Hello' len(s) 利用索引获取字符串中某一位 正数索引 从0开始,从左向右数 负数索引 从-1开始,从 ...

最新文章

  1. 青龙羊毛——鸡厂签到
  2. 如何使用免安装的mysql-孤单的小孩儿-搜狐博客
  3. 机器学习——人工神经网络之参数设置(BP算法)
  4. javax.validation.ValidationException: Unable to find a default provider
  5. log4j日志输出性能优化
  6. android gridview 滚动条位置,android-gridview单元格视图位置在滚动后发生...
  7. 常见的INI(PHP)配置
  8. java的ascii码表_ASCII码表对照
  9. 抖音小店都有哪些类目
  10. vc2005编译出来的程序实现绿色版,即无须安装运行库
  11. Copy-on-Write模式:写时复制
  12. 国稻种芯百团计划行动 丰收节贸促会·黎志康:惠及亚非18国家
  13. 使用Qemu模拟arm开发板
  14. python函数输入参数数量_如何实现Python函数的参数不限个数?
  15. 欧几里德算法 扩展欧几里德算法 求解丢番图方程
  16. Hive技巧-选出某些列其余所有的列
  17. 计算机网络实训报告:宿舍校园网网络设计
  18. POST和Get辨析
  19. 二进制转十进制速记方法
  20. JAVA从入门到精通书中ZIP压缩和解压缩错误修正

热门文章

  1. 我的新浪微博之旅(一)
  2. 光环国际——如何将PRINCE2植入到组织当中?
  3. 英特尔微型计算机第一启动项,英特尔九代酷睿:强悍的笔记本电脑平台
  4. 在C#中保存Bouncy Castle生成的密钥对
  5. 二次递交IPO的嘀嗒出行,离圆上市梦近了吗?
  6. CSS 3.0实现加载动画
  7. 计算机专业培训实施方案,学校信息化培训实施方案
  8. 关于贝加莱Modbus通讯的总结
  9. mkfs.ubifs/hashtable/hashtable_itr.c:42:1: error: redefinition of ‘hashtable_iterator_key’
  10. Oracle在Windows系统中出现的ORA-27100: shared memory realm already exists 的奇怪现象