From 7b07075480692bc5e26a07ecc83b79acb36701a3 Mon Sep 17 00:00:00 2001 From: Jiayuan Zhu Date: Sun, 23 Mar 2025 05:48:00 +0000 Subject: [PATCH] fix a recorder crash and replay hang for 0.9.15 log issue after introducing vehicle door animation into the log --- .../Carla/Source/Carla/Game/FrameData.cpp | 38 ++++++++++----- .../Source/Carla/Recorder/CarlaRecorder.cpp | 47 ++++++++++++------- .../Source/Carla/Recorder/CarlaRecorder.h | 4 +- 3 files changed, 59 insertions(+), 30 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/FrameData.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/FrameData.cpp index 4d4dbaa4d..b00889ec9 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/FrameData.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/FrameData.cpp @@ -553,12 +553,18 @@ void FFrameData::AddTriggerVolume(const ATrafficSignBase &TrafficSign) { return; } + + auto CarlaActor = Episode->GetActorRegistry().FindCarlaActor(&TrafficSign); + if (!CarlaActor) + { + return; + } UBoxComponent* Trigger = Triggers.Top(); auto VolumeOrigin = Trigger->GetComponentLocation(); auto VolumeExtent = Trigger->GetScaledBoxExtent(); CarlaRecorderActorBoundingBox TriggerVolume = { - Episode->GetActorRegistry().FindCarlaActor(&TrafficSign)->GetActorId(), + CarlaActor->GetActorId(), {VolumeOrigin, VolumeExtent} }; TriggerVolumes.Add(TriggerVolume); @@ -567,21 +573,29 @@ void FFrameData::AddTriggerVolume(const ATrafficSignBase &TrafficSign) void FFrameData::AddPhysicsControl(const ACarlaWheeledVehicle& Vehicle) { CarlaRecorderPhysicsControl Control; - Control.DatabaseId = Episode->GetActorRegistry().FindCarlaActor(&Vehicle)->GetActorId(); - Control.VehiclePhysicsControl = Vehicle.GetVehiclePhysicsControl(); - PhysicsControls.Add(Control); + auto CarlaActor = Episode->GetActorRegistry().FindCarlaActor(&Vehicle); + if (CarlaActor) + { + Control.DatabaseId = CarlaActor->GetActorId(); + Control.VehiclePhysicsControl = Vehicle.GetVehiclePhysicsControl(); + PhysicsControls.Add(Control); + } } void FFrameData::AddTrafficLightTime(const ATrafficLightBase& TrafficLight) { - auto DatabaseId = Episode->GetActorRegistry().FindCarlaActor(&TrafficLight)->GetActorId(); - CarlaRecorderTrafficLightTime TrafficLightTime{ - DatabaseId, - TrafficLight.GetGreenTime(), - TrafficLight.GetYellowTime(), - TrafficLight.GetRedTime() - }; - TrafficLightTimes.Add(TrafficLightTime); + auto CarlaActor = Episode->GetActorRegistry().FindCarlaActor(&TrafficLight); + if (CarlaActor) + { + auto DatabaseId = CarlaActor->GetActorId(); + CarlaRecorderTrafficLightTime TrafficLightTime{ + DatabaseId, + TrafficLight.GetGreenTime(), + TrafficLight.GetYellowTime(), + TrafficLight.GetRedTime() + }; + TrafficLightTimes.Add(TrafficLightTime); + } } void FFrameData::AddPosition(const CarlaRecorderPosition &Position) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Recorder/CarlaRecorder.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Recorder/CarlaRecorder.cpp index 596e8473f..3d9fcfdc7 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Recorder/CarlaRecorder.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Recorder/CarlaRecorder.cpp @@ -307,10 +307,14 @@ void ACarlaRecorder::AddVehicleLight(FCarlaActor *CarlaActor) void ACarlaRecorder::AddVehicleDoor(const ACarlaWheeledVehicle &Vehicle, const EVehicleDoor SDoors, bool bIsOpen) { CarlaRecorderDoorVehicle DoorVehicle; - DoorVehicle.DatabaseId = Episode->GetActorRegistry().FindCarlaActor(&Vehicle)->GetActorId(); - DoorVehicle.Doors = static_cast(SDoors); - DoorVehicle.bIsOpen = bIsOpen; - AddDoorVehicle(DoorVehicle); + auto CarlaActor = Episode->GetActorRegistry().FindCarlaActor(&Vehicle); + if (CarlaActor) + { + DoorVehicle.DatabaseId = CarlaActor->GetActorId(); + DoorVehicle.Doors = static_cast(SDoors); + DoorVehicle.bIsOpen = bIsOpen; + AddDoorVehicle(DoorVehicle); + } } void ACarlaRecorder::AddActorKinematics(FCarlaActor *CarlaActor) @@ -353,12 +357,17 @@ void ACarlaRecorder::AddTriggerVolume(const ATrafficSignBase &TrafficSign) { return; } + auto CarlaActor = Episode->GetActorRegistry().FindCarlaActor(&TrafficSign); + if (!CarlaActor) + { + return; + } UBoxComponent* Trigger = Triggers.Top(); auto VolumeOrigin = Trigger->GetComponentLocation(); auto VolumeExtent = Trigger->GetScaledBoxExtent(); CarlaRecorderActorBoundingBox TriggerVolume = { - Episode->GetActorRegistry().FindCarlaActor(&TrafficSign)->GetActorId(), + CarlaActor->GetActorId(), {VolumeOrigin, VolumeExtent} }; TriggerVolumes.Add(TriggerVolume); @@ -370,9 +379,12 @@ void ACarlaRecorder::AddPhysicsControl(const ACarlaWheeledVehicle& Vehicle) if (bAdditionalData) { CarlaRecorderPhysicsControl Control; - Control.DatabaseId = Episode->GetActorRegistry().FindCarlaActor(&Vehicle)->GetActorId(); - Control.VehiclePhysicsControl = Vehicle.GetVehiclePhysicsControl(); - PhysicsControls.Add(Control); + if (auto CarlaActor = Episode->GetActorRegistry().FindCarlaActor(&Vehicle)) + { + Control.DatabaseId = CarlaActor->GetActorId(); + Control.VehiclePhysicsControl = Vehicle.GetVehiclePhysicsControl(); + PhysicsControls.Add(Control); + } } } @@ -380,14 +392,17 @@ void ACarlaRecorder::AddTrafficLightTime(const ATrafficLightBase& TrafficLight) { if (bAdditionalData) { - auto DatabaseId = Episode->GetActorRegistry().FindCarlaActor(&TrafficLight)->GetActorId(); - CarlaRecorderTrafficLightTime TrafficLightTime{ - DatabaseId, - TrafficLight.GetGreenTime(), - TrafficLight.GetYellowTime(), - TrafficLight.GetRedTime() - }; - TrafficLightTimes.Add(TrafficLightTime); + if (auto CarlaActor = Episode->GetActorRegistry().FindCarlaActor(&TrafficLight)) + { + auto DatabaseId = CarlaActor->GetActorId(); + CarlaRecorderTrafficLightTime TrafficLightTime{ + DatabaseId, + TrafficLight.GetGreenTime(), + TrafficLight.GetYellowTime(), + TrafficLight.GetRedTime() + }; + TrafficLightTimes.Add(TrafficLightTime); + } } } diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Recorder/CarlaRecorder.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Recorder/CarlaRecorder.h index 12f527728..a1683595f 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Recorder/CarlaRecorder.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Recorder/CarlaRecorder.h @@ -69,9 +69,9 @@ enum class CarlaRecorderPacketId : uint8_t FrameCounter, WalkerBones, VisualTime, - VehicleDoor, AnimVehicleWheels, - AnimBiker + AnimBiker, + VehicleDoor }; /// Recorder for the simulation