背景
CARLA是Intel公司基于虛幻四引擎開發的自動駕駛仿真器,仿真器作為一個服務器端,用戶可以通過CARLA提供的python API進行編程,從仿真器服務端獲取自己需要的傳感器資料,既然用戶平時都是撰寫客戶端的代碼,我們又何需去看服務端是如何實作的呢?筆者認為,Intel公司的代碼能力是很強的,通過CARLA仿真器原始碼的閱讀,我們可以從使用CARLA的階段進階到熟悉并且可以修改CARLA的地圖,因為CARLA仿真器也是一年又一年的在更新迭代,也添加了許多新的工具,說明還有許多不足的地方,我們可以通過這個方式成為開源社區貢獻者的一員,并且CARLA這樣的Server-Client的方式,其實是將仿真器的瓶頸設定在了網路傳輸的速率之上,因為Server-Client的資料傳輸依靠的是RPC的傳輸方式,如果網路帶寬跟不上,也就無法進行實時仿真,另外,由于CARLA是基于虛幻引擎撰寫的,那也就給想要學習虛幻引擎的朋友提供了一個非常好的學習機會,不僅是從游戲制作的角度,更是從仿真器開發制作的角度來看待這款引擎,
CARLA獲取和編譯
具體可以參考我之前的文章CARLA中匯入RoadRunner建模高精度地圖(一) ------ 環境配置篇,并且我們通過右鍵點擊Unreal/CarlaUE4/CarlaUE4.uproject->Generate Visual Studio project file來生成sln工程檔案,打開之后我們就可以看到CARLA中關于C++部分的代碼實作,從下圖可以看到carla是作為unreal的一個插件放入的工程當中的,類似與airsim的實作方式,如果有虛幻引擎基礎的同學,可以通過添加log函式,來看到我們可以通過修改plugins來查看CARLA是如何組織結構的,

架構分析
CARLA插件下面的Source源檔案依賴于一個更為重要的依賴,就是其依賴的庫如rpc、boost、以及一些對于傳感器資料進行序列化所需要的一些庫等等,而這些檔案在VS工程當中并沒有顯示出來,

我們可以聚焦到Source/Carla/Settings/QualityLevelUE.h檔案,我對這個檔案比較感興趣是因為在CARLA啟動的時候,如果我們使用命令列"CarlaUE4.exe -quality-level=Low",則可以開啟低畫質模式,該檔案參考了<carla/rpc/QualityLevel.h>,而QualityLevelUE.h檔案自身被CarlaSettings.h以及CarlaSettingsDelegate.h檔案包含,我們做一個小實驗,可以看到CarlaSettings.h中的107行,發現CARLA默認啟動的畫質引數為Epic,即最高畫質,我們將其內容修改為Low,再在UEEditor里面Compile C++代碼,再次啟動CARLA,可以看到畫質變低了,



而我們再去深究其改變畫質的原理,可以看到CarlaSettingsDelegate.cpp的71行ApplyQualityLevelPostRestart()函式中根據不同的初始化資訊,CARLA中對于畫質也有不同的調整,
switch (QualityLevel)
{
case EQualityLevel::Low:
{
// execute tweaks for quality
LaunchLowQualityCommands(InWorld);
// iterate all directional lights, deactivate shadows
SetAllLights(InWorld, CarlaSettings->LowLightFadeDistance, false, true);
// Set all the roads the low quality materials
SetAllRoads(InWorld, CarlaSettings->LowRoadPieceMeshMaxDrawDistance, CarlaSettings->LowRoadMaterials);
// Set all actors with static meshes a max disntace configured in the
// global settings for the low quality
SetAllActorsDrawDistance(InWorld, CarlaSettings->LowStaticMeshMaxDrawDistance);
// Disable all post process volumes
SetPostProcessEffectsEnabled(InWorld, false);
break;
}
default:
UE_LOG(LogCarla, Warning, TEXT("Unknown quality level, falling back to default."));
case EQualityLevel::Epic:
{
LaunchEpicQualityCommands(InWorld);
SetAllLights(InWorld, 0.0f, true, false);
SetAllRoads(InWorld, 0, CarlaSettings->EpicRoadMaterials);
SetAllActorsDrawDistance(InWorld, 0);
SetPostProcessEffectsEnabled(InWorld, true);
break;
}
}
AppliedLowPostResetQualityLevel = QualityLevel;
總結
這次主要是帶大家了解了CARLA專案的檔案結構并且進行了一個小實驗,下次博文重點帶大家看一下CARLA中有關于傳感器的實作方式,謝謝支持!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/236046.html
標籤:其他
