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基础库——散点曲线平滑。