参考线平滑-FemPosDeviation-Ipopt

参考线平滑-FemPosDeviation-Ipopt

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

1. 优化目标

参考线平滑-FemPosDeviation-Ipopt_第1张图片

1.1 平滑性

参考线平滑的首要目标当然是平滑性,使用向量的模 ∣ 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=2N1PiPi 2=i=2N1PiPi1 +PiPi+1 2=i=2N1((xi1+xi+12xi)2+(yi1+yi+12yi)2)(1-1)

1.2 几何性

平滑后的参考线,希望能够保留原始道路的几何信息,不会把弯道的处的参考线平滑成一条直线。使用平滑后点与原始点的距离来表示。
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=1NPr,1P1 2=i=1N((x1x1,r)2+(y1y1,r)2)(1-2)

1.3 均匀性

平滑后的参考线的每两个相邻点之间的长度尽量均匀一直。
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=1N1PiPi+1 2=i=1N1((xi+1xi)2+(yi+1yi)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=wsmoothJsmooth+wdeviationJdeviation+wlengthJlength(1-4)

2. 约束条件

2.1 边界约束

只考虑边界约束,即:
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,lowerxixi,upperyi,loweryiyi,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,rboundxixi,r+boundyi,rboundyiyi,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,rx1x1,ry1,ry1y1,r(2-3)

2.2 曲率约束

文章Apollo ReferenceLine Smooth–离散点平滑原理中详细叙述了曲率的计算过程。

参考线平滑-FemPosDeviation-Ipopt_第2张图片

∣ 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 N2个点上的曲率应该满足约束:
( 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} (xi1+xi+12xi)2+(yi1+yi+12yi)2(Δs2×κmax)2,i=1,2,,N1(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} (xi1+xi+12xi)2+(yi1+yi+12yi)2εκ,i(Δs2×κmax)2,i=1,2,,N1εκ,i0,i=1,2,,N1(2-6)

3. Ipopt

由于曲率约束是非线性的,因此可以使用Ipopt进行求解。在进行曲率约束时,需要使用 Δ s \Delta s ΔsApollo使用了原始参考线两点之间的平均距离。

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

你可能感兴趣的:(Auto,Driving,人工智能)