Carla、虚拟现实、无人机模式之间的切换
Carla 模式主要关注行人和自动驾驶车辆的场景模拟,VR 模式针对智能驾驶舱的行为和交互虚拟现实模拟,AIR 模式重点解决低空无人机的模拟,该页面的文档主要解决它们三者之间的切换问题。
使用方法
下载 链接 中的software/hutb/hutb_car_vr_air_mujoco.zip,CarlaUE4.exe启动场景的默认游戏模式为 Carla。
使用 config.py 切换到 VR 模式 :
config.py --map Town10HD?GAME=VR
切换到 无人机模式 :
config.py --map Town10HD?GAME=AIR
Town10HD为所要切换的地图名,GAME=后面为所需要切到到的游戏模式名,目前支持:CARLA、VR、AIR 三种模式。

切换地图的实现分析

调用 config.py 切换地图时 Carla 模式的 --map 参数不支持游戏模式的切换,为了支持游戏模式的切换,先分析已有实现的调用过程:
-
脚本 config.py 使用
load_world()函数实现世界的加载,然后调用LoadWorld,该功能的实现位于 PythonAPI 中的客户端 PythonAPI\carla\source\libcarla\Client.cpp.def("load_world", CONST_CALL_WITHOUT_GIL_3(cc::Client, LoadWorld, std::string, bool, rpc::MapLayer), (arg("map_name"), arg("reset_settings")=true, arg("map_layers")=rpc::MapLayer::All)) -
客户端 的 LoadWorld 实现位于 LibCarla\source\carla\client\Client.h ,
World LoadWorld(
std::string map_name,
bool reset_settings = true,
rpc::MapLayer map_layers = rpc::MapLayer::All) const {
return World{_simulator->LoadEpisode(std::move(map_name), reset_settings, map_layers)};
}
再调用了 LibCarla client\detail 的模拟器 LibCarla\source\carla\client\detail\Simulator.cpp 的 LoadEpisode
EpisodeProxy Simulator::LoadEpisode(std::string map_name, bool reset_settings, rpc::MapLayer map_layers) {
...
_client.LoadEpisode(std::move(map_name), reset_settings, map_layers);
然后调用了 LibCarla client\detail 的客户端 LibCarla\source\carla\client\detail\Client.cpp
void Client::LoadEpisode(std::string map_name, bool reset_settings, rpc::MapLayer map_layer) {
_pimpl->CallAndWait<void>("load_new_episode", std::move(map_name), reset_settings, map_layer);
}
load_new_episode。
- 服务端 的 load_new_episode 位于 Server 模块的 Carla 服务器 Unreal\CarlaUE4\Plugins\Carla\Source\Carla\Server\CarlaServer.cpp ,
BIND_SYNC(load_new_episode) << [this](const std::string &map_name, const bool reset_settings, cr::MapLayer MapLayers) -> R<void>
{
...
if(!Episode->LoadNewEpisode(cr::ToFString(map_name), reset_settings))
...
};
bool UCarlaEpisode::LoadNewEpisode(const FString &MapString, bool ResetSettings)
{
...
UGameplayStatics::OpenLevel(GetWorld(), *FinalPath, true);
...
由此可以看出切换地图调用了模拟引擎的 UGameplayStatics::OpenLevel()。
增加动态切换游戏模式
一般来讲,设置游戏模式(GameMode)都是在 WorldSettings 里面。 然而,该方法都只能在编辑器内提前配置好将要使用的 GameMode,无法在游戏时动态决定 GameMode。 下面的方法可以在运行游戏时决定 Map 使用哪一个 GameMode。
- 在 Unreal\CarlaUE4\Config\DefaultEngine.ini 中设置游戏模式类的别名
- 调用
UGameplayStatics::OpenLevel()函数,传入Options参数"Game=XXX",或者直接在LevelName里面拼接好"LevelName?Game=XXX",其中XXX是GameMode别名
+GameModeClassAliases=(Name="CARLA",GameMode="/Game/Carla/Blueprints/Game/CarlaGameMode.CarlaGameMode_C")
+GameModeClassAliases=(Name="VR",GameMode="/Script/CarlaUE4.DReyeVRGameMode")
+GameModeClassAliases=(Name="AIR",GameMode="/Script/AirSim.AirSimGameMode")