本示例使用:
本示例说明如何为汽车车道保持辅助(LKA)控制器模拟和生成代码。
在此示例中,您:
回顾结合了车道检测数据处理和Model Predictive Control Toolbox™的车道保持控制器的控制算法。
使用由自动驾驶工具箱™生成的综合数据,在闭环Simulink模型中测试控制系统。
配置用于软件在环仿真的代码生成设置,并自动生成用于控制算法的代码。
车道保持辅助系统(LKA)是一种控制系统,可帮助驾驶员在高速公路的标记车道内保持安全行驶。 LKA系统会检测车辆何时偏离车道,并自动调整转向以恢复车道内的正确行驶,而无需驾驶员额外输入。 在该示例中,LKA系统在驾驶员转向命令和车道保持控制器之间切换。 这种方法足以引入LKA系统的建模体系结构,但是实际系统还将向方向盘提供触觉反馈,并通过施加足够的反扭矩使驾驶员能够超越LKA系统。
为了使LKA正常工作,自动驾驶汽车必须确定车道边界以及它前面的车道如何弯曲。 理想的LKA设计主要取决于预测的曲率,横向偏差以及车道中心线与自我车辆之间的相对偏航角。 在使用模型预测控制的车道保持辅助系统 (模型预测控制工具箱)中给出了这样一个系统的示例。 从先进的驾驶辅助系统(ADAS)设计过渡到更多的自治系统,LKA必须能够抵抗现实车道检测器的丢失,不完整或不准确的测量读数。
当来自车道检测的数据可能不准确时,此示例演示了一种可靠的控制器设计方法。 为此,它使用了来自合成车道检测器的数据,该数据模拟了广角单眼视觉相机引入的损伤。 当来自传感器的数据无效或超出范围时,控制器进行决策。 当由于环境条件(例如道路上的急弯)而导致传感器测量结果错误时,这可以提供安全保护。
将示例的文件夹添加到MATLAB®路径。
addpath(fullfile(matlabroot, 'examples' , 'mpc' , 'main' ));
要打开Simulink测试平台模型,请使用以下命令。
open_system( 'LKATestBenchExample' )
该模型包含两个主要子系统:
车道保持辅助系统,可控制车辆的前转向角
车辆和环境子系统,用于对自我车辆的运动进行建模并为环境建模
打开此模型还将运行helperLKASetUp
脚本,该脚本将初始化模型使用的数据。 该脚本会加载Simulink模型所需的某些常量,例如车辆模型参数,控制器设计参数,路况和驾驶员路径。 您可以绘制驾驶员模型将遵循的道路和路径。
plotLKAInputs(scenario,driverPath)
您可以通过启用车道保持辅助并设置安全横向距离来探索算法的行为。 在Simulink模型中,在“ 用户控件”部分,将切换开关切换为“ 打开” ,并将“ 安全横向距离”设置为1米。 或者,启用车道保持辅助并设置安全横向距离。
set_param( 'LKATestBenchExample / Enable' , 'Value' , '1' )
set_param( 'LKATestBenchExample / Safe横向偏移量' , '值' , '1' )
要绘制模拟结果,请使用Bird-Sye Scope 。 Bird's-Eye Scope是一个模型级别的可视化工具,可以从Simulink工具栏中打开。 在“ 模拟”选项卡上的“ 查看结果”下 ,单击“ 鸟瞰范围” 。 打开示波器后,单击“ 查找信号”以设置信号。 然后运行模拟15秒钟,并探索Bird-Eye Scope的内容。
sim( 'LKATestBenchExample' , 'StopTime' , '15' ) %模拟15秒
假设没有干扰添加到测量的输出通道#1。
->假设添加到测量的输出通道2的输出干扰是积分白噪声。
->“ mpc”对象的“ Model.Noise”属性为空。 假设每个测量的输出通道上都有白噪声。
回答=
Simulink.SimulationOutput:
注销:[1x1 Simulink.SimulationData.Dataset]
吹捧:[4678x1双]
SimulationMetadata:[1x1 Simulink.SimulationMetadata]
错误消息:[0x0字符]
鸟瞰范围从自我车辆的角度显示了道路的象征性代表。 在此示例中,“ Bird's-Eye Scope”将合成视觉检测器的覆盖区域渲染为阴影区域。 另外还显示了理想的车道标记,以及综合检测到的左右车道边界(此处以红色显示)。
要运行完整的仿真并浏览结果,请使用以下命令。
sim( 'LKATestBenchExample' ) %模拟到场景结束
plotLKAResults(场景,注销,driverPath)
假设没有干扰添加到测量的输出通道#1。
->假设添加到测量的输出通道2的输出干扰是积分白噪声。
->“ mpc”对象的“ Model.Noise”属性为空。 假设每个测量的输出通道上都有白噪声。
驾驶员路径的蓝色曲线表明,当道路曲率发生变化时,分心的驾驶员可能会将自我驾驶车辆驾驶到另一车道。 带有车道保持辅助功能的驾驶员的红色曲线表明,当道路曲率发生变化时,自我车辆仍保持在车道中。
要绘制控制器性能,请使用以下命令。
plotLKAPerformance(注销)
上图显示了相对于自我运载工具的横向偏差。 LKA的横向偏差在[-0.5,0.5] m之内。
中间图显示了相对偏航角。 与LKA的相对偏航角在[-0.15,0.15] rad之内。
下图显示了自我车辆的转向角。 LKA的转向角在[-0.5,0.5] rad之内。
要查看控制器状态,请使用以下命令。
plotLKAStatus(注销)
上图显示了左右车道偏移量。 大约5.5 s,19 s,31 s和33 s,横向偏移在车道保持辅助设定的距离内。 发生这种情况时,将检测到车道偏离。
中间图显示了LKA状态和车道偏离检测。 检测到的偏离状态与顶部图一致。 当检测到车道偏离时,LKA开启,但稍后当驾驶员可以正确驾驶自我车辆时,控制权将返还给驾驶员。
下图显示了驾驶员和LKA的转向角。 当驾驶员和LKA的转向角之差较小时,LKA将控制权释放给驾驶员(例如,在9 s至17 s之间)。
您可以修改LKA的“安全横向偏移”的值,以忽略驾驶员输入,从而使控制器进入纯车道跟随模式。 通过增加该阈值,横向偏移量始终在车道保持辅助设置的距离内。 因此,车道偏离的状态为开,并且车道保持辅助一直处于控制状态。
set_param( 'LKATestBenchExample / Safe横向偏移量' , '值' , '2' )
sim( 'LKATestBenchExample' ) %模拟到场景结束
假设没有干扰添加到测量的输出通道#1。
->假设添加到测量的输出通道2的输出干扰是积分白噪声。
->“ mpc”对象的“ Model.Noise”属性为空。 假设每个测量的输出通道上都有白噪声。
您可以使用以下命令浏览仿真结果。
plotLKAResults(场景,注销)
红色曲线表示车道保持辅助系统可以使自我车辆保持沿车道中心线行驶。
使用以下命令描述控制器性能。
plotLKAPerformance(注销)
上图显示了相对于自我运载工具的横向偏差。 LKA的横向偏差在[-0.1,0.1] m之内。
中间图显示了相对偏航角。 与LKA的相对偏航角在[-0.02,0.02] rad之内。
下图显示了自我车辆的转向角。 LKA的转向角在[-0.04,0.04] rad之内。
要查看控制器状态,请使用以下命令。
plotLKAStatus(注销)
上图显示了左右车道偏移量。 由于横向偏移永远不在车道保持辅助设置的距离之内,因此不会检测到车道偏离。
中间图显示LKA状态始终为1,也就是说,车道保持辅助系统始终处于控制状态。
下图显示了驾驶员和LKA的转向角。 驾驶员与弯道谈判时的转向角过大。 在此示例中,来自LKA的小转向角足以满足弯道的需要。
车道保持辅助模型包含四个主要部分:1)估算车道中心2)车道保持控制器3)检测车道偏离,以及4)应用辅助。
open_system( 'LKATestBenchExample / Lane Keeping Assist' )
当车辆离检测车道太近时,检测车道偏离子系统会输出一个信号。 当车辆和车道边界之间的偏离车道传感器的偏移小于车道辅助偏移输入时,您会检测到偏离。
估计车道中心子系统将数据从车道传感器输出到车道保持控制器。 在该示例中,检测器被配置为报告相机的当前视野中的当前车道的左右车道边界。 将每个边界建模为曲率随距离线性变化的曲线的长度(回旋曲线)。 要将这些数据提供给控制器,请将检测到的两条曲线都向车道中心偏移汽车的宽度和较小的余量(总计1.8 m)。 通过检测强度对每个所得的中心曲线加权,然后将平均结果传递给控制器。 此外,估计车道中心子系统为车道保持控制器子系统的输入提供了有限的值。 预览的曲率提供了自我车辆前方车道曲率的中心线。 在此示例中,自我车辆可以向前看三秒钟,这是预测范围和采样时间的乘积。 该提前时间使控制器能够使用预览信息来计算自我车辆的转向角,从而改善了MPC控制器的性能。
车道保持控制器模块的目标是通过控制前转向角将车辆保持在车道中并遵循弯道 。 该目标是通过驱动横向偏差来实现的 和相对偏航角 变小(请参见下图)。
LKA控制器基于以下输入来计算自我车辆的转向角:
预览曲率(源自车道检测)
自我车辆纵向速度
横向偏差(根据车道检测得出)
相对偏航角(来自车道检测)
考虑到自我车辆的物理限制,转向角被限制在[-0.5,0.5] rad之内。 您可以更改预测范围或移动“ 控制器行为”滑块以调整控制器的性能。
Apply Assist子系统确定车道保持控制器或驾驶员是否控制了自我车辆。 子系统在车道保持控制器的驾驶员指令转向和辅助转向之间切换。 当检测到车道偏离时,便开始转向辅助转向。 当驾驶员再次开始在车道内转向时,控制权将返回给驾驶员。
车辆和环境子系统实现了车道保持辅助控制器的闭环仿真。
open_system( 'LKATestBenchExample /车辆和环境' )
Vehicle Dynamics子系统使用Vehicle Dynamics Blockset™的Body 3DOF单轨模块对车辆动力学进行建模。
场景读取器模块根据车辆相对于从场景文件LKATestBenchScenario.mat
中读取的场景的位置,生成理想的左右车道边界。
视觉检测生成器模块从场景读取器模块获取理想的车道边界。 检测生成器对单眼相机的视场进行建模,并确定任何其他障碍物,确定每个道路边界的航向角,曲率,曲率导数和有效长度。
Driver子系统根据在helperLKASetUp
中创建的驾驶员路径生成驾驶员转向角。
LKARefMdl
模型配置为支持使用嵌入式编码器软件生成C代码。 要检查您是否有权访问Embedded Coder,请运行:
hasEmbeddedCoderLicense = license( 'checkout' , 'RTW_Embedded_Coder' )
您可以为模型生成一个C函数,并通过运行以下代码来探索代码生成报告:
if hasEmbeddedCoderLicense
rtwbuild( 'LKARefMdl' )
end
您可以使用软件在环(SIL)仿真来验证编译的C代码是否按预期运行。 要在SIL模式下模拟LKARefMdl
引用的模型,请使用:
if hasEmbeddedCoderLicense
set_param( 'LKATestBenchExample / Lane Keeping Assist' , ...
'SimulationMode' , 'Soft-in-the-loop(SIL)' )
end
当您运行LKATestBenchExample
模型时, LKATestBenchExample
模型生成,编译和执行代码。 这使您可以通过仿真来测试已编译代码的行为。
此示例显示了如何在具有车道检测功能的弯道上实施集成车道保持辅助(LKA)控制器。 它还显示了如何使用自动驾驶工具箱生成的综合数据在Simulink中测试控制器,对其进行组件化并自动为其生成代码。
从MATLAB路径中删除示例文件夹。
rmpath(fullfile(matlabroot, 'examples' , 'mpc' , 'main' ));
关闭所有
bd关闭所有
鸟瞰范围 | 车身3DOF | 视觉检测发生器
自动驾驶工具箱文档
支持
使用Simulink实现自适应巡航控制器