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


二、相關配置
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 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; }
同樣還能夠實現獲取整數、布爾值和字符串值。
② 設置類型
設置實數,同樣通過only_one_car.SetValue(vr[i], value[i])設置對應的值。
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實現車輛模型時所需的基本內容,剩余的內容我們將在后續的文章中進行分享。
-
接口
+關注
關注
33文章
8949瀏覽量
153218 -
仿真軟件
+關注
關注
21文章
254瀏覽量
30887 -
自動駕駛
+關注
關注
788文章
14204瀏覽量
169588
發布評論請先 登錄
康謀分享 | 自動駕駛仿真進入“標準時代”:aiSim全面對接ASAM OpenX

自動駕駛大模型中常提的Token是個啥?對自動駕駛有何影響?
康謀分享 | 3DGS:革新自動駕駛仿真場景重建的關鍵技術


康謀分享 | 直面AD/ADAS快速開發挑戰:IVEX自動駕駛場景管理及分析平臺!

康謀分享 | 汽車仿真與AI的結合應用

自動駕駛聯合仿真——功能模型接口FMI(終)

FPGA在自動駕駛領域有哪些優勢?
FPGA在自動駕駛領域有哪些應用?
自動駕駛仿真測試實踐:高精地圖仿真

評論