此示例显示了如何使用横向控制器斯坦利块。
车辆控制是导航系统的最后一步,通常使用两个独立的控制器来完成:
横向控制器:调整转向角,使车辆沿着参考路径行驶。控制器使当前车辆位置和参考路径之间的距离最小化。
纵向控制器:沿参考路径行驶时,通过控制油门和制动器保持所需速度。控制器使车辆的航向角和参考路径方向之间的差异最小化。
本示例着重于恒定纵向速度场景中路径跟随情况下的横向控制。在本例中,您将:
Stanley横向控制器[1]使用非线性控制律来最小化交叉轨迹误差和前轮相对于参考路径的航向角横向控制器斯坦利块计算用于调整车辆当前姿势以匹配参考姿势的转向角命令。
根据用于推导控制律的车辆模型,侧向控制器Stanley块有两种配置[1]:
运动自行车模型:运动学模型假设车辆具有可忽略的惯性。此配置主要适用于惯性影响最小的低速环境。转向指令基于参考姿态、当前姿态和车辆速度计算。
动态的自行车模型动力学模型包括惯性效应:轮胎滑移和转向伺服驱动。这个更复杂但更精确的模型允许控制器处理真实的动态。在这种配置中,控制器还需要路径曲率、车辆当前横摆率和当前转向角来计算转向指令。
您可以通过车型参数。
该场景是使用驾驶场景设计师应用程序。此场景包括单车道、三车道道路和ego车辆。有关添加道路、车道和车辆的详细步骤,请参阅以交互方式创建驾驶场景并生成合成传感器数据.在这种情况下,车辆:
从中间车道开始。
进入弯曲路段后转左车道。
转回中间车道。
在整个模拟过程中,车辆以10米/秒的恒定速度运行。这个场景是从应用程序导出的MATLAB®函数使用导出>导出MATLAB函数按钮。导出的函数名为helperCreateDrivingScenario
.这个场景中的道路和角色被保存到场景文件中侧向控制垫
.
打开Simulin万博1manbetxk教程模型。
open_system (“LateralControlTutorial”)
该模型包含以下主要组件:
A.横向控制器变量子系统,变量模型(万博1manbetxSimulink)它包含两个横向控制器斯坦利块,一个配置一个动态自行车模型,另一个配置一个动态自行车模型。它们都可以控制车辆的转向角度。您可以从命令行指定活动的。例如,要选择横向控制器斯坦利运动块,使用以下命令:
变体=“横向控制器教程/横向控制器”;设置参数(变量,“LabelModeActivechoice”,“运动”);
打开模型也可以运行helperLateralControlTutorialSetup
脚本,它初始化模型使用的数据。该脚本加载Simulink模型所需的某些常量,例如车辆参数、控制器参数、道路场景和参考姿势。特别是,脚本调用以前导出的函数万博1manbetxhelperCreateDrivingScenario
来构建场景。该脚本还通过调用来设置模型所需的总线helperCreateLaneSensorBuses
.
你可以使用以下方法绘制道路和规划路径:
helperPlotRoadAndPath(场景,参照姿势)
在模拟模型时,可以打开鸟瞰的范围分析仿真结果。打开作用域后,单击找到信号来设置信号。然后运行模拟程序,显示车辆、道路边界和车道标记。下图显示了这个例子的25秒鸟瞰镜。此时,车辆已转到左车道。
您可以使用以下命令运行完整的模拟并探索结果:
模拟(“LateralControlTutorial”);
您也可以使用Simulink®万博1manbetx范围(万博1manbetxSimulink)在汽车与环境当车辆沿计划路径行驶时,检查控制器的性能。范围显示最大偏离路径小于0.3米,最大转向角幅度小于3度。
范围=“横向控制教程/车辆和环境/范围”开放式系统(范围)
为了减少转向指令中的横向偏差和振荡,使用横向控制器Stanley动态块并再次模拟模型:
set_param(变种“LabelModeActivechoice”,“动态”);模拟(“LateralControlTutorial”);
该示例演示了如何使用Simulink模拟车道变换场景中车辆的横向控制。与横向控制器Stanley运动块相比,横向控制器Stanley动态块在路径跟踪方面提供了改进的性能,与参考路径的横向偏差更小。万博1manbetx
Hoffmann, Gabriel M., Claire J. Tomlin, Michael Montemerlo和Sebastian Thrun。《越野驾驶自动汽车轨迹跟踪:控制器设计、实验验证与竞赛》。美国控制会议.2007年,页2296 - 2301。
helperPlotRoadAndPath绘制道路和参考路径
函数refPoses helperPlotRoadAndPath(场景)%helperPlotRoadAndPath绘制道路和参考路径h=数字(“颜色”,“白色”);ax₁=轴(h,“盒子”,“开”);
情节(场景中,“父”ax₁)举行在情节(ax₁,refPoses (: 1), refPoses (:, 2),“b”)xlim([150300])ylim([0150])ax1.Title=text(0.5,0.5,“道路和参考路径”);终止