Pure Pursuit算法是一种通过车辆运动几何学(阿克曼转向几何)对前轮转角进行调整来消除横向偏差的横向控制算法,其参考点为后轴中心点。
该算法的思想是:基于当前车辆后轴中心位置,在参考路径上向前 l d l_d ld的距离匹配一个预瞄点,将此预瞄点作为该周期的goal point。假设车辆后轴中心点可以按照一定的转弯半径R形式抵达该预瞄点,然后根据预瞄距离 l d l_d ld、转弯半径R和车辆坐标系下预瞄点的朝向角 α \alpha α之间的几何关系来确定前轮转角,其原理图如下:
为了使车辆后轴中心点跟踪圆弧虚线路径到达C点,在三角形OAC中,需要满足的正弦定理关系:
l d s i n 2 α = R s i n ( π 2 − α ) (1) \frac{l_d}{sin2\alpha}=\frac{R}{sin(\frac{\pi}{2}-\alpha)} \tag{1} sin2αld=sin(2π−α)R(1)
又因为: s i n 2 α = 2 s i n α c o s α , s i n ( π 2 − α ) = c o s α sin2\alpha=2sin\alpha cos\alpha,sin(\frac{\pi}{2}-\alpha)=cos\alpha sin2α=2sinαcosα,sin(2π−α)=cosα,所以化简上述公式可得:
R = l d 2 s i n α (2) R=\frac{l_d}{2sin\alpha} \tag{2} R=2sinαld(2)
为了达到这种几何关系,作为控制量的前轮转角需要满足什么关系呢?在阿克曼转向(三角形OAB)中,有:
t a n δ ≈ L R (3) tan\delta \approx \frac{L}{R} \tag{3} tanδ≈RL(3)
因此,联立上面的公式(2)(3),得到:
δ ( t ) = a r c t a n ( 2 L s i n α ( t ) l d ) (4) \delta(t) = arctan(\frac{2Lsin\alpha(t)}{l_d}) \tag{4} δ(t)=arctan(ld2Lsinα(t))(4)
其中,车辆坐标系下预瞄点的朝向角 α ( t ) \alpha(t) α(t)为变量。
另外,定义横向位置误差为车辆当前姿态和预瞄点在横向上的误差:
e y ( t ) = l d s i n α ( t ) (5) e_y(t) = l_d sin\alpha(t) \tag{5} ey(t)=ldsinα(t)(5)
联立公式(4)(5),可得到前轮转角计算公式:
δ ( t ) = a r c t a n ( 2 L l d 2 e y ( t ) ) (6) \delta(t) =arctan(\frac{2L}{l_d^2}e_y(t)) \tag{6} δ(t)=arctan(ld22Ley(t))(6)
一般而言,考虑小角度假设,公式(6)可变成:
δ ( t ) = a r c t a n ( 2 L l d 2 e y ( t ) ) ≈ 2 L l d 2 e y ( t ) (7) \delta(t) = arctan(\frac{2L}{l_d^2}e_y(t)) \approx \frac{2L}{l_d^2}e_y(t) \tag{7} δ(t)=arctan(ld22Ley(t))≈ld22Ley(t)(7)
因此,纯跟踪法本质上是一个P控制器,输入为横向位置误差,输出为前轮转角。跟踪的控制效果将由预瞄距离 l d l_d ld决定,通常 l d l_d ld定义为关于速度的函数表达式:
l d = l d 0 + k v (8) l_d =l_{d0}+k v \tag{8} ld=ld0+kv(8)
算法特点:
前轮反馈控制(Front wheel feedback)又称Stanley控制其核心思想是基于前轴中心的路径跟踪偏差量对方向盘转向控制量进行计算。
Stanley方法是一种基于横向跟踪误差为前轴中心到最近路径点的距离的非线性反馈函数,并且能实现横向跟踪误差指数收敛于0。根据车辆位姿与给定路径的相对几何关系可以直观的获得控制车辆方向盘转角的控制变量。
Stanley法计算得到的前轮转角控制量由两部分构成:
Stanley法的原理示意图如下所示:
在不考虑横向跟踪误差的情况下,前轮转角应当与给定路径参考点的切线方向一致。其中, θ φ \theta_\varphi θφ表示车辆航向与最近路径点切线方向之间的夹角,在没有任何横向误差的情况下,前轮方向应与所在路径点的方向相同,故消除航向误差的前轮转角为;
δ φ ( t ) = θ φ ( t ) (9) \delta_\varphi(t) = \theta_\varphi(t) \tag{9} δφ(t)=θφ(t)(9)
在不考虑航向跟踪偏差的情况下,横向跟踪误差越大,前轮转向角越大,假设车辆预期轨迹在距离前轮 d ( t ) d(t) d(t)处与参考路径上最近点切线相交,根据几何关系得出如下非线性比例函数:
δ y ( t ) = θ y ( t ) = a r c t a n ( e y ( t ) d ( t ) ) = a r c t a n ( k e y ( t ) v ( t ) ) (10) \delta_y(t)=\theta_y(t)=arctan(\frac{e_y(t)}{d(t)})=arctan(\frac{k e_y(t)}{v(t)}) \tag{10} δy(t)=θy(t)=arctan(d(t)ey(t))=arctan(v(t)key(t))(10)
其中 d ( t ) d(t) d(t)与车速相关,用车速 v ( t ) v(t) v(t)和增益参数k表示.
因此,前轮转角为:
δ ( t ) = δ φ ( t ) + δ y ( t ) = δ φ ( t ) + a r c t a n ( k e y ( t ) v ( t ) ) , δ ( t ) ∈ [ δ m i n , δ m a x ] (11) \delta(t)=\delta_\varphi(t)+\delta_y(t)=\delta_\varphi(t)+arctan(\frac{k e_y(t)}{v(t)}),\delta(t) \in [\delta_{min},\delta_{max}] \tag{11} δ(t)=δφ(t)+δy(t)=δφ(t)+arctan(v(t)key(t)),δ(t)∈[δmin,δmax](11)
算法特点:
LQR控制算法是一种广泛应用于工业控制和机器人控制中的线性控制算法,它利用状态反馈控制来实现系统的稳定性和优化性能。
LQR控制算法的基本思想:通过对系统的状态进行反馈控制,使系统的输出响应达到最优,同时保持系统的稳定性。具体来说,LQR控制算法通过将系统的状态反馈控制矩阵K计算出来,使得系统的状态能够以最小的代价函数进行控制,控制示意图如下:
在LQR控制算法中,代价函数用来描述系统的响应性能和能耗。通常情况下,代价函数可以表示为系统状态与控制输入的加权和,即:
J = ∫ [ X ( t ) T Q X ( t ) + U ( t ) T R U ( t ) ] d t (12) J = ∫[X(t)^T Q X(t) + U(t)^T R U(t)]dt \tag{12} J=∫[X(t)TQX(t)+U(t)TRU(t)]dt(12)
其中,Q和R分别是状态和控制输入的权重矩阵,它们的大小和系统状态和控制输入的维度相同。通过对代价函数进行求导并令其等于0,可以得到连续的状态反馈矩阵K的表达式:
K = − R − 1 B T P (13) K = -R^{-1} B^T P \tag{13} K=−R−1BTP(13)
其中, P P P是Riccati方程的解,它可以通过求解Riccati方程得到,具体的求解方法可以使用数值方法,例如MATLAB中的lqr函数。
一旦得到了状态反馈矩阵K,就可以将其用于控制系统中。具体来说,控制输入(连续的)可以表示为:
U ( t ) = − K X ( t ) (14) U(t) = -KX(t) \tag{14} U(t)=−KX(t)(14)
通过这种方式,系统的状态可以被反馈到控制输入中,从而实现系统的控制。
以车辆的横向控制为例:
步骤1:建立道路-车辆误差状态空间方程
X ( t ) ˙ = A X ( t ) + B U ( t ) Y ( t ) = C X ( t ) (15) \dot{X(t)}=A X(t) + B U(t) \\ Y(t)=C X(t) \tag{15} X(t)˙=AX(t)+BU(t)Y(t)=CX(t)(15)
步骤2:对连续的误差状态方程进行离散化,一般A矩阵采用中点欧拉离散,B及C矩阵采用前向欧拉离散,得到离散的误差状态方程如下:
X ( k + T ) = A d X ( k ) + B d U ( k ) Y ( k ) = C d X ( k ) (16) X(k+T)=A_d X(k) + B_d U(k) \\ Y(k)=C_d X(k) \tag{16} X(k+T)=AdX(k)+BdU(k)Y(k)=CdX(k)(16)
步骤3:构建代价函数 J J J,建立离散的LQR问题
J = 1 2 X T ( N ) F X ( N ) + 1 2 ∑ k = 0 N − 1 [ X T ( k ) Q X ( k ) + U T ( k ) R U ( k ) ] (17) J = \frac{1}{2}X^T(N)FX(N) + \frac{1}{2} \sum_{k = 0}^{N-1} [X^T(k) Q X(k) + U^T(k) R U(k)] \tag{17} J=21XT(N)FX(N)+21k=0∑N−1[XT(k)QX(k)+UT(k)RU(k)](17)
步骤4:求解离散的LQR问题(动态规划法)
结论:
U ( k ) = − K ( k ) X ( k ) (18) U(k) = -K(k) X(k) \tag{18} U(k)=−K(k)X(k)(18)
其中:
K ( k ) = [ B T ( k ) P ( k + 1 ) B ( k ) + R ( k ) ] − 1 B T ( k ) P ( k + 1 ) A ( k ) (19) K(k) = [B^T(k)P(k+1)B(k) + R(k)]^{-1} B^T(k)P(k+1)A(k) \tag{19} K(k)=[BT(k)P(k+1)B(k)+R(k)]−1BT(k)P(k+1)A(k)(19)
而且离散的Riccati方程为:
P ( k ) = A T ( k ) P ( k + 1 ) A ( k ) − A T ( k ) P ( k + 1 ) B ( k ) [ B T ( k ) P ( k + 1 ) B ( k ) + R ( k ) ] − 1 B T ( k ) P ( k + 1 ) A ( k ) (20) P(k) = A^T(k)P(k+1)A(k) - A^T(k)P(k+1)B(k) [B^T(k)P(k+1)B(k) + R(k)]^{-1} B^T(k)P(k+1)A(k) \tag{20} P(k)=AT(k)P(k+1)A(k)−AT(k)P(k+1)B(k)[BT(k)P(k+1)B(k)+R(k)]−1BT(k)P(k+1)A(k)(20)
因此,求解出矩阵 P P P就可以得到控制律。
求解矩阵 P P P:
1、令 P P P等于最终状态权重矩阵;
2、迭代黎卡提方程求出新的 P n e x t P_{next} Pnext;
3、当两次P的差值足够小时,计算反馈矩阵K;
4、根据反馈矩阵K获取最优控制量U;
matrix lqrSolver(matrix A,matrix B,matrix Q, matrix R,double esp,double iterate_max)
{
double gap = 999999;
double iterate = 0;
matrix P = Q;
matrix P_next = zero(4, 4);
while (iterate < iterate_max && gap > esp)
{
P_next = A.transpose() * P * A - A.transpose() * P * B * (B.transpose() * P * B + R).inv() * B.transpose() * P * A;
gap = (P_next - P).norm();
P = P_next;
iterate++;
}
return P_next;
}