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 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 28 of file PIDDrone.cpp.

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

References AVehicle::InteractableName.

Member Function Documentation

◆ AddWayPoint()

void APIDDrone::AddWayPoint ( FVector  Waypoint)
inline

Definition at line 83 of file PIDDrone.h.

84 {
85 FTransform transform;
86 transform.SetLocation(Waypoint);
87
88 DroneParameters.Points.Add(transform);
89 }
FDroneParameters DroneParameters
Definition: PIDDrone.h:244
TArray< FTransform > Points

References FDroneParameters::Points.

◆ AssignRoamingPoints()

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

Definition at line 378 of file PIDDrone.cpp.

379{
381
382 for (const FTransform& point : Points)
383 {
384 WayPoints.Add(point.GetLocation());
385 }
386}
TArray< FVector > WayPoints
Definition: PIDDrone.h:264
void ClearWaypoints()
Definition: PIDDrone.h:115

References ClearWaypoints(), and WayPoints.

◆ AutoPilot()

void APIDDrone::AutoPilot ( const float  DeltaTime)
private

Definition at line 210 of file PIDDrone.cpp.

211{
213 {
214 return;
215 }
216
218}
void SetFlightpath()
Called in tick function for drone roaming through points.
Definition: PIDDrone.cpp:270
EDroneAction DroneAction

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

Referenced by Tick().

◆ BeginPlay()

void APIDDrone::BeginPlay ( )
overrideprivatevirtual

Reimplemented from AVehicle.

Definition at line 95 of file PIDDrone.cpp.

96{
97 Super::BeginPlay();
98
99 World = GetWorld();
100
101 ROSMessage.Reset();
102 ROSMessage = MakeShared<ROSMessages::std_msgs::Float32>();
103
104 CreateTopic();
105
106 // These should be setup in BP_Drone_PID blueprint.
107 DroneSkeletalMesh = Cast<USkeletalMeshComponent>(GetComponentByClass(USkeletalMeshComponent::StaticClass()));
108 PositionMesh = Cast<UStaticMeshComponent>(GetComponentByClass(UStaticMeshComponent::StaticClass()));
109
110 StartingPosition = GetActorLocation();
111 FTransform ActorTransform = GetActorTransform();
112
114 {
115 // Create Transform sensor for forwarder and harvester
116
117 FString VehicleTransformSensorID = ActorID + "/transform";
118
119 FSensorSpawnParameters TransformSensorSpawnParams;
120 TransformSensorSpawnParams.Transform = GetActorTransform();
121 TransformSensorSpawnParams.SensorIdentifier = VehicleTransformSensorID;
122 TransformSensorSpawnParams.SensorName = "transform";
123 TransformSensorSpawnParams.SimulateSensor = true;
124 TransformSensorSpawnParams.Parent = this;
125
126 FTransformSensorParameters TransformSensorParams;
127 TransformSensorParams.SaveTransformDataToDisk = true;
128 TransformSensorParams.OwningActor = this;
129 TransformSensorParams.UseOwningActorTransform = false;
130 TransformSensorParams.PrimitiveComponent = Cast<UPrimitiveComponent>(DroneSkeletalMesh);
131
132 TransformSensor = USensorFactory::SpawnTransformSensor(TransformSensorSpawnParams, TransformSensorParams);
133 }
134
135 if (!OverlapSensor)
136 {
137 // Create OverlapSensor
138
139 FString OverlapSensorID = ActorID + "/overlap";
140
141 FSensorSpawnParameters OverlapSensorSpawnParams;
142 OverlapSensorSpawnParams.Transform = GetActorTransform();
143 OverlapSensorSpawnParams.SensorIdentifier = OverlapSensorID;
144 OverlapSensorSpawnParams.SensorName = "overlap";
145 OverlapSensorSpawnParams.SimulateSensor = true;
146 OverlapSensorSpawnParams.Parent = this;
147
148 FOverlapSensorParameters OverlapSensorParams;
149 OverlapSensorParams.OwningActor = this;
150 OverlapSensorParams.Size = FVector(25.0f, 25.0f, 25.0f);
151 OverlapSensorParams.RelativePosition = FVector(0.0f, 0.0f, 0.0f);
152
153 OverlapSensor = USensorFactory::SpawnOverlapSensor(OverlapSensorSpawnParams, OverlapSensorParams);
154
155 if (OverlapSensor)
156 {
157 OverlapSensor->AttachToComponent(DroneSkeletalMesh, FAttachmentTransformRules::KeepRelativeTransform);
158 }
159 }
160
162 {
163 // Attach rain/snowfall niagara component to drone skeletal mesh.
164 NiagaraComponent->AttachToComponent(DroneSkeletalMesh, FAttachmentTransformRules::KeepRelativeTransform);
165 }
166
167 // Apply default parameters
169}
TSharedPtr< ROSMessages::std_msgs::Float32 > ROSMessage
Definition: PIDDrone.h:198
void CreateTopic()
Definition: PIDDrone.cpp:511
UWorld * World
Definition: PIDDrone.h:250
FVector StartingPosition
Definition: PIDDrone.h:252
UStaticMeshComponent * PositionMesh
Definition: PIDDrone.h:258
USkeletalMeshComponent * DroneSkeletalMesh
Definition: PIDDrone.h:255
void ChangeDroneParameters(const FDroneParameters &newParameters)
Definition: PIDDrone.cpp:34
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, 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 34 of file PIDDrone.cpp.

35{
36//#if WITH_EDITOR
37// UE_LOG(LogTemp, Warning, TEXT("Parameters Changed!"));
38//#endif
39
40 DroneParameters = newParameters;
41
43 {
44 FString OverlapSensorID = ActorID + "/inner_overlap";
45
46 FSensorSpawnParameters SpawnParams;
47 SpawnParams.Transform = GetActorTransform();
48 SpawnParams.SensorIdentifier = OverlapSensorID;
49 SpawnParams.SensorName = "overlap";
50 SpawnParams.SimulateSensor = true;
51 SpawnParams.Parent = this;
52
53 FOverlapSensorParameters SensorParams;
54 SensorParams.OwningActor = this;
55 SensorParams.AllChannels = true;
57 SensorParams.RelativePosition = FVector(0.0f, 0.0f, 0.0f);
58
59 InnerOverlapSensor = USensorFactory::SpawnOverlapSensor(SpawnParams, SensorParams);
60
62 {
63 InnerOverlapSensor->AttachToComponent(DroneSkeletalMesh, FAttachmentTransformRules::KeepRelativeTransform);
64 }
65 }
67 {
68 InnerOverlapSensor->Destroy();
69 InnerOverlapSensor = nullptr;
70 }
71
73 {
74 DroneSkeletalMesh->SetCollisionProfileName(TEXT("DroneNoCollision"));
75 }
76
77 if (OverlapSensor)
78 {
80
81 const float BoundsSizeMeters = DroneParameters.OverlapRadiusMeters;
82 OverlapSensor->SetOverlapBounds(FVector(BoundsSizeMeters, BoundsSizeMeters, BoundsSizeMeters));
83
84 }
85
87 {
89
90 const float BoundsSizeMeters = DroneParameters.InnerOverlapRadiusMeters;
91 InnerOverlapSensor->SetOverlapBounds(FVector(BoundsSizeMeters, BoundsSizeMeters, BoundsSizeMeters));
92 }
93}
void SetVisualizeOverlapArea(bool Visualize)
void SetOverlapBounds(const FVector &NewSize)
AOverlapSensor * InnerOverlapSensor
Definition: PIDDrone.h:261
float InnerOverlapRadiusMeters

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

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

◆ ClearWaypoints()

void APIDDrone::ClearWaypoints ( )
inline

Definition at line 115 of file PIDDrone.h.

116 {
117 DroneParameters.Points.Empty();
118 }

Referenced by AssignRoamingPoints().

◆ CreateTopic()

void APIDDrone::CreateTopic ( )
private

Definition at line 511 of file PIDDrone.cpp.

512{
513 if (ROSTopic)
514 {
515 return;
516 }
517
518 UROSIntegrationGameInstance* ROSInstance = UAgrarsenseStatics::GetROSGameInstance(GetWorld());
519 if (ROSInstance && ROSInstance->IsROSConnected())
520 {
521 ROSTopic = NewObject<UTopic>(UTopic::StaticClass());
522 if (ROSTopic)
523 {
524
525 FString TopicName = FString::Printf(TEXT("/agrarsense/out/vehicles/%s/height"), *GetActorID_Implementation());
526 //UE_LOG(LogTemp, Warning, TEXT("TopicName is %s"), *TopicName);
527
528 ROSTopic->Init(ROSInstance->ROSIntegrationCore, TopicName, "std_msgs/Float32");
529 ROSTopic->Advertise();
530 }
531 }
532}
UTopic * ROSTopic
Definition: PIDDrone.h:196
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 551 of file PIDDrone.cpp.

552{
553 if (ROSTopic)
554 {
555 ROSTopic->Unadvertise();
556 ROSTopic->Unsubscribe();
557 ROSTopic->MarkAsDisconnected();
558 ROSTopic->ConditionalBeginDestroy();
559 ROSTopic = nullptr;
560 }
561}

References ROSTopic.

Referenced by EndPlay(), and ROSBridgeStateChanged().

◆ DrawDebugPoints()

void APIDDrone::DrawDebugPoints ( )
private

Definition at line 220 of file PIDDrone.cpp.

221{
222 TArray<FTransform> dronePoints = DroneParameters.Points;
223
224 dronePath.Add(DroneSkeletalMesh->GetComponentTransform());
225
226 for (int32 i = 0; i < dronePoints.Num(); i++)
227 {
228 if (World)
229 {
230 //UE_LOG(LogTemp, Warning, TEXT("Drone point %d: %s"), i, *dronePoints[i].GetLocation().ToString());
231 DrawDebugSphere(World, dronePoints[i].GetLocation(), 5.0f, 25, FColor::Red, false);
232 if (i < dronePoints.Num() - 1)
233 {
234 FVector nextPointLocation = dronePoints[i + 1].GetLocation();
235 DrawDebugLine(World, dronePoints[i].GetLocation(), nextPointLocation, FColor::Blue, false, 0.0f, 0, 5.0f);
236 }
237 }
238 }
239
240 for (int32 i = 0; i < dronePath.Num(); i++)
241 {
242 if (i < dronePath.Num() - 1)
243 {
244 FVector nextPointLocation = dronePath[i + 1].GetLocation();
245 DrawDebugLine(World, dronePath[i].GetLocation(), nextPointLocation, FColor::Green, false, 0.0f, 0, 5.0f);
246 }
247 }
248}
TArray< FTransform > dronePath
Definition: PIDDrone.h:283

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 171 of file PIDDrone.cpp.

172{
173 Super::EndPlay(EndPlayReason);
174
175 if (TransformSensor)
176 {
177 TransformSensor->Destroy();
178 TransformSensor = nullptr;
179 }
180
182 {
183 InnerOverlapSensor->Destroy();
184 InnerOverlapSensor = nullptr;
185 }
186
187 ROSMessage.Reset();
188 DestroyTopic();
189}
void DestroyTopic()
Definition: PIDDrone.cpp:551

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 473 of file PIDDrone.cpp.

474{
475 TArray<FTransform> generatedRoamingPoints;
476 generatedRoamingPoints.Reserve(roamingPoints);
477
478 FVector currentPosition = GetTransform().GetLocation();
479
480 FVector min = currentPosition - FVector(radius / 2, radius / 2, 0);
481 FVector max = currentPosition + FVector(radius / 2, radius / 2, 0);
482
483 for (int32 i = 0; i < roamingPoints; i++)
484 {
485 FTransform randomPoint;
486 randomPoint.SetLocation(FVector(FMath::RandRange(min.X, max.X), FMath::RandRange(min.Y, max.Y), 5000));
487
488 generatedRoamingPoints.Add(randomPoint);
489#if WITH_EDITOR
490 UE_LOG(LogTemp, Warning, TEXT("Waypoint %i: (%s)"), i, *randomPoint.GetLocation().ToString());
491#endif
492 }
493
494 return generatedRoamingPoints;
495}

Referenced by SetFlightpath().

◆ GetCurrentWaypointTarget()

FVector APIDDrone::GetCurrentWaypointTarget ( )
private

Definition at line 363 of file PIDDrone.cpp.

364{
365 return GetCurrentWaypointTarget_Transform().GetLocation();
366}
FTransform GetCurrentWaypointTarget_Transform()
Definition: PIDDrone.cpp:368

References GetCurrentWaypointTarget_Transform().

Referenced by SetFlightpath().

◆ GetCurrentWaypointTarget_Transform()

FTransform APIDDrone::GetCurrentWaypointTarget_Transform ( )
private

Definition at line 368 of file PIDDrone.cpp.

369{
371 {
372 return DroneSkeletalMesh->GetRelativeTransform();
373 }
374
376}
int32 passedWaypoints
Definition: PIDDrone.h:277

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 92 of file PIDDrone.h.

93 {
94 // On manual flight, return a fixed distance to not affect autofly max speed
96 {
97 return 5000;
98 }
99
100 return distanceToNextPoint;
101 }
float distanceToNextPoint
Definition: PIDDrone.h:281

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 186 of file PIDDrone.h.

187 {
188 return DroneSkeletalMesh;
189 }

◆ GetDroneSpeed()

float APIDDrone::GetDroneSpeed ( ) const
inline

Definition at line 104 of file PIDDrone.h.

105 {
107 {
108 return 0;
109 }
110
111 return FMath::Max(FMath::Abs(DroneSkeletalMesh->GetComponentVelocity().X), FMath::Abs(DroneSkeletalMesh->GetComponentVelocity().Y));
112 }

◆ 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 180 of file PIDDrone.h.

181 {
182 return ShowForwardArrow;
183 }
bool ShowForwardArrow
Definition: PIDDrone.h:273

◆ 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 534 of file PIDDrone.cpp.

535{
536 if (!DroneMesh || !DesiredLocation)
537 {
538 return 0.0f;
539 }
540
541 FVector ToTarget = DesiredLocation->GetComponentLocation() - DroneMesh->GetComponentLocation();
542 FRotator LookRotation = ToTarget.Rotation();
543
544 float CurrentYaw = DroneMesh->GetComponentRotation().Yaw;
545 float DesiredYaw = LookRotation.Yaw;
546
547 float DeltaYaw = FRotator::NormalizeAxis(DesiredYaw - CurrentYaw);
548 return DeltaYaw;
549}

◆ HandleDestroy()

void APIDDrone::HandleDestroy ( )
private

Definition at line 250 of file PIDDrone.cpp.

251{
252 // Should trigger EndPlay?
253
255 if (SimulationLevelManager)
256 {
257 AVehicle* controlledVehicle = SimulationLevelManager->GetManuallyControlledVehicle();
258
259 if (controlledVehicle == this)
260 {
261 SimulationLevelManager->CeaseManualControlOfVehicle();
262 }
263 }
264
265 passedWaypoints = 0;
266 Destroy();
267}
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 227 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 350 of file PIDDrone.cpp.

351{
352 if (DroneParameters.Points.Num() > 0)
353 {
354 DroneParameters.Points.Empty();
356 }
357 else
358 {
360 }
361}

References DroneParameters, FDroneParameters::Points, and Transform.

◆ ROSBridgeStateChanged()

void APIDDrone::ROSBridgeStateChanged ( EROSState  ROSState)
overrideprotectedvirtual

Reimplemented from AVehicle.

Definition at line 497 of file PIDDrone.cpp.

498{
499 switch (ROSState)
500 {
502 CreateTopic();
503 break;
504
506 DestroyTopic();
507 break;
508 }
509}

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

◆ SetCurrentTransformToMovedFromGarageTransform()

virtual void APIDDrone::SetCurrentTransformToMovedFromGarageTransform ( )
inlineoverridevirtual

Reimplemented from AVehicle.

Definition at line 153 of file PIDDrone.h.

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

◆ SetDesiredLocationMesh()

void APIDDrone::SetDesiredLocationMesh ( UStaticMeshComponent *  meshcomponent)
inlineprivate

Definition at line 233 of file PIDDrone.h.

234 {
235 PositionMesh = meshcomponent;
236 }

◆ SetDrawDebugPoints()

void APIDDrone::SetDrawDebugPoints ( bool  show)
inline

Definition at line 174 of file PIDDrone.h.

175 {
176 drawDebugPoints = show;
177 }
bool drawDebugPoints
Definition: PIDDrone.h:275

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 388 of file PIDDrone.cpp.

389{
390 if (!target)
391 {
392 return;
393 }
394
395 FRotator currentRotation = target->GetRelativeRotation();
396 FRotator rotationDifference = rotator - currentRotation;
397
398 target->AddRelativeRotation(rotationDifference, false, nullptr, ETeleportType::TeleportPhysics);
399
400 // Prevent locking up when using interp
401 if (FMath::Abs(rotator.Pitch) < 0.001f)
402 {
403 rotator.Pitch = 0.0f;
404 }
405 if (FMath::Abs(rotator.Yaw) < 0.001f)
406 {
407 rotator.Yaw = 0.0f;
408 }
409 if (FMath::Abs(rotator.Roll) < 0.001f)
410 {
411 rotator.Roll = 0.0f;
412 }
413
414 // Corrected rotation
415 target->SetRelativeRotation(rotator, false, nullptr, ETeleportType::TeleportPhysics);
416}

◆ SetFlightpath()

void APIDDrone::SetFlightpath ( )

Called in tick function for drone roaming through points.

Definition at line 270 of file PIDDrone.cpp.

271{
272 // TODO: Check if in garage
273 // include drone rotation to point
274
275 // Don't try to fly if no waypoints
276 if (DroneParameters.Points.Num() == 0 && IsRoaming())
277 {
279 }
280
281 FVector waypoint = GetCurrentWaypointTarget();
282 FVector currentlocation = DroneSkeletalMesh->GetRelativeTransform().GetLocation();
283
284 if (PositionMesh)
285 {
286 // Doesn't work
287 PositionMesh->SetWorldLocation(waypoint);
288 }
289#if WITH_EDITOR
290 else
291 {
292 UE_LOG(LogTemp, Warning, TEXT("Desired location mesh not found"));
293 //DrawDebugLine(World, currentlocation, waypoint, FColor::Red, false, 0.0f, 0.0f, 5.0f);
294 }
295#endif
296 distanceToNextPoint = FVector2f::Distance(FVector2f(waypoint.X, waypoint.Y), FVector2f(currentlocation.X, currentlocation.Y));
297 if (distanceToNextPoint < 100)
298 {
299 waypointReached = true;
300 if (passedWaypoints != DroneParameters.Points.Num() - 1)
301 {
302#if WITH_EDITOR
303 UE_LOG(LogTemp, Warning, TEXT("Changing waypoint from %i to %i"), passedWaypoints, passedWaypoints + 1);
304#endif
305
307 }
308 else
309 {
311 {
313 passedWaypoints = 0;
314 }
315 else
316 {
318 {
321 OnDroneFinished.Broadcast(DroneParameters.Points.Last());
322 break;
325 passedWaypoints = 0;
326 break;
328 passedWaypoints = 0;
329 break;
331 Algo::Reverse(DroneParameters.Points);
332 passedWaypoints = 0;
333 break;
335 OnDroneFinished.Broadcast(DroneParameters.Points.Last());
336 if (!GetWorld()->GetTimerManager().IsTimerActive(DestroyHandle))
337 {
339 GetWorld()->GetTimerManager().SetTimer(DestroyHandle, this, &APIDDrone::HandleDestroy, 5.0f, false);
340 }
341 break;
342 default:
343 break;
344 }
345 }
346 }
347 }
348}
bool waypointReached
Definition: PIDDrone.h:269
FVector GetCurrentWaypointTarget()
Definition: PIDDrone.cpp:363
void HandleDestroy()
Definition: PIDDrone.cpp:250
bool IsRoaming() const
Definition: PIDDrone.h:227
FDroneFinished OnDroneFinished
Definition: PIDDrone.h:61
FTimerHandle DestroyHandle
Definition: PIDDrone.h:285
TArray< FTransform > GenerateRoamingPoints(float radius, int32 roamingPoints)
Generates a roadming points array for the drone in radius.
Definition: PIDDrone.cpp:473
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 127 of file PIDDrone.h.

128 {
129 manualControl = value;
130 }
bool manualControl
Definition: PIDDrone.h:271

◆ SetShowForwardArrow()

void APIDDrone::SetShowForwardArrow ( bool  Show)
inline

Definition at line 169 of file PIDDrone.h.

170 {
171 ShowForwardArrow = Show;
172 }

Referenced by USimulatorJsonParser::ParseAndSetDroneParameters().

◆ Tick()

void APIDDrone::Tick ( float  DeltaTime)
overrideprivatevirtual

Definition at line 191 of file PIDDrone.cpp.

192{
193 Super::Tick(DeltaTime);
194
195 if (!IsVehicleInGarage())
196 {
197 AutoPilot(DeltaTime);
199
200#if WITH_EDITOR
201 if (drawDebugPoints)
202 {
204 }
205#endif
206
207 }
208}
void AutoPilot(const float DeltaTime)
Definition: PIDDrone.cpp:210
void UpdateGroundHeight()
Definition: PIDDrone.cpp:418
void DrawDebugPoints()
Definition: PIDDrone.cpp:220
bool IsVehicleInGarage() const
Definition: Vehicle.h:133

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

◆ UpdateGroundHeight()

void APIDDrone::UpdateGroundHeight ( )
private

Definition at line 418 of file PIDDrone.cpp.

419{
420 if (!DroneSkeletalMesh || !ROSTopic || !ROSMessage.IsValid())
421 {
422 return;
423 }
424
425 FVector Start = DroneSkeletalMesh->GetComponentLocation();
426 FVector End = Start - FVector(0, 0, 10000.0f);
427
428 FCollisionQueryParams TraceParams = FCollisionQueryParams(FName(TEXT("UpdateGroundHeight")), true, this);
429 TraceParams.bReturnPhysicalMaterial = false;
430 TraceParams.bTraceComplex = false;
431
432 FHitResult HitResult;
433
434#ifdef ParallelLineTraceSingleByChannel_EXISTS
435 // Defined and implemented in our AGRARSENSE Unreal Engine fork
436 // This LineTrace method doesn't block the physics scene which improves linetrace performance.
437 World->ParallelLineTraceSingleByChannel(
438 HitResult,
439 Start,
440 End,
441 ECC_Visibility,
442 TraceParams,
443 FCollisionResponseParams::DefaultResponseParam);
444#else
445 // If not using our fork of the engine, use default LineTrace method.
446 World->LineTraceSingleByChannel(
447 HitResult,
448 Start,
449 End,
450 ECC_Visibility,
451 TraceParams,
452 FCollisionResponseParams::DefaultResponseParam);
453#endif
454
455 if (HitResult.IsValidBlockingHit())
456 {
457 float Height = (Start.Z - HitResult.ImpactPoint.Z) / 100.0f;
458 float HeightRounded = FMath::RoundToFloat(Height * 1000.0f) / 1000.0f;
459
460 if (!FMath::IsNearlyEqual(DroneHeightFromGround, HeightRounded, 0.005f))
461 {
462 DroneHeightFromGround = HeightRounded;
463
465 ROSTopic->Publish(ROSMessage);
466
467 //FString HitActorName = HitResult.GetActor() ? HitResult.GetActor()->GetName() : TEXT("None");
468 //UE_LOG(LogTemp, Log, TEXT("Drone is %f meters above ground. Hit object: %s"), DroneHeightFromGround, *HitActorName);
469 }
470 }
471}
float DroneHeightFromGround
Definition: PIDDrone.h:279

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

Referenced by Tick().

Member Data Documentation

◆ DestroyHandle

FTimerHandle APIDDrone::DestroyHandle
private

Definition at line 285 of file PIDDrone.h.

Referenced by SetFlightpath().

◆ distanceToNextPoint

float APIDDrone::distanceToNextPoint = 0.0f
private

Definition at line 281 of file PIDDrone.h.

Referenced by SetFlightpath().

◆ drawDebugPoints

bool APIDDrone::drawDebugPoints = false
private

Definition at line 275 of file PIDDrone.h.

Referenced by Tick().

◆ DroneHeightFromGround

float APIDDrone::DroneHeightFromGround = 0.0f
private

Definition at line 279 of file PIDDrone.h.

Referenced by UpdateGroundHeight().

◆ DroneParameters

FDroneParameters APIDDrone::DroneParameters
private

◆ dronePath

TArray<FTransform> APIDDrone::dronePath
private

Definition at line 283 of file PIDDrone.h.

Referenced by DrawDebugPoints().

◆ DroneSkeletalMesh

USkeletalMeshComponent* APIDDrone::DroneSkeletalMesh = nullptr
private

◆ flightmode

EFlightMode APIDDrone::flightmode = EFlightMode::Roaming
private

Definition at line 247 of file PIDDrone.h.

◆ InnerOverlapSensor

AOverlapSensor* APIDDrone::InnerOverlapSensor = nullptr
private

Definition at line 261 of file PIDDrone.h.

Referenced by ChangeDroneParameters(), and EndPlay().

◆ manualControl

bool APIDDrone::manualControl = false
private

Definition at line 271 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 277 of file PIDDrone.h.

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

◆ PositionMesh

UStaticMeshComponent* APIDDrone::PositionMesh = nullptr
private

Definition at line 258 of file PIDDrone.h.

Referenced by BeginPlay(), and SetFlightpath().

◆ ROSMessage

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

Definition at line 198 of file PIDDrone.h.

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

◆ ROSTopic

UTopic* APIDDrone::ROSTopic = nullptr
protected

Definition at line 196 of file PIDDrone.h.

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

◆ ShowForwardArrow

bool APIDDrone::ShowForwardArrow = false
private

Definition at line 273 of file PIDDrone.h.

◆ StartingPosition

FVector APIDDrone::StartingPosition
private

Definition at line 252 of file PIDDrone.h.

Referenced by BeginPlay().

◆ waypointReached

bool APIDDrone::waypointReached = false
private

Definition at line 269 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 264 of file PIDDrone.h.

Referenced by AssignRoamingPoints().

◆ World

UWorld* APIDDrone::World = nullptr
private

Definition at line 250 of file PIDDrone.h.

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


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