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

#include <PIDDrone.h>

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

Public Member Functions

 APIDDrone ()
 
virtual EVehicleTypes GetVehicleType () const override
 
virtual FTransform GetInteractableWorldTransform_Implementation () const override
 
void SetDroneAction (EDroneAction mode)
 Set drone's action (roaming, manual) More...
 
EDroneAction GetDroneAction () const
 Get drone's action (roaming, manual) More...
 
FDroneParameters GetDroneParameters () const
 
void ResetDroneEvent ()
 
void ChangeDroneParameters (const FDroneParameters &newParameters)
 
void AddWayPoint (FVector Waypoint)
 
float GetDroneDistanceToNextPoint ()
 
float GetDroneSpeed () const
 
void ClearWaypoints ()
 
void SetFlightpath ()
 Called in tick function for drone roaming through points. More...
 
void SetManualControl (bool value)
 
void MoveDroneToPosition (const FTransform Transform)
 Override all drone roaming points and continue towards this position. More...
 
TArray< FTransform > GenerateRoamingPoints (float radius, int32 roamingPoints)
 Generates a roadming points array for the drone in radius. More...
 
float GetYawRotationDifference (USkeletalMeshComponent *DroneSkeletalMesh, UStaticMeshComponent *DesiredLocation)
 Get wanted waypoint target rotation. More...
 
virtual void SetCurrentTransformToMovedFromGarageTransform () override
 
void SetShowForwardArrow (bool Show)
 
void SetDrawDebugPoints (bool show)
 
bool GetShowForwardArrow () const
 
USkeletalMeshComponent * GetDroneSkeletalMesh () const
 
- Public Member Functions inherited from AVehicle
 AVehicle ()
 
virtual EVehicleTypes GetVehicleType () const
 
void TogglePhysics (bool isOn)
 
void SetVehicleMeshVisibility (bool Visible)
 
void TeleportVehicleTo (FVector NewLocation, FRotator NewRotation)
 
virtual void TeleportVehicleTo_Implementation (FVector NewLocation, FRotator NewRotation)
 
void ResetCamera ()
 
void ToggleLights (bool isOn)
 
void SetVisualizeVehicleOverlapArea (bool Visible)
 
FString ExportToJsonFile (const FString &FileName)
 
void SetVehicleIsInGarage (bool VehicleIsInGarage)
 
bool IsVehicleInGarage () const
 
USensorsManagerComponent * GetSensorsManager () const
 
ACollisionSensorGetCollisionSensor () const
 
ATransformSensorGetTransformSensor () const
 
AOverlapSensorGetOverlapSensor () const
 
FTransform GetMovedFromGarageTransform () const
 
virtual void SetCurrentTransformToMovedFromGarageTransform ()
 
virtual FText GetInteractableName_Implementation () const override
 
virtual FTransform GetInteractableWorldTransform_Implementation () const override
 
virtual FString GetActorID_Implementation () const override
 
virtual FString GetActorName_Implementation () const override
 
virtual FString GetActorInformation_Implementation () const override
 
virtual void SetActorName_Implementation (const FString &NewActorName) override
 
virtual void SetActorIDAndName_Implementation (const FString &NewActorName, const FString &NewID) override
 
void SetVehicleParameters (FWheeledVehicleParameters NewParameters)
 
FWheeledVehicleParameters GetVehicleParameters () const
 
void ApplyVehicleParameters (FWheeledVehicleParameters CurrentParameters)
 
virtual void PossessedBy (AController *NewController) override
 
- Public Member Functions inherited from IInteractable
FText GetInteractableName () const
 
FTransform GetInteractableWorldTransform () const
 
- Public Member Functions inherited from IActorInformation
FString GetActorID () const
 
FString GetActorName () const
 
FString GetActorInformation () const
 
void SetActorName (const FString &NewActorName)
 
void SetActorIDAndName (const FString &NewActorName, const FString &NewID)
 

Public Attributes

FDroneFinished OnDroneFinished
 
- Public Attributes inherited from AVehicle
FText InteractableName
 
FVehicleGarageChangedDelegate OnVehicleGarageChanged
 

Protected Member Functions

void ROSBridgeStateChanged (EROSState ROSState) override
 
virtual void BeginPlay () override
 
virtual void EndPlay (const EEndPlayReason::Type EndPlayReason) override
 
virtual void ROSBridgeStateChanged (EROSState ROSState)
 

Protected Attributes

UTopic * ROSTopic = nullptr
 
TSharedPtr< ROSMessages::std_msgs::Float32 > ROSMessage
 
- Protected Attributes inherited from AVehicle
FWheeledVehicleParameters VehicleParameters
 
TObjectPtr< USensorsManagerComponent > SensorsManager
 
ACollisionSensorCollisionSensor = nullptr
 
ATransformSensorTransformSensor = nullptr
 
AOverlapSensorOverlapSensor = nullptr
 
UNiagaraComponent * NiagaraComponent = nullptr
 
TArray< UStaticMeshComponent * > ExtraTransformSensorPositions
 
FString ActorName
 
FString ActorID
 
FTransform OriginalCameraTransform
 
FTransform MovedFromGarageTransform
 
bool VehicleInGarage = false
 
TArray< ATransformSensor * > ExtraTransformSensors
 

Private Member Functions

virtual void BeginPlay () override
 
virtual void Tick (float DeltaTime) override
 
virtual void EndPlay (const EEndPlayReason::Type EndPlayReason) override
 
void CreateTopic ()
 
void DestroyTopic ()
 
void HandleDestroy ()
 
void AutoPilot (const float DeltaTime)
 
void DrawDebugPoints ()
 
void AssignRoamingPoints (const TArray< FTransform > Points)
 
void SetDroneRotation (USkeletalMeshComponent *target, FRotator rotator)
 
void UpdateGroundHeight ()
 
bool IsRoaming () const
 
void SetDesiredLocationMesh (UStaticMeshComponent *meshcomponent)
 
FVector GetCurrentWaypointTarget ()
 
FTransform GetCurrentWaypointTarget_Transform ()
 

Private Attributes

FDroneParameters DroneParameters
 
EFlightMode flightmode = EFlightMode::Roaming
 
UWorld * World = nullptr
 
FVector StartingPosition
 
USkeletalMeshComponent * DroneSkeletalMesh = nullptr
 
UStaticMeshComponent * PositionMesh = nullptr
 
AOverlapSensorInnerOverlapSensor = nullptr
 
TArray< FVector > WayPoints
 
bool waypointReached = false
 
bool manualControl = false
 
bool ShowForwardArrow = false
 
bool drawDebugPoints = false
 
int32 passedWaypoints = 0
 
float DroneHeightFromGround = 0.0f
 
float distanceToNextPoint = 0.0f
 
TArray< FTransform > dronePath
 
FTimerHandle DestroyHandle
 

Additional Inherited Members

- Static Public Member Functions inherited from IActorInformation
static void SetAndValidateActorIDAndName (FString &ActorName, FString &ActorID, TWeakObjectPtr< AActor > Actor)
 
static bool DestroyActorByID (const FString &ID)
 
static AActor * GetActorByID (const FString &ID)
 
template<typename T >
static TArray< T * > GetActorsWithInterface ()
 
static void PrintAllIds ()
 

Detailed Description

Definition at line 25 of file PIDDrone.h.

Constructor & Destructor Documentation

◆ APIDDrone()

APIDDrone::APIDDrone ( )

Definition at line 30 of file PIDDrone.cpp.

30 : Super()
31{
32 PrimaryActorTick.bCanEverTick = true;
33 InteractableName = NSLOCTEXT("Agrarsense", "DroneInteractableName", "Drone");
34}
FText InteractableName
Definition: Vehicle.h:263

References AVehicle::InteractableName.

Member Function Documentation

◆ AddWayPoint()

void APIDDrone::AddWayPoint ( FVector  Waypoint)
inline

Definition at line 86 of file PIDDrone.h.

87 {
88 FTransform transform;
89 transform.SetLocation(Waypoint);
90
91 DroneParameters.Points.Add(transform);
92 }
FDroneParameters DroneParameters
Definition: PIDDrone.h:247
TArray< FTransform > Points

References FDroneParameters::Points.

◆ AssignRoamingPoints()

void APIDDrone::AssignRoamingPoints ( const TArray< FTransform >  Points)
private

Definition at line 396 of file PIDDrone.cpp.

397{
399
400 for (const FTransform& point : Points)
401 {
402 WayPoints.Add(point.GetLocation());
403 }
404}
TArray< FVector > WayPoints
Definition: PIDDrone.h:267
void ClearWaypoints()
Definition: PIDDrone.h:118

References ClearWaypoints(), and WayPoints.

◆ AutoPilot()

void APIDDrone::AutoPilot ( const float  DeltaTime)
private

Definition at line 228 of file PIDDrone.cpp.

229{
231 {
232 return;
233 }
234
236}
void SetFlightpath()
Called in tick function for drone roaming through points.
Definition: PIDDrone.cpp:288
EDroneAction DroneAction

References FDroneParameters::DroneAction, DroneParameters, SetFlightpath(), and Stationary.

Referenced by Tick().

◆ BeginPlay()

void APIDDrone::BeginPlay ( )
overrideprivatevirtual

Reimplemented from AVehicle.

Definition at line 112 of file PIDDrone.cpp.

113{
114 Super::BeginPlay();
115
116 World = GetWorld();
117
118 ROSMessage.Reset();
119 ROSMessage = MakeShared<ROSMessages::std_msgs::Float32>();
120
121 CreateTopic();
122
123 // These should be setup in BP_Drone_PID blueprint.
124 DroneSkeletalMesh = Cast<USkeletalMeshComponent>(GetComponentByClass(USkeletalMeshComponent::StaticClass()));
125 PositionMesh = Cast<UStaticMeshComponent>(GetComponentByClass(UStaticMeshComponent::StaticClass()));
126
127 StartingPosition = GetActorLocation();
128 FTransform ActorTransform = GetActorTransform();
129
131 {
132 // Create Transform sensor for forwarder and harvester
133
134 FString VehicleTransformSensorID = ActorID + "/transform";
135
136 FSensorSpawnParameters TransformSensorSpawnParams;
137 TransformSensorSpawnParams.Transform = GetActorTransform();
138 TransformSensorSpawnParams.SensorIdentifier = VehicleTransformSensorID;
139 TransformSensorSpawnParams.SensorName = "transform";
140 TransformSensorSpawnParams.SimulateSensor = true;
141 TransformSensorSpawnParams.Parent = this;
142
143 FTransformSensorParameters TransformSensorParams;
144 TransformSensorParams.SaveTransformDataToDisk = true;
145 TransformSensorParams.OwningActor = this;
146 TransformSensorParams.UseOwningActorTransform = false;
147 TransformSensorParams.PrimitiveComponent = Cast<UPrimitiveComponent>(DroneSkeletalMesh);
148
149 TransformSensor = USensorFactory::SpawnTransformSensor(TransformSensorSpawnParams, TransformSensorParams);
150 }
151
152 if (!OverlapSensor)
153 {
154 // Create OverlapSensor
155
156 FString OverlapSensorID = ActorID + "/overlap";
157
158 FSensorSpawnParameters OverlapSensorSpawnParams;
159 OverlapSensorSpawnParams.Transform = GetActorTransform();
160 OverlapSensorSpawnParams.SensorIdentifier = OverlapSensorID;
161 OverlapSensorSpawnParams.SensorName = "overlap";
162 OverlapSensorSpawnParams.SimulateSensor = true;
163 OverlapSensorSpawnParams.Parent = this;
164
165 FOverlapSensorParameters OverlapSensorParams;
166 OverlapSensorParams.OwningActor = this;
167 OverlapSensorParams.AllChannels = true;
168 OverlapSensorParams.Size = FVector(25.0f, 25.0f, 25.0f);
169 OverlapSensorParams.RelativePosition = FVector(0.0f, 0.0f, 0.0f);
170
171 OverlapSensor = USensorFactory::SpawnOverlapSensor(OverlapSensorSpawnParams, OverlapSensorParams);
172
173 if (OverlapSensor)
174 {
175 OverlapSensor->AttachToComponent(DroneSkeletalMesh, FAttachmentTransformRules::KeepRelativeTransform);
176 }
177 }
178
180 {
181 // Attach rain/snowfall niagara component to drone skeletal mesh.
182 NiagaraComponent->AttachToComponent(DroneSkeletalMesh, FAttachmentTransformRules::KeepRelativeTransform);
183 }
184
185 // Apply default parameters
187}
TSharedPtr< ROSMessages::std_msgs::Float32 > ROSMessage
Definition: PIDDrone.h:201
void CreateTopic()
Definition: PIDDrone.cpp:529
UWorld * World
Definition: PIDDrone.h:253
FVector StartingPosition
Definition: PIDDrone.h:255
UStaticMeshComponent * PositionMesh
Definition: PIDDrone.h:261
USkeletalMeshComponent * DroneSkeletalMesh
Definition: PIDDrone.h:258
void ChangeDroneParameters(const FDroneParameters &newParameters)
Definition: PIDDrone.cpp:36
FString ActorID
Definition: Vehicle.h:310
AOverlapSensor * OverlapSensor
Definition: Vehicle.h:296
ATransformSensor * TransformSensor
Definition: Vehicle.h:293
UNiagaraComponent * NiagaraComponent
Definition: Vehicle.h:299
static ATransformSensor * SpawnTransformSensor(const FSensorSpawnParameters SpawnParameters, FTransformSensorParameters SensorParameters)
static AOverlapSensor * SpawnOverlapSensor(const FSensorSpawnParameters SpawnParameters, FOverlapSensorParameters SensorParameters)
UPrimitiveComponent * PrimitiveComponent

References AVehicle::ActorID, FOverlapSensorParameters::AllChannels, ChangeDroneParameters(), CreateTopic(), DroneParameters, DroneSkeletalMesh, AVehicle::NiagaraComponent, AVehicle::OverlapSensor, FOverlapSensorParameters::OwningActor, FTransformSensorParameters::OwningActor, FSensorSpawnParameters::Parent, PositionMesh, FTransformSensorParameters::PrimitiveComponent, FOverlapSensorParameters::RelativePosition, ROSMessage, FTransformSensorParameters::SaveTransformDataToDisk, FSensorSpawnParameters::SensorIdentifier, FSensorSpawnParameters::SensorName, FSensorSpawnParameters::SimulateSensor, FOverlapSensorParameters::Size, USensorFactory::SpawnOverlapSensor(), USensorFactory::SpawnTransformSensor(), StartingPosition, FSensorSpawnParameters::Transform, AVehicle::TransformSensor, FTransformSensorParameters::UseOwningActorTransform, and World.

◆ ChangeDroneParameters()

void APIDDrone::ChangeDroneParameters ( const FDroneParameters newParameters)

Definition at line 36 of file PIDDrone.cpp.

37{
38 DroneParameters = newParameters;
39
41 {
42 FString OverlapSensorID = ActorID + "/inner_overlap";
43
44 FSensorSpawnParameters SpawnParams;
45 SpawnParams.Transform = GetActorTransform();
46 SpawnParams.SensorIdentifier = OverlapSensorID;
47 SpawnParams.SensorName = "overlap";
48 SpawnParams.SimulateSensor = true;
49 SpawnParams.Parent = this;
50
51 FOverlapSensorParameters SensorParams;
52 SensorParams.OwningActor = this;
53 SensorParams.AllChannels = true;
55 SensorParams.RelativePosition = FVector(0.0f, 0.0f, 0.0f);
56
57 InnerOverlapSensor = USensorFactory::SpawnOverlapSensor(SpawnParams, SensorParams);
58
60 {
61 InnerOverlapSensor->AttachToComponent(DroneSkeletalMesh, FAttachmentTransformRules::KeepRelativeTransform);
62 }
63 }
65 {
66 InnerOverlapSensor->Destroy();
67 InnerOverlapSensor = nullptr;
68 }
69
71 {
72 DroneSkeletalMesh->SetCollisionProfileName(TEXT("DroneNoCollision"));
73 }
74
75 if (OverlapSensor)
76 {
78
79 const float BoundsSizeMeters = DroneParameters.OverlapRadiusMeters;
80 OverlapSensor->SetOverlapBounds(FVector(BoundsSizeMeters, BoundsSizeMeters, BoundsSizeMeters));
81
82 }
83
85 {
87
88 const float BoundsSizeMeters = DroneParameters.InnerOverlapRadiusMeters;
89 InnerOverlapSensor->SetOverlapBounds(FVector(BoundsSizeMeters, BoundsSizeMeters, BoundsSizeMeters));
90 }
91
92 if (!CollisionSensor)
93 {
94 // Create Collision sensor
95 FString VehicleCollisionSensorID = ActorID + "/collision";
96 FSensorSpawnParameters CollisionSensorSpawnParams;
97 CollisionSensorSpawnParams.Transform = GetActorTransform();
98 CollisionSensorSpawnParams.SensorIdentifier = VehicleCollisionSensorID;
99 CollisionSensorSpawnParams.SensorName = "collision";
100 CollisionSensorSpawnParams.SimulateSensor = true;
101 CollisionSensorSpawnParams.Parent = this;
102
103 FCollisionSensorParameters FCollisionSensorSpawnParams;
104 FCollisionSensorSpawnParams.OwningActor = this;
105 FCollisionSensorSpawnParams.UseActorCollision = false;
106 FCollisionSensorSpawnParams.PrimitiveComponent = DroneSkeletalMesh;
107
108 CollisionSensor = USensorFactory::SpawnCollisionSensor(CollisionSensorSpawnParams, FCollisionSensorSpawnParams);
109 }
110}
void SetVisualizeOverlapArea(bool Visualize)
void SetOverlapBounds(const FVector &NewSize)
AOverlapSensor * InnerOverlapSensor
Definition: PIDDrone.h:264
ACollisionSensor * CollisionSensor
Definition: Vehicle.h:290
static ACollisionSensor * SpawnCollisionSensor(const FSensorSpawnParameters SpawnParameters, const FCollisionSensorParameters CollisionSensorParameters)
UPrimitiveComponent * PrimitiveComponent
float InnerOverlapRadiusMeters

References AVehicle::ActorID, FOverlapSensorParameters::AllChannels, FDroneParameters::CollisionsEnabled, AVehicle::CollisionSensor, FDroneParameters::CreateInnerOverlapSensor, DroneParameters, DroneSkeletalMesh, FDroneParameters::InnerOverlapRadiusMeters, InnerOverlapSensor, FDroneParameters::OverlapRadiusMeters, AVehicle::OverlapSensor, FCollisionSensorParameters::OwningActor, FOverlapSensorParameters::OwningActor, FSensorSpawnParameters::Parent, FCollisionSensorParameters::PrimitiveComponent, FOverlapSensorParameters::RelativePosition, FSensorSpawnParameters::SensorIdentifier, FSensorSpawnParameters::SensorName, AOverlapSensor::SetOverlapBounds(), AOverlapSensor::SetVisualizeOverlapArea(), FSensorSpawnParameters::SimulateSensor, FOverlapSensorParameters::Size, USensorFactory::SpawnCollisionSensor(), USensorFactory::SpawnOverlapSensor(), FSensorSpawnParameters::Transform, FCollisionSensorParameters::UseActorCollision, and FDroneParameters::VisualizeOverlap.

Referenced by BeginPlay(), and USimulatorJsonParser::ParseAndSetDroneParameters().

◆ ClearWaypoints()

void APIDDrone::ClearWaypoints ( )
inline

Definition at line 118 of file PIDDrone.h.

119 {
120 DroneParameters.Points.Empty();
121 }

Referenced by AssignRoamingPoints().

◆ CreateTopic()

void APIDDrone::CreateTopic ( )
private

Definition at line 529 of file PIDDrone.cpp.

530{
531 if (ROSTopic)
532 {
533 return;
534 }
535
536 UROSIntegrationGameInstance* ROSInstance = UAgrarsenseStatics::GetROSGameInstance(GetWorld());
537 if (ROSInstance && ROSInstance->IsROSConnected())
538 {
539 ROSTopic = NewObject<UTopic>(UTopic::StaticClass());
540 if (ROSTopic)
541 {
542
543 FString TopicName = FString::Printf(TEXT("/agrarsense/out/vehicles/%s/height"), *GetActorID_Implementation());
544 //UE_LOG(LogTemp, Warning, TEXT("TopicName is %s"), *TopicName);
545
546 ROSTopic->Init(ROSInstance->ROSIntegrationCore, TopicName, "std_msgs/Float32");
547 ROSTopic->Advertise();
548 }
549 }
550}
UTopic * ROSTopic
Definition: PIDDrone.h:199
virtual FString GetActorID_Implementation() const override
Definition: Vehicle.h:204
static UROSIntegrationGameInstance * GetROSGameInstance(const UObject *WorldContextObject)

References AVehicle::GetActorID_Implementation(), UAgrarsenseStatics::GetROSGameInstance(), and ROSTopic.

Referenced by BeginPlay(), and ROSBridgeStateChanged().

◆ DestroyTopic()

void APIDDrone::DestroyTopic ( )
private

Definition at line 569 of file PIDDrone.cpp.

570{
571 if (ROSTopic)
572 {
573 ROSTopic->Unadvertise();
574 ROSTopic->Unsubscribe();
575 ROSTopic->MarkAsDisconnected();
576 ROSTopic->ConditionalBeginDestroy();
577 ROSTopic = nullptr;
578 }
579}

References ROSTopic.

Referenced by EndPlay(), and ROSBridgeStateChanged().

◆ DrawDebugPoints()

void APIDDrone::DrawDebugPoints ( )
private

Definition at line 238 of file PIDDrone.cpp.

239{
240 TArray<FTransform> dronePoints = DroneParameters.Points;
241
242 dronePath.Add(DroneSkeletalMesh->GetComponentTransform());
243
244 for (int32 i = 0; i < dronePoints.Num(); i++)
245 {
246 if (World)
247 {
248 //UE_LOG(LogTemp, Warning, TEXT("Drone point %d: %s"), i, *dronePoints[i].GetLocation().ToString());
249 DrawDebugSphere(World, dronePoints[i].GetLocation(), 5.0f, 25, FColor::Red, false);
250 if (i < dronePoints.Num() - 1)
251 {
252 FVector nextPointLocation = dronePoints[i + 1].GetLocation();
253 DrawDebugLine(World, dronePoints[i].GetLocation(), nextPointLocation, FColor::Blue, false, 0.0f, 0, 5.0f);
254 }
255 }
256 }
257
258 for (int32 i = 0; i < dronePath.Num(); i++)
259 {
260 if (i < dronePath.Num() - 1)
261 {
262 FVector nextPointLocation = dronePath[i + 1].GetLocation();
263 DrawDebugLine(World, dronePath[i].GetLocation(), nextPointLocation, FColor::Green, false, 0.0f, 0, 5.0f);
264 }
265 }
266}
TArray< FTransform > dronePath
Definition: PIDDrone.h:286

References DroneParameters, dronePath, DroneSkeletalMesh, FDroneParameters::Points, and World.

Referenced by Tick().

◆ EndPlay()

void APIDDrone::EndPlay ( const EEndPlayReason::Type  EndPlayReason)
overrideprivatevirtual

Reimplemented from AVehicle.

Definition at line 189 of file PIDDrone.cpp.

190{
191 Super::EndPlay(EndPlayReason);
192
193 if (TransformSensor)
194 {
195 TransformSensor->Destroy();
196 TransformSensor = nullptr;
197 }
198
200 {
201 InnerOverlapSensor->Destroy();
202 InnerOverlapSensor = nullptr;
203 }
204
205 ROSMessage.Reset();
206 DestroyTopic();
207}
void DestroyTopic()
Definition: PIDDrone.cpp:569

References DestroyTopic(), InnerOverlapSensor, ROSMessage, and AVehicle::TransformSensor.

◆ GenerateRoamingPoints()

TArray< FTransform > APIDDrone::GenerateRoamingPoints ( float  radius,
int32  roamingPoints 
)

Generates a roadming points array for the drone in radius.

Parameters
radiusradius of the roaming area
Returns
TArray<FVector>

Definition at line 491 of file PIDDrone.cpp.

492{
493 TArray<FTransform> generatedRoamingPoints;
494 generatedRoamingPoints.Reserve(roamingPoints);
495
496 FVector currentPosition = GetTransform().GetLocation();
497
498 FVector min = currentPosition - FVector(radius / 2, radius / 2, 0);
499 FVector max = currentPosition + FVector(radius / 2, radius / 2, 0);
500
501 for (int32 i = 0; i < roamingPoints; i++)
502 {
503 FTransform randomPoint;
504 randomPoint.SetLocation(FVector(FMath::RandRange(min.X, max.X), FMath::RandRange(min.Y, max.Y), 5000));
505
506 generatedRoamingPoints.Add(randomPoint);
507#if WITH_EDITOR
508 UE_LOG(LogTemp, Warning, TEXT("Waypoint %i: (%s)"), i, *randomPoint.GetLocation().ToString());
509#endif
510 }
511
512 return generatedRoamingPoints;
513}

Referenced by SetFlightpath().

◆ GetCurrentWaypointTarget()

FVector APIDDrone::GetCurrentWaypointTarget ( )
private

Definition at line 381 of file PIDDrone.cpp.

382{
383 return GetCurrentWaypointTarget_Transform().GetLocation();
384}
FTransform GetCurrentWaypointTarget_Transform()
Definition: PIDDrone.cpp:386

References GetCurrentWaypointTarget_Transform().

Referenced by SetFlightpath().

◆ GetCurrentWaypointTarget_Transform()

FTransform APIDDrone::GetCurrentWaypointTarget_Transform ( )
private

Definition at line 386 of file PIDDrone.cpp.

387{
389 {
390 return DroneSkeletalMesh->GetRelativeTransform();
391 }
392
394}
int32 passedWaypoints
Definition: PIDDrone.h:280

References DroneParameters, DroneSkeletalMesh, passedWaypoints, and FDroneParameters::Points.

Referenced by GetCurrentWaypointTarget().

◆ GetDroneAction()

EDroneAction APIDDrone::GetDroneAction ( ) const
inline

Get drone's action (roaming, manual)

Returns
Drone's action

Definition at line 68 of file PIDDrone.h.

69 {
71 }

◆ GetDroneDistanceToNextPoint()

float APIDDrone::GetDroneDistanceToNextPoint ( )
inline

Definition at line 95 of file PIDDrone.h.

96 {
97 // On manual flight, return a fixed distance to not affect autofly max speed
99 {
100 return 5000;
101 }
102
103 return distanceToNextPoint;
104 }
float distanceToNextPoint
Definition: PIDDrone.h:284

References Manual.

◆ GetDroneParameters()

FDroneParameters APIDDrone::GetDroneParameters ( ) const
inline

Definition at line 74 of file PIDDrone.h.

75 {
76 return DroneParameters;
77 }

Referenced by USimulatorJsonExporter::SetDroneParameters().

◆ GetDroneSkeletalMesh()

USkeletalMeshComponent * APIDDrone::GetDroneSkeletalMesh ( ) const
inline

Definition at line 189 of file PIDDrone.h.

190 {
191 return DroneSkeletalMesh;
192 }

◆ GetDroneSpeed()

float APIDDrone::GetDroneSpeed ( ) const
inline

Definition at line 107 of file PIDDrone.h.

108 {
110 {
111 return 0;
112 }
113
114 return FMath::Max(FMath::Abs(DroneSkeletalMesh->GetComponentVelocity().X), FMath::Abs(DroneSkeletalMesh->GetComponentVelocity().Y));
115 }

◆ GetInteractableWorldTransform_Implementation()

virtual FTransform APIDDrone::GetInteractableWorldTransform_Implementation ( ) const
inlineoverridevirtual

Reimplemented from AVehicle.

Definition at line 39 of file PIDDrone.h.

40 {
42 {
43 return DroneSkeletalMesh->GetComponentTransform();
44 }
45 else
46 {
47 return GetActorTransform();
48 }
49 }

◆ GetShowForwardArrow()

bool APIDDrone::GetShowForwardArrow ( ) const
inline

Definition at line 183 of file PIDDrone.h.

184 {
185 return ShowForwardArrow;
186 }
bool ShowForwardArrow
Definition: PIDDrone.h:276

◆ GetVehicleType()

virtual EVehicleTypes APIDDrone::GetVehicleType ( ) const
inlineoverridevirtual

Get type of the Vehicle

Returns
Vehicle's type

Reimplemented from AVehicle.

Definition at line 37 of file PIDDrone.h.

References Drone.

◆ GetYawRotationDifference()

float APIDDrone::GetYawRotationDifference ( USkeletalMeshComponent *  DroneSkeletalMesh,
UStaticMeshComponent *  DesiredLocation 
)

Get wanted waypoint target rotation.

Returns
float

Definition at line 552 of file PIDDrone.cpp.

553{
554 if (!DroneMesh || !DesiredLocation)
555 {
556 return 0.0f;
557 }
558
559 FVector ToTarget = DesiredLocation->GetComponentLocation() - DroneMesh->GetComponentLocation();
560 FRotator LookRotation = ToTarget.Rotation();
561
562 float CurrentYaw = DroneMesh->GetComponentRotation().Yaw;
563 float DesiredYaw = LookRotation.Yaw;
564
565 float DeltaYaw = FRotator::NormalizeAxis(DesiredYaw - CurrentYaw);
566 return DeltaYaw;
567}

◆ HandleDestroy()

void APIDDrone::HandleDestroy ( )
private

Definition at line 268 of file PIDDrone.cpp.

269{
270 // Should trigger EndPlay?
271
273 if (SimulationLevelManager)
274 {
275 AVehicle* controlledVehicle = SimulationLevelManager->GetManuallyControlledVehicle();
276
277 if (controlledVehicle == this)
278 {
279 SimulationLevelManager->CeaseManualControlOfVehicle();
280 }
281 }
282
283 passedWaypoints = 0;
284 Destroy();
285}
static ASimulationLevelManager * GetSimulationLevelManager(const UObject *WorldContextObject)

References ASimulationLevelManager::CeaseManualControlOfVehicle(), Destroy, ASimulationLevelManager::GetManuallyControlledVehicle(), UAgrarsenseStatics::GetSimulationLevelManager(), passedWaypoints, and World.

Referenced by SetFlightpath().

◆ IsRoaming()

bool APIDDrone::IsRoaming ( ) const
inlineprivate

Definition at line 230 of file PIDDrone.h.

References Roaming.

Referenced by SetFlightpath().

◆ MoveDroneToPosition()

void APIDDrone::MoveDroneToPosition ( const FTransform  Transform)

Override all drone roaming points and continue towards this position.

Parameters
Transformdrone move position

Definition at line 368 of file PIDDrone.cpp.

369{
370 if (DroneParameters.Points.Num() > 0)
371 {
372 DroneParameters.Points.Empty();
374 }
375 else
376 {
378 }
379}

References DroneParameters, FDroneParameters::Points, and Transform.

◆ ResetDroneEvent()

void APIDDrone::ResetDroneEvent ( )

◆ ROSBridgeStateChanged()

void APIDDrone::ROSBridgeStateChanged ( EROSState  ROSState)
overrideprotectedvirtual

Reimplemented from AVehicle.

Definition at line 515 of file PIDDrone.cpp.

516{
517 switch (ROSState)
518 {
520 CreateTopic();
521 break;
522
524 DestroyTopic();
525 break;
526 }
527}

References Connected, CreateTopic(), DestroyTopic(), and Disconnected.

◆ SetCurrentTransformToMovedFromGarageTransform()

virtual void APIDDrone::SetCurrentTransformToMovedFromGarageTransform ( )
inlineoverridevirtual

Reimplemented from AVehicle.

Definition at line 156 of file PIDDrone.h.

157 {
159 {
160 MovedFromGarageTransform = DroneSkeletalMesh->GetComponentTransform();
161 UE_LOG(LogTemp, Warning, TEXT("Moved from garage transform %s"), *MovedFromGarageTransform.ToString());
162
163 }
164 else
165 {
166 MovedFromGarageTransform = GetActorTransform();
167 UE_LOG(LogTemp, Warning, TEXT("ACTOR Moved from garage transform WHAT IS THIS: %s"), *MovedFromGarageTransform.ToString());
168
169 }
170 }
FTransform MovedFromGarageTransform
Definition: Vehicle.h:315

◆ SetDesiredLocationMesh()

void APIDDrone::SetDesiredLocationMesh ( UStaticMeshComponent *  meshcomponent)
inlineprivate

Definition at line 236 of file PIDDrone.h.

237 {
238 PositionMesh = meshcomponent;
239 }

◆ SetDrawDebugPoints()

void APIDDrone::SetDrawDebugPoints ( bool  show)
inline

Definition at line 177 of file PIDDrone.h.

178 {
179 drawDebugPoints = show;
180 }
bool drawDebugPoints
Definition: PIDDrone.h:278

Referenced by USimulatorJsonParser::ParseAndSetDroneParameters().

◆ SetDroneAction()

void APIDDrone::SetDroneAction ( EDroneAction  mode)
inline

Set drone's action (roaming, manual)

Definition at line 55 of file PIDDrone.h.

56 {
58 }

◆ SetDroneRotation()

void APIDDrone::SetDroneRotation ( USkeletalMeshComponent *  target,
FRotator  rotator 
)
private

Definition at line 406 of file PIDDrone.cpp.

407{
408 if (!target)
409 {
410 return;
411 }
412
413 FRotator currentRotation = target->GetRelativeRotation();
414 FRotator rotationDifference = rotator - currentRotation;
415
416 target->AddRelativeRotation(rotationDifference, false, nullptr, ETeleportType::TeleportPhysics);
417
418 // Prevent locking up when using interp
419 if (FMath::Abs(rotator.Pitch) < 0.001f)
420 {
421 rotator.Pitch = 0.0f;
422 }
423 if (FMath::Abs(rotator.Yaw) < 0.001f)
424 {
425 rotator.Yaw = 0.0f;
426 }
427 if (FMath::Abs(rotator.Roll) < 0.001f)
428 {
429 rotator.Roll = 0.0f;
430 }
431
432 // Corrected rotation
433 target->SetRelativeRotation(rotator, false, nullptr, ETeleportType::TeleportPhysics);
434}

◆ SetFlightpath()

void APIDDrone::SetFlightpath ( )

Called in tick function for drone roaming through points.

Definition at line 288 of file PIDDrone.cpp.

289{
290 // TODO: Check if in garage
291 // include drone rotation to point
292
293 // Don't try to fly if no waypoints
294 if (DroneParameters.Points.Num() == 0 && IsRoaming())
295 {
297 }
298
299 FVector waypoint = GetCurrentWaypointTarget();
300 FVector currentlocation = DroneSkeletalMesh->GetRelativeTransform().GetLocation();
301
302 if (PositionMesh)
303 {
304 // Doesn't work
305 PositionMesh->SetWorldLocation(waypoint);
306 }
307#if WITH_EDITOR
308 else
309 {
310 UE_LOG(LogTemp, Warning, TEXT("Desired location mesh not found"));
311 //DrawDebugLine(World, currentlocation, waypoint, FColor::Red, false, 0.0f, 0.0f, 5.0f);
312 }
313#endif
314 distanceToNextPoint = FVector2f::Distance(FVector2f(waypoint.X, waypoint.Y), FVector2f(currentlocation.X, currentlocation.Y));
315 if (distanceToNextPoint < 100)
316 {
317 waypointReached = true;
318 if (passedWaypoints != DroneParameters.Points.Num() - 1)
319 {
320#if WITH_EDITOR
321 UE_LOG(LogTemp, Warning, TEXT("Changing waypoint from %i to %i"), passedWaypoints, passedWaypoints + 1);
322#endif
323
325 }
326 else
327 {
329 {
331 passedWaypoints = 0;
332 }
333 else
334 {
336 {
339 OnDroneFinished.Broadcast(DroneParameters.Points.Last());
340 break;
343 passedWaypoints = 0;
344 break;
346 passedWaypoints = 0;
347 break;
349 Algo::Reverse(DroneParameters.Points);
350 passedWaypoints = 0;
351 break;
353 OnDroneFinished.Broadcast(DroneParameters.Points.Last());
354 if (!GetWorld()->GetTimerManager().IsTimerActive(DestroyHandle))
355 {
357 GetWorld()->GetTimerManager().SetTimer(DestroyHandle, this, &APIDDrone::HandleDestroy, 5.0f, false);
358 }
359 break;
360 default:
361 break;
362 }
363 }
364 }
365 }
366}
bool waypointReached
Definition: PIDDrone.h:272
FVector GetCurrentWaypointTarget()
Definition: PIDDrone.cpp:381
void HandleDestroy()
Definition: PIDDrone.cpp:268
bool IsRoaming() const
Definition: PIDDrone.h:230
FDroneFinished OnDroneFinished
Definition: PIDDrone.h:61
FTimerHandle DestroyHandle
Definition: PIDDrone.h:288
TArray< FTransform > GenerateRoamingPoints(float radius, int32 roamingPoints)
Generates a roadming points array for the drone in radius.
Definition: PIDDrone.cpp:491
EDroneEndAction DroneEndAction

References Destroy, DestroyHandle, distanceToNextPoint, FDroneParameters::DroneAction, FDroneParameters::DroneEndAction, DroneParameters, DroneSkeletalMesh, GenerateRandomNew, GenerateRoamingPoints(), GetCurrentWaypointTarget(), GoBackwards, HandleDestroy(), IsRoaming(), OnDroneFinished, passedWaypoints, FDroneParameters::Points, PositionMesh, RepeatFromBeginning, Roaming, Stationary, Stop, and waypointReached.

Referenced by AutoPilot().

◆ SetManualControl()

void APIDDrone::SetManualControl ( bool  value)
inline

Definition at line 130 of file PIDDrone.h.

131 {
132 manualControl = value;
133 }
bool manualControl
Definition: PIDDrone.h:274

◆ SetShowForwardArrow()

void APIDDrone::SetShowForwardArrow ( bool  Show)
inline

Definition at line 172 of file PIDDrone.h.

173 {
174 ShowForwardArrow = Show;
175 }

Referenced by USimulatorJsonParser::ParseAndSetDroneParameters().

◆ Tick()

void APIDDrone::Tick ( float  DeltaTime)
overrideprivatevirtual

Definition at line 209 of file PIDDrone.cpp.

210{
211 Super::Tick(DeltaTime);
212
213 if (!IsVehicleInGarage())
214 {
215 AutoPilot(DeltaTime);
217
218#if WITH_EDITOR
219 if (drawDebugPoints)
220 {
222 }
223#endif
224
225 }
226}
void AutoPilot(const float DeltaTime)
Definition: PIDDrone.cpp:228
void UpdateGroundHeight()
Definition: PIDDrone.cpp:436
void DrawDebugPoints()
Definition: PIDDrone.cpp:238
bool IsVehicleInGarage() const
Definition: Vehicle.h:133

References AutoPilot(), DrawDebugPoints(), drawDebugPoints, AVehicle::IsVehicleInGarage(), and UpdateGroundHeight().

◆ UpdateGroundHeight()

void APIDDrone::UpdateGroundHeight ( )
private

Definition at line 436 of file PIDDrone.cpp.

437{
438 if (!DroneSkeletalMesh || !ROSTopic || !ROSMessage.IsValid())
439 {
440 return;
441 }
442
443 FVector Start = DroneSkeletalMesh->GetComponentLocation();
444 FVector End = Start - FVector(0, 0, 10000.0f);
445
446 FCollisionQueryParams TraceParams = FCollisionQueryParams(FName(TEXT("UpdateGroundHeight")), true, this);
447 TraceParams.bReturnPhysicalMaterial = false;
448 TraceParams.bTraceComplex = false;
449
450 FHitResult HitResult;
451
452#ifdef ParallelLineTraceSingleByChannel_EXISTS
453 // Defined and implemented in our AGRARSENSE Unreal Engine fork
454 // This LineTrace method doesn't block the physics scene which improves linetrace performance.
455 World->ParallelLineTraceSingleByChannel(
456 HitResult,
457 Start,
458 End,
459 ECC_Visibility,
460 TraceParams,
461 FCollisionResponseParams::DefaultResponseParam);
462#else
463 // If not using our fork of the engine, use default LineTrace method.
464 World->LineTraceSingleByChannel(
465 HitResult,
466 Start,
467 End,
468 ECC_Visibility,
469 TraceParams,
470 FCollisionResponseParams::DefaultResponseParam);
471#endif
472
473 if (HitResult.IsValidBlockingHit())
474 {
475 float Height = (Start.Z - HitResult.ImpactPoint.Z) / 100.0f;
476 float HeightRounded = FMath::RoundToFloat(Height * 1000.0f) / 1000.0f;
477
478 if (!FMath::IsNearlyEqual(DroneHeightFromGround, HeightRounded, 0.005f))
479 {
480 DroneHeightFromGround = HeightRounded;
481
483 ROSTopic->Publish(ROSMessage);
484
485 //FString HitActorName = HitResult.GetActor() ? HitResult.GetActor()->GetName() : TEXT("None");
486 //UE_LOG(LogTemp, Log, TEXT("Drone is %f meters above ground. Hit object: %s"), DroneHeightFromGround, *HitActorName);
487 }
488 }
489}
float DroneHeightFromGround
Definition: PIDDrone.h:282

References DroneHeightFromGround, DroneSkeletalMesh, ROSMessage, ROSTopic, and World.

Referenced by Tick().

Member Data Documentation

◆ DestroyHandle

FTimerHandle APIDDrone::DestroyHandle
private

Definition at line 288 of file PIDDrone.h.

Referenced by SetFlightpath().

◆ distanceToNextPoint

float APIDDrone::distanceToNextPoint = 0.0f
private

Definition at line 284 of file PIDDrone.h.

Referenced by SetFlightpath().

◆ drawDebugPoints

bool APIDDrone::drawDebugPoints = false
private

Definition at line 278 of file PIDDrone.h.

Referenced by Tick().

◆ DroneHeightFromGround

float APIDDrone::DroneHeightFromGround = 0.0f
private

Definition at line 282 of file PIDDrone.h.

Referenced by UpdateGroundHeight().

◆ DroneParameters

FDroneParameters APIDDrone::DroneParameters
private

◆ dronePath

TArray<FTransform> APIDDrone::dronePath
private

Definition at line 286 of file PIDDrone.h.

Referenced by DrawDebugPoints().

◆ DroneSkeletalMesh

USkeletalMeshComponent* APIDDrone::DroneSkeletalMesh = nullptr
private

◆ flightmode

EFlightMode APIDDrone::flightmode = EFlightMode::Roaming
private

Definition at line 250 of file PIDDrone.h.

◆ InnerOverlapSensor

AOverlapSensor* APIDDrone::InnerOverlapSensor = nullptr
private

Definition at line 264 of file PIDDrone.h.

Referenced by ChangeDroneParameters(), and EndPlay().

◆ manualControl

bool APIDDrone::manualControl = false
private

Definition at line 274 of file PIDDrone.h.

◆ OnDroneFinished

FDroneFinished APIDDrone::OnDroneFinished

Definition at line 61 of file PIDDrone.h.

Referenced by SetFlightpath().

◆ passedWaypoints

int32 APIDDrone::passedWaypoints = 0
private

Definition at line 280 of file PIDDrone.h.

Referenced by GetCurrentWaypointTarget_Transform(), HandleDestroy(), and SetFlightpath().

◆ PositionMesh

UStaticMeshComponent* APIDDrone::PositionMesh = nullptr
private

Definition at line 261 of file PIDDrone.h.

Referenced by BeginPlay(), and SetFlightpath().

◆ ROSMessage

TSharedPtr<ROSMessages::std_msgs::Float32> APIDDrone::ROSMessage
protected

Definition at line 201 of file PIDDrone.h.

Referenced by BeginPlay(), EndPlay(), and UpdateGroundHeight().

◆ ROSTopic

UTopic* APIDDrone::ROSTopic = nullptr
protected

Definition at line 199 of file PIDDrone.h.

Referenced by CreateTopic(), DestroyTopic(), and UpdateGroundHeight().

◆ ShowForwardArrow

bool APIDDrone::ShowForwardArrow = false
private

Definition at line 276 of file PIDDrone.h.

◆ StartingPosition

FVector APIDDrone::StartingPosition
private

Definition at line 255 of file PIDDrone.h.

Referenced by BeginPlay().

◆ waypointReached

bool APIDDrone::waypointReached = false
private

Definition at line 272 of file PIDDrone.h.

Referenced by SetFlightpath().

◆ WayPoints

TArray<FVector> APIDDrone::WayPoints
private
Initial value:
= {
{3790, 8050, 5000},
{11779.536955,6566.541435,5000}
}

Definition at line 267 of file PIDDrone.h.

Referenced by AssignRoamingPoints().

◆ World

UWorld* APIDDrone::World = nullptr
private

Definition at line 253 of file PIDDrone.h.

Referenced by BeginPlay(), DrawDebugPoints(), HandleDestroy(), and UpdateGroundHeight().


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