12#include "GeoReferencingSystem.h"
13#include "Kismet/GameplayStatics.h"
14#include "Engine/World.h"
19 PrimaryActorTick.bCanEverTick =
false;
24 SetActorEnableCollision(
false);
29 ROSMessages::geometry_msgs::Transform transformMsg;
30 TransformMessage = MakeShared<ROSMessages::geometry_msgs::Transform>(transformMsg);
51 SetActorEnableCollision(
false);
66 Super::EndPlay(EndPlayReason);
71 Super::CreateROSTopic();
78 FString BaseTopicName = FString::Printf(TEXT(
"/agrarsense/out/sensors/%s"), *
GetSensorIdentifier());
79 FString NavSatFixTopicName;
81 int32 LastSlashIndex = BaseTopicName.Find(TEXT(
"/"), ESearchCase::IgnoreCase, ESearchDir::FromEnd);
82 if (LastSlashIndex != INDEX_NONE)
84 NavSatFixTopicName = BaseTopicName.Left(LastSlashIndex) + TEXT(
"/navsatfix");
88 NavSatFixTopicName = BaseTopicName + TEXT(
"/navsatfix");
116 ROSTopic->ConditionalBeginDestroy();
128 FTransform CurrentTransform;
129 const bool HasValidTransform =
134 if (!HasValidTransform)
139 const FVector CurrentPosition = CurrentTransform.GetLocation();
140 const FQuat CurrentRotation = CurrentTransform.GetRotation();
142 const float PositionToleranceSq = 0.01f;
143 const float RotationTolerance = 0.001f;
145 const bool PositionChanged = FVector::DistSquared(CurrentPosition,
PreviousPosition) > PositionToleranceSq;
146 const bool RotationChanged = !CurrentRotation.Equals(
PreviousRotation, RotationTolerance);
187 const double Latitude = GeographicCoordinates.Latitude;
188 const double Longitude = GeographicCoordinates.Longitude;
189 const double Altitude = GeographicCoordinates.Altitude;
210 const FRotator ActorRotation = Rotation.Rotator();
219 const double Latitude = GeographicCoordinates.Latitude;
220 const double Longitude = GeographicCoordinates.Longitude;
221 const double Altitude = GeographicCoordinates.Altitude;
223 MetaData = FString::Printf(TEXT(
"%s, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.8f, %.8f, %.8f"), *TimeStamp, ActorPosition.X, ActorPosition.Y, ActorPosition.Z,
224 ActorRotation.Pitch, ActorRotation.Yaw, ActorRotation.Roll,
225 GeographicCoordinates.Latitude, GeographicCoordinates.Longitude, GeographicCoordinates.Altitude);
229 MetaData = FString::Printf(TEXT(
"%s, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f"), *TimeStamp, ActorPosition.X, ActorPosition.Y, ActorPosition.Z,
230 ActorRotation.Pitch, ActorRotation.Yaw, ActorRotation.Roll);
255 LogFile = NewObject<ULogFile>(ULogFile::StaticClass());
261 Prefix =
Vehicle->GetActorID_Implementation();
263 FString FileName = Prefix.IsEmpty() ? TEXT(
"transform") : Prefix + TEXT(
"_transform");
267 AGeoReferencingSystem* GeoRef = AGeoReferencingSystem::GetGeoReferencingSystem(GetWorld());
270 WriteToLogFile(
"timestamp, X location, Y location, Z location, yaw rotation, pitch rotation, roll rotation, GPS latitude, GPS longitude, GPS altitude");
274 WriteToLogFile(
"timestamp, X location, Y location, Z location, yaw rotation, pitch rotation, roll rotation");
294 const FString VehicleName =
Vehicle->GetActorID_Implementation();
301 if (
AVehicle* SensorVehicle = ParentSensor->IsAttachedToVehicle())
305 const FString VehicleName = SensorVehicle->GetActorID_Implementation();
306 const FString ParentSensorName = ParentSensor->GetActorID_Implementation();
307 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