12#include "GeoReferencingSystem.h"
13#include "Kismet/GameplayStatics.h"
14#include "Engine/World.h"
19 PrimaryActorTick.bCanEverTick =
false;
25 SetActorEnableCollision(
false);
30 ROSMessages::geometry_msgs::Transform transformMsg;
31 TransformMessage = MakeShared<ROSMessages::geometry_msgs::Transform>(transformMsg);
52 SetActorEnableCollision(
false);
67 Super::EndPlay(EndPlayReason);
72 Super::CreateROSTopic();
79 FString BaseTopicName = FString::Printf(TEXT(
"/agrarsense/out/sensors/%s"), *
GetSensorIdentifier());
80 FString NavSatFixTopicName;
82 int32 LastSlashIndex = BaseTopicName.Find(TEXT(
"/"), ESearchCase::IgnoreCase, ESearchDir::FromEnd);
83 if (LastSlashIndex != INDEX_NONE)
85 NavSatFixTopicName = BaseTopicName.Left(LastSlashIndex) + TEXT(
"/navsatfix");
89 NavSatFixTopicName = BaseTopicName + TEXT(
"/navsatfix");
117 ROSTopic->ConditionalBeginDestroy();
129 FTransform CurrentTransform;
130 const bool HasValidTransform =
135 if (!HasValidTransform)
140 const FVector CurrentPosition = CurrentTransform.GetLocation();
141 const FQuat CurrentRotation = CurrentTransform.GetRotation();
143 const float PositionToleranceSq = 0.01f;
144 const float RotationTolerance = 0.001f;
146 const bool PositionChanged = FVector::DistSquared(CurrentPosition,
PreviousPosition) > PositionToleranceSq;
147 const bool RotationChanged = !CurrentRotation.Equals(
PreviousRotation, RotationTolerance);
188 const double Latitude = GeographicCoordinates.Latitude;
189 const double Longitude = GeographicCoordinates.Longitude;
190 const double Altitude = GeographicCoordinates.Altitude;
211 const FRotator ActorRotation = Rotation.Rotator();
220 const double Latitude = GeographicCoordinates.Latitude;
221 const double Longitude = GeographicCoordinates.Longitude;
222 const double Altitude = GeographicCoordinates.Altitude;
224 MetaData = FString::Printf(TEXT(
"%s, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.8f, %.8f, %.8f"), *TimeStamp, ActorPosition.X, ActorPosition.Y, ActorPosition.Z,
225 ActorRotation.Pitch, ActorRotation.Yaw, ActorRotation.Roll,
226 GeographicCoordinates.Latitude, GeographicCoordinates.Longitude, GeographicCoordinates.Altitude);
230 MetaData = FString::Printf(TEXT(
"%s, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f"), *TimeStamp, ActorPosition.X, ActorPosition.Y, ActorPosition.Z,
231 ActorRotation.Pitch, ActorRotation.Yaw, ActorRotation.Roll);
256 LogFile = NewObject<ULogFile>(ULogFile::StaticClass());
262 Prefix =
Vehicle->GetActorID_Implementation();
264 FString FileName = Prefix.IsEmpty() ? TEXT(
"transform") : Prefix + TEXT(
"_transform");
268 AGeoReferencingSystem* GeoRef = AGeoReferencingSystem::GetGeoReferencingSystem(GetWorld());
271 WriteToLogFile(
"timestamp, X location, Y location, Z location, yaw rotation, pitch rotation, roll rotation, GPS latitude, GPS longitude, GPS altitude");
275 WriteToLogFile(
"timestamp, X location, Y location, Z location, yaw rotation, pitch rotation, roll rotation");
295 const FString VehicleName =
Vehicle->GetActorID_Implementation();
302 if (
AVehicle* SensorVehicle = ParentSensor->IsAttachedToVehicle())
306 const FString VehicleName = SensorVehicle->GetActorID_Implementation();
307 const FString ParentSensorName = ParentSensor->GetActorID_Implementation();
308 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