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 的私有成员(主要是 SpectatorActorDispatcher),用于注册手动创建的 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 工具库