17#include "ROSIntegration/Classes/RI/Topic.h"
19#include "Camera/CameraComponent.h"
20#include "Field/FieldSystemNodes.h"
21#include "NiagaraComponent.h"
22#include "Algo/Reverse.h"
25#include "DrawDebugHelpers.h"
30 PrimaryActorTick.bCanEverTick =
true;
31 InteractableName = NSLOCTEXT(
"Agrarsense",
"DroneInteractableName",
"Drone");
44 FString OverlapSensorID =
ActorID +
"/inner_overlap";
47 SpawnParams.
Transform = GetActorTransform();
102 ROSMessage = MakeShared<ROSMessages::std_msgs::Float32>();
107 DroneSkeletalMesh = Cast<USkeletalMeshComponent>(GetComponentByClass(USkeletalMeshComponent::StaticClass()));
108 PositionMesh = Cast<UStaticMeshComponent>(GetComponentByClass(UStaticMeshComponent::StaticClass()));
111 FTransform ActorTransform = GetActorTransform();
117 FString VehicleTransformSensorID =
ActorID +
"/transform";
120 TransformSensorSpawnParams.
Transform = GetActorTransform();
122 TransformSensorSpawnParams.
SensorName =
"transform";
124 TransformSensorSpawnParams.
Parent =
this;
139 FString OverlapSensorID =
ActorID +
"/overlap";
142 OverlapSensorSpawnParams.
Transform = GetActorTransform();
144 OverlapSensorSpawnParams.
SensorName =
"overlap";
146 OverlapSensorSpawnParams.
Parent =
this;
150 OverlapSensorParams.
Size = FVector(25.0f, 25.0f, 25.0f);
173 Super::EndPlay(EndPlayReason);
193 Super::Tick(DeltaTime);
226 for (int32 i = 0; i < dronePoints.Num(); i++)
231 DrawDebugSphere(
World, dronePoints[i].GetLocation(), 5.0f, 25, FColor::Red,
false);
232 if (i < dronePoints.Num() - 1)
234 FVector nextPointLocation = dronePoints[i + 1].GetLocation();
235 DrawDebugLine(
World, dronePoints[i].GetLocation(), nextPointLocation, FColor::Blue,
false, 0.0f, 0, 5.0f);
240 for (int32 i = 0; i <
dronePath.Num(); i++)
244 FVector nextPointLocation =
dronePath[i + 1].GetLocation();
245 DrawDebugLine(
World,
dronePath[i].GetLocation(), nextPointLocation, FColor::Green,
false, 0.0f, 0, 5.0f);
255 if (SimulationLevelManager)
259 if (controlledVehicle ==
this)
282 FVector currentlocation =
DroneSkeletalMesh->GetRelativeTransform().GetLocation();
292 UE_LOG(LogTemp, Warning, TEXT(
"Desired location mesh not found"));
296 distanceToNextPoint = FVector2f::Distance(FVector2f(waypoint.X, waypoint.Y), FVector2f(currentlocation.X, currentlocation.Y));
336 if (!GetWorld()->GetTimerManager().IsTimerActive(
DestroyHandle))
382 for (
const FTransform& point : Points)
395 FRotator currentRotation = target->GetRelativeRotation();
396 FRotator rotationDifference = rotator - currentRotation;
398 target->AddRelativeRotation(rotationDifference,
false,
nullptr, ETeleportType::TeleportPhysics);
401 if (FMath::Abs(rotator.Pitch) < 0.001f)
403 rotator.Pitch = 0.0f;
405 if (FMath::Abs(rotator.Yaw) < 0.001f)
409 if (FMath::Abs(rotator.Roll) < 0.001f)
415 target->SetRelativeRotation(rotator,
false,
nullptr, ETeleportType::TeleportPhysics);
426 FVector End = Start - FVector(0, 0, 10000.0f);
428 FCollisionQueryParams TraceParams = FCollisionQueryParams(FName(TEXT(
"UpdateGroundHeight")),
true,
this);
429 TraceParams.bReturnPhysicalMaterial =
false;
430 TraceParams.bTraceComplex =
false;
432 FHitResult HitResult;
434#ifdef ParallelLineTraceSingleByChannel_EXISTS
437 World->ParallelLineTraceSingleByChannel(
443 FCollisionResponseParams::DefaultResponseParam);
446 World->LineTraceSingleByChannel(
452 FCollisionResponseParams::DefaultResponseParam);
455 if (HitResult.IsValidBlockingHit())
457 float Height = (Start.Z - HitResult.ImpactPoint.Z) / 100.0f;
458 float HeightRounded = FMath::RoundToFloat(Height * 1000.0f) / 1000.0f;
475 TArray<FTransform> generatedRoamingPoints;
476 generatedRoamingPoints.Reserve(roamingPoints);
478 FVector currentPosition = GetTransform().GetLocation();
480 FVector min = currentPosition - FVector(radius / 2, radius / 2, 0);
481 FVector max = currentPosition + FVector(radius / 2, radius / 2, 0);
483 for (int32 i = 0; i < roamingPoints; i++)
485 FTransform randomPoint;
486 randomPoint.SetLocation(FVector(FMath::RandRange(min.X, max.X), FMath::RandRange(min.Y, max.Y), 5000));
488 generatedRoamingPoints.Add(randomPoint);
490 UE_LOG(LogTemp, Warning, TEXT(
"Waypoint %i: (%s)"), i, *randomPoint.GetLocation().ToString());
494 return generatedRoamingPoints;
519 if (ROSInstance && ROSInstance->IsROSConnected())
521 ROSTopic = NewObject<UTopic>(UTopic::StaticClass());
528 ROSTopic->Init(ROSInstance->ROSIntegrationCore, TopicName,
"std_msgs/Float32");
536 if (!DroneMesh || !DesiredLocation)
541 FVector ToTarget = DesiredLocation->GetComponentLocation() - DroneMesh->GetComponentLocation();
542 FRotator LookRotation = ToTarget.Rotation();
544 float CurrentYaw = DroneMesh->GetComponentRotation().Yaw;
545 float DesiredYaw = LookRotation.Yaw;
547 float DeltaYaw = FRotator::NormalizeAxis(DesiredYaw - CurrentYaw);
558 ROSTopic->ConditionalBeginDestroy();
void SetVisualizeOverlapArea(bool Visualize)
void SetOverlapBounds(const FVector &NewSize)
TSharedPtr< ROSMessages::std_msgs::Float32 > ROSMessage
TArray< FVector > WayPoints
void AssignRoamingPoints(const TArray< FTransform > Points)
void SetDroneRotation(USkeletalMeshComponent *target, FRotator rotator)
FVector GetCurrentWaypointTarget()
float DroneHeightFromGround
void MoveDroneToPosition(const FTransform Transform)
Override all drone roaming points and continue towards this position.
void AutoPilot(const float DeltaTime)
virtual void BeginPlay() override
void UpdateGroundHeight()
void SetFlightpath()
Called in tick function for drone roaming through points.
void ROSBridgeStateChanged(EROSState ROSState) override
float GetYawRotationDifference(USkeletalMeshComponent *DroneSkeletalMesh, UStaticMeshComponent *DesiredLocation)
Get wanted waypoint target rotation.
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override
float distanceToNextPoint
FTransform GetCurrentWaypointTarget_Transform()
FDroneParameters DroneParameters
AOverlapSensor * InnerOverlapSensor
FDroneFinished OnDroneFinished
TArray< FTransform > dronePath
UStaticMeshComponent * PositionMesh
USkeletalMeshComponent * DroneSkeletalMesh
FTimerHandle DestroyHandle
void ChangeDroneParameters(const FDroneParameters &newParameters)
TArray< FTransform > GenerateRoamingPoints(float radius, int32 roamingPoints)
Generates a roadming points array for the drone in radius.
virtual void Tick(float DeltaTime) override
void CeaseManualControlOfVehicle()
AVehicle * GetManuallyControlledVehicle()
virtual FString GetActorID_Implementation() const override
bool IsVehicleInGarage() const
AOverlapSensor * OverlapSensor
ATransformSensor * TransformSensor
UNiagaraComponent * NiagaraComponent
static UROSIntegrationGameInstance * GetROSGameInstance(const UObject *WorldContextObject)
static ASimulationLevelManager * GetSimulationLevelManager(const UObject *WorldContextObject)
static ATransformSensor * SpawnTransformSensor(const FSensorSpawnParameters SpawnParameters, FTransformSensorParameters SensorParameters)
static AOverlapSensor * SpawnOverlapSensor(const FSensorSpawnParameters SpawnParameters, FOverlapSensorParameters SensorParameters)
float InnerOverlapRadiusMeters
bool CreateInnerOverlapSensor
EDroneEndAction DroneEndAction
float OverlapRadiusMeters
TArray< FTransform > Points