主要内容

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

这个例子展示了如何修改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模式。要了解有关Model块的更多信息,请参阅参考现有的模型(金宝app模型)

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

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

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

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

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

open_system (“AutomatedParkingValetTestBench”) set_param (“AutomatedParkingValetTestBench / AutomatedParkingValetAlgorithm”,“SimulationMode”,“正常”);sim卡(“AutomatedParkingValetTestBench”) helperPlotSimulationSignals (logsout)

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

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

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

  • 路径规划:通过环境地图规划可行的路径pathPlannerRRT对象。

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

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

打开并更新算法模型。

open_system (“AutomatedParkingValetAlgorithm”) set_param (“AutomatedParkingValetAlgorithm”,“SimulationCommand”,“更新”);

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

可变大小的组件接口已被固定大小的接口取代,以支持使用SIL模拟生成和验证c++代码。

  • 的适应提出了信号被分割成固定大小的输出端口(RefPosesArray),并附加一个指定大小的输出端口(RefPosesSize).

  • 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}{'固定'}{“解决者>类型”}{‘FixedStep}{‘汽车’}{的解算器>固定步大小(基本样本时间)}{‘EnableMultiTasking}{”“}{的解算器>对待每个离散率作为一个单独的任务”}{‘ProdLongLongMode}{”的}{'硬件实现>支持很久'}{‘BlockReduct金宝appion}{”“}{“模拟目标>块还原”}{‘MATLABDynamicMemAlloc}{”“}{的模拟目标>模拟目标>动态内存分配在MATLAB函数}{‘OptimizeBlockIOStorage}{”“}{“模拟目标>信号存储重用”}{‘InlineInvariantSignals}{‘上’}{“模拟目标>内联不变的信号”}{‘BuildConfiguration}{快速跑的}{“代码生成>构建配置”}{‘RTWVerbose}{”“}{“代码生成>详细构建”}{‘CombineSignalStateStructs}{”“}{“代码生成界面> >结合信号/状态结构的}{‘SupportVariableSizeSignals}{”“}{”代码金宝app代> >界面支持适应信号}{‘Effici金宝appentFloat2IntCast}{”“}{优化代码生成> >删除代码从浮点整数转换包装超出范围的值的}{‘ZeroExternalMemoryAtStartup}{‘off’}{“代码生成>优化I / O >删除根水平零初始化(逆逻辑)}{‘CustomSymbolStrGlobalVar} {N M美元的}{“代码生成>符号>全局变量”}{‘CustomSymbolStrType} {' N M_T美元}{“代码生成符号> >全球类型”}{‘CustomSymbolStrField} {N M美元的}{“代码生成>符号>全球类型”字段名称}{‘CustomSymbolStrFcn} {APV_ $ N M美元$ F '}{“代码生成方法> >符号子系统”}{'CustomSymbolStrTmpVar'} {'$N$M'} {'Code Generation>Symbols>Local temporary variables'} {'CustomSymbolStrMacro'} {'$N$M'} {'Code Generation>Symbols>Constant宏'}

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

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示例,一般用于路径规划应用程序的设计和实现。

相关的话题