13#include "GameFramework/CharacterMovementComponent.h"
19#include "Components/CapsuleComponent.h"
43 TSharedPtr<const FActorInfo>
Info,
59 TSharedPtr<const FActorInfo>
Info,
72 TSharedPtr<const FActorInfo>
Info,
80 TSharedPtr<const FActorInfo>
Info,
85 Type = ActorType::Sensor;
92 TSharedPtr<const FActorInfo>
Info,
98 ActorData = MakeShared<FTrafficSignData>();
104 TSharedPtr<const FActorInfo>
Info,
110 ActorData = MakeShared<FTrafficLightData>();
116 TSharedPtr<const FActorInfo>
Info,
128 TSharedPtr<const FActorInfo>
Info,
141 TSharedPtr<const FActorInfo>
Info,
177 ActorData->RecordActorData(
this, CarlaEpisode);
188 UE_LOG(LogCarla, Error, TEXT(
"Could not wake up dormant actor %d at location %s"),
GetActorId(), *(
ActorData->GetLocalTransform(CarlaEpisode).GetLocation().ToString()));
192 ActorData->RestoreActorData(
this, CarlaEpisode);
199 FTransform Transform = FTransform(
213 return GetActor()->GetActorTransform();
228 FTransform Transform =
GetActor()->GetActorTransform();
243 FVector Location =
ActorData->Location.ToFVector();
254 return GetActor()->GetActorLocation();
266 FVector Location =
GetActor()->GetActorLocation();
281 FVector GlobalLocation = Location;
292 GetActor()->SetActorRelativeLocation(
301 const FVector& Location, ETeleportType TeleportType)
309 FVector LocalLocation = Location;
316 GetActor()->SetActorRelativeLocation(
325 const FTransform& Transform, ETeleportType TeleportType)
329 FTransform GlobalTransform = Transform;
338 ActorData->Rotation = GlobalTransform.GetRotation();
339 ActorData->Scale = GlobalTransform.GetScale3D();
343 GetActor()->SetActorRelativeTransform(
352 const FTransform& Transform, ETeleportType TeleportType)
357 ActorData->Rotation = Transform.GetRotation();
358 ActorData->Scale = Transform.GetScale3D();
362 FTransform LocalTransform = Transform;
370 GetActor()->SetActorRelativeTransform(
399 Cast<UPrimitiveComponent>(
GetActor()->GetRootComponent());
402 return Primitive->GetPhysicsAngularVelocityInDegrees();
416 auto RootComponent = Cast<UPrimitiveComponent>(
GetActor()->GetRootComponent());
417 if (RootComponent ==
nullptr)
419 return ECarlaServerResponse::FunctionNotSupported;
421 RootComponent->SetPhysicsLinearVelocity(
426 return ECarlaServerResponse::Success;
433 ActorData->AngularVelocity = AngularVelocity;
438 if (RootComponent ==
nullptr)
440 return ECarlaServerResponse::FunctionNotSupported;
442 RootComponent->SetPhysicsAngularVelocityInDegrees(
447 return ECarlaServerResponse::Success;
457 auto RootComponent = Cast<UPrimitiveComponent>(
GetActor()->GetRootComponent());
458 if (RootComponent ==
nullptr)
460 return ECarlaServerResponse::FunctionNotSupported;
462 RootComponent->AddImpulse(
467 return ECarlaServerResponse::Success;
471 const FVector& Impulse,
const FVector& Location)
478 auto RootComponent = Cast<UPrimitiveComponent>(
GetActor()->GetRootComponent());
479 if (RootComponent ==
nullptr)
481 return ECarlaServerResponse::FunctionNotSupported;
484 UE_LOG(LogCarla, Warning, TEXT(
"AddImpulseAtLocation: Experimental feature, use carefully."));
486 RootComponent->AddImpulseAtLocation(
491 return ECarlaServerResponse::Success;
501 auto RootComponent = Cast<UPrimitiveComponent>(
GetActor()->GetRootComponent());
502 if (RootComponent ==
nullptr)
504 return ECarlaServerResponse::FunctionNotSupported;
506 RootComponent->AddForce(
511 return ECarlaServerResponse::Success;
515 const FVector& Force,
const FVector& Location)
522 auto RootComponent = Cast<UPrimitiveComponent>(
GetActor()->GetRootComponent());
523 if (RootComponent ==
nullptr)
525 return ECarlaServerResponse::FunctionNotSupported;
528 UE_LOG(LogCarla, Warning, TEXT(
"AddForceAtLocation: Experimental feature, use carefully."));
530 RootComponent->AddForceAtLocation(
535 return ECarlaServerResponse::Success;
545 auto RootComponent = Cast<UPrimitiveComponent>(
GetActor()->GetRootComponent());
546 if (RootComponent ==
nullptr)
548 return ECarlaServerResponse::FunctionNotSupported;
550 RootComponent->AddAngularImpulseInDegrees(
555 return ECarlaServerResponse::Success;
565 auto RootComponent = Cast<UPrimitiveComponent>(
GetActor()->GetRootComponent());
566 if (RootComponent ==
nullptr)
568 return ECarlaServerResponse::FunctionNotSupported;
570 RootComponent->AddTorqueInDegrees(
575 return ECarlaServerResponse::Success;
588 auto RootComponent = Cast<UPrimitiveComponent>(
GetActor()->GetRootComponent());
589 if (RootComponent ==
nullptr)
591 return ECarlaServerResponse::FunctionNotSupported;
594 RootComponent->SetSimulatePhysics(bEnabled);
595 RootComponent->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
597 return ECarlaServerResponse::Success;
607 GetActor()->SetActorEnableCollision(bEnabled);
609 return ECarlaServerResponse::Success;
619 auto RootComponent = Cast<UPrimitiveComponent>(
GetActor()->GetRootComponent());
620 if (RootComponent ==
nullptr)
622 return ECarlaServerResponse::FunctionNotSupported;
624 RootComponent->SetEnableGravity(bEnabled);
626 return ECarlaServerResponse::Success;
638 auto CarlaVehicle = Cast<ACarlaWheeledVehicle>(
GetActor());
639 if (CarlaVehicle ==
nullptr)
641 return ECarlaServerResponse::NullActor;
643 CarlaVehicle->ActivateVelocityControl(Velocity);
645 return ECarlaServerResponse::Success;
655 auto CarlaVehicle = Cast<ACarlaWheeledVehicle>(
GetActor());
656 if (CarlaVehicle ==
nullptr)
658 return ECarlaServerResponse::NullActor;
660 CarlaVehicle->DeactivateVelocityControl();
662 return ECarlaServerResponse::Success;
677 return ECarlaServerResponse::NotAVehicle;
681 return ECarlaServerResponse::Success;
696 return ECarlaServerResponse::NotAVehicle;
700 return ECarlaServerResponse::Success;
715 return ECarlaServerResponse::NotAVehicle;
720 return ECarlaServerResponse::Success;
730 return ECarlaServerResponse::NotAVehicle;
734 return ECarlaServerResponse::Success;
744 return ECarlaServerResponse::NotAVehicle;
748 return ECarlaServerResponse::Success;
764 return ECarlaServerResponse::NotAVehicle;
769 return ECarlaServerResponse::Success;
785 return ECarlaServerResponse::NotAVehicle;
790 return ECarlaServerResponse::Success;
803 return ECarlaServerResponse::NotAVehicle;
805 Vehicle->SetWheelSteerDirection(WheelLocation, AngleInDeg);
807 return ECarlaServerResponse::Success;
821 return ECarlaServerResponse::NotAVehicle;
824 Angle =
Vehicle->GetWheelSteerAngle(WheelLocation);
826 return ECarlaServerResponse::Success;
837 auto* CarlaVehicle = Cast<ACarlaWheeledVehicle>(
GetActor());
839 if (CarlaVehicle ==
nullptr){
840 return ECarlaServerResponse::NotAVehicle;
842 CarlaVehicle->SetSimulatePhysics(bEnabled);
844 return ECarlaServerResponse::Success;
854 ActorData->bAckermannControlActive =
false;
861 return ECarlaServerResponse::NotAVehicle;
865 return ECarlaServerResponse::Success;
875 ActorData->bAckermannControlActive =
true;
882 return ECarlaServerResponse::NotAVehicle;
886 return ECarlaServerResponse::Success;
901 return ECarlaServerResponse::NotAVehicle;
903 VehicleControl =
Vehicle->GetVehicleControl();
905 return ECarlaServerResponse::Success;
913 VehicleAckermannControl =
ActorData->AckermannControl;
920 return ECarlaServerResponse::NotAVehicle;
922 VehicleAckermannControl =
Vehicle->GetVehicleAckermannControl();
924 return ECarlaServerResponse::Success;
933 AckermannSettings =
ActorData->AckermannControllerSettings;
940 return ECarlaServerResponse::NotAVehicle;
942 AckermannSettings =
Vehicle->GetAckermannControllerSettings();
944 return ECarlaServerResponse::Success;
953 ActorData->AckermannControllerSettings = AckermannSettings;
960 return ECarlaServerResponse::NotAVehicle;
963 Vehicle->ApplyAckermannControllerSettings(AckermannSettings);
965 return ECarlaServerResponse::Success;
978 return ECarlaServerResponse::AutoPilotNotSupported;
980 auto Controller = Cast<AWheeledVehicleAIController>(
Vehicle->GetController());
981 if (Controller ==
nullptr)
983 return ECarlaServerResponse::AutoPilotNotSupported;
985 Controller->SetAutopilot(bEnabled, bKeepState);
987 return ECarlaServerResponse::Success;
995 TelemetryData = EmptyTelemetryData;
1002 return ECarlaServerResponse::NotAVehicle;
1004 TelemetryData =
Vehicle->GetVehicleTelemetryData();
1006 return ECarlaServerResponse::Success;
1019 return ECarlaServerResponse::NotAVehicle;
1021 Vehicle->ShowDebugTelemetry(bEnabled);
1023 return ECarlaServerResponse::Success;
1036 return ECarlaServerResponse::NotAVehicle;
1040 return ECarlaServerResponse::Success;
1053 return ECarlaServerResponse::NotAVehicle;
1062 return ECarlaServerResponse::CarSimPluginNotEnabled;
1065 return ECarlaServerResponse::Success;
1069 uint64_t MaxSubsteps,
float MaxSubstepDeltaTime,
1070 const FString& VehicleJSON,
const FString& PowertrainJSON,
1071 const FString& TireJSON,
const FString& BaseJSONPath)
1081 return ECarlaServerResponse::NotAVehicle;
1086 MaxSubstepDeltaTime,
1092 return ECarlaServerResponse::Success;
1105 return ECarlaServerResponse::NotAVehicle;
1109 if(MovementComponent)
1114 return ECarlaServerResponse::Success;
1135 return ECarlaServerResponse::NotATrafficLight;
1139 return ECarlaServerResponse::Success;
1154 return ETrafficLightState::Off;
1174 return TrafficLight->GetTrafficLightComponent()->GetController();
1189 return ECarlaServerResponse::NotATrafficLight;
1193 return ECarlaServerResponse::Success;
1207 return ECarlaServerResponse::NotATrafficLight;
1211 return ECarlaServerResponse::Success;
1225 return ECarlaServerResponse::NotATrafficLight;
1229 return ECarlaServerResponse::Success;
1243 return ECarlaServerResponse::NotATrafficLight;
1247 return ECarlaServerResponse::Success;
1261 return ECarlaServerResponse::NotATrafficLight;
1263 TrafficLight->GetTrafficLightComponent()->GetGroup()->ResetGroup();
1265 return ECarlaServerResponse::Success;
1271 const FTransform& Transform,
1274 FVector NewLocation = Transform.GetLocation();
1280 UCapsuleComponent* Capsule = Cast<UCapsuleComponent>(
GetActor()->GetRootComponent());
1283 NewLocation.Z += Capsule->GetScaledCapsuleHalfHeight();
1286 FTransform NewTransform = Transform;
1287 NewTransform.SetLocation(NewLocation);
1291 FWalkerData* WalkerData = GetActorData<FWalkerData>();
1299 return ECarlaServerResponse::WalkerDead;
1303 auto Pawn = Cast<APawn>(
GetActor());
1304 if (Pawn ==
nullptr)
1306 return ECarlaServerResponse::ActorTypeMismatch;
1308 auto Controller = Cast<AWalkerController>(Pawn->GetController());
1309 if (Controller ==
nullptr)
1311 return ECarlaServerResponse::WalkerIncompatibleController;
1313 Controller->ApplyWalkerControl(WalkerControl);
1316 return ECarlaServerResponse::Success;
1324 FWalkerData* WalkerData = GetActorData<FWalkerData>();
1332 return ECarlaServerResponse::WalkerDead;
1336 auto Pawn = Cast<APawn>(
GetActor());
1337 if (Pawn ==
nullptr)
1339 return ECarlaServerResponse::ActorTypeMismatch;
1341 auto Controller = Cast<AWalkerController>(Pawn->GetController());
1342 if (Controller ==
nullptr)
1344 return ECarlaServerResponse::WalkerIncompatibleController;
1346 Control = Controller->GetWalkerControl();
1348 return ECarlaServerResponse::Success;
1364 return ECarlaServerResponse::NotAWalker;
1366 auto CharacterMovement = Cast<UCharacterMovementComponent>(
Character->GetCharacterMovement());
1368 CharacterMovement->SetDefaultMovementMode();
1371 CharacterMovement->DisableMovement();
1374 return ECarlaServerResponse::Success;
1389 return ECarlaServerResponse::NotAWalker;
1391 auto CharacterMovement = Cast<UCharacterMovementComponent>(
Character->GetCharacterMovement());
1394 CharacterMovement->SetDefaultMovementMode();
1397 if (CharacterMovement->IsFlying() || CharacterMovement->IsFalling())
1398 CharacterMovement->DisableMovement();
1401 return ECarlaServerResponse::Success;
1414 auto Pawn = Cast<APawn>(
GetActor());
1415 if (Pawn ==
nullptr)
1417 return ECarlaServerResponse::NotAWalker;
1419 auto Controller = Cast<AWalkerController>(Pawn->GetController());
1420 if (Controller ==
nullptr)
1422 return ECarlaServerResponse::WalkerIncompatibleController;
1424 Controller->ApplyWalkerControl(
Control);
1426 return ECarlaServerResponse::Success;
1436 auto Pawn = Cast<APawn>(
GetActor());
1437 if (Pawn ==
nullptr)
1439 return ECarlaServerResponse::NotAWalker;
1441 auto Controller = Cast<AWalkerController>(Pawn->GetController());
1442 if (Controller ==
nullptr)
1444 return ECarlaServerResponse::WalkerIncompatibleController;
1446 Controller->GetBonesTransform(Bones);
1448 return ECarlaServerResponse::Success;
1458 auto Pawn = Cast<APawn>(
GetActor());
1459 if (Pawn ==
nullptr)
1461 return ECarlaServerResponse::NotAWalker;
1463 auto Controller = Cast<AWalkerController>(Pawn->GetController());
1464 if (Controller ==
nullptr)
1466 return ECarlaServerResponse::WalkerIncompatibleController;
1468 Controller->SetBonesTransform(Bones);
1470 return ECarlaServerResponse::Success;
1480 auto Pawn = Cast<APawn>(
GetActor());
1481 if (Pawn ==
nullptr)
1483 return ECarlaServerResponse::NotAWalker;
1485 auto Controller = Cast<AWalkerController>(Pawn->GetController());
1486 if (Controller ==
nullptr)
1488 return ECarlaServerResponse::WalkerIncompatibleController;
1490 Controller->BlendPose(Blend);
1492 return ECarlaServerResponse::Success;
1502 auto Pawn = Cast<APawn>(
GetActor());
1503 if (Pawn ==
nullptr)
1505 return ECarlaServerResponse::NotAWalker;
1507 auto Controller = Cast<AWalkerController>(Pawn->GetController());
1508 if (Controller ==
nullptr)
1510 return ECarlaServerResponse::WalkerIncompatibleController;
1512 Controller->GetPoseFromAnimation();
1514 return ECarlaServerResponse::Success;
1524 auto Pawn = Cast<APawn>(
GetActor());
1525 if (Pawn ==
nullptr)
1527 return ECarlaServerResponse::NotAWalker;
1529 auto Walker = Cast<AWalkerBase>(Pawn);
1532 return ECarlaServerResponse::NotAWalker;
1534 Walker->StartDeathLifeSpan();
1535 UE_LOG(LogCarla, Warning, TEXT(
"Walker starting life span by dead"));
1537 return ECarlaServerResponse::Success;
carla::rpc::VehicleFailureState FailureState
FVehicleLightState LightState
FVehiclePhysicsControl PhysicsControl
FVehicleAckermannControl AckermannControl
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld * World
TSharedPtr< const FActorInfo > carla::rpc::ActorState InState
TSharedPtr< const FActorInfo > Info
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld Actor
EVehicleDoor
Type of door to open/close
FTransform GlobalToLocalTransform(const FTransform &InTransform) const
FVector GlobalToLocalLocation(const FVector &InLocation) const
FTransform LocalToGlobalTransform(const FTransform &InTransform) const
FVector LocalToGlobalLocation(const FVector &InLocation) const
carla::rpc::ActorState State
ECarlaServerResponse AddActorImpulseAtLocation(const FVector &Impulse, const FVector &Location)
static TSharedPtr< FCarlaActor > ConstructCarlaActor(IdType ActorId, AActor *Actor, TSharedPtr< const FActorInfo > Info, ActorType Type, carla::rpc::ActorState InState, UWorld *World)
ECarlaServerResponse AddActorForceAtLocation(const FVector &Force, const FVector &Location)
virtual ECarlaServerResponse SetActorEnableGravity(bool bEnabled)
FVector GetActorLocalLocation() const
void SetActorLocalTransform(const FTransform &Transform, ETeleportType Teleport=ETeleportType::TeleportPhysics)
ECarlaServerResponse AddActorTorque(const FVector &Torque)
ECarlaServerResponse SetActorTargetAngularVelocity(const FVector &AngularVelocity)
ECarlaServerResponse AddActorImpulse(const FVector &Impulse)
virtual ECarlaServerResponse SetActorCollisions(bool bEnabled)
FVector GetActorAngularVelocity() const
FTransform GetActorGlobalTransform() const
FVector GetActorVelocity() const
void SetActorGlobalTransform(const FTransform &Transform, ETeleportType Teleport=ETeleportType::TeleportPhysics)
void SetActorGlobalLocation(const FVector &Location, ETeleportType Teleport=ETeleportType::TeleportPhysics)
TSharedPtr< const FActorInfo > Info
FVector GetActorGlobalLocation() const
void SetActorLocalLocation(const FVector &Location, ETeleportType Teleport=ETeleportType::TeleportPhysics)
TSharedPtr< FActorData > ActorData
IdType GetActorId() const
FTransform GetActorLocalTransform() const
ECarlaServerResponse SetActorTargetVelocity(const FVector &Velocity)
ECarlaServerResponse AddActorForce(const FVector &Force)
virtual ECarlaServerResponse SetActorSimulatePhysics(bool bEnabled)
void WakeActorUp(UCarlaEpisode *CarlaEpisode)
ECarlaServerResponse AddActorAngularImpulse(const FVector &AngularInpulse)
void PutActorToSleep(UCarlaEpisode *CarlaEpisode)
FOtherActor(IdType ActorId, AActor *Actor, TSharedPtr< const FActorInfo > Info, carla::rpc::ActorState InState, UWorld *World)
FSensorActor(IdType ActorId, AActor *Actor, TSharedPtr< const FActorInfo > Info, carla::rpc::ActorState InState, UWorld *World)
virtual ECarlaServerResponse SetLightGreenTime(float time) final
virtual ECarlaServerResponse FreezeTrafficLight(bool bFreeze) final
virtual ETrafficLightState GetTrafficLightState() const final
FTrafficLightActor(IdType ActorId, AActor *Actor, TSharedPtr< const FActorInfo > Info, carla::rpc::ActorState InState, UWorld *World)
virtual ECarlaServerResponse SetTrafficLightState(const ETrafficLightState &State) final
virtual ECarlaServerResponse ResetTrafficLightGroup() final
virtual UTrafficLightController * GetTrafficLightController() final
virtual ECarlaServerResponse SetLightRedTime(float time) final
virtual ECarlaServerResponse SetLightYellowTime(float time) final
FTrafficSignActor(IdType ActorId, AActor *Actor, TSharedPtr< const FActorInfo > Info, carla::rpc::ActorState InState, UWorld *World)
virtual ECarlaServerResponse SetActorAutopilot(bool bEnabled, bool bKeepState=false) final
virtual ECarlaServerResponse EnableChronoPhysics(uint64_t MaxSubsteps, float MaxSubstepDeltaTime, const FString &VehicleJSON, const FString &PowertrainJSON, const FString &TireJSON, const FString &BaseJSONPath) final
virtual ECarlaServerResponse SetActorSimulatePhysics(bool bSimulatePhysics) final
FVehicleActor(IdType ActorId, AActor *Actor, TSharedPtr< const FActorInfo > Info, carla::rpc::ActorState InState, UWorld *World)
virtual ECarlaServerResponse DisableActorConstantVelocity() final
virtual ECarlaServerResponse GetVehicleLightState(FVehicleLightState &LightState) final
virtual ECarlaServerResponse GetFailureState(carla::rpc::VehicleFailureState &) final
virtual ECarlaServerResponse GetWheelSteerAngle(const EVehicleWheelLocation &WheelLocation, float &Angle)
virtual ECarlaServerResponse ApplyControlToVehicle(const FVehicleControl &, const EVehicleInputPriority &) final
virtual ECarlaServerResponse EnableActorConstantVelocity(const FVector &Velocity) final
virtual ECarlaServerResponse SetVehicleLightState(const FVehicleLightState &LightState) final
virtual ECarlaServerResponse EnableCarSim(const FString &SimfilePath) final
virtual ECarlaServerResponse GetPhysicsControl(FVehiclePhysicsControl &PhysicsControl) final
virtual ECarlaServerResponse SetWheelSteerDirection(const EVehicleWheelLocation &WheelLocation, float AngleInDeg) final
virtual ECarlaServerResponse UseCarSimRoad(bool bEnabled) final
virtual ECarlaServerResponse GetVehicleControl(FVehicleControl &) final
virtual ECarlaServerResponse ApplyAckermannControllerSettings(const FAckermannControllerSettings &) final
virtual ECarlaServerResponse GetVehicleTelemetryData(FVehicleTelemetryData &) final
virtual ECarlaServerResponse ApplyAckermannControlToVehicle(const FVehicleAckermannControl &, const EVehicleInputPriority &) final
virtual ECarlaServerResponse ApplyPhysicsControl(const FVehiclePhysicsControl &PhysicsControl) final
virtual ECarlaServerResponse OpenVehicleDoor(const EVehicleDoor DoorIdx) final
virtual ECarlaServerResponse CloseVehicleDoor(const EVehicleDoor DoorIdx) final
virtual ECarlaServerResponse GetVehicleAckermannControl(FVehicleAckermannControl &) final
virtual ECarlaServerResponse RestorePhysXPhysics()
virtual ECarlaServerResponse ShowVehicleDebugTelemetry(bool bEnabled) final
virtual ECarlaServerResponse GetAckermannControllerSettings(FAckermannControllerSettings &) final
virtual ECarlaServerResponse BlendPose(float Blend)
virtual ECarlaServerResponse SetActorSimulatePhysics(bool bSimulatePhysics) final
virtual ECarlaServerResponse SetActorEnableGravity(bool bEnabled) final
virtual ECarlaServerResponse GetPoseFromAnimation()
FWalkerActor(IdType ActorId, AActor *Actor, TSharedPtr< const FActorInfo > Info, carla::rpc::ActorState InState, UWorld *World)
virtual ECarlaServerResponse SetBonesTransform(const FWalkerBoneControlIn &) final
virtual ECarlaServerResponse GetWalkerControl(FWalkerControl &) final
virtual ECarlaServerResponse SetWalkerState(const FTransform &Transform, carla::rpc::WalkerControl WalkerControl) final
virtual ECarlaServerResponse SetActorDead()
virtual ECarlaServerResponse ApplyControlToWalker(const FWalkerControl &) final
virtual ECarlaServerResponse GetBonesTransform(FWalkerBoneControlOut &) final
carla::rpc::WalkerControl WalkerControl
virtual void DisableSpecialPhysics()
static void CreateCarsimComponent(ACarlaWheeledVehicle *Vehicle, FString Simfile)
void UseCarSimRoad(bool bEnabled)
static ALargeMapManager * GetLargeMapManager(const UObject *WorldContextObject)
static void CreateChronoMovementComponent(ACarlaWheeledVehicle *Vehicle, uint64_t MaxSubsteps, float MaxSubstepDeltaTime, FString VehicleJSON="", FString PowertrainJSON="", FString TireJSON="", FString BaseJSONPath="")
从 OpenDrive 映射一个控制器。控制相关交通信号灯并包含其循环