探索分布式驱动车辆状态估计模型的联合仿真之旅
分布式驱动车辆状态估计模型基于Carsim和simulink联合仿真,首先建立分布式驱动车辆轮边电机模型,并使用pid对目标速度进行跟踪,随后在使用级联滑模观测器(ASMO)和车轮运动模型对轮胎力进行观测的基础上,使用UKF SRCKF算法对侧向车速,纵向车速,横摆角速度,质心侧偏角进行估计。
最近在研究分布式驱动车辆状态估计模型,通过 Carsim 和 Simulink 的联合仿真,能得到许多有意思的成果,今天就来跟大家分享分享。
建立轮边电机模型与 PID 速度跟踪
在这个模型构建过程中,首先得建立分布式驱动车辆轮边电机模型。轮边电机直接驱动车轮,这为车辆提供了更精准的动力控制。以简单的直流电机模型为例,其基本的电压平衡方程为:
\[U = iR + L\frac{di}{dt} + e\]

其中 \(U\) 是电机输入电压,\(i\) 是电流,\(R\) 是电阻,\(L\) 是电感,\(e\) 是反电动势。在 Simulink 里构建这个模型,就需要按照这个方程搭建相应的模块。
而对于目标速度跟踪,PID 控制器是个很好用的工具。PID 控制器的输出 \(u(t)\) 由比例(P)、积分(I)、微分(D)三部分组成,公式如下:
\[u(t)=Kp e(t)+Ki \int{0}^{t} e(\tau)d\tau + Kd \frac{de(t)}{dt}\]

这里 \(e(t)\) 是目标速度与当前速度的误差,\(Kp\)、\(Ki\)、\(K_d\) 分别是比例、积分、微分系数。在代码实现上,Matlab 代码可以类似这样写:
% 设定PID参数
Kp = 0.5;
Ki = 0.1;
Kd = 0.05;
% 初始化误差和积分项
prev_error = 0;
integral = 0;
% 假设的目标速度和当前速度
target_speed = 100; % km/h
current_speed = 80; % km/h
for n = 1:100 % 模拟时间步
error = target_speed - current_speed;
integral = integral + error;
derivative = error - prev_error;
control_signal = Kp * error + Ki * integral + Kd * derivative;
% 根据control_signal调整电机输入,这里省略具体调整代码
prev_error = error;
% 更新当前速度,这里省略具体更新代码
end
这段代码简单模拟了 PID 控制器在速度跟踪中的运行逻辑,不断计算误差并调整控制信号以让当前速度逼近目标速度。
轮胎力观测与状态估计
在对轮胎力进行观测时,用到了级联滑模观测器(ASMO)和车轮运动模型。滑模观测器利用系统的不连续控制,使系统状态在滑模面上滑动,从而实现对未知量的观测。
分布式驱动车辆状态估计模型基于Carsim和simulink联合仿真,首先建立分布式驱动车辆轮边电机模型,并使用pid对目标速度进行跟踪,随后在使用级联滑模观测器(ASMO)和车轮运动模型对轮胎力进行观测的基础上,使用UKF SRCKF算法对侧向车速,纵向车速,横摆角速度,质心侧偏角进行估计。
以简单的一阶系统滑模观测器为例,假设系统方程为 \(\dot{x} = ax + bu + d\),其中 \(d\) 是干扰。滑模观测器的设计如下:

\[\hat{\dot{x}} = a\hat{x} + bu + K\text{sgn}(x - \hat{x})\]
这里 \(\hat{x}\) 是估计值,\(K\) 是滑模增益,\(\text{sgn}\) 是符号函数。在 Simulink 中搭建时,要根据这个结构来连接各个模块实现观测功能。
在对侧向车速、纵向车速、横摆角速度、质心侧偏角进行估计时,使用了 UKF(Unscented Kalman Filter)和 SRCKF(Spherical Radial Cubature Kalman Filter)算法。UKF 算法通过对状态变量进行采样,利用无味变换来近似非线性系统的均值和协方差。

以下是简单的 UKF 算法 Matlab 伪代码框架:
% 初始化参数
x_hat = zeros(n,1); % 状态估计
P = eye(n); % 估计协方差
% 设定过程噪声和观测噪声协方差
Q = eye(n);
R = eye(m);
% 时间更新
sigma_points = UT(x_hat, P);
for i = 1:2n+1
x_pred = x_pred + Wm(i) * f(sigma_points(:,i));
P_pred = P_pred + Wc(i) * (f(sigma_points(:,i)) - x_pred) * (f(sigma_points(:,i)) - x_pred)';
end
P_pred = P_pred + Q;
% 测量更新
y_hat = zeros(m,1);
for i = 1:2n+1
y_hat = y_hat + Wm(i) * h(sigma_points(:,i));
end
P_yy = zeros(m,m);
P_xy = zeros(n,m);
for i = 1:2n+1
P_yy = P_yy + Wc(i) * (h(sigma_points(:,i)) - y_hat) * (h(sigma_points(:,i)) - y_hat)';
P_xy = P_xy + Wc(i) * (sigma_points(:,i) - x_pred) * (h(sigma_points(:,i)) - y_hat)';
end
P_yy = P_yy + R;
K = P_xy / P_yy;
z = z_measured - y_hat;
x_hat = x_pred + K * z;
P = P_pred - K * P_yy * K';
这里通过一系列的计算,实现了状态的预测和更新。SRCKF 算法则是在一些复杂系统中有更好的表现,它基于球径向容积规则来计算积分,从而更准确地估计系统状态。
通过 Carsim 和 Simulink 的联合仿真,利用上述的模型和算法,我们能够对分布式驱动车辆的状态进行较为精确的估计,为车辆的进一步控制和优化提供了有力的支持。希望这篇博文能给对这方面感兴趣的朋友一些启发。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)