目录
前言
一、Dubins
二、车辆简单模型
三、Dubins曲线计算
1.坐标变换
2.LSL
3.LRL
4.RSR
5.LSR
6.RSL
7.RLR
8.计算每一段终点
左转
右转
直行
四、C++与ROS实现
五、参考文献
前言
本博客讲述Dubins曲线推导过程与实现。参考了一些博主的成果,仅供自己学习记录使用。
一、Dubins
? ? ? ? Dubins曲线要求车辆仅可以前进,规划出的曲线由三段直线或圆弧组成,能够满足车辆的最小转弯半径、起点航向角、终点航向角和车辆动力学约束,但规划出的曲线在两段交点处曲率不连续。如果车辆也可以在反向行驶,则路径为Reeds–Shepp曲线。

??????? Dubins曲线通常用于机器人和控制理论领域,作为规划轮式机器人、飞机和水下车辆路径的一种方式。前人已经证明连接两点的最短路径可以通过最大曲率的圆弧和直线段的构成,并且必然存在,最佳路径类型可以用与右转(R),左转(L)或直线行驶(S)三种汽车行为来描述,分为六大类,RSR,RSL,LSR,LSL,RLR,LRL。

二、车辆简单模型
??????? 如下图所示,车辆简单模型是一个表达车辆运动的简易模型。该模型将车辆看做平面上的刚体运动,刚体的原点位于车辆后轮的中心;x轴沿着车辆主轴方向,与车辆运动方向相同;车辆在任意一个时刻的姿态可以表述为(x, y, )。车辆的运动速度为s;方向盘的转角为 ,它与前轮的转角相同;前轮和后轮中心的距离为L;如果方向角的转角固定,车辆会在原地转圈,转圈的半径为 。

?在一个很短的时间 内,可以认为车辆沿着后轮指向的方向前进,


即,运动车辆需满足如下条件


三、Dubins曲线计算
1.坐标变换
????????设起点为 ,终点为 ,通过坐标变换将起点和终点放置于x轴,则起点终点连线逆时针旋转 角,此时起点坐标为 ,终点坐标为 ,则





???????? 为起点和终点的航向差,以上角度的取值均在 之间。上述第三式是为了将半径归一化,在后续的计算中将转弯半径都作为1,便于从角度计算弧长,简化计算。
2.LSL

????????根据几何关系(公式来源论文:Classi?cation of the Dubins set),即d与p在x轴和y轴上的关系,以及车辆偏航角变化与 角的关系:


![\alpha+t+q=\beta[mod2\pi]](https://latex.codecogs.com/gif.latex?%5Calpha+t+q%3D%5Cbeta%5Bmod2%5Cpi%5D)
?角度运算关系:






几何关系:


另外车辆从s走过s+t+p角度,到g点角度为 ,即
![\alpha+t+q=\beta[mod2\pi]](https://latex.codecogs.com/gif.latex?%5Calpha+t+q%3D%5Cbeta%5Bmod2%5Cpi%5D)
解方程得
![t_{lsl}=-\alpha+\arctan(\frac{\cos\beta-\cos\alpha}{d+\sin\alpha-\sin\beta})[mod2\pi]](https://latex.codecogs.com/gif.latex?t_%7Blsl%7D%3D-%5Calpha+%5Carctan%28%5Cfrac%7B%5Ccos%5Cbeta-%5Ccos%5Calpha%7D%7Bd+%5Csin%5Calpha-%5Csin%5Cbeta%7D%29%5Bmod2%5Cpi%5D)

![q_{lsl}=\beta-\arctan{\frac{\cos\beta-\cos\alpha}{d+\sin\alpha-\sin\beta}}[mod2\pi]](https://latex.codecogs.com/gif.latex?q_%7Blsl%7D%3D%5Cbeta-%5Carctan%7B%5Cfrac%7B%5Ccos%5Cbeta-%5Ccos%5Calpha%7D%7Bd+%5Csin%5Calpha-%5Csin%5Cbeta%7D%7D%5Bmod2%5Cpi%5D)
总长度等于:


????????若 ,上式依然成立。
3.LRL
????????对于LRL和RLR的情况,一定是 的情况下才会出现,即使 的情况,前面的LSL 等4种情况中的某种情况也会比这两个情况要更优,因此,LRL 情况时构成的三个圆,都是等半径的,也即等于 1。

跟前面 LSL 的方法一样,在x和y向构建方程组:


![\alpha+t-p+q=\beta[mod2\pi]](https://latex.codecogs.com/gif.latex?%5Calpha+t-p+q%3D%5Cbeta%5Bmod2%5Cpi%5D)
角度运算关系:







正余弦关系:






几何关系:


解方程:
![t_{lrl}=(-\alpha+\arctan(\frac{\cos\beta-\cos\alpha}{d+\sin\alpha-\sin\beta})+\frac{p_{lrl}}{2})[mod2\pi]](https://latex.codecogs.com/gif.latex?t_%7Blrl%7D%3D%28-%5Calpha+%5Carctan%28%5Cfrac%7B%5Ccos%5Cbeta-%5Ccos%5Calpha%7D%7Bd+%5Csin%5Calpha-%5Csin%5Cbeta%7D%29+%5Cfrac%7Bp_%7Blrl%7D%7D%7B2%7D%29%5Bmod2%5Cpi%5D)
![p_{lrl}=\arccos\frac{1}{8}(6-d^2+2\cos(\alpha-\beta)+2d(\sin\alpha-\sin\beta))[mod 2\pi]](https://latex.codecogs.com/gif.latex?p_%7Blrl%7D%3D%5Carccos%5Cfrac%7B1%7D%7B8%7D%286-d%5E2+2%5Ccos%28%5Calpha-%5Cbeta%29+2d%28%5Csin%5Calpha-%5Csin%5Cbeta%29%29%5Bmod%202%5Cpi%5D)
![q_{lrl}=\beta[mod 2\pi]-\alpha+2p_{lrl}[mod 2\pi]](https://latex.codecogs.com/gif.latex?q_%7Blrl%7D%3D%5Cbeta%5Bmod%202%5Cpi%5D-%5Calpha+2p_%7Blrl%7D%5Bmod%202%5Cpi%5D)
总长度:

4.RSR


![\alpha-t-q=\beta[mod 2\pi]](https://latex.codecogs.com/gif.latex?%5Calpha-t-q%3D%5Cbeta%5Bmod%202%5Cpi%5D)
求解
![t_{rsr}=\alpha-\arctan\frac{\cos\alpha-\cos\beta}{d-\sin\alpha+\sin\beta}[mod 2\pi]](https://latex.codecogs.com/gif.latex?t_%7Brsr%7D%3D%5Calpha-%5Carctan%5Cfrac%7B%5Ccos%5Calpha-%5Ccos%5Cbeta%7D%7Bd-%5Csin%5Calpha+%5Csin%5Cbeta%7D%5Bmod%202%5Cpi%5D)

![q_{rsr}=-\beta[mod 2\pi]+\arctan(\frac{\cos\alpha-\cos\beta}{d-\sin\alpha+\sin\beta})[mod 2\pi]](https://latex.codecogs.com/gif.latex?q_%7Brsr%7D%3D-%5Cbeta%5Bmod%202%5Cpi%5D+%5Carctan%28%5Cfrac%7B%5Ccos%5Calpha-%5Ccos%5Cbeta%7D%7Bd-%5Csin%5Calpha+%5Csin%5Cbeta%7D%29%5Bmod%202%5Cpi%5D)

5.LSR


![\alpha+t-q=\beta[mod 2\pi]](https://latex.codecogs.com/gif.latex?%5Calpha+t-q%3D%5Cbeta%5Bmod%202%5Cpi%5D)
求解
![t_{lsr}=(-\alpha+\arctan(\frac{-\cos\alpha-\cos\beta}{d+\sin\alpha+\sin\beta})-\arctan(\frac{-2}{p_{lsr}}))[mod 2\pi]](https://latex.codecogs.com/gif.latex?t_%7Blsr%7D%3D%28-%5Calpha+%5Carctan%28%5Cfrac%7B-%5Ccos%5Calpha-%5Ccos%5Cbeta%7D%7Bd+%5Csin%5Calpha+%5Csin%5Cbeta%7D%29-%5Carctan%28%5Cfrac%7B-2%7D%7Bp_%7Blsr%7D%7D%29%29%5Bmod%202%5Cpi%5D)

![q_{lsr}=-\beta[mod 2\pi]+\arctan(\frac{-\cos\alpha-\cos\beta}{d+\sin\alpha+\sin\beta})-\arctan(\frac{-2}{p_{lsr}})[mod 2\pi]](https://latex.codecogs.com/gif.latex?q_%7Blsr%7D%3D-%5Cbeta%5Bmod%202%5Cpi%5D+%5Carctan%28%5Cfrac%7B-%5Ccos%5Calpha-%5Ccos%5Cbeta%7D%7Bd+%5Csin%5Calpha+%5Csin%5Cbeta%7D%29-%5Carctan%28%5Cfrac%7B-2%7D%7Bp_%7Blsr%7D%7D%29%5Bmod%202%5Cpi%5D)

6.RSL


![\alpha-t+q=\beta[mod 2\pi]](https://latex.codecogs.com/gif.latex?%5Calpha-t+q%3D%5Cbeta%5Bmod%202%5Cpi%5D)
求解
![t_{rsl}=\alpha-\arctan(\frac{\cos\alpha+\cos\beta}{d-\sin\alpha-\sin\beta})+\arctan(\frac{2}{p_{rsl}})[mod 2\pi]](https://latex.codecogs.com/gif.latex?t_%7Brsl%7D%3D%5Calpha-%5Carctan%28%5Cfrac%7B%5Ccos%5Calpha+%5Ccos%5Cbeta%7D%7Bd-%5Csin%5Calpha-%5Csin%5Cbeta%7D%29+%5Carctan%28%5Cfrac%7B2%7D%7Bp_%7Brsl%7D%7D%29%5Bmod%202%5Cpi%5D)

![q_{rsl}=\beta[mod 2\pi]-\arctan(\frac{\cos\alpha+\cos\beta}{d-\sin\alpha-\sin\beta})+\arctan(\frac{2}{p_{rsl}})[mod2\pi]](https://latex.codecogs.com/gif.latex?q_%7Brsl%7D%3D%5Cbeta%5Bmod%202%5Cpi%5D-%5Carctan%28%5Cfrac%7B%5Ccos%5Calpha+%5Ccos%5Cbeta%7D%7Bd-%5Csin%5Calpha-%5Csin%5Cbeta%7D%29+%5Carctan%28%5Cfrac%7B2%7D%7Bp_%7Brsl%7D%7D%29%5Bmod2%5Cpi%5D)

7.RLR


![\alpha-t+p-q=\beta[mod2\pi]](https://latex.codecogs.com/gif.latex?%5Calpha-t+p-q%3D%5Cbeta%5Bmod2%5Cpi%5D)
求解
![t_{rlr}=\alpha-\arctan(\frac{\cos\alpha-\cos\beta}{d-\sin\alpha+\sin\beta})+\frac{p_{rlr}}{2}[mod2\pi]](https://latex.codecogs.com/gif.latex?t_%7Brlr%7D%3D%5Calpha-%5Carctan%28%5Cfrac%7B%5Ccos%5Calpha-%5Ccos%5Cbeta%7D%7Bd-%5Csin%5Calpha+%5Csin%5Cbeta%7D%29+%5Cfrac%7Bp_%7Brlr%7D%7D%7B2%7D%5Bmod2%5Cpi%5D)

![q_{rlr}=\alpha-\beta-t_{rlr}+p_{rlr}[mod2\pi]](https://latex.codecogs.com/gif.latex?q_%7Brlr%7D%3D%5Calpha-%5Cbeta-t_%7Brlr%7D+p_%7Brlr%7D%5Bmod2%5Cpi%5D)

8.计算每一段终点
左转
以 为起点,左转 的终点计算





右转
以 为起点,右转 的终点计算

?



直行
?以 为起点,直行p的终点计算




????????每一段间的点,通过和计算终点的方式去计算,例如左转圆弧上的点,则可以左转 角去获得下一个,点的疏密可以通过 的大小去控制,越小则越密,起到每一步的 角的总和大于等于 ,则这一段圆弧完成了点的生成。
?????????至此,Dubins 曲线计算完毕。
四、C++与ROS实现
#include "r_s_planner/dubins.h"
//设置起点、终点坐标和航向角
double start_state[3] = {0, 0, M_PI/4};
double final_state[3] = {3, 4, 0};
//生成Dubins曲线
double steer_radius = 5.8;
DubinsStateSpace db_planner(steer_radius);
std::vector<std::vector<double> > db_path;
db_planner.sample(start_state, final_state, step_size, length, db_path);
//可以使用nav_msgs::Path等ROS消息在RVIZ可视化
//...
????????源代码在($ car_geometric_planner)/src/dubins.cpp,作者已经较好封装,可以在ROS中使用,详见参考文献3。
五、参考文献
1.自动驾驶运动规划-Dubins曲线 - 半杯茶的小酒杯的文章 - 知乎 https://zhuanlan.zhihu.com/p/120272035
2.Dubins曲线详细笔记 - 烟酒僧的文章 - 知乎 https://zhuanlan.zhihu.com/p/414753861
3.GitHub - zwkcoding/car_geometric_planner: Use Reeds-Shepp and Dubin curves for path generation for car modelUse Reeds-Shepp and Dubin curves for path generation for car model - GitHub - zwkcoding/car_geometric_planner: Use Reeds-Shepp and Dubin curves for path generation for car model https://github.com/zwkcoding/car_geometric_planner
|