背景
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中有关于传感器的实现方式,谢谢支持!
来源:oschina
链接:https://my.oschina.net/u/4406675/blog/4815243