CarlaAir 所有修改清单
本文档列出了 CarlaAir 相对于原版 Carla 0.9.16 和 AirSim 的所有代码修改,方便开发者精确了解改动范围。
修改统计
| 类型 | 数量 | 说明 |
|---|---|---|
| 新建文件 | 2 | SimWorldGameMode.h, SimWorldGameMode.cpp |
| 修改文件 | 3 | CarlaGameModeBase.h, CarlaEpisode.h, SimModeBase.cpp |
| 配置修改 | 1 | DefaultGame.ini (添加 AirSim 资源条目) |
| 新建脚本 | 30+ | carlaAir.sh, 示例脚本, Demo 脚本 |
详细修改
1. [新建] SimWorldGameMode.h (位于 AirSim 插件中)
路径: Unreal/CarlaUE4/Plugins/AirSim/Source/SimWorldGameMode.h
行数: 75 行
放置在 AirSim 插件目录的原因: 需要引用 AirSim 头文件 (SimHUDWidget.h, SimModeBase.h, PIPCamera.h, AirSimSettings.hpp)
类声明:
UCLASS()
class AIRSIM_API ASimWorldGameMode : public ACarlaGameModeBase
公共接口: - 构造函数、BeginPlay、Tick、EndPlay(override) - 8 个输入事件处理函数(Recording, Report, Help, Trace, SubWindow 0/1/2, All)
私有成员:
- USimHUDWidget* Widget_ — AirSim HUD 控件
- ASimModeBase* SimMode_ — AirSim 模拟模式 Actor
- APIPCamera* SubwindowCameras_[3] — 子窗口相机
2. [新建] SimWorldGameMode.cpp (位于 AirSim 插件中)
路径: Unreal/CarlaUE4/Plugins/AirSim/Source/SimWorldGameMode.cpp
行数: 548 行
关键实现:
| 函数 | 行号 | 功能 |
|---|---|---|
| 构造函数 | 66-123 | DefaultPawnClass=nullptr, 加载BP_Weather, 注册8个Factory |
| BeginPlay | 127-186 | Carla 初始化 → 创建SpectatorPawn → AirSim引导 |
| Tick | 190-198 | Carla Recorder + AirSim Widget更新 |
| EndPlay | 202-224 | 停止API → 销毁Widget/SimMode → Carla 清理 |
| InitializeAirSimSettings | 228-244 | 读取settings.json |
| SetUnrealEngineSettings | 246-259 | 关闭MotionBlur, 启用CustomDepth |
| CreateSimMode | 263-286 | 根据SimMode类型SpawnActor |
| CreateAirSimWidget | 290-327 | 创建并初始化HUD Widget |
| SetupAirSimInputBindings | 362-375 | 绑定 R/T/;/F1/1/2/3/0 键(F1表示弹出帮助信息,F10表示进行参数设置,0表示显示全部三个传感器数据,冒号表示显示物理、动力学、旋转等实时数据) |
| GetSettingsText | 497-503 | 搜索settings.json (4个位置) |
3. [修改] CarlaGameModeBase.h
路径: Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/CarlaGameModeBase.h
修改量: 2 处,约 4 行
修改前 (在 private: 区域,注意,也在 public 里!):
private:
UPROPERTY(EditAnywhere)
TSubclassOf<AWeather> WeatherClass;
UPROPERTY(EditAnywhere)
TArray<TSubclassOf<ACarlaActorFactory>> ActorFactories;
修改后 (移到 protected: 区域):
protected:
UPROPERTY(EditAnywhere)
TSubclassOf<AWeather> WeatherClass;
UPROPERTY(EditAnywhere)
TArray<TSubclassOf<ACarlaActorFactory>> ActorFactories;
影响: 仅影响访问权限,不改变运行时行为。子类 ASimWorldGameMode 可以在构造函数中设置这些属性。
4. [修改] CarlaEpisode.h
路径: Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/CarlaEpisode.h
修改量: 1 处,2 行
添加位置: 类声明内部,约第 338 行
friend class ASimModeBase;
friend class ASimWorldGameMode;
影响: 允许 SimWorldGameMode 直接访问 Episode 的私有成员(主要是 Spectator 和 ActorDispatcher),用于注册手动创建的 SpectatorPawn。
5. [修改] SimModeBase.cpp (位于 AirSim 插件中)
路径: Unreal/CarlaUE4/Plugins/AirSim/Source/SimMode/SimModeBase.cpp
修改量: 1 处,约 6 行
修改前 (~第 119 行):
this->GetWorld()->SetNewWorldOrigin(FIntVector(player_loc) + FIntVector(0, 0, 0));
global_ned_transform_.reset(new NedTransform(player_start_transform,
UAirBlueprintLib::GetWorldToMetersScale(this)));
修改后:
// NOTE: Do NOT call SetNewWorldOrigin() here. In CarlaAir (CARLA + AirSim integration),
// shifting the world origin breaks CARLA's landscape/road collision, causing all ground
// vehicles to fall through the map (~30m underground). The NedTransform is initialized
// with the original player_start_transform, which correctly serves as the NED origin
// for AirSim coordinate conversion without moving the world.
global_ned_transform_.reset(new NedTransform(player_start_transform,
UAirBlueprintLib::GetWorldToMetersScale(this)));
影响: 车辆不再穿过地面(z≈0.00 正常行驶),AirSim 无人机坐标系不受影响(NedTransform 仍然使用 PlayerStart 作为原点)。
注意
请勿在此处调用 SetNewWorldOrigin()。在 CarlaAir(Carla + AirSim 集成)中,移动世界原点会破坏 Carla 的地形/道路碰撞检测,导致所有地面车辆穿过地图(约 30 米深)。NedTransform 方法使用原始的 player_start_transform 进行初始化,这样无需移动世界即可正确用作 AirSim 坐标转换的 NED 原点。
6. [修改] DefaultGame.ini
路径: Unreal/CarlaUE4/Config/DefaultGame.ini
修改量: 新增约 8 行
新增内容:
# AirSim content directories to cook
+DirectoriesToAlwaysCook=(Path="/AirSim/Blueprints")
+DirectoriesToAlwaysCook=(Path="/AirSim/HUDAssets")
+DirectoriesToAlwaysCook=(Path="/AirSim/Models")
+DirectoriesToAlwaysCook=(Path="/AirSim/Weather")
+DirectoriesToAlwaysCook=(Path="/AirSim/StarterContent")
+DirectoriesToAlwaysCook=(Path="/AirSim/VehicleAdv")
# AirSim assets map
+MapsToCook=(FilePath="/AirSim/AirSimAssets")
影响: 打包时包含所有 AirSim 资源(无人机模型、HUD、天气特效等),共 340 个文件。
未修改的关键文件(供参考)
以下文件是原版 Carla/AirSim 的,未做修改但对理解系统重要:
CarlaGameModeBase.cpp— Carla GameMode 实现CarlaEpisode.cpp— Episode 管理SimModeWorldMultiRotor.cpp— 多旋翼飞行器模式SimpleFlight/SimpleFlightApi.cpp— 简单飞行控制器PIPCamera.cpp— AirSim 相机实现AirBlueprintLib.cpp— AirSim UE4 工具库