12#include "GeoReferencingSystem.h"
13#include "Kismet/GameplayStatics.h"
14#include "Engine/World.h"
19 PrimaryActorTick.bCanEverTick =
false;
27 ROSMessages::geometry_msgs::Transform transformMsg;
28 TransformMessage = MakeShared<ROSMessages::geometry_msgs::Transform>(transformMsg);
51 SetActorEnableCollision(
false);
67 Super::EndPlay(EndPlayReason);
72 Super::CreateROSTopic();
79 FString BaseTopicName = FString::Printf(TEXT(
"/agrarsense/out/sensors/%s"), *
GetSensorIdentifier());
80 FString GnssTopicName;
81 FString NavSatFixTopicName;
83 int32 LastSlashIndex = BaseTopicName.Find(TEXT(
"/"), ESearchCase::IgnoreCase, ESearchDir::FromEnd);
84 if (LastSlashIndex != INDEX_NONE)
86 GnssTopicName = BaseTopicName.Left(LastSlashIndex) + TEXT(
"/gnss");
87 NavSatFixTopicName = BaseTopicName.Left(LastSlashIndex) + TEXT(
"/navsatfix");
91 GnssTopicName = BaseTopicName + TEXT(
"/gnss");
92 NavSatFixTopicName = BaseTopicName + TEXT(
"/navsatfix");
95 GnssTopic = NewObject<UTopic>(UTopic::StaticClass());
136 ROSTopic->ConditionalBeginDestroy();
149 FTransform CurrentTransform;
150 const bool HasValidTransform =
154 if (!HasValidTransform)
159 const FVector CurrentPosition = CurrentTransform.GetLocation();
160 const FQuat CurrentRotation = CurrentTransform.GetRotation();
162 const float PositionToleranceSq = 0.01f;
163 const float RotationTolerance = 0.001f;
165 const bool PositionChanged = FVector::DistSquared(CurrentPosition,
PreviousPosition) > PositionToleranceSq;
166 const bool RotationChanged = !CurrentRotation.Equals(
PreviousRotation, RotationTolerance);
168 if (PositionChanged || RotationChanged)
204 const double Latitude = GeographicCoordinates.Latitude;
205 const double Longitude = GeographicCoordinates.Longitude;
206 const double Altitude = GeographicCoordinates.Altitude;
211 const FString GnssDataString = FString::Printf(TEXT(
"%f, %f, %f"), Latitude, Longitude, Altitude);
235 const FRotator ActorRotation = Rotation.Rotator();
244 const double Latitude = GeographicCoordinates.Latitude;
245 const double Longitude = GeographicCoordinates.Longitude;
246 const double Altitude = GeographicCoordinates.Altitude;
248 MetaData = FString::Printf(TEXT(
"%s, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.8f, %.8f, %.8f"), *TimeStamp, ActorPosition.X, ActorPosition.Y, ActorPosition.Z,
249 ActorRotation.Pitch, ActorRotation.Yaw, ActorRotation.Roll,
250 GeographicCoordinates.Latitude, GeographicCoordinates.Longitude, GeographicCoordinates.Altitude);
254 MetaData = FString::Printf(TEXT(
"%s, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f"), *TimeStamp, ActorPosition.X, ActorPosition.Y, ActorPosition.Z,
255 ActorRotation.Pitch, ActorRotation.Yaw, ActorRotation.Roll);
280 LogFile = NewObject<ULogFile>(ULogFile::StaticClass());
286 Prefix =
Vehicle->GetActorID_Implementation();
288 FString FileName = Prefix.IsEmpty() ? TEXT(
"transform") : Prefix + TEXT(
"_transform");
292 AGeoReferencingSystem* GeoRef = AGeoReferencingSystem::GetGeoReferencingSystem(GetWorld());
295 WriteToLogFile(
"timestamp, X location, Y location, Z location, yaw rotation, pitch rotation, roll rotation, GPS latitude, GPS longitude, GPS altitude");
299 WriteToLogFile(
"timestamp, X location, Y location, Z location, yaw rotation, pitch rotation, roll rotation");
319 const FString VehicleName =
Vehicle->GetActorID_Implementation();
326 if (
AVehicle* SensorVehicle = ParentSensor->IsAttachedToVehicle())
330 const FString VehicleName = SensorVehicle->GetActorID_Implementation();
331 const FString ParentSensorName = ParentSensor->GetActorID_Implementation();
332 FileSavePath = DataLocation + VehicleName +
"/" + ParentSensorName;
static auto BindTick(ObjectType *Object, FunctionType Function)
UROSIntegrationGameInstance * ROSInstance
bool CanSimulateSensor() const
FString GetSensorIdentifier() const
void SetSimulateSensor(bool SimulateSensor)
UTopic * GetROSTopic() const
AVehicle * IsAttachedToVehicle() const
virtual FString GetActorID_Implementation() const override
FString CreateTimeStampString() const
void WriteToLogFile(const FString &Message)
FORCEINLINE bool IsROSConnected() const
static void RemoveTick(FTickEntry TickEntry)
static FTickEntry AddTick(UObject *Object, std::function< void(float)> Function, ETickType Type)
static FString GetDataFolder()
static FGeographicCoordinates UnrealToGeographicCoordinates(AGeoReferencingSystem *GeoReferencingSystem, const FVector &Position)
void Create(const FString &FileNameWithoutExtension, FLogFileSettings Settings)
FFileWriteOptions FileWriteOptions
FFileCreationOptions FileCreationOptions