康谋分享 | 自动驾驶联合仿真——功能模型接口FMI(三)

在之前的两篇文章中(文末往期回顾中可查看),我们主要介绍了功能模型接口FMI的主要组成部分和一些使用场景,今天就以康谋自动驾驶仿真软件aiSim为例,来展示一下如何建立一个FMU并实现基于UDP和FMI联合仿真(co-simulation)数据通信。


目录

效果预览

相关配置

操作步骤

1、实例化

2、FMU交互

3、初始化和释放


一、效果预览

PC1 aiSim运行效果
PC2 读取FMU和UDP通讯

二、相关配置

OS:Ubuntu22.05

仿真软件:aiSim 5.2.0

首先是要构建所需要的FMU,在一些动力学仿真软件上,如CarSim,可以直接导出动力学模型对应的FMU文件,但本次我们基于C++从零构建FMU文件。

需要编辑的6份文件分别是:

  • fmi_simple_car.cpp:根据FMI2.0标准实现一个车辆模型

  • simple_car.h:车辆模型的头文件

  • simple_car.cpp:车辆模型的实现文件

  • value_reference_ids.h:定义值应用ID的头文件

  • modelDescription.xml:定义FMU结构的根文件

  • simple_car_fmu.json文件:用于将构建的FMU文件映射到aiSim的车辆动力学中(非构建FMU所必须)

三、操作步骤

首先是fmi_simple_car.cpp文件主要包含了6个部分,最终实现为模拟控制一个简单的车辆模型,包括了实例化、设置参数,执行仿真步骤以及获取和设置模型参数的功能。

头文件:

  • include "fmi2Functions.h" (是FMI2.0标准的头文件,请参考FMI官网)

  • include

  • include

  • include "simple_car.h"

1、实例化

实例化FMU,在之前的文章中我们以C语言为例,本次采用C++来做示范。

复制代码
fmi2Component fmi2Instantiate(  

fmi2String /*实例名称*/,

fmi2Type fmuType /*实例类型(ME/CO)*/,

fmi2String /*唯一标识符*/,

fmi2String /*资源位置*/,

const fmi2CallbackFunctions* /*回调函数*/,

fmi2Boolean /*是否可见*/,

fmi2Boolean /*是否启用日志*/)

{/*此处可以与用判断车辆实例是否在使用、检查FMU的类型是ME模型交换还是CO联合仿真、执行实例化车辆*/

car_is_used = True; //预先设置的标志变量,用于表示表示车辆是否正在使用

returen &only_one_car; //预先定义的全局SimpleCar对象only_one_car

}

2、FMU交互

实例化完成后,我们要实现一系列函数用于FMU交互的具体实现,主要包含获取和设置变量,执行仿真步骤等。

① 获取类型

获取实数,通过遍历引用数组vr,获取对应的值并存储。

复制代码
fmi2Status fmi2SetReal(fmi2Component /*c*/, const fmi2ValueReference vr[], size_t nvr, const fmi2Real value[]){

for (size_t i = 0; i < nvr; ++i)    {

only_one_car.SetValue(vr[i], value[i]);

}

return fmi2OK;

}

同样还能够实现获取整数、布尔值和字符串值。

执行仿真

获取实联合仿真函数(CO),可以是根据之前实数和证书引入导数计算,又或是引入仿真步骤的执行和取消数,通过遍历引用数组vr,获取对应的值并存储。

比如执行仿真步骤,其中DoStep将会在Simple_car.cpp中实现:

复制代码
fmi2Status fmi2DoStep(fmi2Component /*c*/, fmi2Real /*currentCommunicationPoint*/, fmi2Real communicationStepSize, fmi2Boolean /*newStep*/){    

log_to_file("fmi2DoStep()");    only_one_car.DoStep(communicationStepSize); 

return fmi2OK;

}

同样还能够实现获取整数、布尔值和字符串值。

3、初始化和释放

除此之外,我们还需要注意在仿真过程中FMU实例的初始化和释放。

比如我们可以简单的通过设置car_is_used= false实现实例的释放,可以通过only_one_car = SimplerCar()来实现FMU的重置,其中SimplerCar类的具体实现在simple_car.cpp中。

以上就是基于FMI2.0实现车辆模型时所需的基本内容,剩余的内容我们将在后续的文章中进行分享。


如您对上述产品和解决方案感兴趣,

欢迎联系康谋自动驾驶团队了解更多信息。

我们将竭诚为您服务!

期待与您的交流!

康谋科技 - 您的一站式自动驾驶解决方案合作伙伴,助力自动驾驶商业化落地 - keymotek康谋科技有限公司是原虹科自动驾驶业务孵化出来的全新独立公司,专注于自动驾驶领域。我们以数据为驱动力,提供高性能的数据采集、记录、传输方案,针对各种驾驶场景进行精准的仿真模拟,以及对大量自动驾驶数据进行高效、高质量处理。我们的一站式服务能够满足自动驾驶领域研发测试的全流程需求,助力客户在自动驾驶领域取得更大突破。https://keymotek.com/

相关推荐
吃旺旺雪饼的小男孩19 小时前
自动驾驶图像分割开源数据集指南(2026)
人工智能·开源·自动驾驶
咖啡星人k2 天前
2025 AI编程进入“自动驾驶“时代:我用MonkeyCode把Agent、MCP和AI原生工作流跑通了
人工智能·自动驾驶·prompt·aigc·ai编程·ai-native
QXWZ_IA4 天前
【深度】打破IoT“米级”魔咒:当RTK SDK遇上具身智能与工业互联,厘米级定位如何重塑边缘计算?
物联网·自动驾驶·嵌入式开发·rtk·北斗导航
地平线开发者4 天前
征程6|YOLOv5x 在 Horizon 征程6 上的端到端部署实践(下)
算法·自动驾驶
亚远景aspice5 天前
亚远景-GB44721‑2026 自动驾驶安全文档体系:依托ASPICE构建合规交付包
自动驾驶·aspice·gb44721
爱分享的康康9 天前
解锁路测数据价值|康谋自动驾驶采集‑分析全链路方案解读
人工智能·数码相机·自动驾驶
anscos9 天前
案例分享| Latitude AI × Parasoft:搭建 L2-L3 自动驾驶量产验证与功能安全完整链路
人工智能·安全·自动驾驶
吃好睡好便好10 天前
MATLAB仿真框图4
开发语言·matlab·仿真·分段函数
地平线开发者10 天前
BEVdet模型解析
算法·自动驾驶
爱喝水的鱼丶11 天前
SAP-ABAP:接口与报表场景专项优化:RFC/ODATA 接口、ALV 报表的性能提升方案
运维·性能优化·接口·sap·abap·rfc·经验交流