车辆运动学模型的线性化和离散化及代码实现

线性化

线性化的方法

泰勒级数展开是一种将非线性微分方程在某个特定点(通常是平衡点或操作点)附近线性化的方法。这种方法基于在该点附近,非线性函数可以近似为线性函数加上高阶无穷小。以下是使用泰勒级数展开进行线性化的步骤:

  1. 选择平衡点
    选择系统的平衡点,即系统在没有外部扰动时的稳态工作点。在这个点上,系统的所有导数(或状态变量的变化率)都为零。

  2. 计算函数值和导数
    在平衡点处计算非线性函数的值以及所有一阶和高阶导数。这些导数将构成泰勒级数展开的系数。

  3. 泰勒级数展开
    将非线性函数在展开点附近展开为泰勒级数。通常只保留一阶项(线性项),因为高阶项在小扰动下的影响较小。泰勒级数展开的一般形式为:
    f ( x ) ≈ f ( a ) + f ′ ( a ) ( x − a ) (1) f(x) \approx f(a) + f'(a)(x - a) \tag{1} f(x)f(a)+f(a)(xa)(1)
    其中, f ( x ) f(x) f(x) 是非线性函数, a a a 是展开点, f ′ ( a ) f'(a) f(a) 是函数在点 a a a 的导数。

  4. 线性近似
    通过忽略高阶项,得到非线性函数在展开点附近的线性近似。这个近似可以用来分析系统的局部行为,例如稳定性分析。

  5. 应用线性化模型
    使用线性化后的模型来分析系统的行为,设计控制器,或者进行数值模拟。线性系统的理论工具可以直接应用于这个线性化模型。

举例说明,假设有一个非线性微分方程:
x ˙ = f ( x , u ) (2) \dot{x} = f(x, u) \tag{2} x˙=f(x,u)(2)
其中, x ˙ \dot{x} x˙ 表示 x x x 的导数, u u u 是控制输入。如果我们选择展开点 ( x 0 , u 0 ) (x_0, u_0) (x0,u0),那么在该点附近的泰勒级数展开的一般形式是:
f ( x , u ) = f ( x 0 , u 0 ) + ∂ f ∂ x ( x 0 , u 0 ) ( x − x 0 ) + ∂ f ∂ u ( x 0 , u 0 ) ( u − u 0 ) + ⋯ (3) f(x, u) = f(x_0, u_0) + \frac{\partial f}{\partial x}(x_0, u_0)(x - x_0) + \frac{\partial f}{\partial u}(x_0, u_0)(u - u_0) + \cdots \tag{3} f(x,u)=f(x0,u0)+xf(x0,u0)(xx0)+uf(x0,u0)(uu0)+(3)
如果我们只保留到一阶项,那么非线性方程就可以近似为线性方程:
f ( x , u ) ≈ f ( x 0 , u 0 ) + ∂ f ∂ x ( x 0 , u 0 ) ( x − x 0 ) + ∂ f ∂ u ( x 0 , u 0 ) ( u − u 0 ) (4) f(x, u) \approx f(x_0, u_0) + \frac{\partial f}{\partial x}(x_0, u_0)(x - x_0) + \frac{\partial f}{\partial u}(x_0, u_0)(u - u_0) \tag{4} f(x,u)f(x0,u0)+xf(x0,u0)(xx0)+uf(x0,u0)(uu0)(4)
这个线性化过程的关键在于选择一个合适的点 ( x 0 , u 0 ) (x_0, u_0) (x0,u0) 作为展开点,以及确定展开到哪个阶数。通常,我们会选择平衡点或某个特定的工作点作为展开点。需要注意的是,线性化是一种近似方法,只在一定条件下成立。当扰动或偏差较大时,线性化可能不再准确。因此,在应用线性化方法时,需要谨慎评估其适用性和误差范围。

车辆运动学线性化

{ x ˙ = v c o s φ y ˙ = v s i n φ φ ˙ = v t a n δ f L (5) \begin{cases} \dot{x} = vcos\varphi \\ \dot{y} = vsin\varphi \\ \dot{\varphi} = \frac{vtan\delta_f}{L} \end{cases} \tag{5} x˙=vcosφy˙=vsinφφ˙=Lvtanδf(5)
这里状态变化量和控制量分别为
X ˙ = [ x ˙ y ˙ φ ˙ ] = [ v c o s φ v s i n φ v t a n δ f L ] , u = [ v δ f ] \begin{align*} \dot{X}= \begin{bmatrix} \dot{x}\\ \dot{y}\\ \dot{\varphi} \end{bmatrix}= \begin{bmatrix} vcos\varphi\\ vsin\varphi\\ \frac{vtan\delta_f}{L} \end{bmatrix},& u= \begin{bmatrix} v \\ \delta_f\\ \end{bmatrix} \tag{6} \end{align*} X˙= x˙y˙φ˙ = vcosφvsinφLvtanδf ,u=[vδf](6)
则对应的非线性微分方程为
X ˙ = f ( X , u ) (7) \dot{X}=f(X,u) \tag{7} X˙=f(X,u)(7)
我们选取参考轨迹上的任意一点作为展开点,我们用 X r ˙ = f ( X r , u r ) \dot{X_r}=f(X_r,u_r) Xr˙=f(Xr,ur)表示,其中 X r = [ x r , y r , φ r ] T X_r=[x_r,y_r,\varphi_r]^T Xr=[xr,yr,φr]T u r = [ v r , δ f r ] T u_r=[v_r,\delta_{fr}]^T ur=[vr,δfr]T。对该点采用泰勒级数展开,并忽略高阶项,可得
X ˙ = f ( X r , u r ) + ∂ f ∂ x ( X r , u r ) ( X − X r ) + ∂ f ∂ u ( X r , u r ) ( u − u r ) X ˙ = X r ˙ + ∂ f ∂ x ( X r , u r ) ( X − X r ) + ∂ f ∂ u ( X r , u r ) ( u − u r ) (8) \begin{align*} \dot{X}&=f(X_r,u_r)+\frac{\partial f}{\partial x}(X_r,u_r)(X - X_r) + \frac{\partial f}{\partial u}(X_r,u_r)(u - u_r)\\ \dot{X}&=\dot{X_r}+\frac{\partial f}{\partial x}(X_r,u_r)(X - X_r) + \frac{\partial f}{\partial u}(X_r,u_r)(u - u_r) \end{align*} \tag{8} X˙X˙=f(Xr,ur)+xf(Xr,ur)(XXr)+uf(Xr,ur)(uur)=Xr˙+xf(Xr,ur)(XXr)+uf(Xr,ur)(uur)(8)
移项可得状态误差变化量
X e ˙ = X ˙ − X r ˙ = ∂ f ∂ x ( X r , u r ) ( X − X r ) + ∂ f ∂ u ( X r , u r ) ( u − u r ) (9) \dot{X_e}=\dot{X}-\dot{X_r}=\frac{\partial f}{\partial x}(X_r,u_r)(X - X_r) + \frac{\partial f}{\partial u}(X_r,u_r)(u - u_r) \tag{9} Xe˙=X˙Xr˙=xf(Xr,ur)(XXr)+uf(Xr,ur)(uur)(9)
其中
∂ f ∂ x ( X r , u r ) = [ ∂ v c o s φ ∂ x ∂ v c o s φ ∂ y ∂ v c o s φ ∂ φ ∂ v s i n φ ∂ x ∂ v s i n φ ∂ y ∂ v s i n φ ∂ φ ∂ v t a n δ f L ∂ x ∂ v t a n δ f L ∂ y ∂ v t a n δ f L ∂ φ ] ( X r , u r ) = [ 0 0 − v r s i n φ r 0 0 v r c o s φ r 0 0 0 ] ∂ f ∂ u ( X r , u r ) = [ ∂ v c o s φ ∂ v ∂ v c o s φ ∂ δ f ∂ v s i n φ ∂ v ∂ v s i n φ ∂ δ f ∂ v t a n δ f L ∂ v ∂ v t a n δ f L ∂ δ f ] ( X r , u r ) = [ c o s φ r 0 s i n φ r 0 t a n δ f r L v r L c o s 2 δ f r ] (10) \begin{align*} \frac{\partial f}{\partial x}(X_r,u_r)= \begin{bmatrix} \frac{\partial vcos\varphi }{\partial x} & \frac{\partial vcos\varphi }{\partial y} & \frac{\partial vcos\varphi }{\partial \varphi} \\ \frac{\partial vsin\varphi }{\partial x} & \frac{\partial vsin\varphi }{\partial y} & \frac{\partial vsin\varphi }{\partial \varphi} \\ \frac{\partial \frac{vtan\delta_f}{L} }{\partial x} & \frac{\partial \frac{vtan\delta_f}{L} }{\partial y} & \frac{\partial \frac{vtan\delta_f}{L} }{\partial \varphi} \\ \end{bmatrix}_{(X_r,u_r)}= \begin{bmatrix} 0 & 0 & -v_rsin\varphi_r\\ 0 & 0 & v_rcos\varphi_r\\ 0 & 0 & 0\\ \end{bmatrix}\\ \frac{\partial f}{\partial u}(X_r,u_r)= \begin{bmatrix} \frac{\partial vcos\varphi }{\partial v} & \frac{\partial vcos\varphi }{\partial \delta_f} \\ \frac{\partial vsin\varphi }{\partial v} & \frac{\partial vsin\varphi }{\partial \delta_f} \\ \frac{\partial \frac{vtan\delta_f}{L} }{\partial v} & \frac{\partial \frac{vtan\delta_f}{L} }{\partial \delta_f} \\ \end{bmatrix}_{(X_r,u_r)}= \begin{bmatrix} cos\varphi_r & 0 \\ sin\varphi_r & 0 \\ \frac{ tan\delta_{fr}}{L} & \frac{v_r}{Lcos^2\delta_{fr}} \\ \end{bmatrix} \end{align*} \tag{10} xf(Xr,ur)= xvcosφxvsinφxLvtanδfyvcosφyvsinφyLvtanδfφvcosφφvsinφφLvtanδf (Xr,ur)= 000000vrsinφrvrcosφr0 uf(Xr,ur)= vvcosφvvsinφvLvtanδfδfvcosφδfvsinφδfLvtanδf (Xr,ur)= cosφrsinφrLtanδfr00Lcos2δfrvr (10)
则状态误差变化量 X e ˙ \dot{X_e} Xe˙可表示为
X e ˙ = [ x ˙ − x r ˙ y ˙ − y r ˙ φ ˙ − φ r ˙ ] = [ 0 0 − v r s i n φ r 0 0 v r c o s φ r 0 0 0 ] [ x − x r y − y r φ − φ r ] + [ c o s φ r 0 s i n φ r 0 t a n δ f r L v r L c o s 2 δ f r ] [ v − v r δ − δ r ] = A X e + B u e (11) \begin{align*} \dot{X_e}&= \begin{bmatrix} \dot{x}-\dot{x_r}\\ \dot{y}-\dot{y_r}\\ \dot{\varphi}-\dot{\varphi_r}\\ \end{bmatrix} \\ &= \begin{bmatrix} 0 & 0 & -v_rsin\varphi_r\\ 0 & 0 & v_rcos\varphi_r\\ 0 & 0 & 0\\ \end{bmatrix} \begin{bmatrix} x-x_r\\ y-y_r\\ \varphi-\varphi_r\\ \end{bmatrix} + \begin{bmatrix} cos\varphi_r & 0 \\ sin\varphi_r & 0 \\ \frac{ tan\delta_{fr}}{L} & \frac{v_r}{Lcos^2\delta_{fr}} \\ \end{bmatrix} \begin{bmatrix} v-v_r\\ \delta-\delta_r\\ \end{bmatrix} \\ &= AX_e+Bu_e \end{align*} \tag{11} Xe˙= x˙xr˙y˙yr˙φ˙φr˙ = 000000vrsinφrvrcosφr0 xxryyrφφr + cosφrsinφrLtanδfr00Lcos2δfrvr [vvrδδr]=AXe+Bue(11)

离散化

离散化方法

欧拉法

对于线性微分方程
x ˙ = A x + B u (12) \dot{x}=Ax+Bu \tag{12} x˙=Ax+Bu(12)
其中 A A A B B B分别为状态矩阵和输入矩阵,对上式进行 t t t t + d t t+dt t+dt的积分可得
∫ t t + d t x ˙   d x = ∫ t t + d t ( A x + B u ) d t (13) \int_{t}^{t+dt} \dot{x}\,dx = \int_{t}^{t+dt}(Ax+Bu)dt \tag{13} tt+dtx˙dx=tt+dt(Ax+Bu)dt(13)
由微分中值定理可得
x ( t + d t ) − x ( t ) = A x ( ξ ) d t + B u ( ξ ) d t (14) \begin{align*} x(t+dt)-x(t)=Ax(\xi)dt+Bu(\xi)dt \end{align*} \tag{14} x(t+dt)x(t)=Ax(ξ)dt+Bu(ξ)dt(14)
其中 ξ ∈ ( t . d t ) \xi \in (t.dt) ξ(t.dt)

整理可得
x ( t + d t ) = x ( t ) + A x ( ξ ) d t + B u ( ξ ) d t (15) x(t+dt)=x(t)+ Ax(\xi)dt+Bu(\xi)dt \tag{15} x(t+dt)=x(t)+Ax(ξ)dt+Bu(ξ)dt(15)
根据 ξ \xi ξ的计算方式不同,欧拉法又分为前向欧拉法、后向欧拉法和中值欧拉法。其具体的形式如下

  • 前向欧拉法: x ( ξ ) = x ( t ) x(\xi)=x(t) x(ξ)=x(t)​;
  • 后向欧拉法: x ( ξ ) = x ( t + d t ) x(\xi)=x(t+dt) x(ξ)=x(t+dt)
  • 中值欧拉法: x ( ξ ) = x ( t ) + x ( t + d t ) 2 x(\xi)=\frac{x(t)+x(t+dt)}{2} x(ξ)=2x(t)+x(t+dt)

设离散间隔为 T T T,离散时间为 k k k,则(15)式子 t t t t + d t t+dt t+dt d t dt dt中分别对应的就是 k k k k + 1 k+1 k+1 T T T,结合(15)式,整理可得对应的微分方程如下

  • 前向欧拉法: x ( k + 1 ) = x ( k ) + T A x ( k ) + T B u ( k ) = ( I + T A ) x ( k ) + T B u ( k ) x(k+1)=x(k)+TAx(k)+TBu(k) =(I+TA)x(k)+TBu(k) x(k+1)=x(k)+TAx(k)+TBu(k)=(I+TA)x(k)+TBu(k)​​;
  • 后向欧拉法: x ( k + 1 ) = x ( k ) + T A x ( k + 1 ) + T B u ( k + 1 ) = ( I + T A ) x ( k + 1 ) + T B u ( t + 1 ) x(k+1)=x(k)+TAx(k+1)+TBu(k+1) =(I+TA)x(k+1)+TBu(t+1) x(k+1)=x(k)+TAx(k+1)+TBu(k+1)=(I+TA)x(k+1)+TBu(t+1)
  • 中值欧拉法: x ( k + 1 ) = x ( k ) + T A x ( k + 1 2 ) + T B u ( k + 1 2 ) = ( I + T A ) x ( k + 1 2 ) + T B u ( k + 1 2 ) x(k+1)=x(k)+TAx(\frac{k+1}{2})+TBu(\frac{k+1}{2}) =(I+TA)x(\frac{k+1}{2})+TBu(\frac{k+1}{2}) x(k+1)=x(k)+TAx(2k+1)+TBu(2k+1)=(I+TA)x(2k+1)+TBu(2k+1)
零阶保持法

对于(12)式的微分方程,设初始时间为 t 0 t_0 t0,则其任意时刻状态 x ( t ) x(t) x(t)
x ( t ) = x ( t 0 ) e A ( t − t 0 ) + ∫ t 0 t e A ( t − τ ) B u ( τ ) d τ (16) x(t)=x(t_0)e^{A(t-t_0)}+\int_{t_0}^t e^{A(t-\tau)} Bu(\tau)d{\tau} \tag{16} x(t)=x(t0)eA(tt0)+t0teA(tτ)Bu(τ)dτ(16)
式(16)的证明过程如下

证明

将状态方程(12)移项并左右同乘 e − A t e^{-At} eAt
e − A t ( x ˙ ( t ) − A x ( t ) ) = e − A t B u ( t ) (17) e^{-At}(\dot{x}(t)-Ax(t))=e^{-At}Bu(t) \tag{17} eAt(x˙(t)Ax(t))=eAtBu(t)(17)
上式整理可得
d ( e − A t x ( t ) ) d t = e − A t B u ( t ) (18) \frac{d(e^{-At}x(t))}{dt}=e^{-At}Bu(t) \tag{18} dtd(eAtx(t))=eAtBu(t)(18)
方程左右同时积分得
∫ t 0 t d ( e − A τ x ( τ ) ) d τ d τ = ∫ t 0 t e − A τ B u ( τ ) d τ (19) \int_{t_0}^t \frac{d(e^{-A\tau}x(\tau))}{d\tau} d\tau=\int_{t_0}^te^{-A\tau}Bu(\tau)d\tau \tag{19} t0tdτd(eAτx(τ))dτ=t0teAτBu(τ)dτ(19)
化简可得
e − A t x ( t ) − e − A t 0 x ( t 0 ) = ∫ t 0 t e − A τ B u ( τ ) d τ (20) e^{-At}x(t)-e^{-At_0}x(t_0) =\int_{t_0}^te^{-A\tau}Bu(\tau)d\tau \tag{20} eAtx(t)eAt0x(t0)=t0teAτBu(τ)dτ(20)
移项可得
x ( t ) = x ( t 0 ) e A ( t − t 0 ) + ∫ t 0 t e A ( t − τ ) B u ( τ ) d τ (21) x(t)=x(t_0)e^{A(t-t_0)} + \int_{t_0}^te^{A(t-\tau)}Bu(\tau)d\tau \tag{21} x(t)=x(t0)eA(tt0)+t0teA(tτ)Bu(τ)dτ(21)

设离散系统的采样时间间隔为 T T T,则离散时间 t k + 1 = t k + T t_{k+1}=t_k + T tk+1=tk+T,结合(12)式状态微分方程的解(16)可得
x ( t k + 1 ) = x ( t k ) e A ( t k + 1 − t k ) + ∫ t k t k + 1 e A ( t k + 1 − τ ) B u ( τ ) d τ (22) x(t_{k+1})=x(t_k)e^{A(t_{k+1}-t_k)} + \int_{t_k}^{t_{k+1}}e^{A(t_{k+1}-\tau)}Bu(\tau)d\tau \tag{22} x(tk+1)=x(tk)eA(tk+1tk)+tktk+1eA(tk+1τ)Bu(τ)dτ(22)
根据零阶保持器的特性(即动态系统的输入 u ( t ) u(t) u(t)在每一个采样时间内保持不变)。可得
u ( t ) = u ( t k )          t k ≤ t < t k + 1 (23) u(t)=u(t_k) \;\;\;\; t_k \leq t \lt t_{k+1} \tag{23} u(t)=u(tk)tkt<tk+1(23)
因此结合 t k + 1 − t k = T t_{k+1}-t_k = T tk+1tk=T,可将式(22)写为
x ( t k + 1 ) = x ( t k ) e A T + B u ( t k ) ∫ t k t k + T e A ( t k + T − τ ) d τ = e A T x ( t k ) + ( ∫ t k t k + T e A ( t k + T − τ ) d τ ) B u ( t k ) = e A T x ( t k ) + ( − A − 1 e A ( t k + T − τ ) ∣ t k t k + T ) B u ( t k ) = e A T x ( t k ) + ( − A − 1 ( e 0 − e A T ) ) B u ( t k ) = e A T x ( t k ) + A − 1 ( e A T − I ) B u ( t k ) (24) \begin{align*} x(t_{k+1})&=x(t_k)e^{AT} + Bu(t_k)\int_{t_k}^{t_k+T}e^{A(t_k+T-\tau)}d\tau \\ &=e^{AT}x(t_k) + (\int_{t_k}^{t_k+T}e^{A(t_k+T-\tau)}d\tau)Bu(t_k) \\ &=e^{AT}x(t_k) + (-A^{-1}e^{A(t_k+T-\tau)}\bigg|_{t_k}^{t_k+T})Bu(t_k) \\ &=e^{AT}x(t_k) + (-A^{-1}(e^0-e^{AT}))Bu(t_k) \\ &=e^{AT}x(t_k) + A^{-1}(e^{AT}-I)Bu(t_k) \\ \end{align*} \tag{24} x(tk+1)=x(tk)eAT+Bu(tk)tktk+TeA(tk+Tτ)dτ=eATx(tk)+(tktk+TeA(tk+Tτ)dτ)Bu(tk)=eATx(tk)+(A1eA(tk+Tτ) tktk+T)Bu(tk)=eATx(tk)+(A1(e0eAT))Bu(tk)=eATx(tk)+A1(eATI)Bu(tk)(24)
根据上式可得零阶保持法离散化后的微分方程:
{ x ( k + 1 ) = F x ( k ) + G u ( k ) F = e A T G = A − 1 ( e A T − I ) B = A − 1 ( F − I ) B (25) \begin{cases} x(k+1)=Fx(k)+Gu(k)\\ F=e^{AT}\\ G=A^{-1}(e^{AT}-I)B = A^{-1}(F-I)B \end{cases} \tag{25} x(k+1)=Fx(k)+Gu(k)F=eATG=A1(eATI)B=A1(FI)B(25)

车辆运动学离散化

对(11)式进行前向欧拉离散化,可得
X e ( k ) ˙ = X e ( k + 1 ) − X e ( k ) T = A X e ( k ) + B u e ( k ) (26) \dot{X_e(k)}= \frac{X_e(k+1)-X_e(k)}{T}= AX_e(k)+Bu_e(k) \tag{26} Xe(k)˙=TXe(k+1)Xe(k)=AXe(k)+Bue(k)(26)
整理后的矩阵形式如下所示
X e ( k + 1 ) = ( T A + I ) A X e ( k ) + T B u e ( k ) = [ 1 0 − T v r s i n φ r 0 1 T v r c o s φ r 0 0 1 ] [ x − x r y − y r φ − φ r ] + [ T c o s φ r 0 T s i n φ r 0 T v r t a n δ f r L T v r L c o s 2 δ f r ] [ v − v r δ − δ r ] (27) \begin{align*} X_e(k+1)&=(TA+I)AX_e(k)+TBu_e(k)\\ &= \begin{bmatrix} 1 & 0 & -Tv_rsin\varphi_r\\ 0 & 1 & Tv_rcos\varphi_r\\ 0 & 0 & 1\\ \end{bmatrix} \begin{bmatrix} x-x_r\\ y-y_r\\ \varphi-\varphi_r\\ \end{bmatrix} + \begin{bmatrix} Tcos\varphi_r & 0 \\ Tsin\varphi_r & 0 \\ \frac{Tv_r tan\delta_{fr}}{L} & \frac{Tv_r}{Lcos^2\delta_{fr}} \\ \end{bmatrix} \begin{bmatrix} v-v_r\\ \delta-\delta_r\\ \end{bmatrix} \\ \end{align*} \tag{27} Xe(k+1)=(TA+I)AXe(k)+TBue(k)= 100010TvrsinφrTvrcosφr1 xxryyrφφr + TcosφrTsinφrLTvrtanδfr00Lcos2δfrTvr [vvrδδr](27)
其中 T T T为采样步长, I I I为3x3的单位矩阵。

代码实现

python代码实现基于前面文章用到的车辆运动学模型,新增update_ABMatrix(vehicle, ref_delta, ref_yaw)方法实现,其中vehicleVehicle类实例,ref_deltaref_yaw分别为当前时刻参考线匹配点对应的角度变化 δ f r \delta_{fr} δfr和航向角 φ r \varphi_r φr,具体实现如下

import math
import numpy as np

class Vehicle:
    def __init__(self,
                 x=0.0,
                 y=0.0,
                 yaw=0.0,
                 v=0.0,
                 dt=0.1,
                 l=3.0):
        self.steer = 0
        self.x = x
        self.y = y
        self.yaw = yaw
        self.v = v
        self.dt = dt
        self.L = l  # 轴距
        self.x_front = x + l * math.cos(yaw)
        self.y_front = y + l * math.sin(yaw)

    def update(self, a, delta, max_steer=np.pi):
        delta = np.clip(delta, -max_steer, max_steer)
        self.steer = delta

        self.x = self.x + self.v * math.cos(self.yaw) * self.dt
        self.y = self.y + self.v * math.sin(self.yaw) * self.dt
        self.yaw = self.yaw + self.v / self.L * math.tan(delta) * self.dt

        self.v = self.v + a * self.dt
        self.x_front = self.x + self.L * math.cos(self.yaw)
        self.y_front = self.y + self.L * math.sin(self.yaw)


class VehicleInfo:
    # Vehicle parameter
    L = 3.0  # 轴距
    W = 2.0  # 宽度
    LF = 3.8  # 后轴中心到车头距离
    LB = 0.8  # 后轴中心到车尾距离
    MAX_STEER = 0.6  # 最大前轮转角
    TR = 0.5  # 轮子半径
    TW = 0.5  # 轮子宽度
    WD = W  # 轮距
    LENGTH = LB + LF  # 车辆长度

def draw_vehicle(x, y, yaw, steer, ax, vehicle_info=VehicleInfo, color='black'):
    vehicle_outline = np.array(
        [[-vehicle_info.LB, vehicle_info.LF, vehicle_info.LF, -vehicle_info.LB, -vehicle_info.LB],
         [vehicle_info.W / 2, vehicle_info.W / 2, -vehicle_info.W / 2, -vehicle_info.W / 2, vehicle_info.W / 2]])

    wheel = np.array([[-vehicle_info.TR, vehicle_info.TR, vehicle_info.TR, -vehicle_info.TR, -vehicle_info.TR],
                      [vehicle_info.TW / 2, vehicle_info.TW / 2, -vehicle_info.TW / 2, -vehicle_info.TW / 2,
                       vehicle_info.TW / 2]])

    rr_wheel = wheel.copy()  # 右后轮
    rl_wheel = wheel.copy()  # 左后轮
    fr_wheel = wheel.copy()  # 右前轮
    fl_wheel = wheel.copy()  # 左前轮
    rr_wheel[1, :] += vehicle_info.WD / 2
    rl_wheel[1, :] -= vehicle_info.WD / 2

    # 方向盘旋转
    rot1 = np.array([[np.cos(steer), -np.sin(steer)],
                     [np.sin(steer), np.cos(steer)]])
    # yaw旋转矩阵
    rot2 = np.array([[np.cos(yaw), -np.sin(yaw)],
                     [np.sin(yaw), np.cos(yaw)]])
    fr_wheel = np.dot(rot1, fr_wheel)
    fl_wheel = np.dot(rot1, fl_wheel)
    fr_wheel += np.array([[vehicle_info.L], [-vehicle_info.WD / 2]])
    fl_wheel += np.array([[vehicle_info.L], [vehicle_info.WD / 2]])

    fr_wheel = np.dot(rot2, fr_wheel)
    fr_wheel[0, :] += x
    fr_wheel[1, :] += y
    fl_wheel = np.dot(rot2, fl_wheel)
    fl_wheel[0, :] += x
    fl_wheel[1, :] += y
    rr_wheel = np.dot(rot2, rr_wheel)
    rr_wheel[0, :] += x
    rr_wheel[1, :] += y
    rl_wheel = np.dot(rot2, rl_wheel)
    rl_wheel[0, :] += x
    rl_wheel[1, :] += y
    vehicle_outline = np.dot(rot2, vehicle_outline)
    vehicle_outline[0, :] += x
    vehicle_outline[1, :] += y

    ax.plot(fr_wheel[0, :], fr_wheel[1, :], color)
    ax.plot(rr_wheel[0, :], rr_wheel[1, :], color)
    ax.plot(fl_wheel[0, :], fl_wheel[1, :], color)
    ax.plot(rl_wheel[0, :], rl_wheel[1, :], color)

    ax.plot(vehicle_outline[0, :], vehicle_outline[1, :], color)
    ax.axis('equal')


def update_ABMatrix(vehicle, ref_delta, ref_yaw):
    """
    计算离散线性车辆运动学模型状态矩阵A和输入矩阵B
    return: A, B
    """
    A = np.matrix([
        [1.0, 0.0, -vehicle.v * vehicle.dt * math.sin(ref_yaw)],
        [0.0, 1.0, vehicle.v * vehicle.dt * math.cos(ref_yaw)],
        [0.0, 0.0, 1.0]])

    B = np.matrix([
        [vehicle.dt * math.cos(ref_yaw), 0],
        [vehicle.dt * math.sin(ref_yaw), 0],
        [vehicle.dt * math.tan(ref_delta) / vehicle.L,
         vehicle.v * vehicle.dt / (vehicle.L * math.cos(ref_delta) * math.cos(ref_delta))]])
    return A, B

文章首发公众号:iDoitnow如果喜欢话,可以关注一下

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Part I 基础篇 OpenCV 开发基础. 1 第 1 章初识 OpenCV.. 3 1.1 OpenCV 初识 4 1.1.1 OpenCV 简介.. 4 1.1.2 OpenCV 组件及架构.. 5 1.1.3 OpenCV 资源.. 9 1.2 VS2012 安装OpenCV2.4.x .. 9 1.3 VS2013 安装OpenCV3.0 14 1.4 Sublime 下配置OpenCV. 16 1.5 小结 19 第2 章图像及视频基本操作. 20 2.1 图像初级操作 21 2.1.1 Mat 类 21 2.1.2 Mat 基本操作 23 2.1.3 Mat 类型转换 24 2.1.4 图像读取显示保存 24 2.1.5 图像存储. 26 2.2 图像几何变换 28 2.2.1 坐标映射. 28 2.2.2 平移 29 2.2.3 缩放 33 2.2.4 旋转 36 2.2.5 仿射变换. 40 2.3 视频操作.. 43 2.3.1 VideoCapture 类.. 43 2.3.2 视频写操作 45 2.3.3 视频质量评价.. 48 2.4 图像基础应用操作. 50 2.4.1 界面事件. 50 2.4.2 区域提取. 54 2.4.3 图像元素遍历——反色.. 58 2.4.4 单窗口显示多幅图像 63 2.4.5 图像颜色空间转换 66 2.4.6 图像批量读取——规则.. 69 2.4.7 图像批量读取——无规则. 70 2.5 小结 71 Part II 进阶篇图像处理技术.. 73 第 3 章进阶篇——图像灰度变换技术. 75 3.1 阈值化处理. 76 3.1.1 OTSU 阈值化 76 3.1.2 固定阈值化 79 3.1.3 自适应阈值化.. 81 3.1.4 双阈值化. 83 3.1.5 半阈值化. 84 3.2 直方图处理. 85 3.2.1 灰度直方图 85 3.2.2 H-S 直方图. 88 3.2.3 BGR 直方图.. 89 3.2.4 自定义直方图.. 91 3.2.5 灰度直方图均衡. 93 3.2.6 彩色直方图均衡. 94 3.2.7 直方图变换——查找 95 3.2.8 直方图变换——累计 97 3.2.9 直方图匹配 99 3.2.10 直方图对比.. 101 3.2.11 直方图的反向投影 105 3.3 距离变换 108 3.3.1 距离. 108 3.3.2 邻接性 109 3.3.3 区域..110 3.3.4 距离变换——扫描..110 3.3.5 距离变换——distanceTransform..113 3.4 Gamma 校正.115 3.5 其他常见的灰度变换技术117 3.5.1 线性变换117 3.5.2 对数变换119 3.5.3 对比度拉伸. 121 3.5.4 灰度级分层. 124 3.5.5 灰度比特平面 125 3.6 实例应用 128 3.6.1 最大熵阈值分割.. 128 3.6.2 投影峰谷查找 131 3.7 小结. 134 第4 章进阶篇——图像平滑技术.. 135 4.1 图像采样 136 4.1.1 最近邻插值. 136 4.1.2 双线性插值. 138 4.1.3 插值操作性能对比. 140 4.1.4 图像金字塔. 143 4.2 傅里叶变换.. 146 4.2.1 图像掩码操作 146 4.2.2 离散傅里叶. 149 4.2.3 图像卷积.. 151 4.3 图像噪声 153 4.3.1 椒盐噪声.. 153 4.3.2 高斯噪声.. 155 4.4 空间平滑 157 4.4.1 盒滤波 157 4.4.2 均值滤波.. 159 4.4.3 中值滤波.. 159 4.4.4 高斯滤波.. 161 4.4.5 双边滤波.. 163 4.5 实例应用 166 4.5.1 导向滤波.. 166 4.5.2 图像污点修复 169 4.5.3 旋转文本图像矫正. 172 4.6 小结. 178 第5 章进阶篇——边缘检测技术.. 179 5.1 边缘检测基础. 180 5.1.1 边缘检测概念 180 5.1.2 梯度算子.. 180 5.1.3 一阶微分算子 180 5.1.4 二阶微分算子 181 5.1.5 图像差分运算 182 5.1.6 非极大值抑制 184 5.2 基本边缘检测算子——Sobel 184 5.2.1 非极大值抑制Sobel 检测.. 185 5.2.2 图像直接卷积实现Sobel 186 5.2.3 图像卷积下非极大值抑制Sobel. 187 5.2.4 Sobel 库函数实现 190 5.3 基本边缘检测算子——Laplace 192 5.4 基本边缘检测算子——Roberts 194 5.5 基本边缘检测算子——Prewitt. 195 5.6 改进边缘检测算子——Canny .. 198 5.6.1 Canny 算子.. 198 5.6.2 Canny 原理及实现.. 198 5.6.3 Canny 库函数实现.. 203 5.7 改进边缘检测算子——Marr-Hildreth .. 204 5.8 几何检测 207 5.8.1 霍夫变换.. 207 5.8.2 线检测技术. 208 5.8.3 LSD 快速直线检测. 210 5.8.4 圆检测技术. 214 5.9 形状检测 215 5.9.1 轮廓检测.. 215 5.9.2 凸包检测.. 217 5.9.3 轮廓边界框. 221 5.9.4 轮廓矩 226 5.9.5 点多边形测试 229 5.10 角点检测. 232 5.10.1 moravec 角点 232 5.10.2 harris 角点. 235 5.10.3 Shi-Tomasi 角点. 238 5.11 实例应用. 240 5.11.1 颜色圆检测.. 240 5.11.2 车牌区域检测.. 243 5.12 小结 249 第6 章进阶篇——形态学技术. 250 6.1 腐蚀膨胀操作. 251 6.2 开闭运算操作. 253 6.3 形态学梯度.. 255 6.4 形态学Top-Hat.. 256 6.5 实例应用 257 6.5.1 形态学滤波角点提取. 257 6.5.2 车牌目标提取 260 6.6 小结. 263 Part III 高级篇图像应用技术. 265 第 7 章高级篇——图像分割技术.. 267 7.1 分水岭分割.. 268 7.1.1 分水岭的特征 268 7.1.2 实现分水岭分割.. 269 7.1.3 分水岭分割合并.. 270 7.2 FloodFill 分割. 273 7.3 均值漂移MeanShift 276 7.4 图割Grabcut 279 7.5 实例实例 282 7.5.1 奇异区域检测 282 7.5.2 肤色检测.. 285 7.6 小结. 288 第8 章高级篇——特征分析.. 289 8.1 尺度空间 290 8.1.1 尺度与旋转不变性. 290 8.1.2 特征点尺度变换.. 290 8.2 特征描述子.. 291 8.2.1 SIFT 特征. 292 8.2.2 SURF 特征.. 296 8.2.3 ORB 特征. 300 8.3 方向梯度直方图HOG 302 8.3.1 HOG 原理. 302 8.3.2 HOG 特征提取步骤 303 8.3.3 HOGDescriptor 特征描述类.. 304 8.3.4 HOG 特征描述实现 305 8.4 局部二值模式LBP.. 309 8.4.1 经典LBP.. 309 8.4.2 圆形LBP311 8.5 Haar 特征描述 314 8.5.1 Haar 原理. 314 8.5.2 Haar 特征提取 315 8.6 应用实例 317 8.6.1 最近邻特征点目标提取 317 8.6.2 最大极值稳定区域匹配MSER 320 8.6.3 字符特征提取 324 8.6.4 车牌字符SVM 训练.. 327 8.7 小结. 331 第 9 章高级篇——复杂视频处理技术.. 332 9.1 视频稳像技术. 333 9.2 图像拼接 338 9.2.1 拼接原理及过程.. 338 9.2.2 图像拼接实现 339 9.3 高动态范围图像HDR 342 9.3.1 HDR 合成技术.. 342 9.3.2 HDR 合成原理.. 342 9.3.3 OpenCV 实现. 343 9.4 背景建模 344 9.4.1 背景差分.. 345 9.4.2 混合高斯背景建模. 345 9.4.3 混合高斯背景建模实现 346 9.4.4 混合模型MOG2 成员参数设定. 348 9.4.5 KNN 模型背景建模实现. 349 9.4.6 GMG 模型背景建模实现 351 9.5 级联分类器——人脸检测.. 353 9.5.1 级联分类器. 353 9.5.2 CascadeClassifier 类 353 9.6 应用实例 355 9.6.1 运动目标提取 355 9.6.2 TLD 单目标跟踪.. 358 9.6.3 人眼检测与跟踪.. 361 9.7 小结. 365 附录A 366 1——代码清单.. 366 2——CMake 编译OpenCV3.1 源码. 372 3——OpenCV3.1 Extra 扩展库 375 参考文献.... 379
摘要:绿色低碳的现代能源体系背景下,清洁能源的安全高效利用对加快能源结构调整及推进生态文明建设意义重大。作为清洁能源转换的核心设备,水电、风电机组的巨型化和耦合化使得其运行过程中的振动问题和故障风险日益突出,这对系统的振动信号分析与早期故障辨识方法提出了更高要求。因此,本文以水轮发电机组、风力发电机组等大型旋转机械为研究对象,通过凝炼系统早期故障诊断中的关键科学问题,解析了多故障源耦合激励下的系统非线性动力学特性和故障机理,深入开展了基于噪声干扰抑制和噪声辅助分析的早期故障信号辨识理论研究,提出了大型旋转机械复合故障分离与特征提取方法,构建了系统关键设备性能评估与劣化分析模型,对保障机组安全稳定运行和推进状态检修体制改革具有一定的理论创新意义和工程应用价值。论文主要研究工作及创新性成果如下:(1)针对大型旋转机械中贯流式机组操作油管不对中、受油器松动及操作油管与浮动瓦碰摩问题,建立了考虑操作油杂质影响的时变非线性油膜力模型,并搭建了多源激励下的机组耦合故障动力学模型,研究了系统随不对中分量、操作油杂质和受油器径向刚度等参数变化出现的周期运动、拟周期运动等非线性动力学行为,揭示了多故障源耦合激励下的系统动力学特性和故障机理。(2)针对大型旋转机械早期故障辨识受强背景噪声干扰问题,开展了基于噪声干扰抑制的微弱故障信号检测研究,一方面,分析了噪声强度对传统经验模态分解降噪算法中最优分量重构效果的影响,研究了不同固有模态分量重构后信号概率密度函数的豪斯多夫距离变化趋势,提出了一种基于重构信号概率密度函数相似性的经验模态分解降噪算法;另一方面,讨论了大幅值噪声信号对传统经验模态分解降噪算法中固有模态分量阈值处理效果的影响,引入了熵阈值代替直接对每个分量的采样点进行阈值化,并结合分位数理论构建了多尺度阈值并计算了原始信号所在区域的故障概率,提出了一种基于概率熵阈值的经验模态分解降噪算法。通过模型仿真、实验和工程实例验证了所提出降噪算法在大型旋转机械微弱故障信号检测中的有效性。(3)考虑基于噪声辅助分析理论随机共振来增强大型旋转机械早期故障特征,定性和定量分析了不同噪声强度下二维Duffing振子模型随机共振方法的周期特征增强效果,推导了二维Duffing振子模型随机共振现象发生的必要条件,并研究了不同参数条件下系统输出信号特征幅值随噪声强度的变化趋势。在此基础上构造了基于排列熵的信号筛选准则并提出了基于二维部分Duffing振子模型随机共振理论的故障特征增强算法,实现了噪声能量向故障信号的最大化转移,并成功应用于大型旋转机械早期磨损故障特征识别。(4)针对大型旋转机械中风电机组早期复合故障特征耦合及微弱故障信号难以识别问题,分析了复合故障模式下快速峭度图中的多个谱峭度极大值现象,建立了带通滤波器模型进行解卷积处理获取显著故障信号,并构建了带阻滤波器模型进行窄带带阻滤波滤除显著共振频谱信号从而抑制其对微弱故障特征识别影响,提出了基于连续谱峭度解卷积的早期复合故障诊断方法。通过典型模型仿真和工程实例应用表明所提出算法有效实现了大型旋转机械复合故障分离和微弱故障特征提取。(5)考虑到大型旋转机械关键设备的性能对整个系统安全稳定运行的重要性,从故障概率变化的角度开展了基于逻辑回归理论的设备劣化趋势分析和状态评估研究,引入了改进K均值聚类算法对逻辑回归模型的自变量进行离散化处理来增强模型泛化能力和鲁棒性,建立了基于数据驱动的大型旋转机械关键设备性能评估模型,并成功应用于工程实例中设备故障演化过程分析,同时对大型旋转机械早期故障辨识也有一定指导意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艰默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值