19#include "Misc/DateTime.h"
20#include "Kismet/GameplayStatics.h"
21#include "TimerManager.h"
22#include "UObject/Class.h"
27ASensor::ASensor(
const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
29 RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT(
"SceneRoot"));
30 RootComponent->SetMobility(EComponentMobility::Movable);
37 UWorld* World = GetWorld();
55 World->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([
this]
59 FString ActorInformation = IActorInformation::Execute_GetActorInformation(
this);
60 FString Message = FString::Printf(TEXT(
"Spawned %s"), *ActorInformation);
83 const FString ActorID = IActorInformation::Execute_GetActorID(
this);
84 const FString SensorTransformSensorID = ActorID +
"/transform";
87 SpawnParams.
Transform = GetActorTransform();
108 Super::EndPlay(EndPlayReason);
116 const FString Sensor = UEnum::GetDisplayValueAsText(
GetSensorType()).ToString();
118 const FString Message = FString::Printf(TEXT(
"Destroyed %s sensor with ID: %s"), *Sensor, *ID);
121 if (EndPlayReason == EEndPlayReason::EndPlayInEditor
122 || EndPlayReason == EEndPlayReason::Quit)
126 WeakComponentPtr.Reset();
133 TArray<AActor*> AttachedActors;
134 GetAttachedActors(AttachedActors);
135 for (AActor* Actor : AttachedActors)
192 ROSTopic->ConditionalBeginDestroy();
214 MessageType =
"sensor_msgs/PointCloud2";
223 MessageType =
"sensor_msgs/Image";
227 MessageType =
"geometry_msgs/Transform";
232 MessageType =
"std_msgs/String";
237 UE_LOG(LogTemp, Warning, TEXT(
"Unhandled ROS sensor message creation for sensor: %s"), *SensorNameString);
241 const FString TopicName = FString::Printf(TEXT(
"/agrarsense/out/sensors/%s"), *
GetSensorIdentifier());
243 ROSTopic = NewObject<UTopic>(UTopic::StaticClass());
250 const FString Message = FString::Printf(TEXT(
"%s sensor created ROS topic. Name: '%s' MessageType: '%s' "), *
GetSensorName(), *TopicName, *MessageType);
262 FString VehicleName =
Vehicle->GetActorID_Implementation();
286 LogFile = NewObject<ULogFile>(ULogFile::StaticClass());
290 FString UnixTimeStamp = FString::FromInt(FDateTime::Now().ToUnixTimestamp());
292 FString ActorID = IActorInformation::Execute_GetActorID(
this);
295 ActorID.ReplaceInline(TEXT(
"/"), TEXT(
""), ESearchCase::IgnoreCase);
297 FString FileName = FString::Printf(TEXT(
"%s_%s_%s"), *
GetSensorName(), *ActorID, *UnixTimeStamp);
304 if (!IsValid(
LogFile) && IsValid(
this))
317 if (PrimitiveComponent)
319 TWeakObjectPtr<UPrimitiveComponent> Component(PrimitiveComponent);
332 FDateTime Now = FDateTime::Now();
333 FString TimeStamp = FString::Printf(TEXT(
"%02d:%02d:%04d:%02d:%02d:%02d:%03d"),
334 Now.GetDay(), Now.GetMonth(), Now.GetYear(),
335 Now.GetHour(), Now.GetMinute(), Now.GetSecond(), Now.GetMillisecond());
@ SemanticSegmentationCamera
@ InstanceSegmentationCamera
static TArray< TWeakObjectPtr< UPrimitiveComponent > > ComponentsToHide
virtual void DestroyROSTopic()
virtual void CreateLogFile()
void ROSBridgeStateChanged(EROSState ROSState)
UROSIntegrationGameInstance * ROSInstance
static void HideComponentForAllCameras(UPrimitiveComponent *PrimitiveComponent)
virtual void BeginPlay() override
FSensorDestroy OnSensorDestroy
static FPrimitiveAdded OnPrimitiveAdded
FString GetSensorIdentifier() const
virtual void CreateDataSavePath()
FString GetSensorName() const
virtual ESensorTypes GetSensorType() const
AVehicle * IsAttachedToVehicle() const
FString ExportToJsonFile(const FString &FileName)
virtual FString GetActorID_Implementation() const override
FString CreateTimeStampString() const
void WriteToLogFile(const FString &Message)
FORCEINLINE bool IsROSConnected() const
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override
virtual void CreateROSTopic()
ASensor(const FObjectInitializer &ObjectInitializer)
static TMap< FString, FColor > GetSemanticColors()
static void Log(const FString &Message, bool LogToTextFile=true, bool LogToROS=true)
static FString GetDataFolder()
static UROSIntegrationGameInstance * GetROSGameInstance(const UObject *WorldContextObject)
static UROSHandler * GetROSHandle(const UObject *WorldContextObject)
static FString ConvertSensorTypeToString(ESensorTypes Sensortype)
void Write(const FString &Text)
void Create(const FString &FileNameWithoutExtension, FLogFileSettings Settings)
FROSDelegate_ROState OnROSStateChanged
static TMap< FString, FColor > GetSemanticColors()
static ATransformSensor * SpawnTransformSensor(const FSensorSpawnParameters SpawnParameters, FTransformSensorParameters SensorParameters)
static void AddSensor(ASensor *SensorPtr)
static void RemoveSensor(ASensor *SensorPtr)
static FString ExportSensorToJSON(const FString &FileName, ASensor *Sensor)
FFileWriteOptions FileWriteOptions
FFileCreationOptions FileCreationOptions