CarlaUnreal 插件 Actor 模块说明文档

目录

概述

CarlaUnreal 插件中的 Actor 模块是 CARLA 模拟器中用于管理和操作参与者(Actor)的重要组件。参与者包括车辆、行人、交通信号灯、交通标志和传感器等,用于模拟真实的交通场景和环境交互。该模块提供了 Actor 的生成、注册、数据记录与恢复、状态管理(如休眠与唤醒)以及销毁等功能,广泛应用于 CARLA 的仿真逻辑中。

本模块基于 Unreal Engine 的 Actor 系统,结合 CARLA 的自定义逻辑,实现了对不同类型参与者的统一管理和高效操作。以下文档详细介绍了模块中的核心类、功能以及代码实现的关键点。


核心类与功能

1. FActorData

FActorData 是 Actor 模块的基础数据类,用于记录 记录恢复通用 Actor 的状态数据(如位置、旋转、速度等)。它是其他特定类型数据类的基类(如车辆、行人等)。

主要功能

  • 记录数据:记录 Actor 的位置、旋转、缩放、速度、角速度和物理模拟状态。
  • 恢复数据:根据记录的数据恢复 Actor 的状态。
  • 重生 Actor:根据存储的变换信息重新生成 Actor。
  • 获取局部变换:计算相对于当前地图原点的变换。

关键方法

  • AActor* RespawnActor(UCarlaEpisode* CarlaEpisode, const FActorInfo& Info)
    重生一个 Actor,使用存储的变换信息并向上偏移 15 个单位以避免碰撞。
  • void RecordActorData(FCarlaActor* CarlaActor, UCarlaEpisode* CarlaEpisode)
    记录 Actor 的位置、旋转、缩放、速度、角速度和物理状态。
  • void RestoreActorData(FCarlaActor* CarlaActor, UCarlaEpisode* CarlaEpisode)
    恢复 Actor 的变换、速度、角速度和物理状态,针对车辆和行人进行特殊处理。
  • FTransform GetLocalTransform(UCarlaEpisode* CarlaEpisode) const
    计算相对于当前地图原点的局部变换。

派生类

  • FVehicleData:扩展了 FActorData,用于记录和恢复车辆特定的数据,如物理控制、灯光状态和速度限制。
  • FWalkerData:扩展了 FActorData,用于记录和恢复行人特定的控制数据和存活状态。
  • FTrafficSignData:扩展了 FActorData,用于记录和恢复交通标志的模型和标识信息。
  • FTrafficLightData:扩展了 FActorData,用于记录和恢复交通信号灯的状态和控制器信息。
  • FActorSensorData:扩展了 FActorData,用于记录和恢复传感器的数据流。

2. UActorDispatcher

UActorDispatcher 是 Actor 模块的核心调度类,负责 生成注册销毁状态管理(休眠/唤醒)Actor。它通过绑定 Actor 定义和生成函数,管理 Actor 的生命周期。

主要功能

  • 绑定 Actor 定义:将 Actor 定义与生成函数关联,分配唯一 ID。
  • 生成 Actor:根据描述和变换生成 Actor,并注册到系统中。
  • 销毁 Actor:移除 Actor 及其控制器,清理注册信息。
  • 状态管理:将 Actor 设置为休眠或唤醒状态。
  • ROS2 集成:支持将 Actor 注册到 ROS2 系统中,处理名称映射和回调。

关键方法

  • void Bind(FActorDefinition Definition, SpawnFunctionType Functor)
    绑定 Actor 定义和生成函数,分配唯一 ID。
  • void Bind(ACarlaActorFactory &ActorFactory)
    绑定 Actor 工厂中的所有定义。
  • TPair<EActorSpawnResultStatus, FCarlaActor*> SpawnActor(const FTransform &Transform, FActorDescription Description, FCarlaActor::IdType DesiredId)
    生成 Actor 并注册,返回生成状态和 Actor 指针。
  • AActor* ReSpawnActor(const FTransform &Transform, FActorDescription Description)
    重新生成 Actor,不进行注册。
  • bool DestroyActor(FCarlaActor::IdType ActorId)
    销毁指定 ID 的 Actor 及其控制器。
  • FCarlaActor* RegisterActor(AActor &Actor, FActorDescription Description, FActorRegistry::IdType DesiredId)
    注册 Actor,绑定到指定 ID,并支持 ROS2 集成。
  • void PutActorToSleep(FCarlaActor::IdType Id, UCarlaEpisode* CarlaEpisode)
    将 Actor 及其子 Actor 设置为休眠状态。
  • void WakeActorUp(FCarlaActor::IdType Id, UCarlaEpisode* CarlaEpisode)
    唤醒指定 ID 的 Actor。
  • void OnActorDestroyed(AActor *Actor)
    处理 Actor 销毁事件,清理注册和 ROS2 映射。

3. FActorRegistry

FActorRegistry 是 Actor 模块的注册管理类,负责 注册注销查找 Actor。它维护 Actor 的唯一 ID 和状态信息,确保数据一致性。

主要功能

  • 注册 Actor:为 Actor 分配唯一 ID,存储其信息并关联到系统中。
  • 注销 Actor:移除 Actor 的注册信息,清理映射。
  • 查找 Actor:根据 ID 或 Actor 指针查找注册的 Actor。
  • 状态管理:支持 Actor 的休眠和唤醒操作。
  • 类型判断:根据 Actor 类型返回对应的枚举值(车辆、行人、传感器等)。

关键方法

  • FCarlaActor* Register(AActor &Actor, FActorDescription Description, IdType DesiredId)
    注册 Actor,分配或复用 ID,存储描述和状态信息。
  • void Deregister(IdType Id)
    注销指定 ID 的 Actor,清理映射。
  • void Deregister(AActor *Actor)
    根据 Actor 指针注销 Actor。
  • TSharedPtr<FCarlaActor> MakeCarlaActor(IdType Id, AActor &Actor, FActorDescription Description, crp::ActorState InState)
    创建 FCarlaActor 对象,初始化描述、标签和边界框。
  • void PutActorToSleep(FCarlaActor::IdType Id, UCarlaEpisode* CarlaEpisode)
    将 Actor 及其子 Actor 设置为休眠状态,移除活跃映射。
  • FCarlaActor* FindCarlaActor(IdType Id)
    根据 ID 查找注册的 Actor。
  • static FCarlaActor::ActorType GetActorType(const AActor *Actor)
    判断 Actor 类型(车辆、行人、交通信号灯等)。

代码结构与实现细节

数据记录与恢复

  • 通用数据FActorData 及其派生类记录 Actor 的位置、旋转、速度等基本信息,确保状态一致性。
  • 特定数据:针对车辆(FVehicleData)、行人(FWalkerData)等类型,记录特定控制数据(如车辆灯光、行人控制)。
  • 恢复逻辑:恢复时根据 Actor 类型(如车辆、传感器)应用不同逻辑,确保物理状态和控制参数正确。

Actor 生成与管理

  • 生成流程UActorDispatcher 通过绑定的生成函数生成 Actor,并通过 FActorRegistry 注册到系统中。
  • ID 分配FActorRegistry 使用全局计数器 ID_COUNTER 分配唯一 ID,支持用户指定 ID。
  • 状态管理:休眠状态通过移除活跃映射实现,唤醒时重新注册 Actor。

ROS2 集成

  • 名称映射:Actor 注册时支持 ROS2 名称映射,处理车辆和非车辆的命名规则。
  • 回调支持:为特定角色(如 heroego)添加 ROS2 回调,处理实时数据交互。

错误处理

  • 日志记录:使用 Unreal Engine 的日志系统(UE_LOG)记录生成、销毁和注册中的错误。
  • 状态检查:生成和注册过程中对 Actor 描述和 ID 进行验证,确保数据有效性。

使用场景

  1. 仿真场景初始化
  2. 使用 UActorDispatcher::SpawnActor 生成车辆、行人等 Actor,设置初始位置和状态,进行场景初始化。
  3. 通过 FActorRegistry::Register 注册 Actor,分配唯一 ID。
  4. 状态保存与恢复
  5. 使用 FActorData::RecordActorData 保存 Actor 状态。
  6. 使用 FActorData::RestoreActorData 恢复 Actor 状态,用于场景重置或回放。
  7. 动态管理
  8. 使用 UActorDispatcher::PutActorToSleepWakeActorUp 动态管理 Actor 的活跃状态,优化性能。
  9. 使用 UActorDispatcher::DestroyActor 清理不再需要的 Actor。
  10. 传感器与数据流
  11. 使用 FActorSensorData 管理传感器数据流,支持实时数据传输和处理。
  12. 交通模拟
  13. 使用 FTrafficLightDataFTrafficSignData 管理交通信号灯和标志的状态,模拟真实交通规则。

注意事项

  1. 物理模拟
  2. 车辆和行人的物理模拟状态通过 bSimulatePhysics 控制,需确保正确设置以避免仿真异常。
  3. 恢复物理状态时,需针对不同 Actor 类型(如车辆、行人)应用特定逻辑。
  4. ID 管理
  5. 确保 Actor ID 的唯一性,避免重复注册或冲突。
  6. 使用 DesiredId 时,需验证其未被占用。
  7. ROS2 集成
  8. 启用 ROS2 时,需确保正确配置名称映射和回调,避免命名冲突或数据丢失。
  9. 边界框与标签
  10. 边界框通过 UBoundingBoxCalculator 计算,需确保 Actor 的几何信息正确。
  11. 语义标签通过 ATagger 获取,需避免无效标签(如 NoneOther)。
  12. 未实现功能
  13. 部分代码(如行人死亡计时器)标记为 TODO,需后续完善。
  14. 子 Actor 的休眠逻辑可能需要进一步优化。