主要内容

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

这个示例展示了如何修改路径规划和车辆控制算法的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包括:

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

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

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

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

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

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

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

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

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

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

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

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

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

打开并更新算法模型。

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

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

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

  • 的适应提出了信号已被分割成固定大小的输出端口(RefPosesArray),并使用额外的输出端口指定大小(RefPosesSize).

  • costmapBusCostmap输入端口只包含固定大小的元素,因为在本例中costmap不会改变大小。

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

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

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

  • helper Varsize Rows Rate Transition块(名为RT)已插入到连接不同速率块的可变大小信号中。

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

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

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

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

  • 应用常见的优化。

  • 生成一个报告以方便查看生成的代码。

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

helperSetModelParametersForCodeGeneration (“AutomatedParkingValetAlgorithm”
设置AutomatedParkingValetAlgorithm配置参数:参数值描述  _______________________________ _______________ ______________________________________________________________________________________________________________________ {' SystemTargetFile}{的ert。tlc的}{“代码生成>系统目标文件”}{‘TargetLang} {' C '}{的代码生成语言>}{‘SolverType}{'固定'}{“解决者>类型”}{‘FixedStep}{‘汽车’}{的解算器>固定步大小(基本样本时间)}{‘EnableMultiTasking}{”“}{的解算器>对待每个离散率作为一个单独的任务”}{‘ProdLongLongMode}{”“}{硬件实现>支持很久的}{‘BlockReduction}{”“}{“模拟目标>块还原”}{‘MATLABDynamicMemAlloc}{”的}金宝app{'仿真目标>仿真目标> MATLAB函数中的动态内存分配'}{'OptimizeBlockIOStorage'}{'在'}{'仿真目标>信号存储重用'}{'内联不变信号'}{'BuildConfiguration'}{'更快的运行'}{'代码生成>构建配置'}{'RTWVerbose'}{'的'}{'代码生成>详细构建'}{'CombineSignalStateStructs'}{'代码生成>接口>组合信号/状态结构'}{'金宝app SupportVariableSizeSignals}{“上”}{“代码生成界面> >支持适应信号”}{‘EfficientFloat2IntCast}{”“}{优化代码生成> >删除代码从浮点整数转换包装超出范围的值的}{‘ZeroExternalMemoryAtStartup}{‘off’}{“代码生成>优化I / O >删除根水平零初始化(逆逻辑)”}{‘CustomSymbolStrGlobalVar} {N M美元的}{“代码生成>符号>全局变量”}{' CustomSymbolStrType '}{'$N$M_T'}{'代码生成>符号>全局类型'}{'CustomSymbolStrField'} {'$N$M'}{'代码生成>符号>全局类型字段名'}{'CustomSymbolStrFcn'} {'APV_$N$M$F'}{'代码生成>符号>子系统方法'}{'CustomSymbolStrTmpVar'} {'$N$M'}{'代码生成>符号>局部临时变量'}{'CustomSymbolStrMacro'} {'$N$M'}{'代码生成>符号>常量宏'}}

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

slbuild (“AutomatedParkingValetAlgorithm”);
###自动parkingvaletalgorithm的开始构建过程

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

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

  • step0:每0.05s周期性调用,执行轨迹生成和车辆控制。

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

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

中声明信号接口的附加get和set方法AutomatedParkingValetAlgorithm.h定义在AutomatedParkingValetAlgorithm.c

用SIL仿真验证实现

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

SIL模拟使您能够:*验证主机上编译生成的代码在功能上等同于正常模式。*记录生成的代码在主机上的执行次数。这些时间可以作为生成代码性能的早期指示器。为了精确地测量执行时间,当生成的代码集成到外部环境中或与处理器在循环(PIL)模拟一起使用时,可以对其进行概要分析。要了解有关SIL分析的更多信息,请参阅为生成的代码创建执行时间配置文件(嵌入式编码)

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

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

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

open_system (“AutomatedParkingValetTestBench”) set_param (“AutomatedParkingValetTestBench / AutomatedParkingValetAlgorithm”“SimulationMode”“Software-in-the-loop (SIL)”);save_system (“AutomatedParkingValetAlgorithm”);sim卡(“AutomatedParkingValetTestBench”);
###自动parkingvaletalgorithm的开始构建过程
help plotsimulationsignals (logsout, executionProfile) snapnow

# # #成功完成构建过程:AutomatedParkingValetAlgorithm模型建立目标:总结构建模型重建行动的理由  =============================================================================================================== AutomatedParkingValetAlgorithm代码生成和编译代码生成信息文件不存在。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 2m 19.629s为“AutomatedParkingValetAlgorithm”生成的代码是最新的,因为没有发现结构,参数或代码替换库更改。###成功完成构建过程:AutomatedParkingValetAlgorithm构建摘要0的1个模型构建(1个模型已经更新到最新)构建持续时间:0h 0m 4.78s ###准备开始SIL模拟…使用“Microsoft Visual c++ 2019 (C)”构建。MEX完成成功。###用SIL文件更新代码生成报告…###停止组件的SIL模拟:AutomatedParkingValetAlgorithm

的执行时间step0而且step1方法如下图所示。该图表明,在较低的速率(step1)在达到目标姿势后。这个较低的速率是预期的,因为它对应于规划新路径的时间。

结论

该示例演示了为路径规划器和车辆控制算法生成和验证c++代码的工作流。在集成到外部软件环境之前,使用SIL模拟编译和验证代码,可以确定生成的代码在功能上是正确的。的扩展演示了工作流Simulink中的自动泊车代客金宝app示例,一般适用于设计和实现路径规划应用程序。

相关的话题