当前位置: 首页 > news >正文

ACC自适应巡航控制 软件使用:Carsim2019.0+Matlab_Simulink2021a 适用场景:采用模块化建模方法,搭建ACC自适应巡航控制系统,适用于弯道和直线行驶场景。

ACC自适应巡航控制

软件使用:Carsim2019.0+Matlab/Simulink2021a
适用场景:采用模块化建模方法,搭建ACC自适应巡航控制系统,适用于弯道和直线行驶场景。
包含模块:左右轮毂电机模块,Radar感知模块,PID控制模块等。每个模块的详细情况都可在simulink当中实时查看。

输入:设定距离、自车与前车状态。
传感器:雷达检测距离。
控制器:PID 控制器根据距离误差计算制动力或目标扭矩。
执行器/车辆模型:根据力矩和制动力更新车辆速度和位置。

Python 仿真代码示例

这段代码模拟了图中所示的闭环控制逻辑。

import numpy as np
import matplotlib.pyplot as plt

class RadarSensor:
“”“对应图中的 ‘Radar Sensor’ 模块”“”
def detect(self, ego_pos, lead_pos):
# 计算相对距离
distance = lead_pos - ego_pos
return distance

class PIDController:
“”“对应图中的 ‘PID(s)’ 模块”“”
def init(self, kp, ki, kd):
self.kp = kp
self.ki = ki
self.kd = kd
self.prev_error = 0
self.integral = 0

def update(self, setpoint, measured_value, dt): error = setpoint - measured_value self.integral += error * dt derivative = (error - self.prev_error) / dt output = self.kp * error + self.ki * self.integral + self.kd * derivative self.prev_error = error return output

class VehicleDynamics:
“”“对应图中的 ‘veh_sf’ (车辆模型) 和 ‘Motor_Left/Right’”“”
def init(self):
self.pos = 0.0
self.vel = 0.0
self.mass = 1500.0 # 车辆质量 kg

def update(self, torque, brake_pressure, dt): # 简化的动力学方程: F = ma # 驱动力与扭矩成正比,阻力与刹车压力成正比 force_drive = torque * 2.0 # 简化传动系数 force_brake = brake_pressure * 1000.0 net_force = force_drive - force_brake acc = net_force / self.mass self.vel += acc * dt self.vel = max(0, self.vel) # 速度不能为负 self.pos += self.vel * dt return self.vel, self.pos

— 主仿真循环 —

初始化模块
radar = RadarSensor()
pid_dist = PIDController(kp=1.0, ki=0.1, kd=0.05) # 距离控制PID
pid_vel = PIDController(kp=0.5, ki=0.01, kd=0.0) # 速度控制PID (图中右侧部分)

ego_car = VehicleDynamics()
lead_car_pos = 100.0 # 假设前车在100米处
setup_distance = 50.0 # 设定跟车距离

time_steps = np.arange(0, 20, 0.1) # 仿真20秒
log_distance = []
log_velocity = []

for t in time_steps:
# 1. 传感器检测 (Radar Sensor)
current_distance = radar.detect(ego_car.pos, lead_car_pos)

# 2. 距离控制回路 (左上部分) # 计算距离误差,输出目标速度或制动力 # 这里简化逻辑:如果距离太近,PID输出刹车压力 brake_pressure = pid_dist.update(setup_distance, current_distance, 0.1) brake_pressure = max(0, brake_pressure) # 刹车压力非负 # 3. 速度/扭矩控制回路 (右侧部分) # 假设有一个目标速度,或者直接由距离误差映射到目标扭矩 target_torque = 500 # 假设恒定的驱动扭矩需求 # 图中显示左右电机分别控制,这里简化为总扭矩 final_torque = target_torque - brake_pressure * 10 # 刹车会抵消扭矩 # 4. 车辆更新 (Vehicle Model) current_vel, current_pos = ego_car.update(final_torque, brake_pressure, 0.1) # 记录数据 log_distance.append(current_distance) log_velocity.append(current_vel)

— 绘图 —
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.plot(time_steps, log_distance, label=‘Distance to Lead Car’)
plt.axhline(setup_distance, color=‘r’, linestyle=‘–’, label=‘Setup Distance’)
plt.ylabel(‘Distance (m)’)
plt.legend()
plt.grid(True)
plt.title(‘Simulation of the Control System in the Image’)

plt.subplot(2, 1, 2)
plt.plot(time_steps, log_velocity, label=‘Ego Vehicle Velocity’, color=‘orange’)
plt.ylabel(‘Velocity (m/s)’)
plt.xlabel(‘Time (s)’)
plt.legend()
plt.grid(True)

plt.tight_layout()
plt.show()

代码对应关系说明

Radar Sensor (黄色模块):代码中的 RadarSensor 类,计算 Detected Distance。
PID(s) (左上角):代码中的 pid_dist,用于比较 Setup Distance 和实际距离,产生控制信号。
Brake Master Cylinder Pressure:代码中模拟为 brake_pressure 变量,由 PID 输出控制。
veh_sf (红色小车):代码中的 VehicleDynamics 类,接收 Torque 和 Brake Pressure,输出 Velocity 和位置。
Motor_Left / Motor_Right:在代码的 update 函数中体现为扭矩输入。
Velocity (右上角示波器):代码最后绘图部分的 log_velocity。


代码逻辑分析

图中的工作流主要分为三步:

Simulated Test Specifications(车辆模型参数设置模块):选择数学模型(如 B-Class Sports Car)和测试规程(Procedure)。
Run Control with Simulink(运行控制模块):选择要运行的 Simulink 模型(如 ACC_Car1),并点击运行。
Analyze Results(仿真结果与后处理):设置视频输出和绘图变量(如车速、制动距离)。

MATLAB 自动化脚本示例

%% CarSim 与 Simulink 联合仿真自动化配置脚本
% 对应图中 “CarSim Run Control” 界面的功能实现

clear; clc; close all;

% 1. 车辆模型参数设置模块 (对应图中左侧面板)
% ---------------------------------------------------------
% 定义 CarSim 数据库路径和模型名称
% 图中选择的是: Math Model: B-Class, Sports Car
carsim_dataset = ‘B-Class, Sports Car’;

% 图中选择的是: Procedure: ACC_Car1
carsim_procedure = ‘ACC_Car1’;

% 设置仿真时间
sim_stop_time = ‘30.0’; % 30秒

% 2. 运行控制模块 (对应图中中间面板)
% ---------------------------------------------------------
% 配置 Simulink 模型名称
% 图中显示的是: Models: ACC_Car1
simulink_model = ‘ACC_Car1’;

% 打开 Simulink 模型
if ~exist([simulink_model ‘.slx’], ‘file’)

% 这里仅为演示逻辑 disp(['正在加载模型: ' simulink_model]);

end

% 配置 CarSim S-Function 参数
% 在 Simulink 中,CarSim 通常以一个 S-Function 模块存在
% 我们需要通过 set_param 设置该模块的参数

% 假设 Simulink 模型中 CarSim 模块的路径为: [模型名]/VS Solver
vs_solver_path = [simulink_model ‘/VS Solver’];

% 设置参数 (模拟图中界面的选择)
% 设置数据集
set_param(vs_solver_path, ‘Database’, ‘Your_CarSim_Database_Path’);
set_param(vs_solver_path, ‘Dataset’, carsim_dataset);
% 设置运行规程
set_param(vs_solver_path, ‘Procedure’, carsim_procedure);

% 3. 仿真结果与后处理 (对应图中右侧面板)
% ---------------------------------------------------------
% 设置输出变量 (对应图中 “Output Variables”)
% 例如:输出车辆速度、制动距离等
set_param(simulink_model, ‘LoadExternalInput’, ‘off’);
set_param(simulink_model, ‘SaveOutput’, ‘on’);
set_param(simulink_model, ‘OutputSaveName’, ‘sim_output’);

% 运行仿真
disp(‘开始运行联合仿真…’);
sim(simulink_model, str2double(sim_stop_time));
disp(‘仿真结束。’);

% 后处理:绘制结果 (对应图中 “Analyze Results”)
% 假设输出结构体为 sim_output
figure;
% 绘制车速 (例如变量 B_V_X)
% subplot(2,1,1);
% plot(sim_output.tout, sim_output.yout.get(‘B_V_X’).Values);
% title(‘车辆纵向速度’); ylabel(‘m/s’); grid on;

% 绘制制动距离 (例如变量 B_X)
% subplot(2,1,2);
% plot(sim_output.tout, sim_output.yout.get(‘B_X’).Values);
% title(‘车辆位移’); ylabel(‘m’); xlabel(‘Time (s)’); grid on;

disp(‘结果绘图完成。’);

代码关键点说明

carsim_dataset 和 carsim_procedure:对应图中 “Simulated Test Specifications” 区域的下拉菜单选择。
set_param:这是 MATLAB 的核心函数,用于在后台修改 Simulink 模块的参数,完全替代了人工在 GUI 界面上点击下拉框的操作。
sim(…):对应图中 “Run Now” 按钮的功能,启动仿真求解器。
后处理:代码最后的绘图部分对应图中 “Analyze Results” 的功能,用于提取仿真数据(如车速、距离)并进行可视化。

http://www.jsqmd.com/news/901672/

相关文章:

  • 选择命理推演软件,到底该看什么?
  • Java老兵的逆袭:手把手教你从后端工程师转型AI应用架构师,高薪收藏必备!
  • 告别混乱地址:手把手教你用OData增强定制SAP标准发票的“Bill to”信息
  • 别再到处找教程了!Windows 10/11 保姆级 Mosquitto MQTT 服务器搭建(含MQTTX客户端连接测试)
  • 告别期刊投稿内耗!okbiye 期刊论文 AI 助手,从普刊到 SCI 一键搞定
  • 别再只会点Merge了!IntelliJ IDEA里用Rebase优雅解决Git冲突的完整流程
  • 别再手动调增益了!手把手教你用RFSoC的AGC功能搞定动态信号(附Vivado 2023.1工程)
  • 后端开发新手入门:快速上手必备技能与工具
  • 从相似性分数到自注意力:Transformer核心机制详解与实战
  • 别再被“AI中医大模型”骗了!苹果应用商店能下载的,我帮你筛出了这12款
  • 「开源」四路鱼眼相机360°全景环视系统——从标定到拼接全流程(源码+教程)
  • 从游戏图形到AI芯片:浮点数格式FP32/FP16/FP8的演进史与硬件设计启示
  • 从Vibe Check到科学评估:构建AI模型可量化评估体系的实践指南
  • 如何高效获取Zenodo科研数据:专业开发者的完整解决方案
  • 保姆级教程:手把手教你下载、解析与可视化ScanNet RGB-D数据集(附Python代码)
  • YOLOv8n-Ghost优化与FPGA加速在SAR船舶检测中的应用
  • 移动端GPU内存告急?手把手教你为Unity/UE4手游项目选对纹理压缩格式(ASTC vs ETC2实战解析)
  • 2026杭州工装:为什么新锐公司更适配企业装修需求
  • Keil MDK与Arm DS在Cortex-R开发中的对比与选型
  • n8n与Claude集成:开发者如何构建智能工作流自动化解决方案
  • Keil uVision彻底卸载指南:解决残留问题与注册表清理
  • 告别死记硬背:用‘生产者-消费者’模型图解LwIP的tcpip_thread与邮箱机制
  • 别再给主力机装SQL Server了!用群晖Docker搭个2019版,开发测试两不误
  • 星漫拾光:在快节奏时代,为内心留一处温柔归处
  • 揭秘Ollama、LM Studio等本地大模型工具性能差异的四大核心原因
  • AI Agent安全指南:OWASP Top 10预测与工程防御实践
  • 睡眠呼吸暂停检测:ECG信号与轻量化CNN的创新应用
  • VMware Workstation Pro 17免费激活完整指南:终极许可证密钥获取与配置
  • 水平越权 垂直越权-漏洞解析5
  • 告别第三方录屏软件!用Unity Recorder实现4K多机位动画录制(附Timeline联动技巧)