FemPosDeviation参考线平滑方法是离散点平滑方法,Fem是Finite element estimate的意思。
Apollo中使用Ipopt求解是因为增加了曲率约束,而曲率约束是非线性的,优化目标的设置同OSQP一致,只是增加了松弛因子。

参考线平滑的首要目标当然是平滑性,使用向量的模
∣
P
2
P
2
′
⃗
∣
| \vec{P_2 P^{\prime}_2}|
∣P2P2′∣来表示,显然
∣
P
2
P
2
′
⃗
∣
| \vec{P_2 P^{\prime}_2}|
∣P2P2′∣越小,三个点
P
1
,
P
2
,
P
3
P_1,P_2,P_3
P1,P2,P3越接近一条直线,越平滑。
J
s
m
o
o
t
h
=
∑
i
=
2
N
−
1
∣
P
i
P
i
′
⃗
∣
2
=
∑
i
=
2
N
−
1
∣
P
i
P
i
−
1
⃗
+
P
i
P
i
+
1
⃗
∣
2
=
∑
i
=
2
N
−
1
(
(
x
i
−
1
+
x
i
+
1
−
2
x
i
)
2
+
(
y
i
−
1
+
y
i
+
1
−
2
y
i
)
2
)
(1-1)
J_{smooth} = \sum^{N-1}_{i=2} | \vec{P_i P^{\prime}_i}| ^ 2 = \sum^{N-1}_{i=2} | \vec{P_i P_{i-1}} + \vec{P_i P_{i+1}} | ^ 2 = \sum^{N-1}_{i=2} {( (x_{i-1} + x_{i+1} - 2x_i)^2 + (y_{i-1} + y_{i+1} - 2y_i)^2 )} \tag{1-1}
Jsmooth=i=2∑N−1∣PiPi′∣2=i=2∑N−1∣PiPi−1+PiPi+1∣2=i=2∑N−1((xi−1+xi+1−2xi)2+(yi−1+yi+1−2yi)2)(1-1)
平滑后的参考线,希望能够保留原始道路的几何信息,不会把弯道的处的参考线平滑成一条直线。使用平滑后点与原始点的距离来表示。
J
d
e
v
i
a
t
i
o
n
=
∑
i
=
1
N
∣
P
r
,
1
P
1
⃗
∣
2
=
∑
i
=
1
N
(
(
x
1
−
x
1
,
r
)
2
+
(
y
1
−
y
1
,
r
)
2
)
(1-2)
J_{deviation} = \sum^{N}_{i=1} | \vec{P_{r,1} P_1}| ^ 2 = \sum^{N}_{i=1} ( (x_1 - x_{1,r})^2 + (y_1 - y_{1,r})^2) \tag{1-2}
Jdeviation=i=1∑N∣Pr,1P1∣2=i=1∑N((x1−x1,r)2+(y1−y1,r)2)(1-2)
平滑后的参考线的每两个相邻点之间的长度尽量均匀一直。
J
l
e
n
g
t
h
=
∑
i
=
1
N
−
1
∣
P
i
P
i
+
1
⃗
∣
2
=
∑
i
=
1
N
−
1
(
(
x
i
+
1
−
x
i
)
2
+
(
y
i
+
1
−
y
i
)
2
)
(1-3)
J_{length} = \sum^{N-1}_{i=1} | \vec{P_i P_{i+1}}|^2 = \sum^{N-1}_{i=1} ( (x_{i+1} - x_i)^2 + (y_{i+1} - y_i)^2 ) \tag{1-3}
Jlength=i=1∑N−1∣PiPi+1∣2=i=1∑N−1((xi+1−xi)2+(yi+1−yi)2)(1-3)
因此,参考线平滑的优化目标可以定义为:
J
=
w
s
m
o
o
t
h
∗
J
s
m
o
o
t
h
+
w
d
e
v
i
a
t
i
o
n
∗
J
d
e
v
i
a
t
i
o
n
+
w
l
e
n
g
t
h
∗
J
l
e
n
g
t
h
(1-4)
J = w_{smooth} * J_{smooth} + w_{deviation} * J_{deviation} + w_{length} * J_{length} \tag{1-4}
J=wsmooth∗Jsmooth+wdeviation∗Jdeviation+wlength∗Jlength(1-4)
只考虑边界约束,即:
x
i
,
l
o
w
e
r
≤
x
i
≤
x
i
,
u
p
p
e
r
y
i
,
l
o
w
e
r
≤
y
i
≤
y
i
,
u
p
p
e
r
(2-1)
x_{i,lower} \leq x_i \leq x_{i,upper} \\ y_{i,lower} \leq y_i \leq y_{i,upper} \tag{2-1}
xi,lower≤xi≤xi,upperyi,lower≤yi≤yi,upper(2-1)
可以转化为:
x
i
,
r
−
b
o
u
n
d
≤
x
i
≤
x
i
,
r
+
b
o
u
n
d
y
i
,
r
−
b
o
u
n
d
≤
y
i
≤
y
i
,
r
+
b
o
u
n
d
(2-2)
x_{i,r} - bound \leq x_i \leq x_{i,r} + bound \\ y_{i,r} - bound \leq y_i \leq y_{i,r} + bound \tag{2-2}
xi,r−bound≤xi≤xi,r+boundyi,r−bound≤yi≤yi,r+bound(2-2)
对参考线的起点和终点进行约束,令其等于原始参考线上的点:
x
1
,
r
≤
x
1
≤
x
1
,
r
y
1
,
r
≤
y
1
≤
y
1
,
r
(2-3)
x_{1,r} \leq x_1 \leq x_{1,r} \\ y_{1,r} \leq y_1 \leq y_{1,r} \tag{2-3}
x1,r≤x1≤x1,ry1,r≤y1≤y1,r(2-3)
文章Apollo ReferenceLine Smooth–离散点平滑原理中详细叙述了曲率的计算过程。

∣
P
1
P
3
⃗
∣
=
Δ
s
2
×
κ
∣
P
1
P
3
⃗
∣
≤
Δ
s
2
×
κ
m
a
x
(2-4)
| \vec{P_1 P_3} | = \Delta s^2 \times \kappa \\ | \vec{P_1 P_3} | \leq \Delta s^2 \times \kappa_{max} \tag{2-4}
∣P1P3∣=Δs2×κ∣P1P3∣≤Δs2×κmax(2-4)
因此中间的
N
−
2
N-2
N−2个点上的曲率应该满足约束:
(
x
i
−
1
+
x
i
+
1
−
2
x
i
)
2
+
(
y
i
−
1
+
y
i
+
1
−
2
y
i
)
2
≤
(
Δ
s
2
×
κ
m
a
x
)
2
,
i
=
1
,
2
,
⋯
,
N
−
1
(2-5)
(x_{i-1} + x_{i+1} - 2x_i)^2 + (y_{i-1} + y_{i+1} - 2y_i)^2 \leq ( \Delta s^2 \times \kappa_{max} ) ^ 2, i = 1, 2, \cdots, N-1 \tag{2-5}
(xi−1+xi+1−2xi)2+(yi−1+yi+1−2yi)2≤(Δs2×κmax)2,i=1,2,⋯,N−1(2-5)
为了保证有解,增加了松弛因子
ε
κ
\varepsilon_{\kappa}
εκ:
(
x
i
−
1
+
x
i
+
1
−
2
x
i
)
2
+
(
y
i
−
1
+
y
i
+
1
−
2
y
i
)
2
−
ε
κ
,
i
≤
(
Δ
s
2
×
κ
m
a
x
)
2
,
i
=
1
,
2
,
⋯
,
N
−
1
ε
κ
,
i
≥
0
,
i
=
1
,
2
,
⋯
,
N
−
1
(2-6)
(x_{i-1} + x_{i+1} - 2x_i)^2 + (y_{i-1} + y_{i+1} - 2y_i)^2 - \varepsilon_{\kappa, i} \leq ( \Delta s^2 \times \kappa_{max} ) ^ 2, i = 1, 2, \cdots, N-1 \\ \varepsilon_{\kappa, i} \geq 0, i = 1, 2, \cdots, N-1 \tag{2-6}
(xi−1+xi+1−2xi)2+(yi−1+yi+1−2yi)2−εκ,i≤(Δs2×κmax)2,i=1,2,⋯,N−1εκ,i≥0,i=1,2,⋯,N−1(2-6)
由于曲率约束是非线性的,因此可以使用Ipopt进行求解。在进行曲率约束时,需要使用
Δ
s
\Delta s
Δs,Apollo使用了原始参考线两点之间的平均距离。
// b. curvature constraints
double ref_total_length = 0.0;
auto pre_point = ref_points_.front();
for (size_t i = 1; i < num_of_points_; ++i) {
auto cur_point = ref_points_[i];
double x_diff = cur_point.first - pre_point.first;
double y_diff = cur_point.second - pre_point.second;
ref_total_length += std::sqrt(x_diff * x_diff + y_diff * y_diff);
pre_point = cur_point;
}
double average_delta_s =
ref_total_length / static_cast(num_of_points_ - 1);
double curvature_constr_upper =
average_delta_s * average_delta_s * curvature_constraint_;
for (size_t i = curvature_constr_start_index_;
i < curvature_constr_end_index_; ++i) {
g_l[i] = -1e20;
g_u[i] = curvature_constr_upper * curvature_constr_upper;
}
在Apollo中使用的ADOL-C自动求解优化目标的梯度向量函数、约束函数的雅可比矩阵和拉格朗日函数的黑森矩阵。可以参考文章Planning基础库——散点曲线平滑。