车辆横向控制-状态反馈


概述

根据车辆模型-跟踪误差模型,在小滑移角假设下,车辆横向动力学模型的状态空间方程可以写为
x ˙ = A x + B 1 δ + B 2 ψ ˙ d e s (1) \dot{x} = Ax + B_1\delta + B_2\dot{\psi}_{des} \tag{1} x˙=Ax+B1δ+B2ψ˙des(1)

其中, x = [ e y , e ˙ y , e ψ , e ˙ ψ ] T x = [e_y,\dot{e}_y,e_\psi,\dot{e}_{\psi}]^T x=[ey,e˙y,eψ,e˙ψ]T e y e_y ey代表车辆重心与目标曲线的距离, e ψ e_{\psi} eψ代表车辆与目标跟踪曲线之间的偏航角误差, δ \delta δ代表前轮转向角, ψ ˙ d e s \dot{\psi}_{des} ψ˙des代表期望偏航角速度,该参数由道路曲率和车速决定,矩阵 A A A B 1 B_1 B1 B 2 B_2 B2车辆模型-跟踪误差模型中已经提出。

仿真

使用实际车辆的参数带入上述动力学模型中

物理量数值单位
质量( M M M)1573 k g kg kg
z z z轴转动惯量( I z I_z Iz)2873 k s / m 2 ks/m^2 ks/m2
前轴到重心距离( l f l_f lf)1.10 m m m
后轴到重心距离( l r l_r lr)1.58 m m m
前轮总侧偏刚度( C α f C_{\alpha f} Cαf)80000 N / r a d N/rad N/rad
后轮总侧偏刚度( C α r C_{\alpha r} Cαr)80000 N / r a d N/rad N/rad
x x x轴速度( V x V_x Vx)30 m / s m/s m/s
转弯半径( R R R)1000 m m m

开环系统

如下图所示,对于开环系统,矩阵 A A A有两个特征值位于坐标原点,所以系统是不稳定的。

闭环系统

研究表明, ( A , B 1 ) (A,B_1) (A,B1)对是可控的,因此使用状态反馈法
δ = − K x = − k 1 e y − k 2 e ˙ y − k 3 e ψ − k 4 e ˙ ψ (2) \delta = -Kx = -k_1e_y - k_2\dot{e}_y - k_3e_{\psi} - k_4\dot{e}_{\psi} \tag{2} δ=Kx=k1eyk2e˙yk3eψk4e˙ψ(2)
闭环矩阵 ( A − B K ) (A - BK) (ABK)的特征值可以放置于任何想要的位置,闭环系统的状态反馈控制如下:
x ˙ = ( A − B 1 K ) x + B 2 ψ ˙ d e s (3) \dot{x} = (A - B_1K)x + B_2\dot{\psi}_{des} \tag{3} x˙=(AB1K)x+B2ψ˙des(3)
使用Python的control库中的place函数去设置闭环系统的特征值

K = ct.place(A,B1,P)

上述函数产生一个反馈矩阵 K K K,使得矩阵 ( A − B 1 K ) (A - B_1K) (AB1K)的特征值位于指定向量 P P P的位置。
下面将特征值放置在 [ − 5 − 3 j − 5 + 3 j − 7 − 10 ] T \begin{bmatrix}-5-3j&-5+3j&-7&-10\end{bmatrix}^T [53j5+3j710]T位置,零极点分布如下:

阶跃响应如下:

仿真代码

import numpy as np
import control as ct
import matplotlib.pyplot as plt

# 车辆参数
M   = 1573.0 #(kg) 总质量 mass
I_z = 2873.0 # (kg/m^2) 绕Z轴的转动惯量 
l_f = 1.10  # (m)
l_r = 1.58  # (m)
C_alpha_f = 80000.0 #(N/rad) 前轮总侧偏刚度
C_alpha_r = 80000.0 #(N/rad) 后轮总侧偏刚度
V_x = 30.0 # (m/s)

A = np.array([
        [0.,1.,0.,0.],
        [0.,-2.*(C_alpha_f + C_alpha_r)/(M*V_x),2.*(C_alpha_f + C_alpha_r)/M,-2.*(C_alpha_f*l_f - C_alpha_r*l_r)/(M*V_x)],
        [0.,0.,0.,1.],
        [0.,-2.*(C_alpha_f*l_f - C_alpha_r*l_r)/(I_z*V_x),2.*(C_alpha_f*l_f - C_alpha_r*l_r)/I_z,-2.*(C_alpha_f*l_f**2 + C_alpha_r*l_r**2)/(I_z*V_x)]
        ])

B1 = np.array([
        [0.],
        [2.*C_alpha_f/M],
        [0.],
        [2.*l_f*C_alpha_f/I_z]
        ])

B2 = np.array([[0.],[-2.*(C_alpha_f*l_f - C_alpha_r*l_r)/(M*V_x) - V_x],[0.],[-2.*(C_alpha_f*l_f**2 + C_alpha_r*l_r**2)/(I_z*V_x)]])

C = np.array([[1., 0., 0.,0.],[0.,1.,0.,0.],[0.,0.,1.,0.],[0.,0.,0.,1.]])

D = np.array([[0.],[0.],[0.],[0]])

w,v = np.linalg.eig(A) # 求取数组的特征值
print("特征值:",w)
#print(v)
P = np.array([-5.-3.j,-5.+3.j,-7.,-10.])
K = ct.place(A,B1,P)
print("反馈值K:",K)

sys_init = ct.ss(A,B1,C,D)
ct.pzmap(sys_init)
sys_task = ct.ss(A-B1*K,B2,C,D)
ct.pzmap(sys_task)

t = np.linspace(0, 10, 101)
u = np.zeros(len(t))
u[11:101] = 0.03 #rad/s

f_t,f_yout,f_xout = ct.forced_response(sys_task,t,u)

#plt.close()
plt.figure()
plt.clf()

plt.subplot(3,1,1)
plt.grid()
plt.ylabel("(rad/s)")
plt.plot(f_t,u)
plt.subplot(3,1,2)
plt.grid()
plt.ylabel("e1:(m)")
plt.plot(f_t,f_yout[0])
plt.subplot(3,1,3)
plt.grid()
plt.xlabel("time:(s)")
plt.ylabel("e2:(rad)")
plt.plot(f_t,f_yout[2])

结论

由于 B 2 ψ ˙ d e s B_2\dot{\psi}_{des} B2ψ˙des项的存在,,即使矩阵 ( A − B 1 K ) (A - B_1K) (AB1K)稳定的情况下,跟踪误差也无法达到0。稳定状态下的 e y e_y ey e ψ e_{\psi} eψ不为0,主要因为道路曲率 ψ ˙ d e s \dot{\psi}_{des} ψ˙des不为0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

henry.zhu51

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

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

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

打赏作者

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

抵扣说明:

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

余额充值