Simulink开发项1000例实战专栏--实例191:Simulink智能驾驶场景探索:自动泊车系统设计与验证
目录
Simulink智能驾驶场景探索:自动泊车系统设计与验证
一、背景介绍
二、所需工具和环境
三、步骤详解
步骤1:创建Simulink模型
步骤1.1:打开Simulink并新建模型
步骤2:添加车辆动力学模型
步骤2.1:添加车辆动力学模块
步骤3:添加传感器模块
步骤3.1:添加超声波传感器模块
步骤3.2:添加摄像头传感器模块
步骤4:设计路径规划模块
步骤4.1:加载地图数据
步骤4.2:添加路径规划模块
步骤4.3:连接路径规划模块
步骤5:设计控制器模块
步骤5.1:添加PID控制器模块
步骤5.2:设计转向控制器
步骤5.3:设计速度控制器
步骤5.4:连接反馈回路
步骤6:设置仿真参数
步骤7:运行仿真
步骤8:分析仿真结果
车辆轨迹
转向角变化波形
速度变化波形
上升时间和调节时间
动态响应特性
安全性分析
步骤9:优化自动泊车系统
调整PID参数
增加前馈控制
使用更先进的控制算法
四、总结
Simulink智能驾驶场景探索:自动泊车系统设计与验证
自动泊车系统(APS)构成现代高级驾驶辅助系统(ADAS)的关键模块之一。该系统通过传感器实时监测车辆周边环境信息,并运用预设算法精确计算出最佳停车路线,在此基础之上实现对车辆的自动控制以完成泊车操作
本实例旨在演示如何利用Simulink及其相关工具箱来设计并实现一个自动泊车系统的仿真模型,并对其进行验证
一、背景介绍
自动泊车系统(APS) 主要包括以下几个部分:
- 传感器模块:用于感知周围环境中的障碍物和其他车辆的状态。
- 路径规划模块:依据传感器采集的数据信息计算出理想的停车位规划方案。
- 控制器模块:基于路径规划的结果输出相应的转向角、油门和刹车指令。
- 执行器模块:按照控制器发出的指令对方向盘位置指令、油门力度以及刹车动作进行响应。
在本实例中,在本实例中我们将在本实例中采用超声波传感器与摄像头的结合使用来监测车辆周边环境状况,并同时利用PID控制器实现自动泊车功能。
二、所需工具和环境
为了进行自动泊车系统的仿真,你需要以下工具和环境:
- MATLAB/Simulink 主要用于模型建立与仿真过程。
- Automated Driving Toolbox 包含实现自动驾驶所需的各种工具与功能模块。
- Sensor Fusion and Tracking Toolbox 主要应用于传感器数据的处理与分析过程。
- Vehicle Dynamics Blockset 主要用于构建车辆动力学模型。
- Control System Toolbox 专门用于控制器的设计与性能分析。
- Simulink Control Design 焦注于控制器的设计、优化以及性能提升过程。
三、步骤详解
步骤1:创建Simulink模型
首先,打开 MATLAB 并启动 Simulink 创建一个新的空白模型。
步骤1.1:打开Simulink并新建模型
- 打开MATLAB程序。
- 通过在命令窗口输入
simulink启动Simulink界面。 - 单击“Blank Model”按钮生成一个新的空模型。
matlab
深色版本
% 创建新的Simulink模型
modelName = 'AutomaticParkingSystem';
new_system(modelName);
open_system(modelName);
步骤2:添加车辆动力学模型
我们将使用 Vehicle Dynamics Blockset 来构建车辆的动力学模型。
步骤2.1:添加车辆动力学模块
在指定库中拖放 Longitudinal Driver 模块至模型编辑区。
在指定库中放置 Steering Module 模块于模型编辑区域。
在指定库中移动 Brake System 模块至模型编辑区。
在指定库中转移 Rigid Body 模块至车辆底盘系统部分。
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:添加超声波传感器模块
将 Ultrasonic Sensor 模块拖放到模型编辑区。
配置参数包括最大探测距离、最小探测距离以及更新周期等内容。
matlab
深色版本
% 添加超声波传感器模块
add_block('sensorFusion/Ultrasonic Sensor', [modelName '/Ultrasonic_Sensor']);
set_param([modelName '/Ultrasonic_Sensor'], 'MaxRange', '5'); % 设置最大检测范围为5米
set_param([modelName '/Ultrasonic_Sensor'], 'MinRange', '0.3'); % 设置最小检测范围为0.3米
set_param([modelName '/Ultrasonic_Sensor'], 'UpdateRate', '10'); % 设置更新频率为10Hz
步骤3.2:添加摄像头传感器模块
- 在 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
步骤4:设计路径规划模块
我们将在 Navigation Toolbox 中采用 RRT(快速随机树)算法以实现路径规划的目标。
步骤4.1:加载地图数据
初始化并配置一个 drivingScenario 对象以生成停车场景,并详细指定停车位位置和障碍物布局。
matlab
深色版本
% 创建停车场景
scenario = drivingScenario;
parkingSpace = parkingSpace(scenario); % 定义停车位
obstacle = vehicle(scenario, 'ClassID', 1, 'Position', [5, 0, 0]); % 定义障碍物
% 加载地图数据到Simulink
add_block('navigation/Load Map Data', [modelName '/Load_Map_Data']);
set_param([modelName '/Load_Map_Data'], 'MapFile', 'drivingScenario.mat'); % 假设地图数据存储在drivingScenario.mat文件中
步骤4.2:添加路径规划模块
- 在导航工具箱的路径规划库中进行拖放操作以导入RRT规划器模块至模型编辑区。
- 配置参数设置包括最大迭代步数、时间步长等关键指标。
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米
步骤4.3:连接路径规划模块
通过将地图数据处理单元的输出信号与路径规划算法模块的输入端子相连,并实现路径规划结果与控制执行机构接口建立
matlab
深色版本
% 连接各模块
add_line(modelName, [modelName '/Load_Map_Data'], [modelName '/Path_Planner'], 'autorouting', 'on');
add_line(modelName, [modelName '/Path_Planner'], [modelName '/Controller_Module'], 'autorouting', 'on');
步骤5:设计控制器模块
我们将使用 PID 控制器来实现转向和速度控制。
步骤5.1:添加PID控制器模块
- 将
PID Controller模块从Simulink > Continuous目录移动至模型编辑区。- 配置其初始参数值(如比例系数 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
步骤5.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
步骤5.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
步骤5.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');
步骤6:设置仿真参数
在模型编辑器顶部菜单栏中单击 Simulation > Model Configuration Parameters 选项卡,在此界面中根据需求调节仿真时长(例如设定为 120 秒),同时建议选择 ode45 求解器类型,并进行其他相关设置。
matlab
深色版本
% 设置仿真参数
set_param(modelName, 'StopTime', '120'); % 模拟运行时间为120秒
set_param(modelName, 'Solver', 'ode45');
步骤7:运行仿真
在完成上述步骤后,在主控台上的运行按钮上点击以启动仿真过程。监测车辆的行驶轨迹、转向角变化以及速度波动等关键波形,并验证所述系统运行过程中的稳定性及安全性指标是否达到预期目标。
步骤8:分析仿真结果
利用仿真技术进行研究,则能够系统地获取各项性能数据包括但不限于车辆运行路径转向行为的变化情况速度波动情况快速度阶段的时间以及系统响应调整的时间等信息以下是一些典型的分析手段
车辆轨迹
利用该模块对车辆行驶轨迹进行跟踪,并确保其能够安全且精确地停入停车位以避免碰撞
转向角变化波形
利用 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 parked without collision.');
end
步骤9:优化自动泊车系统
为了提高自动泊车系统的性能水平, 我们可以通过调节PID参数, 引入前馈控制系统, 或采用先进的控制算法等手段来进行优化与改进
调整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);
增加前馈控制
采用前馈控制(Feedforward Control),预判车辆行为轨迹,并据此动态调节转向幅度与行驶速度
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进行自动驾驶汽车仿真系统的设计与实现。主要内容包括:
- 背景介绍 :深入掌握自动泊车系统的原理及其在智能驾驶领域的重要应用。
- 所需工具和环境 :详细说明用于搭建自动泊车系统仿真模型所需的工具与环境配置。
- 步骤详解 :从零开始构建完整的自动泊车系统模型,并完成路径规划、控制器设计及仿真过程。
- 分析仿真结果 :从车辆轨迹分析其运动轨迹;通过转向角变化观察转向策略;分析速度变化以评估动力性能;结合上升时间和调节时间评估动态响应;观察超调量以确定稳定性;最后进行安全性全面评估。
- 优化自动泊车系统 :通过优化 PID 参数设置、引入前馈控制策略或采用更为先进的控制算法来提升系统的性能表现。
