加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 一、效果預(yù)覽
    • 一、相關(guān)配置
    • 三、操作步驟
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

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

07/11 17:09
1452
閱讀需 8 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

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

一、效果預(yù)覽

PC1?aiSim運行效果

PC2?讀取FMU和UDP通訊

一、相關(guān)配置

OS:Ubuntu22.05

仿真軟件:aiSim?5.2.0

首先是要構(gòu)建所需要的FMU,在一些動力學(xué)仿真軟件上,如CarSim,可以直接導(dǎo)出動力學(xué)模型對應(yīng)的FMU文件,但本次我們基于C++從零構(gòu)建FMU文件。

需要編輯的6份文件分別是:

  • fmi_simple_car.cpp:根據(jù)FMI2.0標準實現(xiàn)一個車輛模型
  • simple_car.h:車輛模型的頭文件
  • simple_car.cpp:車輛模型的實現(xiàn)文件
  • value_reference_ids.h:定義值應(yīng)用ID的頭文件
  • modelDescription.xml:定義FMU結(jié)構(gòu)的根文件
  • simple_car_fmu.json文件:用于將構(gòu)建的FMU文件映射到aiSim的車輛動力學(xué)中(非構(gòu)建FMU所必須)

三、操作步驟

首先是fmi_simple_car.cpp文件主要包含了6個部分,最終實現(xiàn)為模擬控制一個簡單的車輛模型,包括了實例化、設(shè)置參數(shù),執(zhí)行仿真步驟以及獲取和設(shè)置模型參數(shù)的功能。

頭文件:

  • include?"fmi2Functions.h"?(是FMI2.0標準的頭文件,請參考FMI官網(wǎng))
  • include
  • include
  • include?"simple_car.h"

1、實例化

實例化FMU,在之前的文章中我們以C語言為例,本次采用C++來做示范。

fmi2Component fmi2Instantiate(  
fmi2String /*實例名稱*/,
fmi2Type fmuType /*實例類型(ME/CO)*/,
fmi2String /*唯一標識符*/,
fmi2String /*資源位置*/,
const fmi2CallbackFunctions* /*回調(diào)函數(shù)*/,
fmi2Boolean /*是否可見*/,
fmi2Boolean /*是否啟用日志*/)
{/*此處可以與用判斷車輛實例是否在使用、檢查FMU的類型是ME模型交換還是CO聯(lián)合仿真、執(zhí)行實例化車輛*/
car_is_used = True; //預(yù)先設(shè)置的標志變量,用于表示表示車輛是否正在使用
returen &only_one_car; //預(yù)先定義的全局SimpleCar對象only_one_car
}

2、FMU交互

實例化完成后,我們要實現(xiàn)一系列函數(shù)用于FMU交互的具體實現(xiàn),主要包含獲取和設(shè)置變量,執(zhí)行仿真步驟等

① 獲取類型

獲取實數(shù),通過遍歷引用數(shù)組vr,獲取對應(yīng)的值并存儲。

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ù),同樣通過only_one_car.SetValue(vr[i],?value[i])設(shè)置對應(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í)行仿真

獲取實聯(lián)合仿真函數(shù)(CO),可以是根據(jù)之前實數(shù)和證書引入導(dǎo)數(shù)計算,又或是引入仿真步驟的執(zhí)行和取消數(shù),通過遍歷引用數(shù)組vr,獲取對應(yīng)的值并存儲。

比如執(zhí)行仿真步驟,其中DoStep將會在Simple_car.cpp中實現(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、初始化和釋放

除此之外,我們還需要注意在仿真過程中FMU實例的初始化和釋放。

比如我們可以簡單的通過設(shè)置car_is_used= false實現(xiàn)實例的釋放,可以通過only_one_car = SimplerCar()來實現(xiàn)FMU的重置,其中SimplerCar類的具體實現(xiàn)在simple_car.cpp中。

以上就是基于FMI2.0實現(xiàn)車輛模型時所需的基本內(nèi)容,剩余的內(nèi)容我們將在后續(xù)的文章中進行分享。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
LM335Z 1 STMicroelectronics Precision Temperature Sensor

ECAD模型

下載ECAD模型
$0.3 查看
AD7415ARTZ-0REEL7 1 Analog Devices Inc Digital Output Temperature Sensor

ECAD模型

下載ECAD模型
$2.7 查看
MLX90316KGO-BCG-000-RE 1 Melexis Microelectronic Integrated Systems Hall Effect Sensor, 0deg Min, 360deg Max, -8-8mA, Rectangular, Surface Mount, 0.173 INCH, ROHS COMPLIANT, PLASTIC, TSSOP-16
$95.07 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜