Simulink开发项1000例实战专栏--实例189:Simulink智能驾驶场景挑战:复杂路况下避障策略仿真
目录
Simulink智能驾驶场景挑战:复杂路况下避障策略仿真
一、背景介绍
二、所需工具和环境
三、步骤详解
步骤1:创建Simulink模型
步骤1.1:打开Simulink并新建模型
步骤2:添加车辆动力学模型
步骤2.1:添加车辆动力学模块
步骤3:添加传感器模块
步骤3.1:添加摄像头传感器模块
步骤3.2:添加雷达传感器模块
步骤3.3:添加激光雷达传感器模块
步骤4:设计数据融合模块
步骤4.1:添加数据融合模块
步骤4.2:连接传感器模块到数据融合模块
步骤5:设计路径规划模块
步骤5.1:加载地图数据
步骤5.2:添加路径规划模块
步骤5.3:连接数据融合模块到路径规划模块
步骤6:设计控制器模块
步骤6.1:添加PID控制器模块
步骤6.2:设计转向控制器
步骤6.3:设计速度控制器
步骤6.4:连接反馈回路
步骤7:设置仿真参数
步骤8:运行仿真
步骤9:性能评估
车辆轨迹
转向角变化波形
速度变化波形
上升时间和调节时间
动态响应特性
安全性分析
步骤10:性能优化
调整PID参数
增加前馈控制
使用更先进的控制算法
使用Simulink Test进行自动化测试
四、总结
Simulink智能驾驶场景挑战:复杂路况下避障策略仿真
智能驾驶系统中的避障技术是保障车辆安全行驶的核心功能。特别是在复杂的路况场景中(涵盖城市道路、高速公路以及施工区域等多种环境),实现障碍物的有效识别与适宜策略的制定变得至关重要。本手册旨在全面阐述通过Simulink平台构建复杂路况环境下障碍物avoidance 策略仿真模型及其验证方法。
一、背景介绍
复杂路况下的避障策略 主要包括以下几个部分:
- 传感器模块:旨在探测车辆运行过程中的周边环境数据。
- 数据融合模块:整合来自多源传感器的信息以实现精准感知,并显著提升感知准确度。
- 路径规划模块:基于收集到的环境数据计算最佳避障路线以确保安全通行。
- 控制器模块:通过分析路径规划结果精确计算出所需的转向角度与行进速度指令。
- 执行器模块:通过调节方向盘位置、加速踏板及制动踏板来实现精准控制以完成预期任务。
在本实例中
二、所需工具和环境
为了进行复杂路况下的避障策略仿真,你需要以下工具和环境:
- MATLAB/Simulink 提供用于建模和仿真功能。
- Automated Driving Toolbox 提供相关于自动驾驶的工具模块集合。
- Sensor Fusion and Tracking Toolbox 提供传感器数据融合处理功能。
- Navigation Toolbox 支持路径规划与导航功能设计。
- Vehicle Dynamics Blockset 提供车辆动力学建模解决方案。
- Control System Toolbox 支持控制器设计与分析操作辅助。
- Simulink Control Design 助于进行控制器设计与优化操作辅助。
- Simulink Test 支持系统自动化测试与验证流程设计。
三、步骤详解
步骤1:创建Simulink模型
首先,打开 MATLAB 并启动 Simulink 创建一个新的空白模型。
步骤1.1:打开Simulink并新建模型
- 打开MATLAB软件。
- 在命令窗口中键入simulink并打开Simulink启动界面。
- 单击"Blank Model"按钮以创建一个新的空模型。
matlab
深色版本
% 创建新的Simulink模型
modelName = 'ComplexRoadAvoidance';
new_system(modelName);
open_system(modelName);
步骤2:添加车辆动力学模型
我们将使用 Vehicle Dynamics Blockset 来构建车辆的动力学模型。
步骤2.1:添加车辆动力学模块
- 从指定库导入所需模块至工作区。
- 从指定库导入模块至工作区域。
- 从指定库导入相应模块至系统架构图上。
- 从指定库导入关键组件至系统布局界面。
matlab
深色版本
% 添加车辆动力学模块
add_block('vehicleDynamics/Longitudinal Driver', [modelName '/Longitudinal_Driver']);
add_block('vehicleDynamics/Steering System', [modelName '/Steering_System']);
add_block('vehicleDynamics/Brake System', [modelName '/Brake_System']);
add_block('vehicleDynamics/Rigid Body', [modelName '/Rigid_Body']);
步骤3:添加传感器模块
采用多种传感器(包括摄像头、雷达和激光雷达)来检测车辆周围的环境。
步骤3.1:添加摄像头传感器模块
- 在 Automated Driving Toolbox 的 Sensors 目录下,将 Camera Sensor 模块拖放至模型编辑区域。
- 请配置参数视场角和分辨率等设置。
matlab
深色版本
% 添加摄像头传感器模块
add_block('automatedDriving/Camera Sensor', [modelName '/Camera_Sensor']);
set_param([modelName '/Camera_Sensor'], 'FOV', '90'); % 设置视场角为90度
set_param([modelName '/Camera_Sensor'], 'Resolution', '[640, 480]'); % 设置分辨率为640x480
步骤3.2:添加雷达传感器模块
- 将
Radar Detection Generator模块拖放至模型编辑区域。 - 在
Sensor Fusion and Tracking Toolbox > Sensors and Measurements库内配置参数设置,包括最大检测范围、最小检测范围以及更新频率等具体值。
matlab
深色版本
% 添加雷达传感器模块
add_block('sensorFusion/Radar Detection Generator', [modelName '/Radar_Sensor']);
set_param([modelName '/Radar_Sensor'], 'MaxRange', '150'); % 设置最大检测范围为150米
set_param([modelName '/Radar_Sensor'], 'MinRange', '5'); % 设置最小检测范围为5米
set_param([modelName '/Radar_Sensor'], 'UpdateRate', '10'); % 设置更新频率为10Hz
步骤3.3:添加激光雷达传感器模块
- 在
Sensor Fusion and Tracking Toolbox > Sensors and Measurements库中导入Lidar Detection Generator模块至模型编辑区。- 配置参数设置包括最大检测范围、最小检测范围以及更新频率等。
matlab
深色版本
% 添加激光雷达传感器模块
add_block('sensorFusion/Lidar Detection Generator', [modelName '/Lidar_Sensor']);
set_param([modelName '/Lidar_Sensor'], 'MaxRange', '100'); % 设置最大检测范围为100米
set_param([modelName '/Lidar_Sensor'], 'UpdateRate', '10'); % 设置更新频率为10Hz
步骤4:设计数据融合模块
本研究中, 我们将采用 Sensor Fusion and Tracking Toolbox 中的多传感器数据融合算法来实现对目标状态的精确估计。
步骤4.1:添加数据融合模块
在 此库中拖放 Multi-Object Tracker 模块至模型编辑区域,并在右侧窗口进行参数配置。其中涉及的配置参数包括追踪器类型设置、初始化方法配置等详细选项。
matlab
深色版本
% 添加数据融合模块
add_block('sensorFusion/Multi-Object Tracker', [modelName '/Data_Fusion']);
set_param([modelName '/Data_Fusion'], 'TrackerType', 'Global Nearest Neighbor (GNN)'); % 设置跟踪器类型为全局最近邻
set_param([modelName '/Data_Fusion'], 'InitializationMethod', 'Constant Velocity'); % 设置初始化方法为恒定速度
步骤4.2:连接传感器模块到数据融合模块
摄像头、雷达以及激光雷达传感器模块所发出的信号被数据融合模块接收
matlab
深色版本
% 连接各模块
add_line(modelName, [modelName '/Camera_Sensor'], [modelName '/Data_Fusion'], 'autorouting', 'on');
add_line(modelName, [modelName '/Radar_Sensor'], [modelName '/Data_Fusion'], 'autorouting', 'on');
add_line(modelName, [modelName '/Lidar_Sensor'], [modelName '/Data_Fusion'], 'autorouting', 'on');
步骤5:设计路径规划模块
采用导航工具箱中的路径规划方案(包括RRT、A*类算法)用于生成避障路径。
步骤5.1:加载地图数据
通过 drivingScenario 对象导入或生成一个涵盖多种复杂的交通状况(包括城市街道、高速公路以及施工区域等)的驾驶模拟场景。
matlab
深色版本
% 创建复杂路况驾驶场景
scenario = drivingScenario;
laneMarkers = laneMarking(scenario); % 定义车道线
obstacle = obstacle(scenario, 'Position', [50, 0, 0]); % 定义障碍物
% 加载地图数据到Simulink
add_block('navigation/Load Map Data', [modelName '/Load_Map_Data']);
set_param([modelName '/Load_Map_Data'], 'MapFile', 'complexRoadScenario.mat'); % 假设地图数据存储在complexRoadScenario.mat文件中
步骤5.2:添加路径规划模块
- 在 Navigation Toolbox > Path Planning 库中拖放 RRT Planner 或 A* Planner 模块至模型编辑区。
- 配置参数设置以指定最大迭代次数和步长等关键参数。
matlab
深色版本
% 添加路径规划模块
add_block('navigation/RRT Planner', [modelName '/Path_Planner']);
set_param([modelName '/Path_Planner'], 'MaxIterations', '1000'); % 设置最大迭代次数为1000
set_param([modelName '/Path_Planner'], 'StepSize', '0.5'); % 设置步长为0.5米
步骤5.3:连接数据融合模块到路径规划模块
将数据融合模块的输出连接到路径规划模块的输入端口。
matlab
深色版本
% 连接各模块
add_line(modelName, [modelName '/Data_Fusion'], [modelName '/Path_Planner'], 'autorouting', 'on');
步骤6:设计控制器模块
我们将使用 PID 控制器来实现转向和速度控制。
步骤6.1:添加PID控制器模块
- 在 Simulink 的 Continuous 目录中导入 PID Controller 组件至模型工作区。
- 配置基本参数设置(包括比例系数 Kp、积分系数 Ki 和微分系数 Kd)。
matlab
深色版本
% 添加PID控制器模块
add_block('simulink/Continuous/PID Controller', [modelName '/PID_Controller_Steering']);
set_param([modelName '/PID_Controller_Steering'], 'P', '1'); % 设置比例系数Kp为1
set_param([modelName '/PID_Controller_Steering'], 'I', '0.1'); % 设置积分系数Ki为0.1
set_param([modelName '/PID_Controller_Steering'], 'D', '0.01'); % 设置微分系数Kd为0.01
% 添加第二个PID控制器用于速度控制
add_block('simulink/Continuous/PID Controller', [modelName '/PID_Controller_Speed']);
set_param([modelName '/PID_Controller_Speed'], 'P', '1'); % 设置比例系数Kp为1
set_param([modelName '/PID_Controller_Speed'], 'I', '0.1'); % 设置积分系数Ki为0.1
set_param([modelName '/PID_Controller_Speed'], 'D', '0.01'); % 设置微分系数Kd为0.01
步骤6.2:设计转向控制器
- 评估车辆相对于目标路径的偏移量(即横向误差)。
- 通过 PID 控制器调整转向角以使车辆回归到目标路径上。
matlab
深色版本
% 计算横向误差
lateralError = calculateLateralError(pathPlan); // 自定义函数计算横向误差
% 添加转向控制器
add_block('simulink/User-Defined Functions/MATLAB Function', [modelName '/Steering_Controller']);
% 编写MATLAB Function代码
function steeringAngle = fcn(lateralError)
steeringAngle = pid(lateralError); % 使用PID控制器计算转向角度
end
步骤6.3:设计速度控制器
- 测定车辆当前行驶的速度与设定的目标行驶速度之间的差异即为速度误差。
- 通过 PID 控制器调节车辆的速度以实现目标行驶参数。
matlab
深色版本
% 计算速度误差
speedError = calculateSpeedError(targetSpeed, currentSpeed); // 自定义函数计算速度误差
% 添加速度控制器
add_block('simulink/User-Defined Functions/MATLAB Function', [modelName '/Speed_Controller']);
% 编写MATLAB Function代码
function throttleSignal = fcn(speedError)
throttleSignal = pid(speedError); % 使用PID控制器计算油门信号
end
步骤6.4:连接反馈回路
将路径规划模块产生的数据传输至转向控制器模块的输入端口,并随后将其输出传递至车辆动力学模型指定转向输入的位置;与此同时,速度控制器模块的数据也被接入车辆动力学模型的速度参数端口,并由此形成了一个完整的闭环控制系统。
matlab
深色版本
% 连接各模块
add_line(modelName, [modelName '/Path_Planner'], [modelName '/Steering_Controller'], 'autorouting', 'on');
add_line(modelName, [modelName '/Steering_Controller'], [modelName '/Steering_System'], 'autorouting', 'on');
add_line(modelName, [modelName '/Speed_Controller'], [modelName '/Longitudinal_Driver'], 'autorouting', 'on');
步骤7:设置仿真参数
单击模型编辑器顶部菜单栏中的 Simulation > Model Configuration Parameters。您可以根据需求设置仿真时长(例如120秒),选择适当的求解器类型(建议采用ode45),并配置其他相关参数。
matlab
深色版本
% 设置仿真参数
set_param(modelName, 'StopTime', '120'); % 模拟运行时间为120秒
set_param(modelName, 'Solver', 'ode45');
步骤8:运行仿真
完成上述步骤后,请启动仿真前,请您点击工具栏中的"Run"按钮以启动仿真过程。随后,请仔细观察车辆的行驶轨迹、转向角的变化以及速度的变化情况,并确认其运行过程的各项指标是否满足设计规范的要求
步骤9:性能评估
为了系统性分析复杂路况下的避障策略表现效果,请重视以下几个核心要素:
车辆轨迹
利用 Scope 模块对车辆行驶轨迹进行精确监测和追踪,并对其潜在障碍进行详细识别和规避处理。该系统将确保车辆以安全的方式持续行驶。
转向角变化波形
利用 Scope 模块监测转向角的变化波形,并保证其稳定性与安全性符合设计要求
速度变化波形
利用 Scope 模块监测速度变化波形特征,并满足系统稳定性和安全性的设计标准
上升时间和调节时间
通过对转向特性的分析以及速度曲线的变化规律研究, 进而可得系统的响应时域指标, 包括上升时间和调节时间两个基本参数. 其中, 上升时间即为系统从初始状态跃迁到目标状态所需的时间, 调节时间则指系统维持在目标状态一定范围内所需的时间.
通过对转向特性的分析以及速度曲线的变化规律研究, 进而可得系统的响应时域指标, 包括上升时间和调节时间两个基本参数. 上升时间即为系统从初始状态跃迁到目标状态所需的时间; 调节时间为维持在目标状态一定范围内所需的时间.
matlab
深色版本
% 获取转向角和速度数据
steeringAngle = getSteeringAngle();
vehicleSpeed = getVehicleSpeed();
% 计算上升时间和调节时间
riseTimeSteering = calculateRiseTime(steeringAngle); % 自定义函数计算转向角上升时间
settlingTimeSteering = calculateSettlingTime(steeringAngle); % 自定义函数计算转向角调节时间
riseTimeSpeed = calculateRiseTime(vehicleSpeed); % 自定义函数计算速度上升时间
settlingTimeSpeed = calculateSettlingTime(vehicleSpeed); % 自定义函数计算速度调节时间
% 显示结果
disp(['Steering Rise Time: ', num2str(riseTimeSteering), ' seconds']);
disp(['Steering Settling Time: ', num2str(settlingTimeSteering), ' seconds']);
disp(['Speed Rise Time: ', num2str(riseTimeSpeed), ' seconds']);
disp(['Speed Settling Time: ', num2str(settlingTimeSpeed), ' seconds']);
动态响应特性
采用阶跃函数输入法和斜坡函数输入法两种方法进行测试;分析系统在动态过程中的表现包括超调度、振荡次数以及其他动态性能指标。
matlab
深色版本
% 计算超调量
overshootSteering = calculateOvershoot(steeringAngle); // 自定义函数计算转向角超调量
overshootSpeed = calculateOvershoot(vehicleSpeed); // 自定义函数计算速度超调量
// 显示结果
disp(['Steering Overshoot: ', num2str(overshootSteering), '%']);
disp(['Speed Overshoot: ', num2str(overshootSpeed), '%']);
安全性分析
通过对行驶路径和实时监测的数据进行分析研究,在动态环境中实现对障碍物的主动识别与避让,并在行车过程中有效防止与其他车辆发生碰撞。
matlab
深色版本
% 获取车辆轨迹数据
trajectory = getTrajectory();
% 检查是否发生碰撞
if any(isCollision(trajectory)) % 自定义函数检查是否发生碰撞
disp('Warning: Collision detected.');
else
disp('Vehicle successfully avoided obstacles without collision.');
end
步骤10:性能优化
为了提升障碍物 circumvention strategies 在复杂场景中的效能 , 我们可以通过 采用以下几种措施 来实现
调整PID参数
人工调节 PID 参数(如比例系数 Kp、积分系数 Ki 和微分系数 Kd),直至获得预期的系统性能
matlab
深色版本
% 调整PID控制器参数
set_param([modelName '/PID_Controller_Steering'], 'P', '1.2'); % 增加转向比例系数Kp
set_param([modelName '/PID_Controller_Steering'], 'I', '0.15'); % 增加转向积分系数Ki
set_param([modelName '/PID_Controller_Steering'], 'D', '0.02'); % 增加转向微分系数Kd
set_param([modelName '/PID_Controller_Speed'], 'P', '1.2'); % 增加速度比例系数Kp
set_param([modelName '/PID_Controller_Speed'], 'I', '0.15'); % 增加速度积分系数Ki
set_param([modelName '/PID_Controller_Speed'], 'D', '0.02'); % 增加速度微分系数Kd
% 重新运行仿真
sim(modelName);
增加前馈控制
采用前馈控制方法能够预判车辆的运动轨迹,并从而实现对转向角度和行驶速度的精确调节。
matlab
深色版本
% 添加前馈控制模块
add_block('simulink/User-Defined Functions/MATLAB Function', [modelName '/Feedforward_Controller']);
% 编写MATLAB Function代码
function feedforwardSignal = fcn(predictedLateralError, predictedSpeedError)
feedforwardSignal = calculateFeedforward(predictedLateralError, predictedSpeedError); % 自定义函数计算前馈控制信号
end
使用更先进的控制算法
采用最新一代的滑模控制技术与模糊逻辑控制系统结合的方法来提升系统性能
matlab
深色版本
% 使用模型预测控制(MPC)
add_block('simulink/Control System Toolbox/Model Predictive Control Toolbox/MPC Controller', [modelName '/MPC_Controller']);
使用Simulink Test进行自动化测试
基于 Simulink Test 工具箱实现系统自动化测试与验证功能的研究与开发,在各个不同的工作环境下均能保证系统的稳定运行能力
matlab
深色版本
% 创建测试用例
testCase = sltest.testmanager.TestFile('Avoidance_TestCases');
testCase.addTestSuite('Avoidance_TestSuite');
testCase.addTestCase('Scenario_1', 'Initial_Speed_80kmh');
% 运行测试
sltest.testmanager.run(testCase);
四、总结
按照本指南阐述了使用Simulink平台构建一个能够在复杂交通场景中实现障碍物规避策略的仿真模型,并对该模型进行了仿真实验以及系统性能指标的全面评估。主要内容包括:
- 背景介绍:掌握应对复杂路况的障碍物规避方法及其在智能汽车技术中的应用。
- 所需工具和环境:明确列出进行复杂路况下障碍物规避仿真所必需的工具及运行环境。
- 步骤详解:从基础构建起完整的障碍物规避系统模型,并对获取的传感器数据进行处理以实现信息融合;随后完成路径规划工作;接着设计并实现控制系统并对系统进行全面仿真测试。
- 性能评估:通过车辆运动轨迹等关键指标综合评估系统的性能表现,并对重要动态特性如转向角变化、速度波动等进行详细分析;同时考察系统的稳定性和响应速度等关键参数。
- 性能优化:通过优化PID参数设置并引入更为先进的控制算法方案来提升系统的整体性能表现。
