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

#include <DataCapture.h>

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

Public Member Functions

 ADataCapture (const FObjectInitializer &ObjectInitializer)
 
void SetupDataCapture (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 UpdatePositions (const FTransform &Transform)
 
void CaptureDataNow ()
 
void DestroySensors ()
 

Private Attributes

FCaptureData CaptureData
 
ECaptureStep CaptureStep = ECaptureStep::WaitingForPositionUpdate
 
int32 FrameCounter = 0
 
bool NeedsPositionUpdate = true
 

Detailed Description

Definition at line 78 of file DataCapture.h.

Constructor & Destructor Documentation

◆ ADataCapture()

ADataCapture::ADataCapture ( const FObjectInitializer &  ObjectInitializer)

Definition at line 18 of file DataCapture.cpp.

18 : Super(ObjectInitializer)
19{
20 RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
21 PrimaryActorTick.bCanEverTick = true;
22 PrimaryActorTick.bStartWithTickEnabled = false;
23 PrimaryActorTick.TickGroup = TG_PrePhysics;
24 SetActorTickEnabled(false);
25}

Member Function Documentation

◆ BeginPlay()

void ADataCapture::BeginPlay ( )
overrideprotectedvirtual

Definition at line 159 of file DataCapture.cpp.

160{
161 Super::BeginPlay();
162}

◆ Capture()

void ADataCapture::Capture ( )
private

Definition at line 178 of file DataCapture.cpp.

179{
181 {
182 // if this is the last position, we can stop capturing and destroy the sensors,
183 // as well as this Actor.
184
185 SetActorTickEnabled(false);
186
187 // Destroy this Actor with delay so Camera sensors have time to save the last images
188 FTimerHandle Handle;
189 GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([this]
190 {
192 Destroy();
193 }), 1.0f, false);
194
195 return;
196 }
197
198 switch (CaptureStep)
199 {
201 {
202 // Wait one frame before moving actor
204 FrameCounter = 0;
205 break;
206 }
208 {
210
211 // Move to next state
213 FrameCounter = 0;
214 break;
215 }
217 {
218 ++FrameCounter;
220 {
222
223 // Prepare for next wait before moving again
225 FrameCounter = 0;
226 }
227 break;
228 }
230 {
231 ++FrameCounter;
233 {
234 // Move to next position
237 FrameCounter = 0;
238 }
239 break;
240 }
241 }
242}
@ WaitingAfterPositionUpdate
@ WaitingForPositionUpdate
int32 FrameCounter
Definition: DataCapture.h:114
FCaptureData CaptureData
Definition: DataCapture.h:110
void UpdatePositions(const FTransform &Transform)
void CaptureDataNow()
ECaptureStep CaptureStep
Definition: DataCapture.h:112
void DestroySensors()
int32 FramesToKeepInSamePosition
Definition: DataCapture.h:54
TArray< FTransform > CapturePositions
Definition: DataCapture.h:32
int32 CurrentCaptureIndex
Definition: DataCapture.h:47

References CaptureData, CaptureDataNow(), FCaptureData::CapturePositions, CaptureStep, Capturing, FCaptureData::CurrentCaptureIndex, Destroy, DestroySensors(), FrameCounter, FCaptureData::FramesToKeepInSamePosition, UpdatePositions(), WaitingAfterCapture, WaitingAfterPositionUpdate, and WaitingForPositionUpdate.

Referenced by Tick().

◆ CaptureDataNow()

void ADataCapture::CaptureDataNow ( )
private

Definition at line 267 of file DataCapture.cpp.

268{
269 for (int32 i = 0; i < CaptureData.Cameras.Num(); i++)
270 {
271 ACamera* CameraPtr = CaptureData.Cameras[i];
272 if (CameraPtr)
273 {
274 CameraPtr->SaveCurrentFrameToDisk();
275 }
276 }
277
278 for (int32 i = 0; i < CaptureData.Lidars.Num(); i++)
279 {
280 ALidar* LidarPtr = CaptureData.Lidars[i];
281 if (LidarPtr)
282 {
283 LidarPtr->SaveCurrentPointCloudToDisk();
284 }
285 }
286}
Definition: Camera.h:53
void SaveCurrentFrameToDisk()
Definition: Camera.h:192
Definition: Lidar.h:35
void SaveCurrentPointCloudToDisk()
Definition: Lidar.h:118
TArray< ACamera * > Cameras
Definition: DataCapture.h:26
TArray< ALidar * > Lidars
Definition: DataCapture.h:29

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

Referenced by Capture().

◆ DestroySensors()

void ADataCapture::DestroySensors ( )
private

Definition at line 288 of file DataCapture.cpp.

289{
290 for (int32 i = 0; i < CaptureData.Sensors.Num(); i++)
291 {
292 ASensor* SensorPtr = CaptureData.Sensors[i];
293 if (SensorPtr)
294 {
295 SensorPtr->Destroy();
296 }
297 }
298}
Definition: Sensor.h:45
TArray< ASensor * > Sensors
Definition: DataCapture.h:23

References CaptureData, and FCaptureData::Sensors.

Referenced by Capture(), and SetupDataCapture().

◆ EndPlay()

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

Definition at line 170 of file DataCapture.cpp.

171{
172 Super::EndPlay(EndPlayReason);
173
174 CaptureData.Cameras.Empty();
176}

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

◆ SetupDataCapture()

void ADataCapture::SetupDataCapture ( FCaptureData  NewCaptureData)

Definition at line 27 of file DataCapture.cpp.

28{
29 // Separate Cameras and Lidars from the Sensors array into their respective arrays
30 // after JsonParser has populated the Sensors array.
31 for (ASensor* Sensor : NewCaptureData.Sensors)
32 {
33 if (ACamera* CameraPtr = Cast<ACamera>(Sensor))
34 {
35 NewCaptureData.Cameras.Add(CameraPtr);
36 }
37 else if (ALidar* LidarPtr = Cast<ALidar>(Sensor))
38 {
39 NewCaptureData.Lidars.Add(LidarPtr);
40 }
41 }
42
43 CaptureData = NewCaptureData;
44
46 {
47 AGeoReferencingSystem* GeoReferencingSystem = AGeoReferencingSystem::GetGeoReferencingSystem(GetWorld());
48
49 if (GeoReferencingSystem)
50 {
51 for (FTransform& CaptureTransform : CaptureData.CapturePositions)
52 {
53 FVector Location = CaptureTransform.GetLocation();
54
55 float StoredZ = Location.Z;
56
57 FGeographicCoordinates GeographicCoordinates;
58 GeographicCoordinates.Latitude = Location.X;
59 GeographicCoordinates.Longitude = Location.Y;
60 GeographicCoordinates.Altitude = Location.Z;
61
62 FVector InUnrealCoordinates = UCoordinateConversionUtilities::GeographicToUnrealCoordinates(GeoReferencingSystem, GeographicCoordinates);
63
65 {
66 CaptureTransform.SetLocation(InUnrealCoordinates);
67 }
68 else
69 {
70 // If user gives wanted Z in meters from the ground, compute the height
71 InUnrealCoordinates.Z = StoredZ;
72 CaptureTransform.SetLocation(InUnrealCoordinates);
74 }
75 }
76 }
77 else
78 {
79 SimulatorLog::Log("Couldn't convert GPS coordinates into Unreal transform because couldn't find GeoReferencingSystem.");
80 }
81 }
82
84 {
85 // Loop through CapturePositions and add 4 additional positions for 360-degree capture
86 TArray<FTransform> NewCapturePositions;
87
88 for (const FTransform& OriginalTransform : CaptureData.CapturePositions)
89 {
90 FVector OriginalPosition = OriginalTransform.GetLocation();
91 FRotator OriginalRotation = OriginalTransform.GetRotation().Rotator();
92 int32 NumPhotos = 4;
93
94 NewCapturePositions.Add(OriginalTransform);
95
96 for (int32 i = 0; i < NumPhotos; i++)
97 {
98 FTransform CameraTransform = FTransform::Identity;
99
100 switch (i)
101 {
102 case 0: // Front
103 CameraTransform.SetLocation(OriginalPosition + FVector(0, 100, 0));
104 CameraTransform.SetRotation(FQuat(OriginalRotation));
105 break;
106 case 1: // Back
107 CameraTransform.SetLocation(OriginalPosition + FVector(0, -100, 0));
108 CameraTransform.SetRotation(FQuat(OriginalRotation + FRotator(0, 180, 0)));
109 break;
110 case 2: // Left
111 CameraTransform.SetLocation(OriginalPosition + FVector(-100, 0, 0));
112 CameraTransform.SetRotation(FQuat(OriginalRotation + FRotator(0, 90, 0)));
113 break;
114 case 3: // Right
115 CameraTransform.SetLocation(OriginalPosition + FVector(100, 0, 0));
116 CameraTransform.SetRotation(FQuat(OriginalRotation + FRotator(0, 270, 0)));
117 break;
118 }
119
120 // Add the new position to NewCapturePositions
121 NewCapturePositions.Add(CameraTransform);
122 }
123 }
124
125 CaptureData.CapturePositions = NewCapturePositions;
126 }
127
128 if (CaptureData.CapturePositions.Num() != 0 && CaptureData.Cameras.Num() != 0)
129 {
130 for (int32 i = 0; i < CaptureData.Cameras.Num(); i++)
131 {
132 ACamera* CameraPtr = CaptureData.Cameras[i];
133 if (CameraPtr)
134 {
135 FCameraBaseParameters params = CameraPtr->GetCameraParameters();
136 params.SaveImageToDisk = false;
137 params.SendDataToROS = false;
138 CameraPtr->ChangeCameraParameters(params);
139 }
140 }
141
143
144 // Enable This Actor tick with delay
145 FTimerHandle Handle;
146 GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([this]
147 {
149 SetActorTickEnabled(true);
150 }), 0.1f, false);
151 }
152 else
153 {
155 Destroy();
156 }
157}
void ChangeCameraParameters(FCameraBaseParameters newParameters)
Definition: Camera.cpp:55
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)
static bool AlignTransformFromGroundInMeters(AActor *Actor, FTransform &InTransform)
bool UseGPSLocation
Definition: DataCapture.h:44
bool UseHeightAboveGround
Definition: DataCapture.h:57
bool CaptureRotatedViews
Definition: DataCapture.h:38

References UPhysicsUtilities::AlignTransformFromGroundInMeters(), FCaptureData::Cameras, CaptureData, FCaptureData::CapturePositions, FCaptureData::CaptureRotatedViews, ACamera::ChangeCameraParameters(), Destroy, DestroySensors(), UCoordinateConversionUtilities::GeographicToUnrealCoordinates(), ACamera::GetCameraParameters(), FCaptureData::Lidars, SimulatorLog::Log(), FCameraBaseParameters::SaveImageToDisk, FCameraBaseParameters::SendDataToROS, FCaptureData::Sensors, UpdatePositions(), FCaptureData::UseGPSLocation, and FCaptureData::UseHeightAboveGround.

Referenced by USimulatorJsonParser::ParseDataCapture().

◆ Tick()

void ADataCapture::Tick ( float  DeltaTime)
overrideprotectedvirtual

Definition at line 164 of file DataCapture.cpp.

165{
166 Super::Tick(DeltaTime);
167 Capture();
168}

References Capture().

◆ UpdatePositions()

void ADataCapture::UpdatePositions ( const FTransform &  Transform)
private

Definition at line 244 of file DataCapture.cpp.

245{
246 for (int32 i = 0; i < CaptureData.Sensors.Num(); i++)
247 {
248 ASensor* SensorPtr = CaptureData.Sensors[i];
249 if (SensorPtr)
250 {
251 SensorPtr->SetActorTransform(Transform);
252 }
253 }
254
255 for (int32 i = 0; i < CaptureData.Lidars.Num(); i++)
256 {
257 ALidar* LidarPtr = CaptureData.Lidars[i];
258 if (LidarPtr)
259 {
260 // The Lidar sensor generates a full point cloud across multiple frames,
261 // so to ensure accurate data capture after moving the actor, we force a reset of the point cloud capture.
262 LidarPtr->ForceClearContainers();
263 }
264 }
265}
void ForceClearContainers()
Definition: Lidar.h:110

References CaptureData, ALidar::ForceClearContainers(), FCaptureData::Lidars, FCaptureData::Sensors, and Transform.

Referenced by Capture(), and SetupDataCapture().

Member Data Documentation

◆ CaptureData

FCaptureData ADataCapture::CaptureData
private

◆ CaptureStep

ECaptureStep ADataCapture::CaptureStep = ECaptureStep::WaitingForPositionUpdate
private

Definition at line 112 of file DataCapture.h.

Referenced by Capture().

◆ FrameCounter

int32 ADataCapture::FrameCounter = 0
private

Definition at line 114 of file DataCapture.h.

Referenced by Capture().

◆ NeedsPositionUpdate

bool ADataCapture::NeedsPositionUpdate = true
private

Definition at line 116 of file DataCapture.h.


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