线控转向系统 Carsim和Simulink联合仿真模型。 基于横摆角速度增益不变的变传动比模块。 图中分别为角阶跃工况 和 双移线工况 汽车对应的响应曲线,并且与Carsim自带的机械转向对比图。
线控转向系统 Carsim和Simulink联合仿真模型。基于横摆角速度增益不变的变传动比模块。图中分别为角阶跃工况 和 双移线工况 汽车对应的响应曲线并且与Carsim自带的机械转向对比图。这是一个非常专业的汽车动力学控制仿真需求。要实现线控转向SBW与 Carsim 的联合仿真并验证基于横摆角速度增益不变的变传动比策略你需要完成以下三个核心步骤Simulink 模型搭建构建变传动比计算模块核心算法。Carsim 设置配置车辆模型并启用外部转向输入。联合仿真与后处理运行角阶跃和双移线工况提取数据并绘制对比曲线。自动创建 Simulink 模型框架。生成核心的变传动比VGRS-Function 或 MATLAB Function 代码。提供批量运行 Carsim 联合仿真的脚本。自动绘制响应曲线对比图包含您描述的角阶跃和双移线工况。 项目结构说明请在 MATLAB 中创建一个文件夹包含以下文件main_simulation.m (主程序运行仿真、绘图)sbw_vgr_logic.m (核心算法变传动比计算)run_carsim_co_sim.m (联合仿真接口脚本)核心算法变传动比逻辑 (sbw_vgr_logic.m)这是实现“横摆角速度增益不变”策略的核心。原理理想状态下横摆角速度 omega_r 与方向盘转角 delta_{sw} 的关系应为线性且增益恒定。公式omega_r frac{v}{L(1Kv^2)} cdot delta_{f}我们需要反推前轮转角 delta_f使得 frac{omega_r}{delta_{sw}} G_{target} (常数)。function delta_f sbw_vgr_logic(delta_sw, v_x, vehicle_params)% SBW_VGR_LOGIC 基于横摆角速度增益不变的变传动比计算%% 输入:% delta_sw: 方向盘转角 (rad)% v_x: 车速 (m/s)% vehicle_params: 结构体包含 L (轴距), K (稳定性因数) 等%% 输出:% delta_f: 目标前轮转角 (rad)% --- 1. 参数提取 --- L vehicle_params.L; % 轴距 (m) K vehicle_params.K; % 稳定性因数 (s^2/m^2) % 防止除零或车速过低 if v_x 1.0) 0.05; elseif strcmp(scenario_name, DoubleLaneChange) % 双移线正弦组合或标准ISO轨迹 t_end 10; dt 0.01; time_vec (0:dt:t_end); % 简化正弦模拟双移线输入 steer_input 0.08 * sin(0.5 * time_vec) .* (time_vec 4 time_vec Carsim - Vehicle。 拖入 CARSIM S-Function 模块。 双击配置选择您的车辆模型 (.cpar)。 关键设置在 External Inputs 中勾选 Steering Angle (前轮转角)取消勾选 Steering Wheel Angle (因为我们要自己算前轮转角)。搭建控制逻辑 (SBW 核心)输入使用 From Workspace 模块读取 t_in 和 steer_cmd (方向盘转角)。Switch 模块输入1 (上)来自 steer_cmd (机械模式直接连通需除以固定传动比 16 得到前轮角)。输入2 (下)来自 MATLAB Function 模块。控制端来自 Constant 模块 (sbw_enable_flag)。MATLAB Function 模块双击编辑粘贴 sbw_vgr_logic.m 中的核心代码逻辑。输入端口u1 (方向盘角), u2 (车速从 Carsim 输出反馈回来)。输出端口y1 (计算后的前轮转角)。反馈回路从 Carsim 模块的输出端口引出 Vehicle Speed (vx)连回 MATLAB Function 模块。输出与示波器从 Carsim 模块输出 Yaw Rate, Lateral Acc, Y Position。连接 To Workspace 模块变量名分别设为 carsim_yaw_rate, carsim_ay, carsim_Y, carsim_time。设置 Save format 为 Array 或 Structure with Time。 预期结果分析运行 main_simulation.m 后您将看到四张图角阶跃 - 横摆角速度机械转向在不同车速下如果仿真中包含变速响应峰值会有较大差异可能存在超调。线控转向由于增益恒定无论车速如何在控制范围内单位方向盘转角产生的横摆角速度应保持一致响应曲线更平滑驾驶员手感一致性更好。双移线 - 横向位移线控转向车辆在高速避障时所需的驾驶员方向盘转角更小高速时传动比变小轨迹跟踪更精准车身姿态更稳定。CarSim 自带的 VS Visualizer可视化后处理工具显示的是一个“Quick Start Guide Example”仿真结果。图中包含 12 个子图展示了车辆在某种工况很可能是双移线或蛇形穿桩下的动态响应横向位移轨迹方向盘转角 / 手力车身侧偏角、横摆角速度车轮滑移角、垂向力加速度、侧倾角等✅ 1. MATLAB 脚本从 CarSim 结果文件中提取数据并复现这 12 张图✅ 2. Python Matplotlib 版本可选✅ 3. 如何配置 CarSim 输出这些信号✅ 4. 自定义 VS Visualizer 布局模板.vsl 文件结构说明 方案一MATLAB 脚本 —— 复现 VS Visualizer 的 12 子图假设您的 CarSim 仿真已运行完毕结果保存在 results.mat 或 CarSim 默认路径下。%% reproduce_carsim_visualizer.m% 复现 CarSim VS Visualizer 的 12 子图布局% 假设数据已从 CarSim 导出到 MATLAB 工作区clear; clc; close all;%% 1. 加载 CarSim 仿真结果示例从 .mat 文件加载% 实际使用时请替换为您的真实数据源% 可通过 CarSim - Tools - Export to MATLAB 获取变量名load(‘carsim_results.mat’); % 假设包含 time, Y, steer_ang, yaw_rate 等time linspace(0, 10, 1000);Y 5 * sin(0.time) . (time5); % 横向位移steer_ang 0.1 * sin(0.8time); % 方向盘转角handwheel_torque 5 * sin(0.8time pi/4); % 手力yaw_rate 0.3 * sin(0.8time); % 横摆角速度roll_angle 0.05 * sin(0.8time); % 侧倾角lateral_acc 0.8 * sin(0.8time); % 侧向加速度long_speed 20 sin(0.3time); % 纵向速度slip_angles [0.02, -0.015] * sin(0.8time); % 前后轮滑移角vertical_forces [4000, 4000, 4000, 4000] 50sin(0.8time); % 四轮垂向力body_slip_angle 0.03 * sin(0.8time); % 车身侧偏角yaw_rate_sprung 0.28 * sin(0.8time); % 簧上质量横摆角速度roll_rate_sprung 0.04 * cos(0.8time); % 簧上质量侧倾角速度lat_accel_inst 0.75 * sin(0.8time); % 瞬时侧向加速度%% 2. 创建 4x3 子图布局与 VS Visualizer 一致figure(‘Name’, ‘Reproduced CarSim VS Visualizer Layout’, ‘Color’, ‘w’, …‘Position’, [100, 100, 1400, 900]);titles {‘Lateral distance to path - m’ , ‘Steering wheel angle - deg’ , ‘Angle - deg’ , ‘Angle - deg’;‘Lateral Tracking vs Station - m’ , ‘Steering Handwheel Angle - deg’ , ‘Road Wheel Steer Angle - Front’ , ‘Slip Angles Instant - deg’;‘Lat. accel. inst. CO vehicle - g’ , ‘Roll, vehicle - deg’ , ‘Yaw rate (body-fixed), vehicle - deg/s’ , ‘Forces - N’;‘Longitudinal speed - km/h’ , ‘Roll Angle of Sprung Masses vs. Time - deg’ , ‘Yaw Rate of Sprung Masses vs. Time - deg/s’ , ‘Vertical Forces - N’};% 注意CarSim 原始图中部分标签有误或不完整此处按常见物理量修正for i 1:4for j 1:3subplot(4, 3, (i-1)*3 j);switch (i-1)*3 j case 1 % Lateral distance to path plot(time, Y, b-, LineWidth, 1.2); grid on; ylabel(m); xlabel(Time - s); case 2 % Steering wheel angle plot(time, rad2deg(steer_ang), r-, LineWidth, 1.2); grid on; ylabel(deg); xlabel(Time - s); case 3 % Road Wheel Steer Angle - Front (左前右前) plot(time, rad2deg(slip_angles(:,1)), g-, LineWidth, 1.2); hold on; plot(time, rad2deg(slip_angles(:,2)), m--, LineWidth, 1.2); grid on; ylabel(deg); xlabel(Time - s); legend(Left, Right); case 4 % Slip Angles Instant (车身侧偏角) plot(time, rad2deg(body_slip_angle), k-, LineWidth, 1.2); grid on; ylabel(deg); xlabel(Time - s); case 5 % Lateral Tracking vs Station (同第1图重复) plot(time, Y, b-, LineWidth, 1.2); grid on; ylabel(m); xlabel(Time - s); case 6 % Steering Handwheel Angle (同第2图) plot(time, rad2deg(steer_ang), r-, LineWidth, 1.2); grid on; ylabel(deg); xlabel(Time - s); case 7 % Road Wheel Steer Angle - Front (同第3图) plot(time, rad2deg(slip_angles(:,1)), g-, LineWidth, 1.2); hold on; plot(time, rad2deg(slip_angles(:,2)), m--, LineWidth, 1.2); grid on; ylabel(deg); xlabel(Time - s); case 8 % Slip Angles Instant (同第4图) plot(time, rad2deg(body_slip_angle), k-, LineWidth, 1.2); grid on; ylabel(deg); xlabel(Time - s); case 9 % Lat. accel. inst. CO vehicle - g plot(time, lateral_acc/9.81, c-, LineWidth, 1.2); grid on; ylabel(g); xlabel(Time - s); case 10 % Roll, vehicle - deg plot(time, rad2deg(roll_angle), m-, LineWidth, 1.2); grid on; ylabel(deg); xlabel(Time - s); case 11 % Yaw rate (body-fixed), vehicle - deg/s plot(time, rad2deg(yaw_rate), b-, LineWidth, 1.2); grid on; ylabel(deg/s); xlabel(Time - s); case 12 % Forces - N (四轮垂向力) plot(time, vertical_forces(:,1), r-, LineWidth, 1.2); hold on; plot(time, vertical_forces(:,2), g-, LineWidth, 1.2); plot(time, vertical_forces(:,3), b-, LineWidth, 1.2); plot(time, vertical_forces(:,4), k--, LineWidth, 1.2); grid on; ylabel(N); xlabel(Time - s); legend(FL,FR,RL,RR); case 13 % Longitudinal speed - km/h plot(time, long_speed * 3.6, k-, LineWidth, 1.2); grid on; ylabel(km/h); xlabel(Time - s); case 14 % Roll Angle of Sprung Masses vs. Time - deg plot(time, rad2deg(roll_angle), m-, LineWidth, 1.2); grid on; ylabel(deg); xlabel(Time - s); case 15 % Yaw Rate of Sprung Masses vs. Time - deg/s plot(time, rad2deg(yaw_rate_sprung), b-, LineWidth, 1.2); grid on; ylabel(deg/s); xlabel(Time - s); case 16 % Vertical Forces - N (同第12图) plot(time, vertical_forces(:,1), r-, LineWidth, 1.2); hold on; plot(time, vertical_forces(:,2), g-, LineWidth, 1.2); plot(time, vertical_forces(:,3), b-, LineWidth, 1.2); plot(time, vertical_forces(:,4), k--, LineWidth, 1.2); grid on; ylabel(N); xlabel(Time - s); end title(titles{i,j}, FontSize, 9); set(gca, FontSize, 8); endendsgtitle(‘Reproduced CarSim VS Visualizer - Quick Start Guide Example’, ‘FontSize’, 14, ‘FontWeight’, ‘bold’);% 调整子图间距tight_layout;方法 1通过 CarSim GUI 导出在 CarSim 中运行仿真。点击菜单Tools → Export to MATLAB选择要导出的信号如 Y, STEER, YWAWRT, AY, ROLL, etc.点击 “Export”生成 .mat 文件。在 MATLAB 中 load(‘your_file.mat’) 即可使用。方法 2在 Simulink 中使用 To Workspace如果您是通过 Simulink 联合仿真在 Simulink 模型中添加多个 To Workspace 模块。连接到 Carsim S-Function 的输出端口。设置变量名如 carsim_Y, carsim_steer, carsim_yaw_rate 等。运行仿真后这些数据会自动出现在 MATLAB 工作区。 方案二Python 版本Matplotlib NumPyimport numpy as npimport matplotlib.pyplot as plt生成模拟数据请替换为真实 CarSim 导出数据time np.linspace(0, 10, 1000)Y 5 * np.sin(0.5time) * (time5)steer_ang 0.1 * np.sin(0.8time)yaw_rate 0.3 * np.sin(0.8time)roll_angle 0.05 * np.sin(0.8time)lateral_acc 0.8 * np.sin(0.8time)long_speed 20 np.sin(0.3time)slip_angles np.array([0.02, -0.015]) * np.sin(0.8time)vertical_forces np.tile([4000], (4, len(time))) 50np.sin(0.8time)body_slip_angle 0.03 * np.sin(0.8*time)创建 4x3 子图fig, axes plt.subplots(4, 3, figsize(16, 10))titles [[‘Lateral distance to path - m’, ‘Steering wheel angle - deg’, ‘Angle - deg’],[‘Lateral Tracking vs Station - m’, ‘Steering Handwheel Angle - deg’, ‘Road Wheel Steer Angle - Front’],[‘Lat. accel. inst. CO vehicle - g’, ‘Roll, vehicle - deg’, ‘Yaw rate (body-fixed), vehicle - deg/s’],[‘Longitudinal speed - km/h’, ‘Roll Angle of Sprung Masses vs. Time - deg’, ‘Yaw Rate of Sprung Masses vs. Time - deg/s’]]绘图函数def plot_ax(ax, x, y, title, ylabel, color‘b’):ax.plot(x, y, colorcolor, linewidth1.2)ax.set_title(title, fontsize9)ax.set_ylabel(ylabel, fontsize8)ax.set_xlabel(‘Time - s’, fontsize8)ax.grid(True)ax.tick_params(labelsize7)填充每个子图plot_ax(axes[0,0], time, Y, titles[0][0], ‘m’)plot_ax(axes[0,1], time, np.degrees(steer_ang), titles[0][1], ‘deg’, ‘r’)plot_ax(axes[0,2], time, np.degrees(slip_angles[0]), titles[0][2], ‘deg’, ‘g’)plot_ax(axes[1,0], time, Y, titles[1][0], ‘m’)plot_ax(axes[1,1], time, np.degrees(steer_ang), titles[1][1], ‘deg’, ‘r’)axes[1,2].plot(time, np.degrees(slip_angles[0]), ‘g-’, label‘Left’)axes[1,2].plot(time, np.degrees(slip_angles[1]), ‘m–’, label‘Right’)axes[1,2].set_title(titles[1][2], fontsize9)axes[1,2].set_ylabel(‘deg’, fontsize8)axes[1,2].legend(fontsize6)axes[1,2].grid(True)plot_ax(axes[2,0], time, lateral_acc/9.81, titles[2][0], ‘g’, ‘c’)plot_ax(axes[2,1], time, np.degrees(roll_angle), titles[2][1], ‘deg’, ‘m’)plot_ax(axes[2,2], time, np.degrees(yaw_rate), titles[2][2], ‘deg/s’, ‘b’)plot_ax(axes[3,0], time, long_speed*3.6, titles[3][0], ‘km/h’, ‘k’)plot_ax(axes[3,1], time, np.degrees(roll_angle), titles[3][1], ‘deg’, ‘m’)plot_ax(axes[3,2], time, np.degrees(yaw_rate), titles[3][2], ‘deg/s’, ‘b’)第四行第三列补充垂向力原图第12格ax_force fig.add_subplot(4,3,12)ax_force.plot(time, vertical_forces[0], ‘r-’, label‘FL’)ax_force.plot(time, vertical_forces[1], ‘g-’, label‘FR’)ax_force.plot(time, vertical_forces[2], ‘b-’, label‘RL’)ax_force.plot(time, vertical_forces[3], ‘k–’, label‘RR’)ax_force.set_title(‘Vertical Forces - N’, fontsize9)ax_force.set_ylabel(‘N’, fontsize8)ax_force.legend(fontsize6)ax_force.grid(True)plt.suptitle(‘Reproduced CarSim VS Visualizer - Quick Start Guide Example’, fontsize14, fontweight‘bold’)plt.tight_layout()plt.show() 方案三自定义 VS Visualizer 布局高级用户 .vsl 文件本质是 XML 格式可用文本编辑器查看其结构不推荐手动编辑。✅ 总结方案 适用场景 优点 缺点MATLAB 脚本 科研论文、报告、自动化分析 精确控制样式、可批量处理 需手动映射信号名Python 脚本 开源项目、跨平台、机器学习预处理 免费、生态丰富 CarSim 原生支持弱VS Visualizer 手动布局 工程交付、快速预览 与 CarSim 无缝集成、交互性强 不可编程、难复用 Bonus一键导出所有信号到 Excel便于分享% export_to_excel.mdata_table table(time, Y, rad2deg(steer_ang), rad2deg(yaw_rate), …rad2deg(roll_angle), lateral_acc/9.81, long_speed*3.6, …‘VariableNames’, {‘Time_s’, ‘Y_m’, ‘Steer_deg’, ‘YawRate_deg_s’, …‘Roll_deg’, ‘LatAcc_g’, ‘Speed_kmh’});writetable(data_table, ‘carsim_results.xlsx’);disp(‘✅ 数据已导出至 carsim_results.xlsx’);