1 简介
Frenet坐标系是一种在几何学和物理学中常用的坐标系,特别是在轨迹规划和机器人控制中。它由法国数学家Jean Frenet于1847年为了解决在求解某些几何问题时遇到的环形坐标系的问题而提出的。它依据曲线的切线和法线来定义坐标轴,主要用于局部地描述曲线或曲面的几何特性。在自动驾驶技术领域,这种坐标系统提供了一种相对于传统的Cartesian坐标系统更为直观的方式来表示车辆在道路上的位置。
1.1 概念介绍和理解
如图1所示,它采用道路中心线作为基准线,并基于该基准线的切线向量 τ ⃗ \vec{\tau} τ 与法线向量 n ⃗ \vec{n} n 构建坐标框架,坐标轴互相垂直,分别定义为 s s s 方向(沿基准线方向,也称为纵向)和 l l l 方向(当前基准线的法向,也称为横向)。其中, s s s 值表示车辆沿道路的行进距离,即纵向位置,而 l l l 值则表示车辆在道路上的水平位置,即横向位置。
Tips:光看定义没什么感觉。我们来理解一下从Cardesian转到Frenet到底做了一件什么事情。
其实,只做了一件事——把Cartesian空间中的曲线“拉直”。首先,我们要理解Cardesian中为什么会有曲线:如图所示,曲线上的点的位姿 ( x , y , θ ) (x, y, \theta) (x,y,θ)都是相对于 ( x 轴 , O 原点 , y 轴 ) (x_轴,O_{原点},y_轴) (x轴,O原点,y轴)来进行讨论的,当坐标轴不变,位姿变化时,就形成了一条曲线。如果我们深入理解了"运动是相对的"和“参考系”的概念,那自然可以想到沿着我们曲线切线和法线方向建立参考系,不就可以“化曲为直”了。代价是,我们的参考系一直在变(好比是坐标轴在沿着曲线滑动),用代码实现时需要耗费一些计算量。
如果大家了解过电机的定子和转子就更容易理解Cartesian和Frenet的关系了——Cartesian就好比是内转子电机;Frenet就好比是外转子电机。
1.2 符号表示
Cartesian坐标系表示为: [ r ⃗ , v ⃗ , a ⃗ , θ , κ ] [ \vec{r}, \vec{v}, \vec{a}, \theta, \kappa ] [r,v,a,θ,κ]。其中,各个变量的含义如下:
-
r ⃗ \vec{r} r:在笛卡尔坐标系统中的位置向量(位失);
-
v ⃗ \vec{v} v:在笛卡尔坐标系统中的线速度向量,可以分解为 v x , v y v_x,v_y vx,vy两个标量(大家可以理解一下什么是标量——标量就是在单个坐标轴方向上投影后的那个系数;有人可能有疑问,那向量的模也是标量呢?这可以理解为投影到实数轴上的系数);模为 v v v,方向为切线方向 τ \tau τ;
-
w ⃗ \vec{w} w:在笛卡尔坐标系中的角速度向量,模为 w w w,方向为垂直旋转平面向上或向下,计算方法为圆心与切点连线向量与切线方向叉乘的结果方向(可以用右手法则,圆心在切线左侧为上,右侧为下)。 w ⃗ \vec{w} w和 v ⃗ \vec{v} v的关系如下:
v ⃗ = w ⃗ × R ⃗ \vec{v} = \vec{w} \times \vec{R} v=w×R
其中, R ⃗ \vec{R} R 为半径矢量,大小为半径长度,方向为圆心指向切点。。 -
a ⃗ \vec{a} a:在笛卡尔坐标系中的加速度向量,可以被分解为切线方向的加速度 a τ ⃗ \vec{a_{\tau}} aτ和法线方向的加速度 a n ⃗ \vec{a_n} an;
-
θ \theta θ:在笛卡尔坐标系统中,切线与X轴正方向之间的夹角,一般用来表示汽车的朝向角heading;
-
κ = d θ d s \kappa = \frac{d\theta}{ds} κ=dsdθ:道路的曲率,注意需要和角速度( w = d θ d t w=\frac{d\theta}{dt} w=dtdθ)进行区分,前者与时间无关是一个静态量,后者是一个动态量(规控中引入 κ \kappa κ主要是用来对 w w w进行约束,不至于翻车,约束的关系参见车辆运动学和动力学分析)。
Frenet坐标系表示为: [ s , s ˙ , s ¨ , l , l ˙ , l ¨ , l ′ , l ′ ′ ] [s, \dot{s}, \ddot{s}, l, \dot{l}, \ddot{l}, l', l'' ] [s,s˙,s¨,l,l˙,l¨,l′,l′′]。其中,各个变量的含义如下(注意s和l都是标量):
- s s s:Frenet坐标系中的纵向坐标;
- s ˙ = d s d t \dot{s} = \frac{ds}{dt} s˙=dtds:纵向坐标随时间变化的速率,即纵向速度;
- s ¨ = d s ˙ d t \ddot{s} = \frac{d\dot{s}}{dt} s¨=dtds˙:纵向速度的变化率,即纵向加速度;
- l l l:Frenet坐标系中的横向坐标,大小为横向偏离中心线的距离,方向为法线方向或负法线方向,取决于参考线匹配点到车辆质点连线向量与参考线匹配点切线向量的叉乘结果,结果为正则为法线方向,为负则为负法线方向(由于法线方向定义为切线方向逆时针旋转90度,因此有“左正右负”的口诀);
- l ˙ = d l d t \dot{l} = \frac{dl}{dt} l˙=dtdl:横向坐标随时间变化的速率,即横向速度;
- l ¨ = d l ˙ d t \ddot{l} = \frac{d\dot{l}}{dt} l¨=dtdl˙:横向速度的变化率,即横向加速度;
- l ′ = d l d s l' = \frac{dl}{ds} l′=dsdl:横向坐标相对于纵向坐标的变化率;
- l ′ ′ = d l ′ d s l'' = \frac{dl'}{ds} l′′=dsdl′:横向坐标相对于纵向坐标的二阶变化率。
两者的区别如下:
- Cartesian中基向量对t不变化( d i d t = 0 \frac{di}{dt}=0 dtdi=0),对x也不变化( d i d x = 0 \frac{di}{dx}=0 dxdi=0);但是Frenet会变化( d τ d t ≠ 0 \frac{d\tau}{dt} \neq 0 dtdτ=0, d τ d s ≠ 0 \frac{d\tau}{ds}\neq 0 dsdτ=0);
- Cartesian中 d x dx dx能够描述车辆沿x轴方向实际行进的距离;但是在Frenet中, d s ds ds不能描述车辆实际行进的路程,实际行进的路程只能在Cardesian中计算,表示为 d s r ds_r dsr(h为vehicle的缩写), d s ≠ d s h ds \neq ds_h ds=dsh。
1.3 优缺点和适用范围
1.3.1 优点
使用Frenet有以下几个优势:
- 化曲为直;
- 实现了横纵向解耦。
上述优势带来的好处是将非线性规划问题转换为线性规划问题,不论是施加约束还是随机采样,都变得十分方便。
1.3.2 缺点和注意事项
存在的缺点是:
- 使用的是质点模型,忽视了车辆形变;对于大型车辆使用的时要十分小心,需要评估形变并添加额外约束。
- 非常依赖参考线的质量,参考线必须处处可导,否则不能保证轨迹连续;参考线的拼接处一定要做好。
- Cartesian与Frenet坐标系在 l l l 大小接近 1 κ r \frac{1}{\kappa_r} κr1时转换变得不稳定(后面会详细说明);大曲率的车道不要使用Frenet。
- 不能描述车辆运动学特性;涉及车辆运动学时不要使用Frenet。
- 多车协同规划支持不太好;多车协同规划不要用Frenet。
2 Frenet基础公式推导
2.1 问题定义
Tips:有一个重要的点想明白,才能跳出单纯推导公式的怪圈。
这个重要的点就是——坐标变换这件事到底涉及了几方?答案是三方(和毕业签三方似的~),而不是两方。
有人可能会有疑问,明明是两方,怎么会是三方?
我们拿《车体坐标系和全局坐标系转换》举例,涉及到传感器的全局坐标、车辆的全局坐标和传感器相对于车辆的车体坐标——这三者(毕业生是传感器,学校是车辆,社会雇佣单位是大地;毕业生从学校中出来到社会中去,从学生身份转变为员工的身份,就好比是相对于学校的局部坐标转相对于社会的全局坐标,桥梁是学校,因为学校有它自身相对于社会的地位)。
理解这一点很重要。推公式推不明白,符号混用往往都是因为没有很清楚的阐明或者理解这一点。Cardesian和Frenet之间的坐标变换同样需要“签三方”,少一个都不行。所以,我们要先明确这三方都是谁,不然就会出现“哭了半天不知道谁死了”的尴尬。从大范围到小范围分析,其中一方是大地,第二方是车道中心线(参考线),第三方是车辆。
从Cartesian坐标转Frenet坐标是在做一件什么事情呢?就是已知车辆相对于大地的全局Cartesian坐标;也已知车道中心线(严格来说是车辆在参考线上的投影)相对于大地的全局Cardesian坐标;求车辆相对于车道中心线(严格来讲纵向是参考中心线的某个固定起点,横向是参考车辆当前时刻在车道中心线上的投影点)的Frenet坐标。
如果是求相对于参考线(严格来讲是参考线的某个固定起点)的Cartesian,那这个问题就退变成了《全局坐标系和局部坐标系的转换》,使用向量的旋转和平移就可以完成。
当就目前的目标来看,需要借助曲线坐标系,即Frenet坐标系相关的知识来完成。
2.2 基础公式
我们最终的目的是完成Cartesian和Frenet之间的转换:已知车辆后轴中心点在Cartesian下的状态 [ r h ⃗ , v h ⃗ , a h ⃗ , θ h , κ h ] [ \vec{r_h}, \vec{v_h}, \vec{a_h}, \theta_h, \kappa_h ] [rh,vh,ah,θh,κh],求解车辆相对于车道中心线(参考线)的Frenet下的状态 [ s , s ˙ , s ¨ , l , l ˙ , l ¨ , l ′ , l ′ ′ ] [s, \dot{s}, \ddot{s}, l, \dot{l}, \ddot{l}, l', l'' ] [s,s˙,s¨,l,l˙,l¨,l′,l′′]。
如下图2表示,下标带h(vehicle的缩写)的为车辆状态(vehicle state),下标带r(reference的缩写)的为车辆在参考线上的匹配点的状态。
2.2.1 核心关系
车辆后轴中心在Cartesian下的状态和匹配点(车辆后轴中心在参考线上的投影点)在Cardesian下的状态之间的关系可以用如图中的向量三角形表示,具体关系如下:
r
h
⃗
=
r
r
⃗
+
l
n
r
⃗
(1)
\vec{r_h} = \vec{r_r} + l\vec{n_r}\tag1
rh=rr+lnr(1)
后续所有的转换公式都是以此为桥梁建立的,称之为核心公式一点都不为过。
2.2.2 Frenet最小状态集
Frenet的最小状态集可以为
[
s
,
s
˙
,
s
¨
,
l
,
l
˙
,
l
¨
]
[s, \dot{s}, \ddot{s}, l, \dot{l}, \ddot{l} ]
[s,s˙,s¨,l,l˙,l¨],因为:
l
′
=
d
l
d
s
=
d
l
d
t
d
s
d
t
=
l
˙
s
˙
(2)
l' = \frac{dl}{ds} = \frac{\frac{dl}{dt}}{\frac{ds}{dt}} = \frac{\dot{l}}{\dot{s}}\tag2
l′=dsdl=dtdsdtdl=s˙l˙(2)
l
′
′
=
d
l
′
d
s
=
d
(
l
˙
/
s
˙
)
d
t
s
˙
=
l
¨
s
˙
2
−
l
˙
s
¨
s
˙
3
=
l
¨
−
l
′
s
¨
s
˙
2
(3)
l'' = \frac{dl'}{ds} = \frac{\frac{d(\dot{l}/\dot{s})}{dt}}{\dot{s}}=\frac{\ddot{l}}{\dot{s}^2} - \frac{\dot{l}\ddot{s}}{\dot{s}^3} = \frac{\ddot{l} - l'\ddot{s}}{\dot{s}^2}\tag3
l′′=dsdl′=s˙dtd(l˙/s˙)=s˙2l¨−s˙3l˙s¨=s˙2l¨−l′s¨(3)
也可以为
[
s
,
s
˙
,
s
¨
,
l
,
l
′
,
l
′
′
]
[s, \dot{s}, \ddot{s}, l, l', l'' ]
[s,s˙,s¨,l,l′,l′′],因为:
l
˙
=
d
l
d
t
=
d
l
d
s
d
s
d
t
=
l
′
s
˙
(2)
\dot{l} = \frac{dl}{dt}=\frac{dl}{ds}\frac{ds}{dt}= l'\dot{s}\tag2
l˙=dtdl=dsdldtds=l′s˙(2)
l ¨ = d l ˙ d t = d ( l ′ s ˙ ) d t = d l ′ d t s ˙ + l ′ s ¨ = d l ′ d s d s d t s ˙ + l ′ s ¨ = l ′ ′ s ˙ 2 + l ′ s ¨ (3) \ddot{l} = \frac{d\dot{l}}{dt} = \frac{d(l'\dot{s})}{dt}=\frac{dl'}{dt}\dot{s}+l'\ddot{s}=\frac{dl'}{ds}\frac{ds}{dt}\dot{s}+l'\ddot{s}=l''\dot{s}^2+l'\ddot{s}\tag3 l¨=dtdl˙=dtd(l′s˙)=dtdl′s˙+l′s¨=dsdl′dtdss˙+l′s¨=l′′s˙2+l′s¨(3)
Tips:公式标号一致,代表两个公式等价。第一种推导比第二种复杂一些,因为乘法的求导链式法则比除法形式上稍简单一些。大家使用时也尽量使用乘法的链式法则。
2.2.3 车辆在Cardesian下的向量导数
- 求位矢对时间的导数 v h ⃗ \vec{v_h} vh
r h ⃗ ˙ = v h ⃗ = ∣ v h ⃗ ∣ τ h ⃗ = v h τ h ⃗ (4) \dot{\vec{r_h}} = \vec{v_h}= |\vec{v_h}|\vec{\tau_h}=v_h\vec{\tau_h}\tag4 rh˙=vh=∣vh∣τh=vhτh(4)
其中, v h v_h vh为标量,可以从轮速计算获得。
- 求切线向量对时间的导数
如图3(注意图中没有加下标h,因为这个图同样适用于2.2.4)所示:
设时间 d t dt dt内,车辆行驶了 d s h ds_h dsh的距离,向量 τ h ⃗ \vec{\tau_h} τh改变了 d τ h ⃗ \vec{d\tau_h} dτh,旋转的角度为 d θ h d\theta_h dθh, ∣ d τ h ⃗ ∣ = 2 s i n ( d θ h / 2 ) |\vec{d\tau_h}| = 2sin(d\theta_h/2) ∣dτh∣=2sin(dθh/2)。
则当
d
t
→
0
,
d
s
h
→
0
dt \to 0, ds_h \to 0
dt→0,dsh→0时,
d
τ
h
d\tau_h
dτh的方向趋于
n
h
⃗
\vec{n_h}
nh,大小趋于
d
θ
h
d\theta_h
dθh,有
τ
h
⃗
˙
=
lim
△
t
→
0
(
τ
h
+
△
τ
h
)
−
τ
h
⃗
⃗
△
t
=
d
θ
h
n
h
⃗
d
t
=
d
θ
h
n
h
⃗
d
s
h
d
s
h
d
t
=
κ
h
v
h
n
h
⃗
(5)
\dot{\vec{\tau_h}} = \lim\limits_{\triangle t \to 0} \frac{\vec{(\tau_h+\triangle\tau_h)-\vec{\tau_h}}}{\triangle t} = \frac{d\theta_h \vec{n_h}}{dt} = \frac{d\theta_h \vec{n_h}}{ds_h} \frac{ds_h}{dt}=\kappa_hv_h\vec{n_h}\tag5
τh˙=△t→0lim△t(τh+△τh)−τh=dtdθhnh=dshdθhnhdtdsh=κhvhnh(5)
- 求法线向量对时间的导数
如图4所示:
设时间 d t dt dt内,车辆行驶了 d s h ds_h dsh的距离,向量 n h ⃗ \vec{n_h} nh改变了 d n h ⃗ \vec{dn_h} dnh,旋转的角度为 d θ h d\theta_h dθh, ∣ d n h ⃗ ∣ = 2 s i n ( d θ h / 2 ) |\vec{dn_h}| = 2sin(d\theta_h/2) ∣dnh∣=2sin(dθh/2)。
则当
d
t
→
0
,
d
s
h
→
0
dt \to 0, ds_h \to 0
dt→0,dsh→0时,
d
n
h
dn_h
dnh的方向趋于
−
τ
h
⃗
-\vec{\tau_h}
−τh,大小趋于
d
θ
h
d\theta_h
dθh,有
n
h
⃗
˙
=
lim
△
t
→
0
(
n
h
+
△
n
h
)
−
n
h
⃗
⃗
△
t
=
−
d
θ
h
τ
h
⃗
d
t
=
−
d
θ
h
τ
h
⃗
d
s
h
d
s
h
d
t
=
−
κ
h
v
h
τ
h
⃗
(6)
\dot{\vec{n_h}} = \lim\limits_{\triangle t \to 0} \frac{\vec{(n_h+\triangle n_h)-\vec{n_h}}}{\triangle t} = \frac{-d\theta_h \vec{\tau_h}}{dt} = \frac{-d\theta_h \vec{\tau_h}}{ds_h} \frac{ds_h}{dt}=-\kappa_hv_h\vec{\tau_h}\tag6
nh˙=△t→0lim△t(nh+△nh)−nh=dt−dθhτh=dsh−dθhτhdtdsh=−κhvhτh(6)
- 求速度矢量对时间的导数 a ⃗ \vec{a} a
v h ⃗ ˙ = a h ⃗ = ( ∣ v h ⃗ ∣ τ h ⃗ ) ˙ = v h ˙ τ h ⃗ + v h τ h ⃗ ˙ = a τ τ h ⃗ + κ h v h 2 n h ⃗ (7) \dot{\vec{v_h}} = \vec{a_h} = \dot{(|\vec{v_h}|\vec{\tau_h})}=\dot{v_h}\vec{\tau_h}+v_h\dot{\vec{\tau_h}}=a_{\tau}\vec{\tau_h} +\kappa_h v_h^2 \vec{n_h}\tag7 vh˙=ah=(∣vh∣τh)˙=vh˙τh+vhτh˙=aττh+κhvh2nh(7)
其中, a τ = v h ˙ a_{\tau}=\dot{v_h} aτ=vh˙ 为线加速度,可以由纵向加速度计得到,也可以由线速度 v h v_h vh对时间求导得到。
从式(7)中我们还能得到
a
n
=
κ
h
v
h
2
(8)
a_n = \kappa_h v_h^2\tag8
an=κhvh2(8)
其中,
a
n
a_n
an为向心加速度,这个值我们从角加速度计也可以得到,从而可以估计车辆行驶轨迹的曲率
κ
h
\kappa_h
κh 。
2.2.4 匹配点在Cardesian下的向量导数
- 求位矢对时间的导数 v r ⃗ \vec{v_r} vr
r r ⃗ ˙ = v r ⃗ = ∣ v r ⃗ ∣ τ r ⃗ = v r τ r ⃗ = s ˙ τ r ⃗ (9) \dot{\vec{r_r}} = \vec{v_r}= |\vec{v_r}|\vec{\tau_r}=v_r\vec{\tau_r}=\dot{s}\vec{\tau_r}\tag9 rr˙=vr=∣vr∣τr=vrτr=s˙τr(9)
其中, v r v_r vr为标量,可以从轮速计算获得。
- 求切线向量对时间的导数
如图3所示:
设时间 d t dt dt内,车辆行驶了 d s r ds_r dsr的距离,向量 τ r ⃗ \vec{\tau_r} τr改变了 d τ r ⃗ \vec{d\tau_r} dτr,旋转的角度为 d θ r d\theta_r dθr, ∣ d τ r ⃗ ∣ = 2 s i n ( d θ r / 2 ) |\vec{d\tau_r}| = 2sin(d\theta_r/2) ∣dτr∣=2sin(dθr/2)。
则当
d
t
→
0
,
d
s
r
→
0
dt \to 0, ds_r \to 0
dt→0,dsr→0时,
d
τ
r
d\tau_r
dτr的方向趋于
n
r
⃗
\vec{n_r}
nr,大小趋于
d
θ
r
d\theta_r
dθr,有
τ
r
⃗
˙
=
lim
△
t
→
0
(
τ
r
+
△
τ
r
)
−
τ
r
⃗
⃗
△
t
=
d
θ
r
n
r
⃗
d
t
=
d
θ
r
n
r
⃗
d
s
r
d
s
r
d
t
=
κ
r
s
˙
n
r
⃗
(10)
\dot{\vec{\tau_r}} = \lim\limits_{\triangle t \to 0} \frac{\vec{(\tau_r+\triangle\tau_r)-\vec{\tau_r}}}{\triangle t} = \frac{d\theta_r \vec{n_r}}{dt} = \frac{d\theta_r \vec{n_r}}{ds_r} \frac{ds_r}{dt}=\kappa_r \dot{s} \vec{n_r}\tag{10}
τr˙=△t→0lim△t(τr+△τr)−τr=dtdθrnr=dsrdθrnrdtdsr=κrs˙nr(10)
- 求法线向量对时间的导数
如图4所示:
设时间
d
t
dt
dt内,车辆行驶了
d
s
r
ds_r
dsr的距离,向量
n
r
⃗
\vec{n_r}
nr改变了
d
n
r
⃗
\vec{dn_r}
dnr,旋转的角度为
d
θ
r
d\theta_r
dθr,
∣
d
n
r
⃗
∣
=
2
s
i
n
(
d
θ
r
/
2
)
|\vec{dn_r}| = 2sin(d\theta_r/2)
∣dnr∣=2sin(dθr/2)。
则当
d
t
→
0
,
d
s
r
→
0
dt \to 0, ds_r \to 0
dt→0,dsr→0时,
d
n
r
dn_r
dnr的方向趋于
−
τ
r
⃗
-\vec{\tau_r}
−τr,大小趋于
d
θ
r
d\theta_r
dθr,有
n
r
⃗
˙
=
lim
△
t
→
0
(
n
r
+
△
n
r
)
−
n
r
⃗
⃗
△
t
=
−
d
θ
r
τ
r
⃗
d
t
=
−
d
θ
r
τ
r
⃗
d
s
r
d
s
r
d
t
=
−
κ
r
s
˙
τ
r
⃗
(11)
\dot{\vec{n_r}} = \lim\limits_{\triangle t \to 0} \frac{\vec{(n_r+\triangle n_r)-\vec{n_r}}}{\triangle t} = \frac{-d\theta_r \vec{\tau_r}}{dt} = \frac{-d\theta_r \vec{\tau_r}}{ds_r} \frac{ds_r}{dt}=-\kappa_r \dot{s}\vec{\tau_r}\tag{11}
nr˙=△t→0lim△t(nr+△nr)−nr=dt−dθrτr=dsr−dθrτrdtdsr=−κrs˙τr(11)