title | date |
---|---|
AF_Toolbox 使用手册 |
2024-06-04 |
在自动驾驶领域中,控制算法开发多以 MATLAB/Simulink 平台为基础进行开发,因此,将 Simulink 算法模型落地到实车开发中存在诸多转换环节。
本工具提供将 Simulink 模型生成目标平台代码(C++) 中需要的部分开发工具,包括有:
- 数据类型转换工具
- 消息接口定义生成工具
- 消息接口转换(映射)工具
- 录制消息回放功能(未开发)
使用 AF_Toolbox 工具前,首先需要配置环境,其中包括依赖的 python,C++ 编译器等,该工具当前支持 MATLAB R2023a 版本适配,生成的产物文件支持 MATLAB R2017a 版本。
工具箱根路径下提供环境配置脚本(config_toolbox.m
),包括对 python,C++ 编译器的配置等。在 MATLAB 命令行终端中切换到 $af_toolbox_root_path
路径后,运行 config_toolbox
脚本,会配置需要的运行环境。
具体使用方式如下:
- 下载 af_toolbox 项目代码到本地:
bash>> git clone -b r2023a http://gitlab.hirain.com/bsi/af_toolbox.git
- 在 MATLAB 终端中执行如下指令:
matlab>> cd <af_toolbox_root_path>
matlab>> config_toolbox
执行过程截图:
matlab>> ls
. CHANGELOG.txt af_toolbox.pptx hirain mlroscpp slroscpp
.. README bin include preferences sltoolstrip
.git README.md codertarget local ros utilities
.gitignore README.md.docx config_toolbox.m mlros2 slros2 visualizationapp
matlab>> config_toolbox
[af_toolbox] search toolbox_path file list: C:\Users\zhiqi.jia\Project\Toolbox\af_toolbox\local\path\toolbox_path
[af_toolbox] add toolbox path(2) success
[af_toolbox] remove toolbox path(0) success
[af_toolbox] set `Microsoft Visual C++ 2022 (C)` as C compiler
[af_toolbox] set `Microsoft Visual C++ 2022 (C++)` as C++ compiler
环境配置仅在当前 shell 中生效,每次重启/新开 MATLAB shell 应该重新运行该脚本。
在 Simulink 中模块间传输消息需要指定具体的类型,并且支持通过自定义 Bus 扩展支持的消息类型。通过 Simulink 中的 Coder 工具箱可以将模型文件(.slx)生成针对指定平台的 C/C++ 代码,因此需要将 Simulink 中的数据类型(包括自定义 Bus 类型)映射到 C++ 中的数据类型,其中需要依赖 MATLAB 中支持的消息类型作为中间转换,其中内置的消息类型列表如下:
基础数据类型映射表:
平台 | - | - | - | - | - | - | - | - |
---|---|---|---|---|---|---|---|---|
MATLAB | logical | uint8 | char | int8 | uint8 | int16 | uint16 | int32 |
SIMULINK | boolean | uint8 | uint8 | int8 | uint8 | int16 | uint16 | int32 |
ROS2 | bool | byte | char | int8 | uint8 | int16 | uint16 | int32 |
平台 | - | - | - | - | - | - | - |
---|---|---|---|---|---|---|---|
MATLAB | single | double | int64 | uint64 | string | string | uint32 |
SIMULINK | single | double | int64 | uint64 | string | string | uint32 |
ROS2 | float32 | float64 | int64 | uint64 | string | wstring | uint32 |
[note]: simulink 中支持的数据类型:data-types-supported-by-simulink
在模型中也会使用自定义的消息类型,Simulink 可以通过自定义的 Bus 定义实现,在使用 Coder 工具箱将模型生成 C++代码时,自定的 Bus 类型将映射为结构体;在 ROS2 中同样可以通过自定义 IDL 实现对自定义消息类型的支持,IDL 文件会通过 rosidl 工具编译为 C++代码。因此,若将 Simulink 模型文件生成的 C++代码在 RED(ROS2) 框架中运行,需要支持 Bus 生成的 C++数据类型与 ROS2 IDL 生成的数据类型相互转换。
AF_Toolbox 工具箱中有 rosidl2bus
指令,可以实现上述需求,将 ROS IDL 类型映射为 Simulink 中 Bus 类型,以及对应的转换函数文件。
具体使用方式如下:
- 准备 ROS IDL 功能包,需要符合 ROS2 中 MSG 功能包文件结构,可由
af_configutor
工具依据通信矩阵生成。执行该工具后将生成应用模板工程及 ROS IDL 功能包。
# 需要安装 af_configurator 工具
# pip install af_configurator
bash>> af_config \
-i '.\V2.5_HAV3.0_DDS-20231016_V1.03_20240111_释放版本(勘误) 修改部分Topic和QoS.xlsx' \
--someip '.\V2.5_HAV3.0_SOMEIP_20230922(配合DDS).xlsx' \
-o output_240603
输出产物:
bash>> tree -m 1
.\V2.5_HAV3.0_通信矩阵_DDS\output_240603 (888.5KB)
├── hav_interfaces (198.14KB)
├── HPC1_TDA4 (211.16KB)
├── HPC2_TDA4 (195.22KB)
├── HPC3_TDA4 (85.18KB)
├── performance_test (52.49KB)
├── TBOX1 (77.02KB)
└── TBOX2 (69.29KB)
- 在当前 MATLAB Shell 下运行
rosidl2bus
指令,实现将 msg(ROS) 定义的消息类型转换到 BUS(Simulink) 类型。
函数签名:
% @brief 将ROS IDL转换为Simulink中BUS定义
% @detail 将IDL转换为BUS定义,输出BUS定义的MATLAB的脚本文件、DataDirectory文件以及C++文件
% @param model_types_hdr: 模型头文件的名称, 例如 "model_remap_test.h", 缺省值为 "HAV3G_TDA4MultiThreads_types.h".
% @param path_folder: 包含 msg 定义的文件夹名称,该路径的根文件夹中需要包含 msg 定义的文件夹,该文件夹需要符合 ROS2 对 msg 功能包的文件夹结构,缺省值为 "pwd".
% example use:
% `rosidl2bus('model_remap_test.h', pwd)`
function [status] = rosidl2bus(model_types_hdr, path_folder)
参数说明:
model_types_hdr
:模型头文件的名称,可缺省,默认值为 "HAV3G_TDA4MultiThreads_types.h",需要与模型生成的类型定义文件名称相匹配,可以手动指定参数。path_folder
:包含 ros2 interfaces 定义的功能包路径,可缺省,默认值为pwd
,该路径的根文件夹下需要包含符合 ROS2 功能包文件结构的 msg 消息定义,在示例指令中将扫描 "ap_interfaces" 以及 "hav_interfaces" 两个文件夹。
示例指令:
rosidl2bus('model_remap_test.h', pwd)
执行过程:
Identifying message files in folder 'C:/Users/zhiqi.jia/Project/Toolbox/test/merge_240603'..Validating message files in folder 'C:/Users/zhiqi.jia/Project/Toolbox/test/merge_240603'..Done.
[af_toolbox] convert msg to matlab struct...
Generating MATLAB interfaces for custom message packages...
[0/2] Generating MATLAB interfaces for custom message packages... 0%
msg: (1/26): ActivationEnaStsADU
... ...
msg: (26/26): Year
[1/2] Generating MATLAB interfaces for custom message packages... 50%
msg: (1/2078): ACTIVESTATIONARYTESTING
... ...
msg: (2078/2078): Year
[2/2] Generating MATLAB interfaces for custom message packages... 100% Done.
[af_toolbox] convert msg to bus...
[1/2] Generating Bus for custom message packages...
[af_toolbox] delete data dictionary:
- `C:\Users\zhiqi.jia\Project\Toolbox\af_toolbox\slros2\ros2lib.sldd`.
[af_toolbox] create data dictionary path:
- `C:\Users\zhiqi.jia\Project\Toolbox\af_toolbox\slros2\ros2lib.sldd`.
bus: (1/26): ap_interfaces/ActivationEnaStsADU
... ...
bus: (26/26): ap_interfaces/Year
[1/2] Generating Bus for custom message packages... Done
[af_toolbox] replace bus define to r2017... Done.
[2/2] Generating Bus for custom message packages...
[af_toolbox] delete data dictionary:
- `C:\Users\zhiqi.jia\Project\Toolbox\af_toolbox\slros2\ros2lib.sldd`.
[af_toolbox] create data dictionary path:
- `C:\Users\zhiqi.jia\Project\Toolbox\af_toolbox\slros2\ros2lib.sldd`.
bus: (1/2078): hav_interfaces/ACTIVESTATIONARYTESTING
... ...
bus: (2078/2078): hav_interfaces/Year
[2/2] Generating Bus for custom message packages... Done
[af_toolbox] replace bus define to r2017... Done.
历时 5824.391459 秒。
[af_toolbox] execution time: 5824.39s.
[af_toolbox] convert all msg to bus success.
产物说明:
执行对应指令后将在 $path_folder
的同级路径下放置产物文件,包含有 $path_folder/af_gen
、$path_folder/matlab_msg_gen
文件夹,其中 $path_folder/af_gen/convert
中包含用于 msg 与 bus 转换的 cpp 文件,同模型生成的代码及 AF RED 框架生成代码(here)放置在一起,通过 cmake 进行编译运行。
其中 $path_folder/af_gen/bus
中包含 msg 转换为 bus 定义的 m 脚本文件及 sldd 文件,用于 "映射层" 模型的绘制,可放置于 "映射层生成工具" 的输入路径下。
其中 $path_folder/matlab_msg_gen
中包含 msg 转换为 maltab struct 的结构定义,用于 rosbag 回放工具,需包含在 MATLAB 工作空间路径下。
bash>> tree
C:\Users\Project\Toolbox\test\merge_240603\af_gen (25.85MB)
├── bus (23.87MB)
│ ├── ap_interfaces (67.91KB)
│ │ ├── ap_interfaces.m (34.45KB)
│ │ ├── ap_interfaces.sldd (2.57KB)
│ │ └── ap_interfaces_2017a.m (30.89KB)
│ ├── bus_interfaces.m (8.6MB)
│ ├── bus_interfaces.sldd (482.59KB)
│ ├── bus_interfaces_2017a.m (7.95MB)
│ └── hav_interfaces (6.78MB)
│ ├── hav_interfaces.m (3.57MB)
│ ├── hav_interfaces.sldd (2.57KB)
│ └── hav_interfaces_2017a.m (3.22MB)
└── convert (1.98MB)
├── include (648.05KB)
│ └── convert (648.05KB)
│ ├── ap_interfaces (7.69KB)
│ │ └── slros_busmsg_conversion.h (7.69KB)
│ ├── hav_interfaces (611.84KB)
│ │ └── slros_busmsg_conversion.h (611.84KB)
│ └── slros_msgconvert_utils.h (28.51KB)
└── src (1.35MB)
└── convert (1.35MB)
├── ap_interfaces (14.28KB)
│ └── slros_busmsg_conversion.cpp (14.28KB)
└── hav_interfaces (1.33MB)
└── slros_busmsg_conversion.cpp (1.33MB)
当前智驾模型使用 SOME/IP 版本通信矩阵定义的接口及数据类型实现,并将现有接口定义为模型"固有"接口,实现智驾模型与通信矩阵协议的隔离;需要实现生成智驾模型的"固有"接口的能力,并将"接口模型"用于之后的"映射层生成"工具的输入。
以目前智驾保留的模型接口为例,包含有两种类型:
- 1:1 类型接口
- 1:n 类型接口
其中 "1:n" 类型接口为 SOME/IP 遗留类型,暂时通过参数配置的方式(remap: none
)决定是否使能这部分接口的生成。
函数签名:
% @brief
% @details 依据配置文件可以生成全部的 port 口,和模型是完全对应的,其中包括了 part 口的部分
% 生成的产物,可以进一步生成映射层
function [status] = draw_reference_model(...
path_folder, ...
model_reference, ...
add_part, debug)
参数说明:
path_folder
: 包含$path_folder/merge/orchestration/merge.yaml
文件夹的路径;model_reference
: 生成的 Simulink 模型文件名称,指令执行完后将保存到$path_folder/af_gen/model
路径下;add_part
: 是否添加"拆分"类型接口;debug
: 是否使能 debug 模式,在绘制"接口模型"中,需要依赖定义好的 Bus 类型支持,在脚本执行中会将当前工作空间中所有 bus 定义的脚本进行合并,是一项耗时的工作,使能该参数后,将使用上次合并后的产物("bus/bus_interfaces.m"),减少每次执行的时间。
示例指令:
draw_reference_model(pwd, 'model_reference_test', false, false)
指令会从 $path_folder/merge/orchestration/merge.yaml
路径读入配置文件:
bash>> tree
C:\Users\Project\Toolbox\test\merge_240603\merge (2.57MB)
├── bus (1.76MB)
│ ├── model_interfaces.m (1.76MB)
│ └── part_interfaces.m (1.63KB)
├── model (786.82KB)
│ └── part_model_use_subsystem.slx (786.82KB)
└── orchestration (41.84KB)
└── merge.yaml (41.84KB)
执行过程:
[af_toolbox] create port model... ...
[af_toolbox] traversing all ports(87)... ...
[af_toolbox] the length of port name is truncated:
- `FrontCameraObjectDataTransmission_FrontCameraObjectDetectionInfo`->`FrontCameraObjectDataTransmission_FrontCameraObjectDetectionnfo`
[af_toolbox] create port model... ...
[af_toolbox] traversing all ports(37)... ...
[af_toolbox] create port model... ...
[af_toolbox] traversing all ports(34)... ...
[af_toolbox] set model(model_reference_test) config set: af_configuration.
[af_toolbox] set model([af_toolbox] set data dict file(bus_interfaces.sldd) to model(model_reference_test)).
历时 13.870094 秒。
[af_toolbox] draw simulink model success.
产物文件结构:
bash>> tree
C:\Users\Project\Toolbox\test\merge_240603\af_gen (41.88MB)
├── bus (23.87MB)
├── convert (1.98MB)
└── model (16.03MB)
├── model_reference_test.slx (93.24KB)
└── model_reference_test_r2017a.slx (86.08KB)
产物说明:
可选参数 add_part
会生成两种类型的模型:
禁用add_part
参数,生成的模型中将删除"拆分"类型接口,具体效果如图所示:
draw_reference_model(pwd, 'model_reference_test', false, false)
使能add_part
参数后,生成的"智驾接口定义模型"将添加"拆分"类型接口,具体效果如图所示:
draw_reference_model(pwd, 'model_reference_test', true, false)
该模型仅定义接口及对应的数据类型,智驾模型将使用提供的输入/输出接口作为算法模型的输入/输出接口。
app_name: hi_adus
tasks:
- block: /hi_adus/HPC1_TDA4_hi_adus_VLAN7
input_topics:
- simulink: FCObjectDetectionInfoStruct_ROS2Sim_Output
type_simulink: FCObjectDetectionInfoStruct
- simulink: FrontCameraObjectDataTransmission_FrontCameraLaneLineInfo
type_simulink: LaneLinesInfoStruct
- simulink:
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo0_33
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo102_135
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo136_169
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo34_67
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo68_101
tag_simulink:
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo0_33
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo102_1
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo136_1
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo34_67
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo68_10
type_simulink:
- FreeSpacesInfoStruct
- FreeSpacesInfoStruct
- FreeSpacesInfoStruct
- FreeSpacesInfoStruct
- FreeSpacesInfoStruct
remap: none
output_topics:
- simulink: FCObjectDetectionInfoStruct_Sim2ROS_Output
type_simulink: FCObjectDetectionInfoStruct
input_topics
: 字段为 red->model 映射关系;output_topics
: 字段为 model->red 映射关系;simulink
: 字段为模型文件中抽象的接口定义,对应模型文件中 inport 模块名称;type_simulink
: 字段为对应模型文件中 inport 模块 “OutDataTypeStr” 属性;remap
: 是否使能解析;tag_simulink
: (选填)针对"拆分"类型接口,用于设置 Goto/From 模块的 tag 值,对于超过 63 字符的 tag 值,将被 simulink 进行截断,未必避免截断后出现命名冲突问题,将支持手动设置 tag 值;
当前智驾模型内部有一套通过 SOME/IP 定义的 BUS 消息类型做为算法模型的输入/输出接口,当前若使用 RED 框架运行智驾应用,需要将原接口及数据类型映射到 ROS IDL 定义生成的 BUS 类型上,实现两种数据类型的相互转换,从而实现通过 RED 框架与智驾算法模型消息的收发;也可实现智驾算法模型与通信矩阵协议间的解耦。因此,引入中间的"映射层模型"实现上述需求。
当前工具支持的模型接口定义基于 “some/ip 0525” 通信矩阵版本,dds 接口定义基于
V2.5_HAV3.0_DDS-20231016_V1.03_1113_释放版本
通信矩阵版本。
对于映射层模型与智驾算法模型的集成方式有两种方案:
- 将映射层模型与智驾算法模型在同一层级进行集成,及映射层模型的输出与智驾算法模型的输入对接,反之亦然;
- 将映射层模型放置在智驾模型的外层,通过将智驾模型做为"refernece model"的方式实现接口的对接;
函数签名:
% @Todo 可以优化代码结构,分为”前处理“,”处理“,”后处理“然后再进一步封装
% example:
% `draw_remap_model(pwd, 'model_remap_test', false)`
function [status] = draw_remap_model(...
path_folder, ...
model_name, ...
add_part, debug)
示例指令:
draw_remap_model(pwd, "model_remap_test", true, false)
执行过程:
[af_toolbox] create port model... ...
[af_toolbox] traversing all ports(87)... ...
[af_toolbox] create port model... ...
[af_toolbox] traversing all ports(87)... ...
[af_toolbox] the length of port name is truncated:
- `FrontCameraObjectDataTransmission_FrontCameraObjectDetectionInfo`->`FrontCameraObjectDataTransmission_FrontCameraObjectDetectionnfo`
[af_toolbox] line composite ports... ...
[af_toolbox] traversing all ports(87)... ...
[af_toolbox] line port(1)
- `AutoDriveEnableControl_MethodRR_Request_Topic$`->`DUControlInfo_AutoDriveEnableControl_AutoDriveEnable`
... ...
[af_toolbox] create port model... ...
[af_toolbox] traversing all ports(37)... ...
[af_toolbox] create port model... ...
[af_toolbox] traversing all ports(37)... ...
[af_toolbox] line composite ports... ...
[af_toolbox] traversing all ports(37)... ...
[af_toolbox] line port(1)
- `L4TSPDebugInfomation_DebugADUStatuesInfo$`->`ebugADUStatuesInfo_Event_Topic`
... ...
[af_toolbox] set model(model_remap_internal_with_part_test) config set: af_configuration.
[af_toolbox] set model([af_toolbox] set data dict file(bus_interfaces.sldd) to model(model_remap_internal_with_part_test).
[af_toolbox] export model to r2017 version:
- `model_remap_internal_with_part_test_r2017a.slx`.
导出成功: 'C:\Users\zhiqi.jia\Project\Toolbox\test\merge_240603\model_remap_internal_with_part_test_r2017a.slx' 已创建,可用于 Simulink R2017a。
Done历时 2157.541459 秒。
[af_toolbox] draw simulink model success.
参数说明:
path_folder
: 包含 "merge/orchestration/merge.yaml" 文件结构的路径;model_name
: 所生成的"映射层模型"文件名称;add_part
: 将"拆分"类型接口的映射模型 copy 到"映射层模型"中;debug
: 是否使能 debug 接口,复用上次合并的 bus_interfaces.m 文件;是否删除冗余接口及 tag 模块;
文件结构:
tree
C:\Users\Project\Toolbox\test\merge_240603\af_gen (41.88MB)
├── bus (23.87MB)
│ ├── ap_interfaces (67.91KB)
│ │ ├── ap_interfaces.m (34.45KB)
│ │ ├── ap_interfaces.sldd (2.57KB)
│ │ └── ap_interfaces_2017a.m (30.89KB)
│ ├── bus_interfaces.m (8.6MB)
│ ├── bus_interfaces.sldd (482.59KB)
│ ├── bus_interfaces_2017a.m (7.95MB)
│ └── hav_interfaces (6.78MB)
│ ├── hav_interfaces.m (3.57MB)
│ ├── hav_interfaces.sldd (2.57KB)
│ └── hav_interfaces_2017a.m (3.22MB)
├── convert (1.98MB)
│ ├── include (648.05KB)
│ │ └── convert (648.05KB)
│ │ ├── ap_interfaces (7.69KB)
│ │ │ └── slros_busmsg_conversion.h (7.69KB)
│ │ ├── hav_interfaces (611.84KB)
│ │ │ └── slros_busmsg_conversion.h (611.84KB)
│ │ └── slros_msgconvert_utils.h (28.51KB)
│ └── src (1.35MB)
│ └── convert (1.35MB)
│ ├── ap_interfaces (14.28KB)
│ │ └── slros_busmsg_conversion.cpp (14.28KB)
│ └── hav_interfaces (1.33MB)
│ └── slros_busmsg_conversion.cpp (1.33MB)
└── model (16.03MB)
├── model_reference_test.slx (93.24KB)
├── model_reference_test_r2017a.slx (86.08KB)
├── model_remap_internal_test.slx (2.17MB)
├── model_remap_internal_test_r2017a.slx (2.19MB)
├── model_remap_internal_with_part_test.slx (2.83MB)
├── model_remap_internal_with_part_test_r2017a.slx (2.89MB)
├── model_remap_test.slx (2.87MB)
└── model_remap_test_r2017a.slx (2.91MB)
产物说明:
可选参数 debug
会生成两种类型的模型:
draw_remap_model(pwd, 'model_remap_internal_test', false, false)
draw_remap_model(pwd, 'model_remap_test', false, true)
可选参数 add_part
会生成两种类型的模型:
draw_remap_model(pwd, 'model_remap_test', true, false)
函数签名:
% @brief 将映射层投射在智驾模型外层,以shell_model的方式进行包裹
% @param path_folder
% @param model_reference: 该文件由上游输入,通过`draw_reference_model()`模型生成
% @param add_part
% @param debug: 是否复用 data dict 数据
% @return model_remap: 将remap层关系,生成到remap_model中,用于与智驾模型解耦
% example:
% 1. 需要执行 `draw_reference_system()` 生成对应的 reference_model
% 2. `draw_remap_model_by_shell(pwd, 'model_remap_ref_test', 'model_remap_test', false, false)`
function [status] = draw_remap_model_by_shell(...
path_folder, ...
model_reference, model_remap, ...
add_part, debug)
示例指令:
draw_remap_model_by_shell(pwd, 'model_reference_test', 'model_remap_test', false, false)
执行过程:
[af_toolbox] create data dictionary path:
- `C:\Users\Project\Toolbox\test\merge_240603\af_gen\bus\bus_interfaces.sldd`.
[af_toolbox] export bus obj from file
- loading `C:\Users\Project\Toolbox\test\merge_240603\af_gen\bus\ap_interfaces\ap_interfaces.m`
- loading `C:\Users\Project\Toolbox\test\merge_240603\af_gen\bus\hav_interfaces\hav_interfaces.m`
- loading `C:\Users\Project\Toolbox\test\merge_240603\merge\bus\model_interfaces.m`
- loading `C:\Users\Project\Toolbox\test\merge_240603\merge\bus\part_interfaces.m`
[af_toolbox] save datadict changes:
- `C:\Users\Project\Toolbox\test\merge_240603\af_gen\bus\bus_interfaces.sldd`.
[af_toolbox] replace bus define to r2017... Done.
[af_toolbox] create shell model... ...
[af_toolbox] traversing all ports(121)... ...
[af_toolbox] traversing all ports(37)... ...
[af_toolbox] create port model... ...
[af_toolbox] traversing all ports(87)... ...
[af_toolbox] line composite ports... ...
[af_toolbox] traversing all ports(87)... ...
[af_toolbox] line port(1)
- `AutoDriveEnableControl_MethodRR_Request_Topic$`->`DUControlInfo_AutoDriveEnableControl_AutoDriveEnable`
... ...
[af_toolbox] create port model... ...
[af_toolbox] traversing all ports(37)... ...
[af_toolbox] line composite ports... ...
[af_toolbox] traversing all ports(37)... ...
[af_toolbox] line port(1)
- `L4TSPDebugInfomation_DebugADUStatuesInfo$`->`ebugADUStatuesInfo_Event_Topic`
... ...
[af_toolbox] delete target blocks(34)... ...
- model_remap_test/FrontCameraFreeSpaceInfo_Event_Topic_1
- model_remap_test/FrontCameraFreeSpaceInfo_Event_Topic_2
... ...
[af_toolbox] delete target blocks(34)... ...
- model_remap_test/Goto0
- model_remap_test/Goto1
... ...
[af_toolbox] already set af_configuration as config set in model(model_reference_test).
[af_toolbox] set model([af_toolbox] set data dict file(bus_interfaces.sldd) to model(model_reference_test).
[af_toolbox] set model(model_remap_test) config set: af_configuration.
[af_toolbox] set model([af_toolbox] set data dict file(bus_interfaces.sldd) to model(model_remap_test).
[af_toolbox] export model to r2017 version:
- `model_reference_test_r2017a.slx`,
- `model_remap_test_r2017a.slx`.
导出成功: 'C:\Users\zhiqi.jia\Project\Toolbox\test\merge_240603\model_reference_test_r2017a.slx' 已创建,可用于 Simulink R2017a。
导出成功: 'C:\Users\zhiqi.jia\Project\Toolbox\test\merge_240603\model_remap_test_r2017a.slx</a>' 已创建,可用于 Simulink R2017a。
Done历时 1591.117311 秒。
[af_toolbox] draw simulink model success.
参数说明:
path_folder
: 包含 "merge/orchestration/merge.yaml" 文件结构的路径;model_name
: 所生成的"映射层模型"文件名称;add_part
: 将"拆分"类型接口的映射模型 copy 到"映射层模型"中;debug
: 是否使能 debug 接口,复用上次合并的 bus_interfaces.m 文件;是否删除冗余接口及 tag 模块;
文件结构:
tree
C:\Users\Project\Toolbox\test\merge_240603\af_gen (41.88MB)
├── bus (23.87MB)
│ ├── ap_interfaces (67.91KB)
│ │ ├── ap_interfaces.m (34.45KB)
│ │ ├── ap_interfaces.sldd (2.57KB)
│ │ └── ap_interfaces_2017a.m (30.89KB)
│ ├── bus_interfaces.m (8.6MB)
│ ├── bus_interfaces.sldd (482.59KB)
│ ├── bus_interfaces_2017a.m (7.95MB)
│ └── hav_interfaces (6.78MB)
│ ├── hav_interfaces.m (3.57MB)
│ ├── hav_interfaces.sldd (2.57KB)
│ └── hav_interfaces_2017a.m (3.22MB)
├── convert (1.98MB)
│ ├── include (648.05KB)
│ │ └── convert (648.05KB)
│ │ ├── ap_interfaces (7.69KB)
│ │ │ └── slros_busmsg_conversion.h (7.69KB)
│ │ ├── hav_interfaces (611.84KB)
│ │ │ └── slros_busmsg_conversion.h (611.84KB)
│ │ └── slros_msgconvert_utils.h (28.51KB)
│ └── src (1.35MB)
│ └── convert (1.35MB)
│ ├── ap_interfaces (14.28KB)
│ │ └── slros_busmsg_conversion.cpp (14.28KB)
│ └── hav_interfaces (1.33MB)
│ └── slros_busmsg_conversion.cpp (1.33MB)
└── model (16.03MB)
├── model_reference_test.slx (93.24KB)
├── model_reference_test_r2017a.slx (86.08KB)
├── model_remap_internal_test.slx (2.17MB)
├── model_remap_internal_test_r2017a.slx (2.19MB)
├── model_remap_internal_with_part_test.slx (2.83MB)
├── model_remap_internal_with_part_test_r2017a.slx (2.89MB)
├── model_remap_test.slx (2.87MB)
└── model_remap_test_r2017a.slx (2.91MB)
产物说明:
可选参数 add_part
会生成两种类型的模型:
draw_remap_model_by_shell(pwd, 'model_reference_test', 'model_remap_test', true, false)
draw_remap_model_by_shell(pwd, 'model_reference_test', 'model_remap_test', false, false)
其中,"merge/orchestration/merge.yaml" 映射格式示例如下,
input_topics
: 字段为 red->model 映射关系;output_topics
: 字段为 model->red 映射关系;name
: 字段为 red 定义的 topic,对应为 simulink 中 inport 模块;type_red
: 字段为 dds topic 消息类型,对应 simulink 中 inport 模块的 “OutDataTypeStr” 属性‘simulink
: 字段为模型文件中抽象的接口定义,对应模型文件中 inport 模块名称;type_simulink
: 字段为对应模型文件中 inport 模块 “OutDataTypeStr” 属性;remap
: 是否使能解析;tag_simulink
: (选填)针对"拆分"类型接口,用于设置 Goto/From 模块的 tag 值,对于超过 63 字符的 tag 值,将被 simulink 进行截断,未必避免截断后出现命名冲突问题,将支持手动设置 tag 值;
app_name: hi_adus
tasks:
- block: /hi_adus/HPC1_TDA4_hi_adus_VLAN7
input_topics:
- name: FrontCameraLaneLineInfo_Event_Topic
type_red: hav_interfaces/msg/LaneLinesInfoStruct
simulink: FrontCameraObjectDataTransmission_FrontCameraLaneLineInfo
type_simulink: LaneLinesInfoStruct
- name:
- FrontCameraFreeSpaceInfo_Event_Topic_1
- FrontCameraFreeSpaceInfo_Event_Topic_2
- FrontCameraFreeSpaceInfo_Event_Topic_3
- FrontCameraFreeSpaceInfo_Event_Topic_4
- FrontCameraFreeSpaceInfo_Event_Topic_5
type_red:
- hav_interfaces/msg/FreeSpacesInfoStruct
- hav_interfaces/msg/FreeSpacesInfoStruct
- hav_interfaces/msg/FreeSpacesInfoStruct
- hav_interfaces/msg/FreeSpacesInfoStruct
- hav_interfaces/msg/FreeSpacesInfoStruct
simulink:
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo0_33
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo102_135
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo136_169
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo34_67
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo68_101
tag_simulink:
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo0_33
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo102_1
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo136_1
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo34_67
- FrontCameraObjectDataTransmission_FrontCameraFreeSpaceInfo68_10
type_simulink:
- FreeSpacesInfoStruct
- FreeSpacesInfoStruct
- FreeSpacesInfoStruct
- FreeSpacesInfoStruct
- FreeSpacesInfoStruct
remap: none
output_topics:
- name: FCObjectDetectionInfoStruct_Sim2ROS_Input
type_red: test_interfaces/msg/FCObjectDetectionInfoStruct
simulink: FCObjectDetectionInfoStruct_Sim2ROS_Output
type_simulink: FCObjectDetectionInfoStruct
功能开发中,依赖智驾模型使用 MATLAB 平台升级至 R2023a 版本。
以 1016 版本通信矩阵为例对智驾模型进行适配,有以下 4 个 msg 是智驾模型中没有使用的。若依据完整的 interfaces 生成 bus 转换函数,但模型中并没使用该 bus 定义;由于智驾模型中使用到对应 bus 才会在生成代码中包含数据结构的定义;转换函数会使用到模型中生成的数据结构定义,如果没有该定义,则会在编译阶段报错;则,需要手动删除一下 4 个未使用到数据类型。
RDU1SteerValid.msg
Radar4DbodyInfoStruct.msg
ValidFlag.msg
VehicleSpeed.msg