14#include "GeoReferencingSystem.h"
15#include "TimerManager.h"
19 RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT(
"SceneRoot"));
20 PrimaryActorTick.bCanEverTick =
true;
21 PrimaryActorTick.bStartWithTickEnabled =
false;
22 PrimaryActorTick.TickGroup = TG_PrePhysics;
23 SetActorTickEnabled(
false);
32 if (
ACamera* CameraPtr = Cast<ACamera>(Sensor))
34 NewCaptureData.
Cameras.Add(CameraPtr);
36 else if (
ALidar* LidarPtr = Cast<ALidar>(Sensor))
38 NewCaptureData.
Lidars.Add(LidarPtr);
46 AGeoReferencingSystem* GeoReferencingSystem = AGeoReferencingSystem::GetGeoReferencingSystem(GetWorld());
48 if (GeoReferencingSystem)
52 FVector Location = CaptureTransform.GetLocation();
54 float StoredZ = Location.Z;
56 FGeographicCoordinates GeographicCoordinates;
57 GeographicCoordinates.Latitude = Location.X;
58 GeographicCoordinates.Longitude = Location.Y;
59 GeographicCoordinates.Altitude = Location.Z;
65 CaptureTransform.SetLocation(InUnrealCoordinates);
70 InUnrealCoordinates.Z = StoredZ;
71 CaptureTransform.SetLocation(InUnrealCoordinates);
78 SimulatorLog::Log(
"Couldn't convert GPS coordinates into Unreal transform because couldn't find GeoReferencingSystem.");
85 TArray<FTransform> NewCapturePositions;
89 FVector OriginalPosition = OriginalTransform.GetLocation();
90 FRotator OriginalRotation = OriginalTransform.GetRotation().Rotator();
93 NewCapturePositions.Add(OriginalTransform);
95 for (int32 i = 0; i < NumPhotos; i++)
97 FTransform CameraTransform = FTransform::Identity;
102 CameraTransform.SetLocation(OriginalPosition + FVector(0, 100, 0));
103 CameraTransform.SetRotation(FQuat(OriginalRotation));
106 CameraTransform.SetLocation(OriginalPosition + FVector(0, -100, 0));
107 CameraTransform.SetRotation(FQuat(OriginalRotation + FRotator(0, 180, 0)));
110 CameraTransform.SetLocation(OriginalPosition + FVector(-100, 0, 0));
111 CameraTransform.SetRotation(FQuat(OriginalRotation + FRotator(0, 90, 0)));
114 CameraTransform.SetLocation(OriginalPosition + FVector(100, 0, 0));
115 CameraTransform.SetRotation(FQuat(OriginalRotation + FRotator(0, 270, 0)));
120 NewCapturePositions.Add(CameraTransform);
145 GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([
this]
148 SetActorTickEnabled(
true);
165 Super::Tick(DeltaTime);
171 Super::EndPlay(EndPlayReason);
184 SetActorTickEnabled(
false);
188 GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([
this]
294 SensorPtr->Destroy();
301 UWorld* World = GetWorld();
307 FVector Position =
Transform.GetLocation();
308 FVector Start = Position;
309 FVector End = Position - FVector(0, 0, 10000);
311 FHitResult HitResult;
312 FCollisionQueryParams QueryParams;
314 bool Hit = World->LineTraceSingleByChannel(HitResult, Start, End, ECC_Visibility, QueryParams);
318 float HeightAboveGround = Position.Z;
319 Position.Z = HitResult.ImpactPoint.Z + (HeightAboveGround * 100.0f);
@ WaitingAfterPositionUpdate
@ WaitingForPositionUpdate
void ChangeCameraParameters(FCameraBaseParameters newParameters)
void SaveCurrentFrameToDisk()
FCameraBaseParameters GetCameraParameters()
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override
void SetupDataCapture(FCaptureData NewCaptureData)
virtual void Tick(float DeltaTime) override
ADataCapture(const FObjectInitializer &ObjectInitializer)
void UpdatePositions(const FTransform &Transform)
void ComputeAndSetZFromGround(FTransform &Transform)
virtual void BeginPlay() override
void ForceClearContainers()
void SaveCurrentPointCloudToDisk()
static void Log(const FString &Message, bool LogToTextFile=true, bool LogToROS=true)
static FVector GeographicToUnrealCoordinates(AGeoReferencingSystem *GeoReferencingSystem, const FGeographicCoordinates &GeographicCoordinates)
int32 FramesToKeepInSamePosition
bool UseHeightAboveGround
TArray< FTransform > CapturePositions
TArray< ACamera * > Cameras
TArray< ALidar * > Lidars
int32 CurrentCaptureIndex
TArray< ASensor * > Sensors