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

398{
400
401 for (const FTransform& point : Points)
402 {
403 WayPoints.Add(point.GetLocation());
404 }
405}
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:545
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 545 of file PIDDrone.cpp.

546{
547 if (ROSTopic)
548 {
549 return;
550 }
551
552 UROSIntegrationGameInstance* ROSInstance = UAgrarsenseStatics::GetROSGameInstance(GetWorld());
553 if (ROSInstance && ROSInstance->IsROSConnected())
554 {
555 ROSTopic = NewObject<UTopic>(UTopic::StaticClass());
556 if (ROSTopic)
557 {
558
559 FString TopicName = FString::Printf(TEXT("/agrarsense/out/vehicles/%s/height"), *GetActorID_Implementation());
560 //UE_LOG(LogTemp, Warning, TEXT("TopicName is %s"), *TopicName);
561
562 ROSTopic->Init(ROSInstance->ROSIntegrationCore, TopicName, "std_msgs/Float32");
563 ROSTopic->Advertise();
564 }
565 }
566}
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 585 of file PIDDrone.cpp.

586{
587 if (ROSTopic)
588 {
589 ROSTopic->Unadvertise();
590 ROSTopic->Unsubscribe();
591 ROSTopic->MarkAsDisconnected();
592 ROSTopic->ConditionalBeginDestroy();
593 ROSTopic = nullptr;
594 }
595}

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:585

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

508{
509 TArray<FTransform> generatedRoamingPoints;
510 generatedRoamingPoints.Reserve(roamingPoints);
511
512 FVector currentPosition = GetTransform().GetLocation();
513
514 FVector min = currentPosition - FVector(radius / 2, radius / 2, 0);
515 FVector max = currentPosition + FVector(radius / 2, radius / 2, 0);
516
517 for (int32 i = 0; i < roamingPoints; i++)
518 {
519 FTransform randomPoint;
520 randomPoint.SetLocation(FVector(FMath::RandRange(min.X, max.X), FMath::RandRange(min.Y, max.Y), 5000));
521
522 generatedRoamingPoints.Add(randomPoint);
523#if WITH_EDITOR
524 UE_LOG(LogTemp, Warning, TEXT("Waypoint %i: (%s)"), i, *randomPoint.GetLocation().ToString());
525#endif
526 }
527
528 return generatedRoamingPoints;
529}

Referenced by SetFlightpath().

◆ GetCurrentWaypointTarget()

FVector APIDDrone::GetCurrentWaypointTarget ( )
private

Definition at line 382 of file PIDDrone.cpp.

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

References GetCurrentWaypointTarget_Transform().

Referenced by SetFlightpath().

◆ GetCurrentWaypointTarget_Transform()

FTransform APIDDrone::GetCurrentWaypointTarget_Transform ( )
private

Definition at line 387 of file PIDDrone.cpp.

388{
390 {
391 return DroneSkeletalMesh->GetRelativeTransform();
392 }
393
395}
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 568 of file PIDDrone.cpp.

569{
570 if (!DroneMesh || !DesiredLocation)
571 {
572 return 0.0f;
573 }
574
575 FVector ToTarget = DesiredLocation->GetComponentLocation() - DroneMesh->GetComponentLocation();
576 FRotator LookRotation = ToTarget.Rotation();
577
578 float CurrentYaw = DroneMesh->GetComponentRotation().Yaw;
579 float DesiredYaw = LookRotation.Yaw;
580
581 float DeltaYaw = FRotator::NormalizeAxis(DesiredYaw - CurrentYaw);
582 return DeltaYaw;
583}

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

370{
371 if (DroneParameters.Points.Num() > 0)
372 {
373 DroneParameters.Points.Empty();
375 }
376 else
377 {
379 }
380}

References DroneParameters, FDroneParameters::Points, and Transform.

◆ ResetDroneEvent()

void APIDDrone::ResetDroneEvent ( )

◆ ROSBridgeStateChanged()

void APIDDrone::ROSBridgeStateChanged ( EROSState  ROSState)
overrideprotectedvirtual

Reimplemented from AVehicle.

Definition at line 531 of file PIDDrone.cpp.

532{
533 switch (ROSState)
534 {
536 CreateTopic();
537 break;
538
540 DestroyTopic();
541 break;
542 }
543}

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

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

◆ SetFlightpath()

void APIDDrone::SetFlightpath ( )

Called in tick function for drone roaming through points.

Definition at line 288 of file PIDDrone.cpp.

289{
290 // Check if drone is in garage
292 return;
293
294 // Don't try to fly if no waypoints
295 if (DroneParameters.Points.Num() == 0 && IsRoaming())
296 {
298 }
299
300 FVector waypoint = GetCurrentWaypointTarget();
301 FVector currentlocation = DroneSkeletalMesh->GetRelativeTransform().GetLocation();
302
303 if (PositionMesh)
304 {
305 // Doesn't work
306 PositionMesh->SetWorldLocation(waypoint);
307 }
308#if WITH_EDITOR
309 else
310 {
311 UE_LOG(LogTemp, Warning, TEXT("Desired location mesh not found"));
312 //DrawDebugLine(World, currentlocation, waypoint, FColor::Red, false, 0.0f, 0.0f, 5.0f);
313 }
314#endif
315 distanceToNextPoint = FVector2f::Distance(FVector2f(waypoint.X, waypoint.Y), FVector2f(currentlocation.X, currentlocation.Y));
316 if (distanceToNextPoint < 100)
317 {
318 waypointReached = true;
319 if (passedWaypoints != DroneParameters.Points.Num() - 1)
320 {
321#if WITH_EDITOR
322 UE_LOG(LogTemp, Warning, TEXT("Changing waypoint from %i to %i"), passedWaypoints, passedWaypoints + 1);
323#endif
324
326 }
327 else
328 {
330 {
332 passedWaypoints = 0;
333 }
334 else
335 {
337 {
340 OnDroneFinished.Broadcast(DroneParameters.Points.Last());
341 break;
344 passedWaypoints = 0;
345 break;
347 passedWaypoints = 0;
348 break;
350 Algo::Reverse(DroneParameters.Points);
351 passedWaypoints = 0;
352 break;
354 OnDroneFinished.Broadcast(DroneParameters.Points.Last());
355 if (!GetWorld()->GetTimerManager().IsTimerActive(DestroyHandle))
356 {
358 GetWorld()->GetTimerManager().SetTimer(DestroyHandle, this, &APIDDrone::HandleDestroy, 5.0f, false);
359 }
360 break;
361 default:
362 break;
363 }
364 }
365 }
366 }
367}
bool waypointReached
Definition: PIDDrone.h:272
FVector GetCurrentWaypointTarget()
Definition: PIDDrone.cpp:382
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:507
bool IsVehicleInGarage() const
Definition: Vehicle.h:133
EDroneEndAction DroneEndAction

References Destroy, DestroyHandle, distanceToNextPoint, FDroneParameters::DroneAction, FDroneParameters::DroneEndAction, DroneParameters, DroneSkeletalMesh, GenerateRandomNew, GenerateRoamingPoints(), GetCurrentWaypointTarget(), GoBackwards, HandleDestroy(), IsRoaming(), AVehicle::IsVehicleInGarage(), 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:437
void DrawDebugPoints()
Definition: PIDDrone.cpp:238

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

◆ UpdateGroundHeight()

void APIDDrone::UpdateGroundHeight ( )
private

Definition at line 437 of file PIDDrone.cpp.

438{
439 if (!DroneSkeletalMesh || !ROSTopic || !ROSMessage.IsValid())
440 {
441 return;
442 }
443
444 FVector Start = DroneSkeletalMesh->GetComponentLocation();
445 FVector End = Start - FVector(0, 0, 10000.0f);
446
447 FCollisionQueryParams TraceParams = FCollisionQueryParams(FName(TEXT("UpdateGroundHeight")), true, this);
448 TraceParams.bReturnPhysicalMaterial = false;
449 TraceParams.bTraceComplex = false;
450
451 // Get all child actors and add them to ignored actors list.
452 TArray<AActor*> AttachedActors;
453 GetAttachedActors(AttachedActors);
454 for (AActor* AttachedActor : AttachedActors)
455 {
456 // If the attached actor is a sensor, also ignore its children (e.g., sensor model mesh).
457 if (AttachedActor && Cast<ASensor>(AttachedActor))
458 {
459 TArray<AActor*> ChildActors;
460 AttachedActor->GetAttachedActors(ChildActors);
461 AttachedActors.Append(ChildActors);
462 }
463 }
464 TraceParams.AddIgnoredActors(AttachedActors);
465
466 FHitResult HitResult;
467
468#ifdef ParallelLineTraceSingleByChannel_EXISTS
469 // Defined and implemented in our AGRARSENSE Unreal Engine fork
470 // This LineTrace method doesn't block the physics scene which improves linetrace performance.
471 World->ParallelLineTraceSingleByChannel(
472 HitResult,
473 Start,
474 End,
475 ECC_Visibility,
476 TraceParams,
477 FCollisionResponseParams::DefaultResponseParam);
478#else
479 // If not using our fork of the engine, use default LineTrace method.
480 World->LineTraceSingleByChannel(
481 HitResult,
482 Start,
483 End,
484 ECC_Visibility,
485 TraceParams,
486 FCollisionResponseParams::DefaultResponseParam);
487#endif
488
489 if (HitResult.IsValidBlockingHit())
490 {
491 float Height = (Start.Z - HitResult.ImpactPoint.Z) / 100.0f;
492 float HeightRounded = FMath::RoundToFloat(Height * 1000.0f) / 1000.0f;
493
494 if (!FMath::IsNearlyEqual(DroneHeightFromGround, HeightRounded, 0.005f))
495 {
496 DroneHeightFromGround = HeightRounded;
497
499 ROSTopic->Publish(ROSMessage);
500
501 //FString HitActorName = HitResult.GetActor() ? HitResult.GetActor()->GetName() : TEXT("None");
502 //UE_LOG(LogTemp, Log, TEXT("Drone is %f meters above ground. Hit object: %s"), DroneHeightFromGround, *HitActorName);
503 }
504 }
505}
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: