在之前的兩篇文章中(文末往期回顧中可查看),我們主要介紹了功能模型接口FMI的主要組成部分和一些使用場(chǎng)景,今天就以康謀自動(dòng)駕駛仿真軟件aiSim為例,來(lái)展示一下如何建立一個(gè)FMU并實(shí)現(xiàn)基于UDP和FMI聯(lián)合仿真(co-simulation)數(shù)據(jù)通信。
一、效果預(yù)覽


二、相關(guān)配置
OS:Ubuntu22.05
仿真軟件:aiSim 5.2.0
首先是要構(gòu)建所需要的FMU,在一些動(dòng)力學(xué)仿真軟件上,如CarSim,可以直接導(dǎo)出動(dòng)力學(xué)模型對(duì)應(yīng)的FMU文件,但本次我們基于C++從零構(gòu)建FMU文件。
需要編輯的6份文件分別是:
fmi_simple_car.cpp:根據(jù)FMI2.0標(biāo)準(zhǔn)實(shí)現(xiàn)一個(gè)車輛模型
simple_car.h:車輛模型的頭文件
simple_car.cpp:車輛模型的實(shí)現(xiàn)文件
value_reference_ids.h:定義值應(yīng)用ID的頭文件
modelDescription.xml:定義FMU結(jié)構(gòu)的根文件
simple_car_fmu.json文件:用于將構(gòu)建的FMU文件映射到aiSim的車輛動(dòng)力學(xué)中(非構(gòu)建FMU所必須)
三、操作步驟
首先是fmi_simple_car.cpp文件主要包含了6個(gè)部分,最終實(shí)現(xiàn)為模擬控制一個(gè)簡(jiǎn)單的車輛模型,包括了實(shí)例化、設(shè)置參數(shù),執(zhí)行仿真步驟以及獲取和設(shè)置模型參數(shù)的功能。
頭文件:
include "fmi2Functions.h" (是FMI2.0標(biāo)準(zhǔn)的頭文件,請(qǐng)參考FMI官網(wǎng))
include
include
include "simple_car.h"
1、實(shí)例化
實(shí)例化FMU,在之前的文章中我們以C語(yǔ)言為例,本次采用C++來(lái)做示范。
fmi2Component fmi2Instantiate( fmi2String /*實(shí)例名稱*/, fmi2Type fmuType /*實(shí)例類型(ME/CO)*/, fmi2String /*唯一標(biāo)識(shí)符*/, fmi2String /*資源位置*/, const fmi2CallbackFunctions* /*回調(diào)函數(shù)*/, fmi2Boolean /*是否可見(jiàn)*/, fmi2Boolean /*是否啟用日志*/) {/*此處可以與用判斷車輛實(shí)例是否在使用、檢查FMU的類型是ME模型交換還是CO聯(lián)合仿真、執(zhí)行實(shí)例化車輛*/ car_is_used = True; //預(yù)先設(shè)置的標(biāo)志變量,用于表示表示車輛是否正在使用 returen &only_one_car; //預(yù)先定義的全局SimpleCar對(duì)象only_one_car }
2、FMU交互
實(shí)例化完成后,我們要實(shí)現(xiàn)一系列函數(shù)用于FMU交互的具體實(shí)現(xiàn),主要包含獲取和設(shè)置變量,執(zhí)行仿真步驟等。
① 獲取類型
獲取實(shí)數(shù),通過(guò)遍歷引用數(shù)組vr,獲取對(duì)應(yīng)的值并存儲(chǔ)。
fmi2Status fmi2GetReal(fmi2Component /*c*/, const fmi2ValueReference vr[], size_t nvr, fmi2Real value[]){ for (size_t i = 0; i < nvr; ++i) { value[i] = only_one_car.GetValue(vr[i]); } return fmi2OK; }
同樣還能夠?qū)崿F(xiàn)獲取整數(shù)、布爾值和字符串值。
② 設(shè)置類型
設(shè)置實(shí)數(shù),同樣通過(guò)only_one_car.SetValue(vr[i], value[i])設(shè)置對(duì)應(yīng)的值。
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; }
同樣還能夠?qū)崿F(xiàn)獲取整數(shù)、布爾值和字符串值。
③ 執(zhí)行仿真
獲取實(shí)聯(lián)合仿真函數(shù)(CO),可以是根據(jù)之前實(shí)數(shù)和證書(shū)引入導(dǎo)數(shù)計(jì)算,又或是引入仿真步驟的執(zhí)行和取消數(shù),通過(guò)遍歷引用數(shù)組vr,獲取對(duì)應(yīng)的值并存儲(chǔ)。
比如執(zhí)行仿真步驟,其中DoStep將會(huì)在Simple_car.cpp中實(shí)現(xiàn):
fmi2Status fmi2DoStep(fmi2Component /*c*/, fmi2Real /*currentCommunicationPoint*/, fmi2Real communicationStepSize, fmi2Boolean /*newStep*/){ log_to_file("fmi2DoStep()"); only_one_car.DoStep(communicationStepSize); return fmi2OK; }
同樣還能夠?qū)崿F(xiàn)獲取整數(shù)、布爾值和字符串值。
3、初始化和釋放
除此之外,我們還需要注意在仿真過(guò)程中FMU實(shí)例的初始化和釋放。
比如我們可以簡(jiǎn)單的通過(guò)設(shè)置car_is_used= false實(shí)現(xiàn)實(shí)例的釋放,可以通過(guò)only_one_car = SimplerCar()來(lái)實(shí)現(xiàn)FMU的重置,其中SimplerCar類的具體實(shí)現(xiàn)在simple_car.cpp中。
以上就是基于FMI2.0實(shí)現(xiàn)車輛模型時(shí)所需的基本內(nèi)容,剩余的內(nèi)容我們將在后續(xù)的文章中進(jìn)行分享。
-
接口
+關(guān)注
關(guān)注
33文章
8775瀏覽量
152396 -
仿真軟件
+關(guān)注
關(guān)注
21文章
250瀏覽量
30633 -
自動(dòng)駕駛
+關(guān)注
關(guān)注
788文章
14002瀏覽量
167711
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
康謀分享 | 3DGS:革新自動(dòng)駕駛仿真場(chǎng)景重建的關(guān)鍵技術(shù)


康謀分享 | ADTF軟件注冊(cè)和工程創(chuàng)建# 自動(dòng)駕駛# 系統(tǒng)開(kāi)發(fā)# 數(shù)據(jù)處理# 教程# 測(cè)試# 干貨# 經(jīng)驗(yàn)
自動(dòng)駕駛規(guī)控算法驗(yàn)證到底需要什么樣的場(chǎng)景仿真軟件?

康謀與Anyverse建立合作伙伴關(guān)系
康謀技術(shù) | 毫米波雷達(dá)技術(shù)解析

康謀分享 | 直面AD/ADAS快速開(kāi)發(fā)挑戰(zhàn):IVEX自動(dòng)駕駛場(chǎng)景管理及分析平臺(tái)!

康謀分享 | 汽車仿真與AI的結(jié)合應(yīng)用

自動(dòng)駕駛聯(lián)合仿真——功能模型接口FMI(終)

FPGA在自動(dòng)駕駛領(lǐng)域有哪些優(yōu)勢(shì)?
FPGA在自動(dòng)駕駛領(lǐng)域有哪些應(yīng)用?
康謀分享 | 自動(dòng)駕駛聯(lián)合仿真——功能模型接口FMI(四)

康謀分享 | 自動(dòng)駕駛聯(lián)合仿真——功能模型接口FMI(二)

自動(dòng)駕駛仿真測(cè)試實(shí)踐:高精地圖仿真

康謀分享 | 自動(dòng)駕駛聯(lián)合仿真——功能模型接口FMI(一)

評(píng)論