主要内容

用于路径规划和车辆控制的代码生成

这个例子展示了如何修改Simulink®模型的路径规划和车辆控制算法,金宝app生成c++代码,并使用软件在环(SIL)仿真验证生成的代码。

介绍

开发路径规划和车辆控制算法通常涉及在Simulink中设计和模拟算法模型,在C ++代码中实现算法,并将算法代码集成到外部软件环境中进行部署到车辆中。金宝app从算法模型自动生成和验证代码可确保模拟和实现之间的功能等效。

Simulink中的自动化停车剂金宝app通过实例说明了如何设计路径规划和车辆控制算法。这个例子展示了如何在c++中修改设计来实现。这个工作流中的步骤是:

  1. 将设计分配成算法和测试台模型。

  2. 修改算法模型以支持代码生成。金宝app

  3. 从算法模型生成C ++代码。

  4. 使用SIL仿真验证生成的代码的行为。

然后,您可以将生成的代码集成到外部软件项目中,以便在车辆中进行进一步的测试。

对算法和测试台进行划分

原始模型来自Simulink中的自动化停车剂金宝app示例已经分别分为单独的算法和测试台型号。

  • 算法模型AutomatedParkingValetAlgorithm指定了要在c++中实现的路径规划和车辆控制功能。

  • 试验台模型AutomatedParkingValetTestBench指定测试算法模型的刺激因素和环境。

模拟测试台模型

AutomatedParkingValetTestBench模型指定要测试的刺激和环境AutomatedParkingValetAlgorithm模型。主要组成部分AutomatedParkingValetTestBench包括:

  • 算法模型参考:AutomatedParkingValetAlgorithm模型块由模型块引用。模型块和支持在不同模拟模式下模拟引用模型金宝app,包括正常和SIL模式。要了解有关模型块的更多信息,请参阅参考现有模型(金宝app模型)

  • Costmap: Costmap Creator块创建环境的Costmap,并将其作为总线信号输出。

  • 行为计划: Behavior Planner块通过提供一个中间目标和配置,根据全局路由计划触发一系列导航任务。

  • 车型为了演示该算法的性能,将泊车代客控制器应用到车辆模型块中,该模型块包含一个车身3DOF块。

AutomatedParkingValetTestBench模型也被配置为记录姿态(CurrPose)及纵向速度(CurrVelocity),以及行为规划者的目标是否达到的状态(守门员).这些信号记录在工作区变量中Logsout.

在正常模式下用该算法对试验台模型进行仿真。

Open_System(“AutomatedParkingValetTestBench”) set_param (“AutomatedParkingValetTestBench / AutomatedParkingValetAlgorithm”“SimulationMode”“正常”);SIM(“AutomatedParkingValetTestBench”)螺旋翻转人员(Logsout)

第一个图显示了车辆从停车场输入到最终停车位所经过的路径。第二幅图描绘了速度和达到目标的信号。注意,当目标之间转换时,车辆速度是平滑的和连续的。

修改算法模型以支持代码生成金宝app

AutomatedParkingValetAlgorithm模型指定要在c++中实现的功能。主要组成部分AutomatedParkingValetAlgorithm模型是:

  • 路径规划师:通过环境地图规划可行的路径pathplannerrrt.目的。

  • 轨迹发生器:通过拟合样条平滑,通过产生速度剖面来将参考路径平滑并将平滑的路径转换为轨迹。

  • 车辆控制器:控制车辆的转向和速度,以遵循生成的路径和速度剖面。

打开并更新算法模型。

Open_System(“AutomatedParkingValetAlgorithm”) set_param (“AutomatedParkingValetAlgorithm”“SimulationCommand”“更新”);

AutomatedValetparking.模型中包含了一些修改Simulink中的自动化停车剂金宝app支持代码生成的示例。金宝app最重要的修改是指定固定大小的组件接口和显式的速率转换。

可变大小的组件接口已替换为固定大小接口,以便启用生成和验证具有SIL仿真的C ++代码。

  • 的适应姿势信号被分割成固定大小的输出端口(refpaseArray.),并附加一个指定大小的输出端口(重复化).

  • costmapbus.与之相关的巴士Costmap输入端口仅包含固定大小的元素,因为在此示例中CostMap不会更改大小。

AutomatedValetparking.模型包含多个费率。块的颜色代表不同的采样时间。在0.1s采样时间内进行路径规划和轨迹生成,用绿色表示。车辆控制在0.05s的采样时间内执行,并以红色表示。要了解有关显示示例时间颜色的更多信息,请参阅查看采样时间信息(金宝app模型)

已将显式速率转换块插入模型中以将每个速率视为单独的任务。

  • 速率转换块已插入到固定大小CurrPose信号。

  • 辅助varsize行速率转换块(命名RT)已插入连接不同速率块的可变大小信号。

将每个速率作为特定任务处理,可以为每个速率生成一个具有单独方法入口点的c++类。为每个速率生成单独的方法,简化了集成到车辆中的多任务软件调度程序或操作系统的过程。要了解更多关于将费率视为独立任务的信息,请参阅多任务执行建模(嵌入式编码)

从算法模型配置和生成代码

配置AutomatedParkingValetAlgorithm生成代码的模型包括将参数设置为:

  • 为每个速率生成带有入口点的c++代码。

  • 运用常见的优化。

  • 生成一个报告,以方便探索生成的代码。

设置和查看模型参数以启用C ++代码生成。

helperSetModelParametersForCodeGeneration (“AutomatedParkingValetAlgorithm”
组AutomatedParkingValetAlgorithm配置参数:参数值说明_______________________________ _______________ ______________________________________________________________________________________________________________________ { 'SystemTargetFile'} { 'ert.tlc'} { '代码生成>系统目标文件'} { 'TargetLang'} { 'C'} { '代码生成>语言'{'solvertype'} {'solvertepe'} {'solver> type'} {'fixedstep'} {'autoStep'} {'autoStep'} {'autoStep'} {'autoStep'} {'auto'} {'solver>固定步骤大小(基本采样时间)'} {'enbermultitastasking'}{'on'} {'solver>将每个离散速率视为单独的任务'} {'prodlonglongmode'} {'上'} {'solution实现>支持long long'} {'blockreduction'} {上'} {金宝app'仿真目标>块减少'} {'matlabdynamicmalloc'} {'on'} {'仿真目标> matlab函数中的动态内存分配'} {'OptimizeBlockiostorage'} {'上'} {'仿真目标>信号Storage Reuse'} {'InlineInvariantSignals'} {'on'} {'模拟拖跑t>内联不变信号'} {'buildconfiguration'} {'fasters runs'} {'代码生成> build configuration'} {'rtwverbose'} {'rtwverbose'} {''} {'代码生成> verbose build'} {'combinedignalstatecructs'} {'on'} {'代码生成> interface>组合信号/状态结构'} {'supportvariableizesignalsignals'} 金宝app{'on'} {'on'} {'on'} {'代码生成> interface>支持变量大小信号'} {'efficalfloat2intcast'} {“上”} {“代码生成>优化>从浮点到整数转换删除代码,涡卷外的范围内的值”} {“ZeroExternalMemoryAtStartup”} {“关闭”} {“代码生成>优化>删除根级别I / O零初始化(反逻辑)'} {'customsymbolstrglobalvar'} {'$ n $ m'} {'$ n $ m'} {'$ n $ m'} {'代码生成>符号>全局变量'} {'customsymbolstrype'} {'$ n $ m_t'} {'代码生成>符号>全局类型} { 'CustomSymbolStrField'} { '$ N $ M'} { '代码生成>符号>全局类型CustomSymbolStrFcn '} {'APV_ $ N $ M $ F的'{}' 字段名称'} {'代码生成>符号>子系统方法S'} { 'CustomSymbolStrTmpVar'} { '$ N $ M'} { '代码生成>符号>本地临时变量'} { 'CustomSymbolStrMacro'} { '$ N $ M'} {'代码生成>象征>常量宏'}

从算法模型生成代码和代码生成报告。

slbuild (“AutomatedParkingValetAlgorithm”);
### Starting build procedure for: automatedparkkingvaletalalgorithm ###成功完成build procedure for: automatedparkkingvaletalalgorithm build Summary模型重建行动的原因  ============================================================================================== AutomatedParkingValetAlgorithm代码生成和编译生成的代码是过时了。建造时间:0小时1米46.449秒

使用代码生成报告探索生成的代码。要了解有关代码生成报告的更多信息,请参阅代码生成的报告(金宝app仿真软件编码器).使用代码生成报告中的代码接口报告链接来探索这些生成的方法:

  • 初始化:初始化调用一次。

  • step0:每0.05秒定时调用,执行轨迹生成和车辆控制。

  • step1:每0.1秒周期性调用,执行路径规划。

  • 终止:终止时调用一次。

中声明了信号接口的其他get和set方法automatedparkingvaletalgorithm.h.和定义automatedparkingvaletalgorithm.c.

使用SIL仿真验证实现

软件循环(SIL)模拟为已部署应用程序的行为提供了早期洞察。要了解有关SIL仿真的更多信息,请参阅SIL和PIL模拟(嵌入式编码)

*验证主机上编译生成的代码在功能上与正常模式等效。*记录生成代码在主机上的执行时间。这些时间可以作为生成代码性能的早期指标。为了精确的执行时间度量,当生成的代码集成到外部环境或使用在循环中的处理器(PIL)模拟时,对其进行概要分析。要了解关于SIL分析的更多信息,请参阅使用SIL和PIL的代码执行分析(嵌入式编码)

配置算法和测试台模型参数,以支持SIL仿真和日志执行概要信息。金宝app

helperSetModelParametersForSIL (“AutomatedParkingValetAlgorithm”);helperSetModelParametersForSIL (“AutomatedParkingValetTestBench”);
设置AutomatedParkingValetAlgorithm配置参数:参数值描述  ________________________________ ____________________ ____________________________________________________________ {' SystemTargetFile}{的ert。tlc的}{“代码生成>系统目标文件”}{‘TargetLang} {' C '}{的代码生成语言>}{‘CodeExecutionProfiling}{”“}{“代码生成验证> >衡量任务执行时间的}{‘CodeProfilingSaveOptions}{‘AllData}{“代码生成验证> >保存选项”}{‘CodeExecutionProfileVariable}{‘executionProfile}{”代码生成验证> >工作空间变量的}AutomatedParkingValetTestBench配置参数:设置参数值描述  ________________________________ ____________________ ____________________________________________________________ {' SystemTargetFile}{的ert。tlc的}{“代码生成>系统目标文件”}{‘TargetLang} {' C '}{的代码生成语言>}{‘CodeExecutionProfiling}{”“}{“代码生成验证> >衡量任务执行时间的}{‘CodeProfilingSaveOptions}{‘AllData}{“代码生成验证> >保存选项”}{‘CodeExecutionProfileVariable}{‘executionProfile}{”代码生成验证> >工作空间变量的}

用该算法在SIL模式下对试验台模型进行仿真,并绘制结果图。

Open_System(“AutomatedParkingValetTestBench”) set_param (“AutomatedParkingValetTestBench / AutomatedParkingValetAlgorithm”“SimulationMode”“Software-in-the-loop (SIL)”);save_system (“AutomatedParkingValetAlgorithm”);SIM(“AutomatedParkingValetTestBench”);
###为“automatedparkingvalettalgorithm”生成的代码是最新的,因为没有发现结构、参数或代码替换库的变化。### success completion of build procedure for: automatedparkvaletalalgorithm build Summary 0 of 1 models built (1 models already up to date) build duration: 0h 0m 8.79s ###准备启动SIL模拟…使用“Microsoft Visual c++ 2019 (C)”构建。墨西哥人成功完成。###使用SIL文件更新代码生成报告…### stop SIL simulation for component: automatedparkingvaletalalgorithm . ### stop SIL simulation for component: automatedparkingvaletalalgorithm . ### stop SIL simulation for component: automatedparkingvaletalalgorithm . ###停止SIL仿真

helperPlotSimulationSignals (logsout executionProfile)

执行时间step0step1方法如下图所示。图表表明,在较低的速率下需要最大的执行时间(step1)。这个较低的速率是预期的,因为它对应于规划新路径的时间。

结论

此示例展示了用于为路径计划和车辆控制算法生成和验证C ++代码的工作流程。编译和验证使用SIL模拟的代码确立了在集成到外部软件环境之前所生成的代码在功能上正确的信心。工作流程被证明为延伸的Simulink中的自动化停车剂金宝app示例并且通常适用于设计和实现路径规划应用。

相关话题