Agrarsense
PhotoCapture.cpp
Go to the documentation of this file.
1// Copyright (c) 2024 FrostBit Software Lab at the Lapland University of Applied Sciences
2//
3// This work is licensed under the terms of the MIT license.
4// For a copy, see <https://opensource.org/licenses/MIT>.
5
6#include "PhotoCapture.h"
10
11#include "GeoReferencingSystem.h"
12#include "TimerManager.h"
13
14APhotoCapture::APhotoCapture(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
15{
16 RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
17 PrimaryActorTick.bCanEverTick = true;
18 PrimaryActorTick.bStartWithTickEnabled = false;
19 PrimaryActorTick.TickGroup = TG_PrePhysics;
20 SetActorTickEnabled(false);
21}
22
24{
25 CaptureData = NewCaptureData;
26
28 {
29 AGeoReferencingSystem* GeoReferencingSystem = AGeoReferencingSystem::GetGeoReferencingSystem(GetWorld());
30
31 if (GeoReferencingSystem)
32 {
33 for (FTransform& Transform : CaptureData.CapturePositions)
34 {
35 FVector Location = Transform.GetLocation();
36
37 FGeographicCoordinates GeographicCoordinates;
38 GeographicCoordinates.Latitude = Location.X;
39 GeographicCoordinates.Longitude = Location.Y;
40 GeographicCoordinates.Altitude = Location.Z;
41
42 const FVector InUnrealCoordinates = UCoordinateConversionUtilities::GeographicToUnrealCoordinates(GeoReferencingSystem, GeographicCoordinates);
43
44 Transform.SetLocation(InUnrealCoordinates);
45 }
46 }
47 else
48 {
49 SimulatorLog::Log("Couldn't convert GPS coordinates into Unreal transform because couldn't find GeoReferencingSystem.");
50 }
51 }
52
54 {
55 // Loop through CapturePositions and add 4 additional positions for 360-degree capture
56 TArray<FTransform> NewCapturePositions;
57
58 for (const FTransform& OriginalTransform : CaptureData.CapturePositions)
59 {
60 FVector OriginalPosition = OriginalTransform.GetLocation();
61 FRotator OriginalRotation = OriginalTransform.GetRotation().Rotator();
62 int32 NumPhotos = 4;
63
64 NewCapturePositions.Add(OriginalTransform);
65
66 for (int32 i = 0; i < NumPhotos; i++)
67 {
68 FTransform CameraTransform = FTransform::Identity;
69
70 switch (i)
71 {
72 case 0: // Front
73 CameraTransform.SetLocation(OriginalPosition + FVector(0, 100, 0));
74 CameraTransform.SetRotation(FQuat(OriginalRotation));
75 break;
76 case 1: // Back
77 CameraTransform.SetLocation(OriginalPosition + FVector(0, -100, 0));
78 CameraTransform.SetRotation(FQuat(OriginalRotation + FRotator(0, 180, 0)));
79 break;
80 case 2: // Left
81 CameraTransform.SetLocation(OriginalPosition + FVector(-100, 0, 0));
82 CameraTransform.SetRotation(FQuat(OriginalRotation + FRotator(0, 90, 0)));
83 break;
84 case 3: // Right
85 CameraTransform.SetLocation(OriginalPosition + FVector(100, 0, 0));
86 CameraTransform.SetRotation(FQuat(OriginalRotation + FRotator(0, 270, 0)));
87 break;
88 }
89
90 // Add the new position to NewCapturePositions
91 NewCapturePositions.Add(CameraTransform);
92 }
93 }
94
95 CaptureData.CapturePositions = NewCapturePositions;
96 }
97
98 if (CaptureData.CapturePositions.Num() != 0 && CaptureData.Cameras.Num() != 0)
99 {
100 for (int32 i = 0; i < CaptureData.Cameras.Num(); i++)
101 {
102 ACamera* CameraPtr = CaptureData.Cameras[i];
103 if (CameraPtr)
104 {
105 FCameraBaseParameters params = CameraPtr->GetCameraParameters();
106 params.SaveImageToDisk = false;
107 params.SendDataToROS = false;
108 CameraPtr->ChangeCameraParameters(params);
109 }
110 }
111
113
114 // Enable This Actor tick with delay
115 FTimerHandle Handle;
116 GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([this]
117 {
119 SetActorTickEnabled(true);
120 }), 0.1f, false);
121 }
122 else
123 {
125 Destroy();
126 }
127}
128
130{
131 Super::BeginPlay();
132}
133
134void APhotoCapture::Tick(float DeltaTime)
135{
136 Super::Tick(DeltaTime);
137 Capture();
138}
139
140void APhotoCapture::EndPlay(const EEndPlayReason::Type EndPlayReason)
141{
142 Super::EndPlay(EndPlayReason);
143
144 CaptureData.Cameras.Empty();
146}
147
149{
150 // A bit convoluted logic due to its not guaranteed that we can move actor
151 // and save the camera image in the same frame.
152
154 {
155 FrameCounter++;
158 {
159 FrameCounter = 0;
161 {
164 }
165 }
166 }
167
169 {
170 // Disable tick
171 SetActorTickEnabled(false);
172
173 // Destroy this Actor with delay so Camera sensors has time to save the last images
174 FTimerHandle Handle;
175 GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([this]
176 {
178 Destroy();
179 }), 1.0f, false);
180 }
181}
182
183void APhotoCapture::UpdateCameraPositions(const FTransform& Transform)
184{
185 for (int32 i = 0; i < CaptureData.Cameras.Num(); i++)
186 {
187 ACamera* CameraPtr = CaptureData.Cameras[i];
188 if (CameraPtr)
189 {
190 CameraPtr->SetActorTransform(Transform);
191 }
192 }
193}
194
196{
197 for (int32 i = 0; i < CaptureData.Cameras.Num(); i++)
198 {
199 ACamera* CameraPtr = CaptureData.Cameras[i];
200 if (CameraPtr)
201 {
202 CameraPtr->SaveCurrentFrameToDisk();
203 }
204 }
205}
206
208{
209 for (int32 i = 0; i < CaptureData.Cameras.Num(); i++)
210 {
211 ACamera* CameraPtr = CaptureData.Cameras[i];
212 if (CameraPtr)
213 {
214 CameraPtr->Destroy();
215 }
216 }
217}
Definition: Camera.h:53
void ChangeCameraParameters(FCameraBaseParameters newParameters)
Definition: Camera.cpp:54
void SaveCurrentFrameToDisk()
Definition: Camera.h:184
FCameraBaseParameters GetCameraParameters()
Definition: Camera.h:91
virtual void Tick(float DeltaTime) override
void DestroyCameras()
virtual void BeginPlay() override
void CaptureImages()
APhotoCapture(const FObjectInitializer &ObjectInitializer)
void SetupPhotoCapture(FCaptureData NewCaptureData)
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override
void UpdateCameraPositions(const FTransform &Transform)
int32 FrameCounter
Definition: PhotoCapture.h:87
FCaptureData CaptureData
Definition: PhotoCapture.h:85
static void Log(const FString &Message, bool LogToTextFile=true, bool LogToROS=true)
static FVector GeographicToUnrealCoordinates(AGeoReferencingSystem *GeoReferencingSystem, const FGeographicCoordinates &GeographicCoordinates)
int32 FramesToKeepInSamePosition
Definition: PhotoCapture.h:42
bool UseGPSLocation
Definition: PhotoCapture.h:36
TArray< FTransform > CapturePositions
Definition: PhotoCapture.h:24
bool CaptureRotatedViews
Definition: PhotoCapture.h:30
TArray< ACamera * > Cameras
Definition: PhotoCapture.h:21
int32 CurrentCaptureIndex
Definition: PhotoCapture.h:39