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