Agrarsense
Public Member Functions | Protected Member Functions | Private Member Functions | Private Attributes | List of all members
APhotoCapture Class Reference

#include <PhotoCapture.h>

Inheritance diagram for APhotoCapture:
Inheritance graph
[legend]
Collaboration diagram for APhotoCapture:
Collaboration graph
[legend]

Public Member Functions

 APhotoCapture (const FObjectInitializer &ObjectInitializer)
 
void SetupPhotoCapture (FCaptureData NewCaptureData)
 

Protected Member Functions

virtual void BeginPlay () override
 
virtual void Tick (float DeltaTime) override
 
virtual void EndPlay (const EEndPlayReason::Type EndPlayReason) override
 

Private Member Functions

void Capture ()
 
void UpdateCameraPositions (const FTransform &Transform)
 
void CaptureImages ()
 
void DestroyCameras ()
 

Private Attributes

FCaptureData CaptureData
 
int32 FrameCounter = 0
 

Detailed Description

Definition at line 53 of file PhotoCapture.h.

Constructor & Destructor Documentation

◆ APhotoCapture()

APhotoCapture::APhotoCapture ( const FObjectInitializer &  ObjectInitializer)

Definition at line 14 of file PhotoCapture.cpp.

14 : 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}

Member Function Documentation

◆ BeginPlay()

void APhotoCapture::BeginPlay ( )
overrideprotectedvirtual

Definition at line 129 of file PhotoCapture.cpp.

130{
131 Super::BeginPlay();
132}

◆ Capture()

void APhotoCapture::Capture ( )
private

Definition at line 148 of file PhotoCapture.cpp.

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}
void DestroyCameras()
void CaptureImages()
void UpdateCameraPositions(const FTransform &Transform)
int32 FrameCounter
Definition: PhotoCapture.h:87
FCaptureData CaptureData
Definition: PhotoCapture.h:85
int32 FramesToKeepInSamePosition
Definition: PhotoCapture.h:42
TArray< FTransform > CapturePositions
Definition: PhotoCapture.h:24
int32 CurrentCaptureIndex
Definition: PhotoCapture.h:39

References CaptureData, CaptureImages(), FCaptureData::CapturePositions, FCaptureData::CurrentCaptureIndex, Destroy, DestroyCameras(), FrameCounter, FCaptureData::FramesToKeepInSamePosition, and UpdateCameraPositions().

Referenced by Tick().

◆ CaptureImages()

void APhotoCapture::CaptureImages ( )
private

Definition at line 195 of file PhotoCapture.cpp.

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}
Definition: Camera.h:53
void SaveCurrentFrameToDisk()
Definition: Camera.h:184
TArray< ACamera * > Cameras
Definition: PhotoCapture.h:21

References FCaptureData::Cameras, CaptureData, and ACamera::SaveCurrentFrameToDisk().

Referenced by Capture().

◆ DestroyCameras()

void APhotoCapture::DestroyCameras ( )
private

Definition at line 207 of file PhotoCapture.cpp.

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}

References FCaptureData::Cameras, and CaptureData.

Referenced by Capture(), and SetupPhotoCapture().

◆ EndPlay()

void APhotoCapture::EndPlay ( const EEndPlayReason::Type  EndPlayReason)
overrideprotectedvirtual

Definition at line 140 of file PhotoCapture.cpp.

141{
142 Super::EndPlay(EndPlayReason);
143
144 CaptureData.Cameras.Empty();
146}

References FCaptureData::Cameras, CaptureData, and FCaptureData::CapturePositions.

◆ SetupPhotoCapture()

void APhotoCapture::SetupPhotoCapture ( FCaptureData  NewCaptureData)

Definition at line 23 of file PhotoCapture.cpp.

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}
void ChangeCameraParameters(FCameraBaseParameters newParameters)
Definition: Camera.cpp:54
FCameraBaseParameters GetCameraParameters()
Definition: Camera.h:91
static void Log(const FString &Message, bool LogToTextFile=true, bool LogToROS=true)
static FVector GeographicToUnrealCoordinates(AGeoReferencingSystem *GeoReferencingSystem, const FGeographicCoordinates &GeographicCoordinates)
bool UseGPSLocation
Definition: PhotoCapture.h:36
bool CaptureRotatedViews
Definition: PhotoCapture.h:30

References FCaptureData::Cameras, CaptureData, FCaptureData::CapturePositions, FCaptureData::CaptureRotatedViews, ACamera::ChangeCameraParameters(), Destroy, DestroyCameras(), UCoordinateConversionUtilities::GeographicToUnrealCoordinates(), ACamera::GetCameraParameters(), SimulatorLog::Log(), FCameraBaseParameters::SaveImageToDisk, FCameraBaseParameters::SendDataToROS, Transform, UpdateCameraPositions(), and FCaptureData::UseGPSLocation.

Referenced by USimulatorJsonParser::ParseDataCapture().

◆ Tick()

void APhotoCapture::Tick ( float  DeltaTime)
overrideprotectedvirtual

Definition at line 134 of file PhotoCapture.cpp.

135{
136 Super::Tick(DeltaTime);
137 Capture();
138}

References Capture().

◆ UpdateCameraPositions()

void APhotoCapture::UpdateCameraPositions ( const FTransform &  Transform)
private

Definition at line 183 of file PhotoCapture.cpp.

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}

References FCaptureData::Cameras, CaptureData, and Transform.

Referenced by Capture(), and SetupPhotoCapture().

Member Data Documentation

◆ CaptureData

FCaptureData APhotoCapture::CaptureData
private

◆ FrameCounter

int32 APhotoCapture::FrameCounter = 0
private

Definition at line 87 of file PhotoCapture.h.

Referenced by Capture().


The documentation for this class was generated from the following files: