Agrarsense
SensorsManagerComponent.cpp
Go to the documentation of this file.
1// Copyright (c) 2023 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
17
18const FString USensorsManagerComponent::ComponentHierarchySeparator = TEXT("_|_");
19
20USensorsManagerComponent::USensorsManagerComponent()
21{
22 PrimaryComponentTick.bCanEverTick = false;
23}
24
25USensorsManagerComponent::~USensorsManagerComponent()
26{
27}
28
29ALidar* USensorsManagerComponent::SpawnLidar(const FTransform& transform, bool isTransformRelativeToComponent, const FString sensorIdentifier, const FString sensorName, FLidarParameters lidarParameters, bool simulateSensor, ASensorModel*& createdModel, USceneComponent* attachToComponent, FName attachToBone)
30{
31 // Check if attachToComponent is not set but attachToBone is set
32 if (!attachToComponent && !attachToBone.IsNone())
33 {
34 attachToComponent = GetOwner()->GetRootComponent();
35 }
36
37 FTransform sensorTransform = isTransformRelativeToComponent ? GetSensorAttachmentTransform(transform, attachToComponent, attachToBone) : transform;
38
39 ALidar* lidar = USensorFactory::SpawnLidarSensor(sensorTransform, sensorIdentifier, sensorName, lidarParameters, simulateSensor, GetOwner());
40
41 if (!lidar)
42 {
43 return nullptr;
44 }
45
46 createdModel = lidar->GetSensorModel();
47
48 ASensor* CastedSensor = Cast<ASensor>(lidar);
49
50 AddSensorDestroyListener(CastedSensor);
51
52 AttachSensor(CastedSensor, attachToComponent, attachToBone);
53
54 Lidars.Emplace(lidar);
55 Sensors.Emplace(CastedSensor);
56
57 OnLidarSpawned.Broadcast(lidar);
58 OnSensorSpawned.Broadcast(CastedSensor);
59
60 return lidar;
61}
62
63ACamera* USensorsManagerComponent::SpawnCamera(const FTransform& transform, bool isTransformRelativeToComponent, const FString sensorIdentifier, const FString sensorName, FCameraBaseParameters cameraParameters, bool simulateSensor, ASensorModel*& createdModel, USceneComponent* attachToComponent, FName attachToBone)
64{
65 // Check if attachToComponent is not set but attachToBone is set
66 if (!attachToComponent && !attachToBone.IsNone())
67 {
68 attachToComponent = GetOwner()->GetRootComponent();
69 }
70
71 FTransform sensorTransform = isTransformRelativeToComponent ? GetSensorAttachmentTransform(transform, attachToComponent, attachToBone) : transform;
72
73 ACamera* camera = USensorFactory::SpawnCamera(sensorTransform, sensorIdentifier, sensorName, cameraParameters, simulateSensor, GetOwner());
74
75 if (!camera)
76 {
77 return nullptr;
78 }
79
80 createdModel = camera->GetSensorModel();
81
82 ASensor* CastedSensor = Cast<ASensor>(camera);
83
84 AttachSensor(CastedSensor, attachToComponent, attachToBone);
85
86 AddSensorDestroyListener(CastedSensor);
87
88 Cameras.Emplace(camera);
89 Sensors.Emplace(CastedSensor);
90
91 camera->OnCameraWindowClosed.AddDynamic(this, &USensorsManagerComponent::OnCameraWindowClosed);
92
93 OnCameraSpawned.Broadcast(camera);
94 OnSensorSpawned.Broadcast(CastedSensor);
95
96 return camera;
97}
98
99AThermalCamera* USensorsManagerComponent::SpawnThermalCamera(const FTransform& transform, bool isTransformRelativeToComponent, const FString sensorIdentifier, const FString sensorName, FThermalCameraParameters thermalCameraParameters, bool simulateSensor, ASensorModel*& createdModel, USceneComponent* attachToComponent, FName attachToBone)
100{
101
102 // Check if attachToComponent is not set but attachToBone is set
103 if (!attachToComponent && !attachToBone.IsNone())
104 {
105 attachToComponent = GetOwner()->GetRootComponent();
106 }
107
108 FTransform sensorTransform = isTransformRelativeToComponent ? GetSensorAttachmentTransform(transform, attachToComponent, attachToBone) : transform;
109
110 AThermalCamera* thermalCamera = USensorFactory::SpawnThermalCamera(sensorTransform, sensorIdentifier, sensorName, thermalCameraParameters, simulateSensor, GetOwner());
111
112 if (!thermalCamera)
113 {
114 return nullptr;
115 }
116
117 createdModel = thermalCamera->GetSensorModel();
118
119 ASensor* CastedSensor = Cast<ASensor>(thermalCamera);
120
121 AttachSensor(CastedSensor, attachToComponent, attachToBone);
122
123 AddSensorDestroyListener(CastedSensor);
124
125 ThermalCameras.Emplace(thermalCamera);
126 Sensors.Emplace(CastedSensor);
127
128 thermalCamera->OnCameraWindowClosed.AddDynamic(this, &USensorsManagerComponent::OnCameraWindowClosed);
129
130 OnThermalCameraSpawned.Broadcast(thermalCamera);
131 OnSensorSpawned.Broadcast(CastedSensor);
132
133 return thermalCamera;
134}
135
136ADVSCamera* USensorsManagerComponent::SpawnDVSCamera(const FTransform& transform, bool isTransformRelativeToComponent, const FString sensorIdentifier, const FString sensorName, FDVSCameraParameters DVSCameraParameters, bool simulateSensor, ASensorModel*& createdModel, USceneComponent* attachToComponent, FName attachToBone)
137{
138 // Check if attachToComponent is not set but attachToBone is set
139 if (!attachToComponent && !attachToBone.IsNone())
140 {
141 attachToComponent = GetOwner()->GetRootComponent();
142 }
143
144 FTransform sensorTransform = isTransformRelativeToComponent ? GetSensorAttachmentTransform(transform, attachToComponent, attachToBone) : transform;
145
146 ADVSCamera* DVSCamera = USensorFactory::SpawnDVSCamera(sensorTransform, sensorIdentifier, sensorName, DVSCameraParameters, simulateSensor, GetOwner());
147
148 if (!DVSCamera)
149 {
150 return nullptr;
151 }
152
153 createdModel = DVSCamera->GetSensorModel();
154
155 ASensor* CastedSensor = Cast<ASensor>(DVSCamera);
156
157 AttachSensor(CastedSensor, attachToComponent, attachToBone);
158
159 AddSensorDestroyListener(CastedSensor);
160
161 DVSCameras.Emplace(DVSCamera);
162 Sensors.Emplace(CastedSensor);
163
164 DVSCamera->OnCameraWindowClosed.AddDynamic(this, &USensorsManagerComponent::OnCameraWindowClosed);
165
166 OnDVSCameraSpawned.Broadcast(DVSCamera);
167 OnSensorSpawned.Broadcast(CastedSensor);
168
169 return DVSCamera;
170}
171
172ASemanticSegmentationCamera* USensorsManagerComponent::SpawnSegmentationCamera(const FTransform& transform, bool isTransformRelativeToComponent, const FString sensorIdentifier, const FString sensorName, FCameraBaseParameters cameraParameters, bool simulateSensor, ASensorModel*& createdModel, USceneComponent* attachToComponent, FName attachToBone)
173{
174
175 // Check if attachToComponent is not set but attachToBone is set
176 if (!attachToComponent && !attachToBone.IsNone())
177 {
178 attachToComponent = GetOwner()->GetRootComponent();
179 }
180
181 FTransform sensorTransform = isTransformRelativeToComponent ? GetSensorAttachmentTransform(transform, attachToComponent, attachToBone) : transform;
182
183 ASemanticSegmentationCamera* segmentationCamera = USensorFactory::SpawnSegmentationCamera(sensorTransform, sensorIdentifier, sensorName, cameraParameters, simulateSensor, GetOwner());
184
185 if (!segmentationCamera)
186 {
187 return nullptr;
188 }
189
190 createdModel = segmentationCamera->GetSensorModel();
191
192 ASensor* CastedSensor = Cast<ASensor>(segmentationCamera);
193
194 AttachSensor(CastedSensor, attachToComponent, attachToBone);
195
196 AddSensorDestroyListener(CastedSensor);
197
198 SegmentationCameras.Emplace(segmentationCamera);
199 Sensors.Emplace(CastedSensor);
200
201 segmentationCamera->OnCameraWindowClosed.AddDynamic(this, &USensorsManagerComponent::OnCameraWindowClosed);
202
203 OnSegmentationCameraSpawned.Broadcast(segmentationCamera);
204 OnSensorSpawned.Broadcast(CastedSensor);
205
206 return segmentationCamera;
207}
208
209ADepthCamera* USensorsManagerComponent::SpawnDepthCamera(const FTransform& transform, bool isTransformRelativeToComponent, const FString sensorIdentifier, const FString sensorName, FDepthCameraParameters DepthCameraParameters, bool simulateSensor, ASensorModel*& createdModel, USceneComponent* attachToComponent, FName attachToBone)
210{
211 // Check if attachToComponent is not set but attachToBone is set
212 if (!attachToComponent && !attachToBone.IsNone())
213 {
214 attachToComponent = GetOwner()->GetRootComponent();
215 }
216
217 FTransform sensorTransform = isTransformRelativeToComponent ? GetSensorAttachmentTransform(transform, attachToComponent, attachToBone) : transform;
218
219 ADepthCamera* depthCamera = USensorFactory::SpawnDepthCamera(sensorTransform, sensorIdentifier, sensorName, DepthCameraParameters, simulateSensor, GetOwner());
220
221 if (!depthCamera)
222 {
223 return nullptr;
224 }
225
226 createdModel = depthCamera->GetSensorModel();
227
228 ASensor* CastedSensor = Cast<ASensor>(depthCamera);
229
230 AttachSensor(CastedSensor, attachToComponent, attachToBone);
231
232 AddSensorDestroyListener(CastedSensor);
233
234 DepthCameras.Emplace(depthCamera);
235 Sensors.Emplace(CastedSensor);
236
237 depthCamera->OnCameraWindowClosed.AddDynamic(this, &USensorsManagerComponent::OnCameraWindowClosed);
238
239 OnDepthCameraSpawned.Broadcast(depthCamera);
240 OnSensorSpawned.Broadcast(CastedSensor);
241
242 return depthCamera;
243}
244
245ARadar* USensorsManagerComponent::SpawnRadar(const FTransform& transform, bool isTransformRelativeToComponent, const FString sensorIdentifier, const FString sensorName, FRadarParameters radarParameters, bool simulateSensor, ASensorModel*& createdModel, USceneComponent* attachToComponent, FName attachToBone)
246{
247 // Check if attachToComponent is not set but attachToBone is set
248 if (!attachToComponent && !attachToBone.IsNone())
249 {
250 attachToComponent = GetOwner()->GetRootComponent();
251 }
252
253 FTransform sensorTransform = isTransformRelativeToComponent ? GetSensorAttachmentTransform(transform, attachToComponent, attachToBone) : transform;
254
255 ARadar* radar = USensorFactory::SpawnRadar(sensorTransform, sensorIdentifier, sensorName, radarParameters, simulateSensor, GetOwner());
256
257 if (!radar)
258 {
259 return nullptr;
260 }
261
262 createdModel = radar->GetSensorModel();
263
264 ASensor* CastedSensor = Cast<ASensor>(radar);
265
266 AttachSensor(CastedSensor, attachToComponent, attachToBone);
267
268 AddSensorDestroyListener(CastedSensor);
269
270 Radars.Emplace(radar);
271 Sensors.Emplace(CastedSensor);
272
273 OnRadarSpawned.Broadcast(radar);
274 OnSensorSpawned.Broadcast(CastedSensor);
275
276 return radar;
277}
278
279ASensor* USensorsManagerComponent::SpawnSensor(const FTransform& transform, bool isTransformRelativeToComponent, const FString sensorIdentifier, const FString sensorName, ESensorTypes sensorType, bool simulateSensor, ASensorModel*& createdModel, USceneComponent* attachToComponent, FName attachToBone)
280{
281 ASensor* sensor = nullptr;
282
283 switch (sensorType)
284 {
286 sensor = Cast<ASensor>(SpawnLidar(transform, isTransformRelativeToComponent, sensorIdentifier, sensorName, FLidarParameters(), simulateSensor, createdModel, attachToComponent, attachToBone));
287 break;
289 sensor = Cast<ASensor>(SpawnCamera(transform, isTransformRelativeToComponent, sensorIdentifier, sensorName, FCameraBaseParameters(), simulateSensor, createdModel, attachToComponent, attachToBone));
290 break;
292 sensor = Cast<ASensor>(SpawnThermalCamera(transform, isTransformRelativeToComponent, sensorIdentifier, sensorName, FThermalCameraParameters(), simulateSensor, createdModel, attachToComponent, attachToBone));
293 break;
295 sensor = Cast<ASensor>(SpawnDVSCamera(transform, isTransformRelativeToComponent, sensorIdentifier, sensorName, FDVSCameraParameters(), simulateSensor, createdModel, attachToComponent, attachToBone));
296 break;
298 sensor = Cast<ASensor>(SpawnSegmentationCamera(transform, isTransformRelativeToComponent, sensorIdentifier, sensorName, FCameraBaseParameters(), simulateSensor, createdModel, attachToComponent, attachToBone));
299 break;
301 sensor = Cast<ASensor>(SpawnDepthCamera(transform, isTransformRelativeToComponent, sensorIdentifier, sensorName, FDepthCameraParameters(), simulateSensor, createdModel, attachToComponent, attachToBone));
302 break;
304 sensor = Cast<ASensor>(SpawnRadar(transform, isTransformRelativeToComponent, sensorIdentifier, sensorName, FRadarParameters(), simulateSensor, createdModel, attachToComponent, attachToBone));
305 break;
306 default:
307 break;
308 }
309
310 return sensor;
311}
312
313void USensorsManagerComponent::DestroyLidar(ALidar* lidarToDestroy)
314{
315 if (lidarToDestroy)
316 {
317 FString sensorIdentifier = lidarToDestroy->GetSensorIdentifier();
318 Lidars.Remove(lidarToDestroy);
319
320 ASensor* CastedSensor = Cast<ASensor>(lidarToDestroy);
321
322 RemoveSensorDestroyListener(CastedSensor);
323
324 Sensors.Remove(CastedSensor);
325 DestroySensorActor(CastedSensor);
326
327 OnLidarDestroyed.Broadcast(sensorIdentifier);
328 OnSensorDestroyed.Broadcast(ESensorTypes::Lidar, sensorIdentifier);
329 }
330}
331
332void USensorsManagerComponent::DestroyCamera(ACamera* cameraToDestroy)
333{
334 if (cameraToDestroy)
335 {
336 FString sensorIdentifier = cameraToDestroy->GetSensorIdentifier();
337
338 cameraToDestroy->OnCameraWindowClosed.RemoveDynamic(this, &USensorsManagerComponent::OnCameraWindowClosed);
339 Cameras.Remove(cameraToDestroy);
340
341 ASensor* CastedSensor = Cast<ASensor>(cameraToDestroy);
342
343 RemoveSensorDestroyListener(CastedSensor);
344
345 Sensors.Remove(CastedSensor);
346 DestroySensorActor(CastedSensor);
347
348 OnCameraDestroyed.Broadcast(sensorIdentifier);
349 OnSensorDestroyed.Broadcast(ESensorTypes::RGBCamera, sensorIdentifier);
350 }
351}
352
353void USensorsManagerComponent::DestroyThermalCamera(AThermalCamera* thermalCameraToDestroy)
354{
355 if (thermalCameraToDestroy)
356 {
357 FString sensorIdentifier = thermalCameraToDestroy->GetSensorIdentifier();
358
359 thermalCameraToDestroy->OnCameraWindowClosed.RemoveDynamic(this, &USensorsManagerComponent::OnCameraWindowClosed);
360 ThermalCameras.Remove(thermalCameraToDestroy);
361
362 ASensor* CastedSensor = Cast<ASensor>(thermalCameraToDestroy);
363
364 RemoveSensorDestroyListener(CastedSensor);
365
366 Sensors.Remove(CastedSensor);
367 DestroySensorActor(CastedSensor);
368
369 OnThermalCameraDestroyed.Broadcast(sensorIdentifier);
370 OnSensorDestroyed.Broadcast(ESensorTypes::ThermalCamera, sensorIdentifier);
371 }
372}
373
374void USensorsManagerComponent::DestroyDVSCamera(ADVSCamera* DVSCameraToDestroy)
375{
376 if (DVSCameraToDestroy)
377 {
378 FString sensorIdentifier = DVSCameraToDestroy->GetSensorIdentifier();
379
380 DVSCameraToDestroy->OnCameraWindowClosed.RemoveDynamic(this, &USensorsManagerComponent::OnCameraWindowClosed);
381 DVSCameras.Remove(DVSCameraToDestroy);
382
383 ASensor* CastedSensor = Cast<ASensor>(DVSCameraToDestroy);
384
385 RemoveSensorDestroyListener(CastedSensor);
386
387 Sensors.Remove(CastedSensor);
388 DestroySensorActor(CastedSensor);
389
390 OnDVSCameraDestroyed.Broadcast(sensorIdentifier);
391 OnSensorDestroyed.Broadcast(ESensorTypes::DVSCamera, sensorIdentifier);
392 }
393}
394
395void USensorsManagerComponent::DestroySegmentationCamera(ASemanticSegmentationCamera* segmentationCameraToDestroy)
396{
397 if (segmentationCameraToDestroy)
398 {
399 FString sensorIdentifier = segmentationCameraToDestroy->GetSensorIdentifier();
400
401 segmentationCameraToDestroy->OnCameraWindowClosed.RemoveDynamic(this, &USensorsManagerComponent::OnCameraWindowClosed);
402 SegmentationCameras.Remove(segmentationCameraToDestroy);
403
404 ASensor* CastedSensor = Cast<ASensor>(segmentationCameraToDestroy);
405
406 RemoveSensorDestroyListener(CastedSensor);
407
408 Sensors.Remove(CastedSensor);
409 DestroySensorActor(CastedSensor);
410
411 OnSegmentationCameraDestroyed.Broadcast(sensorIdentifier);
412 OnSensorDestroyed.Broadcast(ESensorTypes::SemanticSegmentationCamera, sensorIdentifier);
413 }
414}
415
416void USensorsManagerComponent::DestroyDepthCamera(ADepthCamera* depthCameraToDestroy)
417{
418 if (depthCameraToDestroy)
419 {
420 FString sensorIdentifier = depthCameraToDestroy->GetSensorIdentifier();
421
422 depthCameraToDestroy->OnCameraWindowClosed.RemoveDynamic(this, &USensorsManagerComponent::OnCameraWindowClosed);
423 DepthCameras.Remove(depthCameraToDestroy);
424
425 ASensor* CastedSensor = Cast<ASensor>(depthCameraToDestroy);
426
427 RemoveSensorDestroyListener(CastedSensor);
428
429 Sensors.Remove(CastedSensor);
430 DestroySensorActor(CastedSensor);
431
432 OnDepthCameraDestroyed.Broadcast(sensorIdentifier);
433 OnSensorDestroyed.Broadcast(ESensorTypes::DepthCamera, sensorIdentifier);
434 }
435}
436
437void USensorsManagerComponent::DestroyRadar(ARadar* radarToDestroy)
438{
439 if (radarToDestroy)
440 {
441 FString sensorIdentifier = radarToDestroy->GetSensorIdentifier();
442
443 Radars.Remove(radarToDestroy);
444
445 ASensor* CastedSensor = Cast<ASensor>(radarToDestroy);
446
447 RemoveSensorDestroyListener(CastedSensor);
448
449 Sensors.Remove(CastedSensor);
450 DestroySensorActor(CastedSensor);
451
452 OnRadarDestroyed.Broadcast(sensorIdentifier);
453 OnSensorDestroyed.Broadcast(ESensorTypes::Radar, sensorIdentifier);
454 }
455}
456
457void USensorsManagerComponent::DestroySensor(ASensor* sensorToDestroy)
458{
459 if (sensorToDestroy)
460 {
461 ESensorTypes sensorType = sensorToDestroy->GetSensorType();
462
463 switch (sensorType)
464 {
466 DestroyLidar(Cast<ALidar>(sensorToDestroy));
467 break;
469 DestroyCamera(Cast<ACamera>(sensorToDestroy));
470 break;
472 DestroyThermalCamera(Cast<AThermalCamera>(sensorToDestroy));
473 break;
475 DestroyDVSCamera(Cast<ADVSCamera>(sensorToDestroy));
476 break;
478 DestroySegmentationCamera(Cast<ASemanticSegmentationCamera>(sensorToDestroy));
479 break;
481 DestroyDepthCamera(Cast<ADepthCamera>(sensorToDestroy));
482 break;
484 DestroyRadar(Cast<ARadar>(sensorToDestroy));
485 break;
486 default:
487 break;
488 }
489 }
490}
491
492void USensorsManagerComponent::DestroyAllSensors()
493{
494 TArray<ASensor*> SensorsTempArray = Sensors;
495
496 for (const auto& sensor : SensorsTempArray)
497 {
498 DestroySensor(sensor);
499 }
500}
501
502FTransform USensorsManagerComponent::SensorRelativeTransformToWorld(const FTransform& relativeTransform)
503{
504 AActor* owner = GetOwner();
505 return relativeTransform * owner->GetActorTransform();
506}
507
508FTransform USensorsManagerComponent::SensorRelativeTransformToComponentWorld(const FTransform& relativeTransform, const FTransform& componentTransformWorld)
509{
510 return relativeTransform * componentTransformWorld;
511}
512
513FTransform USensorsManagerComponent::GetSensorAttachmentTransform(const FTransform& sensorRelativeTransform, USceneComponent* attachToComponent, const FName& attachToBone, bool revertScaleToVectorOne)
514{
515 FTransform worldTransform;
516
517 // Calculate worldTransform based on attachToComponent availability
518 if (attachToComponent)
519 {
520 worldTransform = SensorRelativeTransformToComponentWorld(sensorRelativeTransform, attachToComponent->GetSocketTransform(attachToBone));
521 }
522 else
523 {
524 worldTransform = SensorRelativeTransformToWorld(sensorRelativeTransform);
525 }
526
527 if (revertScaleToVectorOne)
528 {
529 worldTransform.SetScale3D(FVector(1, 1, 1));
530 }
531
532 return worldTransform;
533}
534
535USceneComponent* USensorsManagerComponent::GetComponentByHierarchyName(FString hierarchyName)
536{
537
538 // Array to hold the split parts
539 TArray<FString> componentNames;
540
541 AActor* owner = GetOwner();
542
543 // Always fallback to owner root component
544 USceneComponent* matchingComponent = owner->GetRootComponent();
545
546 // Split the hierarchy
547 hierarchyName.ParseIntoArray(componentNames, *ComponentHierarchySeparator, true);
548
549 if (componentNames.Num() > 0)
550 {
551 // Search for the initial component using the first element in the split array
552 FString initialComponentName = componentNames[0];
553 USceneComponent* initialComponent = nullptr;
554 bool skipFirstComponentName = true;
555
556 TArray<USceneComponent*> ownerComponents;
557 owner->GetComponents<USceneComponent>(ownerComponents);
558
559 // Iterate over owner's components to find the initial component
560 for (USceneComponent* childComponent : ownerComponents)
561 {
562 if (childComponent && childComponent->GetName() == initialComponentName)
563 {
564 initialComponent = childComponent;
565 matchingComponent = initialComponent;
566 break;
567 }
568 }
569
570 if (!initialComponent)
571 {
572 // UE_LOG(LogTemp, Warning, TEXT("Initial component '%s' not found. Fallback to using owner root component"), *initialComponentName);
573
574 initialComponent = owner->GetRootComponent();
575
576 skipFirstComponentName = false;
577 }
578
579 USceneComponent* currentComponent = initialComponent;
580
581 // Check if there is more components to search through.
582 if (currentComponent && componentNames.Num() > (skipFirstComponentName ? 1 : 0))
583 {
584 // Flag to check if the component with the given name is found
585 bool bComponentFound = false;
586
587 // Iterate over each part of the hierarchy
588 for (int32 i = (skipFirstComponentName ? 1 : 0); i < componentNames.Num(); ++i)
589 {
590 FString componentName = componentNames[i];
591
592 bComponentFound = false;
593
594 // Loop through the child components of the current component
595 for (USceneComponent* childComponent : currentComponent->GetAttachChildren())
596 {
597 FString childComponentName = childComponent->GetName();
598
599 // Check if the child component's name matches the current part of the split string
600 // UE_LOG(LogTemp, Warning, TEXT("Compare between %s and %s."), *childComponentName, *componentName);
601
602 if (childComponent && childComponent->GetName() == componentName)
603 {
604 // Match found, update the current component
605 currentComponent = childComponent;
606 bComponentFound = true;
607 // break out of this inner component search loop
608 break;
609 }
610 }
611
612 // If the component was not found, can't continue the search anymore
613 if (!bComponentFound)
614 {
615 // Component not found, break out of the loop or handle as needed
616 UE_LOG(LogTemp, Warning, TEXT("Component '%s' not found. Breaking out of the loop"), *componentName);
617 // break out of the whole search loop
618 break;
619 }
620 }
621
622 // At this point, CurrentComponent should point to the component matching the hierarchy
623 if (bComponentFound)
624 {
625 FString foundComponentName = currentComponent->GetName();
626 matchingComponent = currentComponent;
627 }
628 else
629 {
630 // Component not found, handle as needed
631 UE_LOG(LogTemp, Warning, TEXT("Component not found"));
632 }
633 }
634 }
635
636 return matchingComponent;
637}
638
639void USensorsManagerComponent::AttachSensorToOwner(ASensor* sensor)
640{
641 // Owner is probably a vehicle
642 AActor* owner = GetOwner();
643
644 // Parent sensor to the owner of this component (vehicle)
645 AttachSensorToActor(sensor, owner);
646}
647
648void USensorsManagerComponent::AttachSensorToActor(ASensor* sensor, AActor* attachToActor)
649{
650 if (sensor && attachToActor)
651 {
652 sensor->AttachToActor(attachToActor, FAttachmentTransformRules::KeepWorldTransform);
653 sensor->AttachedToComponent = FString();
654 sensor->AttachedToBone = NAME_None;
655 }
656}
657
658void USensorsManagerComponent::AttachSensorToBone(ASensor* sensor, USceneComponent* attachToComponent, const FName& boneName)
659{
660 if (!sensor || !attachToComponent)
661 {
662 return;
663 }
664
665 if (IsValid(attachToComponent))
666 {
667 sensor->AttachToComponent(attachToComponent, FAttachmentTransformRules::KeepWorldTransform, boneName);
668
669 USceneComponent* currentParentComponent = attachToComponent->GetAttachParent();
670
671 // FString fullComponentName = FString();
672 FString fullComponentName = attachToComponent->GetName();
673
674 // If this does not have a parent, this is the highest attach parent which we will not include
675 if (currentParentComponent)
676 {
677 fullComponentName = attachToComponent->GetName();
678
679 // Skip the highest attach parent which should be the owner itself. Having only the currentParentComponent-check would include the owner as well.
680 while (currentParentComponent && currentParentComponent->GetAttachParent())
681 {
682 FString ParentComponentName = currentParentComponent->GetName();
683 // Prepend the parent's name into the full component name like ParentComponent_|_ChildComponent.
684 // This could have been a TArray<FString> because that can be also saved easily
685 fullComponentName = FString::Format(TEXT("{0}{1}{2}"), { *ParentComponentName, *ComponentHierarchySeparator, *fullComponentName });
686
687 // Move to the next parent
688 currentParentComponent = currentParentComponent->GetAttachParent();
689 }
690 }
691
692 sensor->AttachedToComponent = fullComponentName;
693 sensor->AttachedToBone = boneName;
694
695 //UE_LOG(LogTemp, Warning, TEXT("Full component name: %s"), *fullComponentName);
696 }
697}
698
699void USensorsManagerComponent::AttachSensor(ASensor* sensor, USceneComponent* attachToComponent, const FName& boneName)
700{
701 // If attachToComponent is valid OR if the boneName is set.
702 if (IsValid(attachToComponent) || !boneName.IsNone())
703 {
704 AttachSensorToBone(sensor, attachToComponent, boneName);
705 }
706 else
707 {
708 AttachSensorToOwner(sensor);
709 }
710}
711
712void USensorsManagerComponent::DestroySensorActor(AActor* sensorActor)
713{
714 if (!sensorActor)
715 {
716 return;
717 }
718
719 TArray<AActor*> attachedActors;
720 sensorActor->GetAttachedActors(attachedActors);
721
722 for (AActor* CActor : attachedActors)
723 {
724 if (CActor)
725 {
726 CActor->Destroy();
727 }
728 }
729
730 sensorActor->Destroy();
731}
732
733void USensorsManagerComponent::LoadPreset(FVehicleSensorsPreset preset, bool simulateSensors)
734{
735 DestroyAllSensors();
736
737 for (const auto& LidarData : preset.LidarDatas)
738 {
739 FSensorPreset sensorData = LidarData.SensorData;
740 FTransform sensorTransform(sensorData.Rotation, sensorData.Location);
741
742 USceneComponent* attachToComponent = GetComponentByHierarchyName(sensorData.AttachedToComponent);
743 FName attachToBone = sensorData.AttachedToBone;
744
745 ASensorModel* createdModel = nullptr;
746
747 SpawnLidar(sensorTransform, true, sensorData.SensorIdentifier, sensorData.SensorName, LidarData.LidarParameters, simulateSensors, createdModel, attachToComponent, attachToBone);
748 }
749
750 for (const auto& RadarData : preset.RadarDatas)
751 {
752 FSensorPreset sensorData = RadarData.SensorData;
753 FTransform sensorTransform(sensorData.Rotation, sensorData.Location);
754
755 USceneComponent* attachToComponent = GetComponentByHierarchyName(sensorData.AttachedToComponent);
756 FName attachToBone = sensorData.AttachedToBone;
757
758 ASensorModel* createdModel = nullptr;
759
760 SpawnRadar(sensorTransform, true, sensorData.SensorIdentifier, sensorData.SensorName, RadarData.RadarParameters, simulateSensors, createdModel, attachToComponent, attachToBone);
761 }
762
763 for (const auto& CameraData : preset.CameraDatas)
764 {
765 FSensorPreset sensorData = CameraData.SensorData;
766
767 FTransform sensorTransform(sensorData.Rotation, sensorData.Location);
768
769 USceneComponent* attachToComponent = GetComponentByHierarchyName(sensorData.AttachedToComponent);
770 FName attachToBone = sensorData.AttachedToBone;
771
772 ASensorModel* createdModel = nullptr;
773
774 SpawnCamera(sensorTransform, true, sensorData.SensorIdentifier, sensorData.SensorName, CameraData.CameraParameters, simulateSensors, createdModel, attachToComponent, attachToBone);
775 }
776
777 for (const auto& CameraData : preset.ThermalCameraDatas)
778 {
779 FSensorPreset sensorData = CameraData.SensorData;
780
781 FTransform sensorTransform(sensorData.Rotation, sensorData.Location);
782
783 USceneComponent* attachToComponent = GetComponentByHierarchyName(sensorData.AttachedToComponent);
784 FName attachToBone = sensorData.AttachedToBone;
785
786 ASensorModel* createdModel = nullptr;
787
788 SpawnThermalCamera(sensorTransform, true, sensorData.SensorIdentifier, sensorData.SensorName, CameraData.CameraParameters, simulateSensors, createdModel, attachToComponent, attachToBone);
789 }
790
791 for (const auto& CameraData : preset.DVSCameraDatas)
792 {
793 FSensorPreset sensorData = CameraData.SensorData;
794
795 FTransform sensorTransform(sensorData.Rotation, sensorData.Location);
796
797 USceneComponent* attachToComponent = GetComponentByHierarchyName(sensorData.AttachedToComponent);
798 FName attachToBone = sensorData.AttachedToBone;
799
800 ASensorModel* createdModel = nullptr;
801
802 SpawnDVSCamera(sensorTransform, true, sensorData.SensorIdentifier, sensorData.SensorName, CameraData.DVSCameraParameters, simulateSensors, createdModel, attachToComponent, attachToBone);
803 }
804
805 for (const auto& CameraData : preset.SegmentationCameraDatas)
806 {
807 FSensorPreset sensorData = CameraData.SensorData;
808
809 FTransform sensorTransform(sensorData.Rotation, sensorData.Location);
810
811 USceneComponent* attachToComponent = GetComponentByHierarchyName(sensorData.AttachedToComponent);
812 FName attachToBone = sensorData.AttachedToBone;
813
814 ASensorModel* createdModel = nullptr;
815
816 SpawnSegmentationCamera(sensorTransform, true, sensorData.SensorIdentifier, sensorData.SensorName, CameraData.CameraParameters, simulateSensors, createdModel, attachToComponent, attachToBone);
817 }
818
819 for (const auto& CameraData : preset.DepthCameraDatas)
820 {
821 FSensorPreset sensorData = CameraData.SensorData;
822
823 FTransform sensorTransform(sensorData.Rotation, sensorData.Location);
824
825 USceneComponent* attachToComponent = GetComponentByHierarchyName(sensorData.AttachedToComponent);
826 FName attachToBone = sensorData.AttachedToBone;
827
828 ASensorModel* createdModel = nullptr;
829
830 SpawnDepthCamera(sensorTransform, true, sensorData.SensorIdentifier, sensorData.SensorName, CameraData.CameraParameters, simulateSensors, createdModel, attachToComponent, attachToBone);
831 }
832}
833
834FVehicleSensorsPreset USensorsManagerComponent::GetSensorsAsPreset()
835{
837
838 for (const auto& Lidar : Lidars)
839 {
840 FSensorPreset sensorPreset = GetSensorPreset(Cast<ASensor>(Lidar));
841 FLidarPreset lidarPreset;
842 lidarPreset.SensorData = sensorPreset;
843 lidarPreset.LidarParameters = Lidar->GetLidarParameters();
844
845 preset.LidarDatas.Add(lidarPreset);
846 }
847
848 for (const auto& Radar : Radars)
849 {
850 FSensorPreset sensorPreset = GetSensorPreset(Cast<ASensor>(Radar));
851 FRadarPreset radarPreset;
852 radarPreset.SensorData = sensorPreset;
853 radarPreset.RadarParameters = Radar->GetRadarParameters();
854
855 preset.RadarDatas.Add(radarPreset);
856 }
857
858 for (const auto& Camera : Cameras)
859 {
860 FSensorPreset sensorPreset = GetSensorPreset(Cast<ASensor>(Camera));
861 FCameraPreset cameraPreset;
862 cameraPreset.SensorData = sensorPreset;
863 cameraPreset.CameraParameters = Camera->GetCameraParameters();
864 preset.CameraDatas.Add(cameraPreset);
865 }
866
867 for (const auto& ThermalCamera : ThermalCameras)
868 {
869 FSensorPreset sensorPreset = GetSensorPreset(Cast<ASensor>(ThermalCamera));
870 FThermalCameraPreset cameraPreset;
871 cameraPreset.SensorData = sensorPreset;
872 cameraPreset.CameraParameters = ThermalCamera->GetThermalCameraParameters();
873 preset.ThermalCameraDatas.Add(cameraPreset);
874 }
875
876 for (const auto& DVSCamera : DVSCameras)
877 {
878 FSensorPreset sensorPreset = GetSensorPreset(Cast<ASensor>(DVSCamera));
879 FDVSCameraPreset cameraPreset;
880 cameraPreset.SensorData = sensorPreset;
881 cameraPreset.DVSCameraParameters = DVSCamera->GetDVSCameraParameters();
882 preset.DVSCameraDatas.Add(cameraPreset);
883 }
884
885 for (const auto& SegmentationCamera : SegmentationCameras)
886 {
887 FSensorPreset sensorPreset = GetSensorPreset(Cast<ASensor>(SegmentationCamera));
889 cameraPreset.SensorData = sensorPreset;
890 cameraPreset.CameraParameters = SegmentationCamera->GetCameraParameters();
891 preset.SegmentationCameraDatas.Add(cameraPreset);
892 }
893
894 for (const auto& DepthCamera : DepthCameras)
895 {
896 FSensorPreset sensorPreset = GetSensorPreset(Cast<ASensor>(DepthCamera));
897 FDepthCameraPreset cameraPreset;
898 cameraPreset.SensorData = sensorPreset;
899 cameraPreset.CameraParameters = DepthCamera->GetDepthCameraParameters();
900 preset.DepthCameraDatas.Add(cameraPreset);
901 }
902
903 return preset;
904}
905
906FSensorPreset USensorsManagerComponent::GetSensorPreset(ASensor* sensor)
907{
908 FSensorPreset sensorPreset;
909
910 FTransform relativeTransform = sensor->GetRootComponent()->GetRelativeTransform();
911
912 sensorPreset.Location = relativeTransform.GetLocation();
913 sensorPreset.Rotation = relativeTransform.Rotator();
914 sensorPreset.SensorIdentifier = sensor->GetSensorIdentifier();
915 sensorPreset.SensorName = sensor->GetSensorName();
916 sensorPreset.SensorType = sensor->GetSensorType();
917 sensorPreset.AttachedToComponent = sensor->AttachedToComponent;
918 sensorPreset.AttachedToBone = sensor->AttachedToBone;
919
920 return sensorPreset;
921}
922
923void USensorsManagerComponent::AddSensorDestroyListener(ASensor* sensor)
924{
925 if (sensor)
926 {
927 sensor->OnSensorDestroy.AddDynamic(this, &USensorsManagerComponent::OnSensorDestroy);
928 }
929}
930
931void USensorsManagerComponent::RemoveSensorDestroyListener(ASensor* sensor)
932{
933 if (sensor)
934 {
935 sensor->OnSensorDestroy.RemoveDynamic(this, &USensorsManagerComponent::OnSensorDestroy);
936 }
937}
938
939void USensorsManagerComponent::OnCameraWindowClosed(ACamera* camera)
940{
941 if (camera)
942 {
943 ASensor* CastedSensor = Cast<ASensor>(camera);
944 DestroySensor(CastedSensor);
945 }
946}
947
948void USensorsManagerComponent::OnSensorDestroy(ASensor* sensor)
949{
950 if (sensor)
951 {
952 // Calling this will actually try to remove the sensor again but I think that is OK
953 DestroySensor(sensor);
954 }
955}
ESensorTypes
Definition: SensorTypes.h:15
@ SemanticSegmentationCamera
Definition: Camera.h:53
FCameraDelegate_OnWindowClosed OnCameraWindowClosed
Definition: Camera.h:141
Definition: Lidar.h:35
Definition: Radar.h:26
Definition: Sensor.h:45
FSensorDestroy OnSensorDestroy
Definition: Sensor.h:283
FString GetSensorIdentifier() const
Definition: Sensor.h:75
FString GetSensorName() const
Definition: Sensor.h:96
virtual ESensorTypes GetSensorType() const
Definition: Sensor.h:65
FString AttachedToComponent
Definition: Sensor.h:286
ASensorModel * GetSensorModel() const
Definition: Sensor.h:181
FName AttachedToBone
Definition: Sensor.h:289
static ASemanticSegmentationCamera * SpawnSegmentationCamera(const FTransform &transform, const FString sensorIdentifier, const FString sensorName, FCameraBaseParameters cameraParameters, bool SimulateSensor=true, AActor *Parent=nullptr)
static ARadar * SpawnRadar(const FTransform &transform, const FString sensorIdentifier, const FString sensorName, FRadarParameters radarParameters, bool SimulateSensor=true, AActor *Parent=nullptr)
static ADVSCamera * SpawnDVSCamera(const FTransform &transform, const FString sensorIdentifier, const FString sensorName, FDVSCameraParameters DVSCameraParameters, bool SimulateSensor, AActor *Parent=nullptr)
static ALidar * SpawnLidarSensor(const FTransform &transform, const FString sensorIdentifier, const FString sensorName, FLidarParameters lidarParameters, bool SimulateSensor=true, AActor *Parent=nullptr)
static ACamera * SpawnCamera(const FTransform &transform, const FString sensorIdentifier, const FString sensorName, FCameraBaseParameters cameraParameters, bool SimulateSensor=true, AActor *Parent=nullptr)
static ADepthCamera * SpawnDepthCamera(const FTransform &transform, const FString sensorIdentifier, const FString sensorName, FDepthCameraParameters depthCameraParameters, bool SimulateSensor=true, AActor *Parent=nullptr)
static AThermalCamera * SpawnThermalCamera(const FTransform &transform, const FString sensorIdentifier, const FString sensorName, FThermalCameraParameters thermalCameraParameters, bool SimulateSensor=true, AActor *Parent=nullptr)
FCameraBaseParameters CameraParameters
Definition: CameraPreset.h:30
FSensorPreset SensorData
Definition: CameraPreset.h:24
FSensorPreset SensorData
FDVSCameraParameters DVSCameraParameters
FDepthCameraParameters CameraParameters
FSensorPreset SensorData
FSensorPreset SensorData
Definition: LidarPreset.h:24
FLidarParameters LidarParameters
Definition: LidarPreset.h:30
FSensorPreset SensorData
Definition: RadarPreset.h:24
FRadarParameters RadarParameters
Definition: RadarPreset.h:30
FRotator Rotation
Definition: SensorPreset.h:50
FString SensorName
Definition: SensorPreset.h:32
ESensorTypes SensorType
Definition: SensorPreset.h:38
FString SensorIdentifier
Definition: SensorPreset.h:26
FName AttachedToBone
Definition: SensorPreset.h:56
FString AttachedToComponent
Definition: SensorPreset.h:53
FVector Location
Definition: SensorPreset.h:44
FThermalCameraParameters CameraParameters
TArray< FRadarPreset > RadarDatas
TArray< FLidarPreset > LidarDatas
TArray< FThermalCameraPreset > ThermalCameraDatas
TArray< FDVSCameraPreset > DVSCameraDatas
TArray< FSemanticSegmentationCameraPreset > SegmentationCameraDatas
TArray< FCameraPreset > CameraDatas
TArray< FDepthCameraPreset > DepthCameraDatas