Frenet转Cartesian
1 明确目标
已知车辆质点在Frenet坐标系下的状态:
- Frenet 坐标系下的纵向坐标: s s s
- 纵向速度: s ˙ \dot{s} s˙
- 纵向加速度: s ¨ \ddot{s} s¨
- 横向坐标: l l l
- 横向速度: l ˙ \dot{l} l˙
- 横向加速度: l ¨ \ddot{l} l¨
- 横向坐标变化率: l ′ l' l′
- 横向坐标的二阶变化率: l ′ ′ l'' l′′
已知参考线上任意点状态(下述状态在参考线生成后都可以通过计算得到):
- 参考线上的任意点: s r s_r sr和其对应的 r r ⃗ \vec{r_r} rr
- 参考线上任意点的单位切向量: τ r ⃗ \vec{\tau_r} τr
- 参考线上任意点的单位法向量: n r ⃗ \vec{n_r} nr
- 参考线上任意点的曲率: κ r \kappa_r κr
- 参考线上任意点的曲率变化率: κ r ′ \kappa_r' κr′
求解车辆质点在Cartesian坐标系下的状态:
- 位置向量: r h ⃗ \vec{r_h} rh
- 速度向量: v h ⃗ \vec{v_h} vh
- 切线方向与 x x x轴夹角: θ h \theta_h θh
- 加速度向量: a h ⃗ \vec{a_h} ah
- 曲率: κ h \kappa_h κh
2 公式推导
2.1 基础公式汇总
为了方便查阅,现将前文《01Frenet与Cartesian坐标系(基础知识)》推导的Frenet基础公式汇总如下:
- 核心关系
r h ⃗ = r r ⃗ + l n r ⃗ (2-1) \vec{r_h} = \vec{r_r} + l\vec{n_r}\tag{2-1} rh=rr+lnr(2-1)
- Frenet最小状态集
l ˙ = l ′ s ˙ (2-2) \dot{l} = l'\dot{s}\tag{2-2} l˙=l′s˙(2-2)
l ¨ = l ′ ′ s ˙ 2 + l ′ s ¨ (2-3) \ddot{l} = l''\dot{s}^2+l'\ddot{s}\tag{2-3} l¨=l′′s˙2+l′s¨(2-3)
车辆在Cartesian下的向量导数
r h ⃗ ˙ = v h ⃗ = ∣ v h ⃗ ∣ τ h ⃗ = v h τ h ⃗ (2-4) \dot{\vec{r_h}} = \vec{v_h}= |\vec{v_h}|\vec{\tau_h}=v_h\vec{\tau_h}\tag{2-4} rh˙=vh=∣vh∣τh=vhτh(2-4)τ h ⃗ ˙ = κ h v h n h ⃗ (2-5) \dot{\vec{\tau_h}} = \kappa_hv_h\vec{n_h}\tag{2-5} τh˙=κhvhnh(2-5)
n h ⃗ ˙ = − κ h v h τ h ⃗ (2-6) \dot{\vec{n_h}} =-\kappa_hv_h\vec{\tau_h}\tag{2-6} nh˙=−κhvhτh(2-6)
v h ⃗ ˙ = a h ⃗ = a τ τ h ⃗ + κ h v h 2 n h ⃗ (2-7) \dot{\vec{v_h}} = \vec{a_h} = a_{\tau}\vec{\tau_h} +\kappa_h v_h^2 \vec{n_h}\tag{2-7} vh˙=ah=aττh+κhvh2nh(2-7)
匹配点在Cartesian下的向量导数
r r ⃗ ˙ = v r ⃗ = ∣ v r ⃗ ∣ τ r ⃗ = s ˙ τ r ⃗ (2-8) \dot{\vec{r_r}} = \vec{v_r}= |\vec{v_r}|\vec{\tau_r}=\dot{s}\vec{\tau_r}\tag{2-8} rr˙=vr=∣vr∣τr=s˙τr(2-8)τ r ⃗ ˙ = κ r s ˙ n r ⃗ (2-9) \dot{\vec{\tau_r}} = \kappa_r \dot{s} \vec{n_r}\tag{2-9} τr˙=κrs˙nr(2-9)
n r ⃗ ˙ = − κ r s ˙ τ r ⃗ (2-10) \dot{\vec{n_r}} =-\kappa_r \dot{s}\vec{\tau_r}\tag{2-10} nr˙=−κrs˙τr(2-10)
2.2 求解 r h ⃗ \vec{r_h} rh
根据(2-1)有:
r h ⃗ = r r ⃗ + l n r ⃗ (2-11) \vec{r_h} = \vec{r_r} + l\vec{n_r}\tag{2-11} rh=rr+lnr(2-11)
2.3 求解 v h ⃗ \vec{v_h} vh
v h ⃗ = r h ⃗ ˙ = r r ⃗ ˙ + l ˙ n r ⃗ + l n r ⃗ ˙ = s τ r ⃗ + l ˙ n r ⃗ − l κ r s ˙ τ r ⃗ (2-12) \begin{align} \vec{v_h} &= \dot{\vec{r_h}}\\ &= \dot{\vec{r_r}} + \dot{l}\vec{n_r} + l\dot{\vec{n_r}}\\ &= s\vec{\tau_r} + \dot{l}\vec{n_r} -l\kappa_r\dot{s}\vec{\tau_r} \end{align}\tag{2-12} vh=rh˙=rr˙+l˙nr+lnr˙=sτr+l˙nr−lκrs˙τr(2-12)
可以进一步求得
v h = ∣ v h ⃗ ∣ θ h = a r g ( v h ⃗ ) (2-13) \begin{align} v_h &= |\vec{v_h}|\\ \theta_h&=arg(\vec{v_h}) \end{align}\tag{2-13} vhθh=∣vh∣=arg(vh)(2-13)
其中,arg代表求向量的相位角。
求出了 v h ⃗ \vec{v_h} vh,可以进一步求得
τ h ⃗ = v h ⃗ v h (2-14) \vec{\tau_h} = \frac{\vec{v_h}}{v_h} \tag{2-14} τh=vhvh(2-14)
对于二维平面,
n h ⃗ = A τ h ⃗ = [ 0 − 1 1 0 ] τ h ⃗ (2-15) \begin{align} \vec{n_h} &= A\vec{\tau_h} \\ &= \left[ \begin{array}{cc} 0 & -1 \\ 1 & 0 \\ \end{array} \right]\vec{\tau_h} \end{align}\tag{2-15} nh=Aτh=[01−10]τh(2-15)
其中, A A A 是一个二维变换矩阵
Tips:如果是编码的话,(2-15)的乘法也可以直接通过调换坐标进行等价替换,可以进一步提升计算效率。例如, τ h ⃗ = ( x x 2 + y 2 , y x 2 + y 2 ) \vec{\tau_h}=(\frac{x}{\sqrt{x^2+y^2}},\frac{y}{\sqrt{x^2+y^2}}) τh=(x2+y2x,x2+y2y),则 n h ⃗ = ( − y x 2 + y 2 , x x 2 + y 2 ) \vec{n_h}=(\frac{-y}{\sqrt{x^2+y^2}},\frac{x}{\sqrt{x^2+y^2}}) nh=(x2+y2−y,x2+y2x)。
2.4 求解 a h ⃗ \vec{a_h} ah
因为已经求得了 v h ⃗ \vec{v_h} vh,所以可以进一步求得 a h ⃗ \vec{a_h} ah,一种方法就是简单粗暴的对 v h ⃗ \vec{v_h} vh求导,即 a h ⃗ = v h ⃗ ˙ \vec{a_h} = \dot{\vec{v_h}} ah=vh˙.我们这里选择另外一种更简便的方式.
根据前文Cartesian转Frenet的公式(2-19)和(2-21),有
a h ⃗ τ r ⃗ = ( 1 − κ r l ) s ¨ − ( 2 κ r l ′ + κ r ′ l ) s ˙ 2 \vec{a_h}\vec{\tau_r} = (1-\kappa_rl)\ddot{s} - (2\kappa_rl'+\kappa_r'l)\dot{s}^2 ahτr=(1−κrl)s¨−(2κrl′+κr′l)s˙2
a h ⃗ n r ⃗ = κ r s ˙ 2 ( 1 − κ r l ) + l ¨ \vec{a_h}\vec{n_r} = \kappa_r\dot{s}^2(1-\kappa_rl) + \ddot{l} ahnr=κrs˙2(1−κrl)+l¨
根据单位正交基的定义可以进一步求得
a h ⃗ = [ ( 1 − κ r l ) s ¨ − ( 2 κ r l ′ + κ r ′ l ) s ˙ 2 ] τ r ⃗ + [ κ r s ˙ 2 ( 1 − κ r l ) + l ¨ ] n r ⃗ (2-16) \begin{align} \vec{a_h} = &[(1-\kappa_rl)\ddot{s} - (2\kappa_rl'+\kappa_r'l)\dot{s}^2]\vec{\tau_r} + \\ &[\kappa_r\dot{s}^2(1-\kappa_rl) + \ddot{l}]\vec{n_r} \end{align} \tag{2-16} ah=[(1−κrl)s¨−(2κrl′+κr′l)s˙2]τr+[κrs˙2(1−κrl)+l¨]nr(2-16)
进一步可得
a τ = a h ⃗ τ h ⃗ a n = a h ⃗ n h ⃗ (2-17) \begin{align} a_\tau &= \vec{a_h}\vec{\tau_h} \\ a_n &=\vec{a_h}\vec{n_h} \end{align}\tag{2-17} aτan=ahτh=ahnh(2-17)
2.5 求解 κ h \kappa_h κh
由(2-7)可得
κ h = a n v h 2 (2-18) \kappa_h = \frac{a_n}{v_h^2} \tag{2-18} κh=vh2an(2-18)
3 总结
- 还是坚持使用向量推导的一贯作风,不引入三角函数,会使得表达式更简洁;
- 编码时使用向量实现是否比三角函数更快还需要进一步实验(理论上会更快)。