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"
8
9#include "TimerManager.h"
10
11APhotoCapture::APhotoCapture(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
12{
13 RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
14 PrimaryActorTick.bCanEverTick = true;
15 PrimaryActorTick.bStartWithTickEnabled = false;
16 PrimaryActorTick.TickGroup = TG_PrePhysics;
17 SetActorTickEnabled(false);
18}
19
21{
22 CaptureData = NewCaptureData;
23
24 if (CaptureData.CapturePositions.Num() != 0 && CaptureData.Cameras.Num() != 0)
25 {
26 for (int32 i = 0; i < CaptureData.Cameras.Num(); i++)
27 {
28 ACamera* CameraPtr = CaptureData.Cameras[i];
29 if (CameraPtr)
30 {
31 FCameraBaseParameters params = CameraPtr->GetCameraParameters();
32 params.SaveImageToDisk = false;
33 params.SendDataToROS = false;
34 CameraPtr->ChangeCameraParameters(params);
35 }
36 }
37
39
40 // Enable This Actor tick with delay
41 FTimerHandle Handle;
42 GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([this]
43 {
45 SetActorTickEnabled(true);
46 }), 0.1f, false);
47 }
48 else
49 {
51 Destroy();
52 }
53}
54
56{
57 Super::BeginPlay();
58}
59
60void APhotoCapture::Tick(float DeltaTime)
61{
62 Super::Tick(DeltaTime);
63 Capture();
64}
65
66void APhotoCapture::EndPlay(const EEndPlayReason::Type EndPlayReason)
67{
68 Super::EndPlay(EndPlayReason);
69
70 CaptureData.Cameras.Empty();
72}
73
75{
76 // A bit convoluted logic due to its not guaranteed that we can move actor
77 // and save the camera image in the same frame.
78
80 {
84 {
85 FrameCounter = 0;
87 {
90 }
91 }
92 }
93
95 {
96 // Disable tick
97 SetActorTickEnabled(false);
98
99 // Destroy this Actor with delay so Camera sensors has time to save the last images
100 FTimerHandle Handle;
101 GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([this]
102 {
104 Destroy();
105 }), 1.0f, false);
106 }
107}
108
109void APhotoCapture::UpdateCameraPositions(const FTransform& Transform)
110{
111 for (int32 i = 0; i < CaptureData.Cameras.Num(); i++)
112 {
113 ACamera* CameraPtr = CaptureData.Cameras[i];
114 if (CameraPtr)
115 {
116 CameraPtr->SetActorTransform(Transform);
117 }
118 }
119}
120
122{
123 for (int32 i = 0; i < CaptureData.Cameras.Num(); i++)
124 {
125 ACamera* CameraPtr = CaptureData.Cameras[i];
126 if (CameraPtr)
127 {
128 CameraPtr->SaveCurrentFrameToDisk();
129 }
130 }
131}
132
134{
135 for (int32 i = 0; i < CaptureData.Cameras.Num(); i++)
136 {
137 ACamera* CameraPtr = CaptureData.Cameras[i];
138 if (CameraPtr)
139 {
140 CameraPtr->Destroy();
141 }
142 }
143}
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:75
FCaptureData CaptureData
Definition: PhotoCapture.h:73
int32 FramesToKeepInSamePosition
Definition: PhotoCapture.h:30
TArray< FTransform > CapturePositions
Definition: PhotoCapture.h:24
TArray< ACamera * > Cameras
Definition: PhotoCapture.h:21
int32 CurrentCaptureIndex
Definition: PhotoCapture.h:27