12#include <util/ue-header-guard-begin.h>
16#include "Kismet/GameplayStatics.h"
17#include <util/ue-header-guard-end.h>
23 PrimaryActorTick.bCanEverTick =
true;
24 PrimaryActorTick.bStartWithTickEnabled =
true;
26 SceneComp = CreateDefaultSubobject<USceneComponent>(TEXT(
"SceneComp"));
28 SaveImagePath = FPaths::ProjectSavedDir() +
"SensorSpawnerCaptures/";
38 if(
ACarlaGameModeBase* CarlaGameMode = Cast<ACarlaGameModeBase>(UGameplayStatics::GetGameMode(GetWorld())))
63 UE_LOG(LogSensorSpawnerActor, Warning, TEXT(
"Warning: ASensorSpawnerActor::SpawnSensors - Delayed spawn already in progress, wait until it ends"));
81 for(
int i = 0; i < SensorStruct.Amount; i++)
127 const TArray<FActorDefinition>& ActorDefinitions =
CarlaEpisode->GetActorDefinitions();
131 return ActorDefinition;
138 FTransform Transform;
141 const TPair<EActorSpawnResultStatus, FCarlaActor*> SpawnResult =
CarlaEpisode->SpawnActorWithInfo(Transform, SensorDescription);
144 if(SpawnResult.Value)
158 SensorDescription.
UId = Definition->
UId;
159 SensorDescription.
Id = Definition->
Id;
166 if(Variation.RecommendedValues.IsValidIndex(0))
168 CreatedAttribute.
Id = Variation.Id;
169 CreatedAttribute.
Type = Variation.Type;
170 CreatedAttribute.
Value = Variation.RecommendedValues[0];
171 SensorDescription.
Variations.Emplace(CreatedAttribute.
Id, CreatedAttribute);
178 Transform = FTransform::Identity;
182 Transform.SetLocation(FVector(PosX, PosY, PosZ));
210 if(
ASensor* CaptureSensor = Cast<ASensor>(Actor))
223 Super::Tick(DeltaSeconds);
242 const FString FinalPath = FPaths::Combine(
SaveImagePath, CaptureSensor->GetName(), FString::Printf(TEXT(
"%lld"), FDateTime::Now().ToUnixTimestamp()) +
"-Frame_" + FrameNumber +
".png");
243 CaptureSensor->SaveCaptureToDisk(FinalPath);
249 const FVector Accelerometer = IMUSensor->GetAccelerometerValue().ToFVector();
250 const FVector Gyroscope = IMUSensor->GetGyroscopeValue().ToFVector();
251 float Compass = IMUSensor->GetCompassValue();
252 Compass = FMath::RadiansToDegrees(Compass);
254 const FString FilePath = FPaths::Combine(
SaveImagePath, IMUSensor->GetName(), IMUSensor->GetName() +
".json");
259 if(
const AGnssSensor* GnssSensor = Cast<AGnssSensor>(CurrentSensor))
261 const FString FilePath = FPaths::Combine(
SaveImagePath, GnssSensor->GetName(), GnssSensor->GetName() +
".json");
265 if(
const ARayCastLidar* LidarSensor = Cast<ARayCastLidar>(CurrentSensor))
267 const FString FilePath = FPaths::Combine(
SaveImagePath, LidarSensor->GetName(), FString::Printf(TEXT(
"%lld"), FDateTime::Now().ToUnixTimestamp()) +
"-Frame_" + FrameNumber +
".ply");
271 if(
const ARadar* RadarSensor = Cast<ARadar>(CurrentSensor))
273 const FString FilePath = FPaths::Combine(
SaveImagePath, RadarSensor->GetName(), FString::Printf(TEXT(
"%lld"), FDateTime::Now().ToUnixTimestamp()) +
"-Frame_" + FrameNumber +
".json");
281 const UWorld* World = GetWorld();
285 if(SensorAttachParent)
287 SensorActor->AttachToActor(SensorAttachParent, FAttachmentTransformRules::KeepWorldTransform);
288 SensorActor->SetOwner(SensorAttachParent);
289 SensorActor->SetActorRelativeTransform(FTransform::Identity);
299 if(
const ARadar* RadarSensor = Cast<ARadar>(CurrentSensor); CurrentSensor)
301 FRotator CurrentRot = RadarSensor->GetActorRotation();
302 for(
auto& detect : RadarSensor->GetRadarData().GetDetections() )
304 float Azi = FMath::RadiansToDegrees(detect.azimuth);
305 float Alt = FMath::RadiansToDegrees(detect.altitude);
307 FVector FWVector( (detect.depth - 0.25f) * 100.0f, 0.f, 0.f);
308 FTransform SensorTransform(FRotator(CurrentRot.Pitch + Alt,
309 CurrentRot.Yaw + Azi,
312 FWVector = SensorTransform.GetRotation().RotateVector(FWVector);
314 float Norm_velocity = detect.velocity / velocity_range;
316 ColorPoint.R = FMath::Clamp(Norm_velocity, 0.0f, 1.0f) * 255;
317 ColorPoint.G = FMath::Clamp( 1.0f - abs(Norm_velocity), 0.0f, 1.0f) * 255;
318 ColorPoint.B = FMath::Clamp(abs(- 1.0f - Norm_velocity), 0.0f, 1.0f) * 255;
320 DrawDebugPoint(GetWorld(), RadarSensor->GetActorLocation() + FWVector ,
PointSize, ColorPoint,
false, 0.06);
DEFINE_LOG_CATEGORY_STATIC(LogSensorSpawnerActor, Verbose, All)
static bool IsValid(const ACarlaWheeledVehicle *Vehicle)
Base class for the CARLA Game Mode.
Gnss sensor representation The actual position calculation is done one server side.
A ray-cast based Radar sensor.
A ray-cast based Lidar sensor.
Base class for sensors using a USceneCaptureComponent2D for rendering the scene.
void GetRandomTransform(FTransform &Transform) const
TObjectPtr< USceneComponent > SceneComp
virtual void BeginPlay() override
void AttachSensorToActor(AActor *SensorActor)
FTimerHandle SpawnSensorsDelayedTimerHandle
FTimerHandle InitialDelaySpawnTimerHandle
TArray< TObjectPtr< ASensor > > SpawnedSensorsArray
TSubclassOf< class ASensor > SensorClassToCapture
void SpawnSensorActor(const FActorDescription &SensorDescription, bool bAttachToActor)
void SpawnSensorsDelayed()
void OnEpisodeInitialised(UCarlaEpisode *InitialisedEpisode)
void SaveSensorData(float DeltaSeconds)
TSubclassOf< AActor > AttachActorClass
void ToggleRadarVisibility()
bool bSaveDataAtBeginPlay
TObjectPtr< UCarlaEpisode > CarlaEpisode
const FActorDefinition * GetActorDefinitionByClass(const TSubclassOf< AActor > ActorClass) const
TArray< FSensorTuple > SensorsToSpawn
virtual void Tick(float DeltaSeconds) override
void DrawRadarSensorPoints() const
TArray< FSensorTuple > SensorsToSpawnCopy
void StopRecordingSensorData()
void AddSensorToSaveDataArray(AActor *Actor)
void StartRecordingSensorData()
void GenerateSensorActorDescription(const FActorDefinition *Definition, FActorDescription &SensorDescription) const
static uint64_t GetFrameCounter()
static bool SaveGnssDataToJson(const FString &JsonFilePath, double Altitude, double Latitude, double Longitude, const FString &FrameNumber)
static bool SaveLidarDataToPly(const FString &FilePath, const TArray< float > &PointArray, int ArrayElementSize)
static bool SaveRadarDataToJson(const FString &JsonFilePath, const FRadarData &Rays, const FString &FrameNumber)
static bool SaveIMUDataToJson(const FString &JsonFilePath, const FVector &Accelerometer, const FVector &Gyroscope, float Compass, const FString &FrameNumber)
An actor attribute, may be an intrinsic (non-modifiable) attribute of the actor or an user-defined ac...
A definition of a Carla Actor with all the variation and attributes.
FString Id
Display ID that identifies the actor.
uint32 UId
Uniquely identifies the definition (no need to fill it).
TArray< FActorVariation > Variations
Variations represent variables the user can modify to generate variations of the actor.
TSubclassOf< AActor > Class
Class of the actor to be spawned (Optional).
A description of a Carla Actor with all its variation.
TMap< FString, FActorAttribute > Variations
User selected variations of the actor.
TSubclassOf< AActor > Class
Class of the actor to be spawned.
uint32 UId
UId of the definition in which this description was based.
FString Id
Display ID that identifies the actor.
Definition of an actor variation.