Agrarsense
Vehicle.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
7
16
17#include "Kismet/GameplayStatics.h"
18#include "NiagaraFunctionLibrary.h"
19#include "NiagaraComponent.h"
20#include "NiagaraSystem.h"
21
23{
24 PrimaryActorTick.bCanEverTick = false;
25 SensorsManager = CreateDefaultSubobject<USensorsManagerComponent>(TEXT("SensorsManagerComp"));
26 InteractableName = NSLOCTEXT("Agrarsense", "VehicleInteractableName", "Vehicle");
27}
28
30{
31 Super::BeginPlay();
32
33 TogglePhysics(true);
34
35 UROSHandler* ROSHandler = UAgrarsenseStatics::GetROSHandle(GetWorld());
36 if (ROSHandler)
37 {
38 ROSHandler->OnROSStateChanged.AddUniqueDynamic(this, &AVehicle::ROSBridgeStateChanged);
39 }
40
41 bool IsDrone = GetVehicleType() == EVehicleTypes::Drone;
42
43 // Spawn Transform and Collision sensors for each vehicle
44 FTransform transform = GetTransform();
45
46 // Create Collision sensor
47 FString VehicleCollisionSensorID = ActorID + "/collision";
48 CollisionSensor = USensorFactory::SpawnCollisionSensor(transform, this, VehicleCollisionSensorID, "collision", true, this);
49
50 if (!IsDrone)
51 {
52 // Create Transform sensor for forwarder and harvester
54 Params.SaveTransformDataToDisk = true;
55 Params.OwningActor = this;
56
57 FString VehicleTransformSensorID = ActorID + "/transform";
58 TransformSensor = USensorFactory::SpawnTransformSensor(transform, Params, VehicleTransformSensorID, "transform", true, this);
59 }
60
61 float NiagaraComponentHeight = 500.0f;
62 float OverlapBoundsSize = 5000.0f;
63
64 if (IsDrone)
65 {
66 // Adjust certain variables if vehicle is a drone
67 OverlapBoundsSize = 2500.0f;
68 NiagaraComponentHeight = 200.0f;
69 }
70
71 FVector RelativePosition = FVector(0.0f, 0.0f, 0.0f);
73 {
74 // TODO make better solution for this.
75 RelativePosition = FVector(150.0f, -120.0f, 250.0f);
76 }
77
78 // Create OverlapSensor
80 Params.OwningActor = this;
81 Params.Size = FVector(OverlapBoundsSize, OverlapBoundsSize, OverlapBoundsSize);
82 Params.RelativePosition = RelativePosition;
83 FString OverlapSensorID = ActorID + "/overlap";
84 OverlapSensor = USensorFactory::SpawnOverlapSensor(transform, Params, OverlapSensorID, "overlap", this);
85
86 // Load and setup rain/snow fall niagara system
87 UNiagaraSystem* NiagaraSystem = LoadObject<UNiagaraSystem>(nullptr, TEXT("/Game/Agrarsense/Particles/WaterAndSnow/NS_Particles.NS_Particles"));
88 if (NiagaraSystem)
89 {
90 NiagaraComponent = UNiagaraFunctionLibrary::SpawnSystemAttached(NiagaraSystem, this->GetRootComponent(),
91 FName("NiagaraEmitterSocketName"),
92 FVector(0.0, 0.0, NiagaraComponentHeight), FRotator::ZeroRotator, EAttachLocation::KeepRelativeOffset, true);
93 }
94
96}
97
98void AVehicle::EndPlay(const EEndPlayReason::Type EndPlayReason)
99{
100 Super::EndPlay(EndPlayReason);
101
102 UROSHandler* ROSHandler = UAgrarsenseStatics::GetROSHandle(GetWorld());
103 if (ROSHandler)
104 {
105 ROSHandler->OnROSStateChanged.RemoveDynamic(this, &AVehicle::ROSBridgeStateChanged);
106 }
107
108 if (TransformSensor)
109 {
110 TransformSensor->Destroy();
111 TransformSensor = nullptr;
112 }
113
114 if (CollisionSensor)
115 {
116 CollisionSensor->Destroy();
117 CollisionSensor = nullptr;
118 }
119
120 if (OverlapSensor)
121 {
122 OverlapSensor->Destroy();
123 OverlapSensor = nullptr;
124 }
125
126 // Destroy attached sensors when vehicle is destroyed
127 if (IsValid(SensorsManager) && EndPlayReason == EEndPlayReason::Destroyed)
128 {
129 SensorsManager->DestroyAllSensors();
130 }
131
133 {
134 NiagaraComponent->UnregisterComponent();
135 NiagaraComponent->DestroyComponent();
136 NiagaraComponent = nullptr;
137 }
138
139 // Destroy all remaining Actors that are attached to this vehicle, if any
140 TArray<AActor*> AttachedActors;
141 GetAttachedActors(AttachedActors);
142 for (AActor* Actor : AttachedActors)
143 {
144 if (Actor)
145 {
146 Actor->Destroy();
147 }
148 }
149}
150
152{
153
154}
155
156void AVehicle::PossessedBy(AController* NewController)
157{
158 Super::PossessedBy(NewController);
159
160 ResetCamera();
161}
162
163void AVehicle::TeleportVehicleTo_Implementation(FVector NewLocation, FRotator NewRotation)
164{
165 SetActorLocationAndRotation(NewLocation, NewRotation, false, nullptr, ETeleportType::TeleportPhysics);
166}
167
169{
170 if (OverlapSensor)
171 {
173 }
174}
175
176FString AVehicle::ExportToJsonFile(const FString& FileName)
177{
178 bool OverrideTransform = IsVehicleInGarage();
179
180 FTransform TransformToUse = GetActorTransform();
181
182 if (OverrideTransform)
183 {
184 TransformToUse = MovedFromGarageTransform;
185 }
186
187 return USimulatorJsonExporter::ExportVehicleAndSensorsToJSON(FileName, this, OverrideTransform, TransformToUse);
188}
EROSState
Definition: ROSState.h:16
void SetVisualizeOverlapArea(bool Visualize)
ACollisionSensor * CollisionSensor
Definition: Vehicle.h:285
FTransform MovedFromGarageTransform
Definition: Vehicle.h:305
FWheeledVehicleParameters VehicleParameters
Definition: Vehicle.h:276
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override
Definition: Vehicle.cpp:98
FText InteractableName
Definition: Vehicle.h:258
virtual void BeginPlay() override
Definition: Vehicle.cpp:29
virtual void PossessedBy(AController *NewController) override
Definition: Vehicle.cpp:156
void ResetCamera()
virtual void TeleportVehicleTo_Implementation(FVector NewLocation, FRotator NewRotation)
Definition: Vehicle.cpp:163
bool IsVehicleInGarage() const
Definition: Vehicle.h:124
FString ActorID
Definition: Vehicle.h:300
FString ExportToJsonFile(const FString &FileName)
Definition: Vehicle.cpp:176
AVehicle()
Definition: Vehicle.cpp:22
void SetVisualizeVehicleOverlapArea(bool Visible)
Definition: Vehicle.cpp:168
AOverlapSensor * OverlapSensor
Definition: Vehicle.h:291
virtual EVehicleTypes GetVehicleType() const
Definition: Vehicle.h:52
void ApplyVehicleParameters(FWheeledVehicleParameters CurrentParameters)
void TogglePhysics(bool isOn)
ATransformSensor * TransformSensor
Definition: Vehicle.h:288
UNiagaraComponent * NiagaraComponent
Definition: Vehicle.h:294
virtual void ROSBridgeStateChanged(EROSState ROSState)
Definition: Vehicle.cpp:151
TObjectPtr< USensorsManagerComponent > SensorsManager
Definition: Vehicle.h:282
static UROSHandler * GetROSHandle(const UObject *WorldContextObject)
FROSDelegate_ROState OnROSStateChanged
Definition: ROSHandler.h:81
static AOverlapSensor * SpawnOverlapSensor(const FTransform &transform, FOverlapSensorParameters Parameters, const FString sensorIdentifier, const FString sensorName, AActor *Parent=nullptr)
static ATransformSensor * SpawnTransformSensor(const FTransform &transform, FTransformSensorParameters Parameters, const FString sensorIdentifier, const FString sensorName, bool SimulateSensor=true, AActor *Parent=nullptr)
static ACollisionSensor * SpawnCollisionSensor(const FTransform &transform, AActor *Owner, const FString sensorIdentifier, const FString sensorName, bool SimulateSensor=true, AActor *Parent=nullptr)
static FString ExportVehicleAndSensorsToJSON(FString FileName, AVehicle *Vehicle, bool OverrideTransform=false, const FTransform &Transform=FTransform())