32#include "ROSIntegration/Classes/ROSIntegrationGameInstance.h"
33#include "ROSIntegration/Public/std_msgs/String.h"
34#include "ROSIntegration/Classes/RI/Topic.h"
36#include "Engine/GameViewportClient.h"
37#include "Engine/Engine.h"
38#include "Engine/World.h"
39#include "Misc/DateTime.h"
40#include "Async/Async.h"
71 UWorld* World =
nullptr;
72 if (GEngine && GEngine->GameViewport)
74 World = GEngine->GameViewport->GetWorld();
111 CommandHandlers.Add(TEXT(
"teleportspectator"),
FCommand(&
UROSCommands::HandleTeleportSpectator, 0.03f, TEXT(
"x,y,z or x,y,z,yaw,pitch,roll")));
112 CommandHandlers.Add(TEXT(
"teleportspectatorheight"),
FCommand(&
UROSCommands::HandleTeleportSpectatorHeight, 0.03f, TEXT(
"x,y,z or x,y,z,yaw,pitch,roll")));
113 CommandHandlers.Add(TEXT(
"teleportbyid"),
FCommand(&
UROSCommands::HandleTeleportActorByID, 0.03f, TEXT(
"ID of Actor, x,y,z or x,y,z,yaw,pitch,roll")));
115 CommandHandlers.Add(TEXT(
"teleportbyidheight"),
FCommand(&
UROSCommands::HandleTeleportActorByIDHeight, 0.05f, TEXT(
"ID of Actor, x,y,z or x,y,z,yaw,pitch,roll")));
231 CommandTopic = NewObject<UTopic>(UTopic::StaticClass());
236 std::function<void(TSharedPtr<FROSBaseMsg>)> SubscribeCallback = [
this](TSharedPtr<FROSBaseMsg> msg) ->
void
238 auto Concrete = StaticCastSharedPtr<ROSMessages::std_msgs::String>(msg);
239 if (Concrete.IsValid())
241 FString message = *(Concrete->_Data);
242 AsyncTask(ENamedThreads::GameThread, [
this, message]()
263 if (Message.FindChar(
' ', SpaceIndex))
266 Command = Message.Left(SpaceIndex).ToLower();
269 Variable = Message.Mid(SpaceIndex + 1);
274 Command = Message.ToLower();
278 FString CommandMsg = FString::Printf(TEXT(
"Incoming [command variable]: %s %s"), *Command, *Variable);
285 double CurrentTime = FPlatformTime::Seconds();
288 if (TimeSinceLastExecution >= CommandInfo->
CooldownTime)
291 (this->*(CommandInfo->
Handler))(Variable);
298 float CoolDownTimeLeft = CommandInfo->
CooldownTime - TimeSinceLastExecution;
299 FString Msg = FString::Printf(TEXT(
"Command '%s' on cooldown. Retry in %.2f sec."), *Command, CoolDownTimeLeft);
305 FString Msg = FString::Printf(TEXT(
"Couldn't find command: '%s'"), *Command);
312 FString LoweredString = String.ToLower();
314 if (LoweredString.Equals(
"true") || LoweredString.Equals(
"1"))
319 else if (LoweredString.Equals(
"false") || LoweredString.Equals(
"0"))
336 FString message =
"Available Simulator ROS commands {COMMAND} {VALUE} || ";
340 const FString& CommandString = CommandPair.Key;
341 const FCommand& CommandInfo = CommandPair.Value;
344 message += FString::Printf(TEXT(
"%s || "), *CommandString);
348 message += FString::Printf(TEXT(
"%s %s || "), *CommandString, *CommandInfo.
DefaultValue);
358 if (GEngine && World)
360 GEngine->Exec(World, TEXT(
"quit force"));
367 if (AgrarsenseSettings)
376 if (AgrarsenseSettings)
385 if (AgrarsenseSettings)
393 int32 FrameCount = 0;
394 if (!Variable.IsNumeric())
399 FrameCount = FCString::Atoi(*Variable);
403 if (AgrarsenseSettings)
413 if (!Variable.IsNumeric())
418 Time = FCString::Atof(*Variable);
422 if (AgrarsenseSettings)
432 if (AgrarsenseSettings)
441 if (GEngine && World)
443 GEngine->Exec(World, *Variable);
449 if (!Variable.IsNumeric())
454 float Radius = FCString::Atof(*Variable);
460 if (
AOverlapSensor* OverlapSensor = Spectator->GetOverlapSensor())
462 OverlapSensor->SetOverlapBounds(FVector(Radius, Radius, Radius));
478 TArray<FString> Components;
479 Variable.ParseIntoArray(Components, TEXT(
","),
true);
481 if (Components.Num() >= 3)
487 float X = FCString::Atof(*Components[0]);
488 float Y = FCString::Atof(*Components[1]);
489 float Z = FCString::Atof(*Components[2]);
491 Location = FVector(X, Y, Z);
493 if (Components.Num() >= 6)
496 float Pitch = FCString::Atof(*Components[3]);
497 float Yaw = FCString::Atof(*Components[4]);
498 float Roll = FCString::Atof(*Components[5]);
501 Rotation = FQuat(FRotator(Pitch, Yaw, Roll));
535 if (!Variable.IsNumeric())
540 TArray<AActor*> Taggers;
541 UGameplayStatics::GetAllActorsOfClass(
GetGameWorld(), ATagger::StaticClass(), Taggers);
542 ATagger* Tagger = Cast<ATagger>(Taggers[0]);
551 Spectator->TeleportSpectator(Actor->GetActorTransform());
560 FString TransformString;
563 TArray<FString> Tokens;
564 Variable.ParseIntoArray(Tokens, TEXT(
" "),
true);
565 if (Tokens.Num() >= 2)
568 TransformString = Variable.RightChop(ID.Len() + 1);
572 SimulatorLog::Log(
"Invalid input. Input should be in format: ID,X,Y,Z or ID,X,Y,Z,YAW,PITCH,ROLL");
580 FString log = FString::Printf(TEXT(
"Could not find Actor with ID: %s"), *ID);
586 TArray<FString> Components;
587 TransformString.ParseIntoArray(Components, TEXT(
","),
true);
589 if (Components.Num() >= 3)
595 float X = FCString::Atof(*Components[0]);
596 float Y = FCString::Atof(*Components[1]);
597 float Z = FCString::Atof(*Components[2]);
599 Location = FVector(X, Y, Z);
601 if (Components.Num() >= 6)
604 float Pitch = FCString::Atof(*Components[3]);
605 float Yaw = FCString::Atof(*Components[4]);
606 float Roll = FCString::Atof(*Components[5]);
609 Rotation = FQuat(FRotator(Pitch, Yaw, Roll));
622 UE_LOG(LogTemp, Warning, TEXT(
"Teleporting Actor with ID: %s to: %s"), *ID, *TransformString);
626 AVehicle* VehiclePtr = Cast<AVehicle>(Actor);
652 Message = FString::Printf(TEXT(
"Object with ID %s successfully destroyed."), *Variable);
656 Message = FString::Printf(TEXT(
"Failed to destroy object with ID %s."), *Variable);
680 TArray<AActor*> Vehicles;
681 UGameplayStatics::GetAllActorsOfClass(World, AVehicle::StaticClass(), Vehicles);
682 for (AActor* Actor : Vehicles)
694 if (!Variable.IsNumeric())
699 TArray<AActor*> Taggers;
700 UGameplayStatics::GetAllActorsOfClass(
GetGameWorld(), ATagger::StaticClass(), Taggers);
701 ATagger* Tagger = Cast<ATagger>(Taggers[0]);
716 if (AgrarsenseSettings)
718 TArray<FString> Maps = AgrarsenseSettings->
GetMapNames();
722 for (
const FString& map : Maps)
724 message += FString::Printf(TEXT(
"%s, "), *map);
748 TArray<AActor*> Actors;
749 UGameplayStatics::GetAllActorsWithInterface(
GetGameWorld(), UActorInformation::StaticClass(), Actors);
751 TArray<AActor*> TypedActors;
752 for (AActor* Actor : Actors)
754 if (Actor->IsA(ActorClass))
756 TypedActors.Add(Actor);
761 if (!TypedActors.IsEmpty())
763 Msg = FString::Printf(TEXT(
"Simulation has %d %ss \n "), TypedActors.Num(), *ActorTypeName);
764 for (AActor* Actor : TypedActors)
770 FString ActorInfo = IActorInformation::Execute_GetActorInformation(Actor);
771 Msg += FString::Printf(TEXT(
"%s \n \n "), *ActorInfo);
779 Msg = FString::Printf(TEXT(
"Simulation has 0 %ss."), *ActorTypeName);
792 if (Variable.IsNumeric())
795 if (AgrarsenseSettings)
797 int32 IntValue = FCString::Atoi(*Variable);
805 if (Variable.IsNumeric())
808 if (AgrarsenseSettings)
810 float FloatValue = FCString::Atof(*Variable);
819 if (AgrarsenseSettings)
835 if (AgrarsenseSettings)
851 if (AgrarsenseSettings)
910 Walker->ExportToJsonFile(
"ExportedWalker");
920 AVehicle* VehiclePtr = VehicleData.Vehicle.Get();
937 TArray<AActor*> Vehicles;
938 UGameplayStatics::GetAllActorsOfClass(World, AVehicle::StaticClass(), Vehicles);
939 for (AActor* Actor : Vehicles)
941 AVehicle* VehiclePtr = Cast<AVehicle>(Actor);
950 UGameplayStatics::GetAllActorsOfClass(World, ASensor::StaticClass(),
Sensors);
953 ASensor* SensorPtr = Cast<ASensor>(Actor);
975 TArray<AActor*> Taggers;
976 UGameplayStatics::GetAllActorsOfClass(World, ATagger::StaticClass(), Taggers);
978 if (
ATagger* Tagger = Cast<ATagger>(Taggers[0]))
980 Tagger->ExportObjectLocationsToCSV();
1002 TArray<AActor*> OverlapSensors;
1003 UGameplayStatics::GetAllActorsOfClass(World, AOverlapSensor::StaticClass(), OverlapSensors);
1005 for (AActor* SensorActor : OverlapSensors)
1019 FString BoundsString;
1021 TArray<FString> Tokens;
1022 Variable.ParseIntoArray(Tokens, TEXT(
" "),
true);
1024 if (Tokens.Num() < 2)
1031 BoundsString = Tokens[1];
1033 if (BoundsString.IsNumeric())
1035 float Radius = FCString::Atof(*BoundsString);
1049 FString BoundsString;
1051 TArray<FString> Tokens;
1052 Variable.ParseIntoArray(Tokens, TEXT(
" "),
true);
1054 if (Tokens.Num() < 2)
1061 BoundsString = Tokens[1];
1063 FVector RelativePosition;
1064 TArray<FString> BoundsTokens;
1065 BoundsString.ParseIntoArray(BoundsTokens, TEXT(
","),
true);
1067 if (BoundsTokens.Num() >= 3)
1069 RelativePosition.X = FCString::Atof(*BoundsTokens[0]);
1070 RelativePosition.Y = FCString::Atof(*BoundsTokens[1]);
1071 RelativePosition.Z = FCString::Atof(*BoundsTokens[2]);
1104 FString TransformString;
1107 TArray<FString> Tokens;
1108 Variable.ParseIntoArray(Tokens, TEXT(
" "),
true);
1109 if (Tokens.Num() >= 2)
1112 TransformString = Variable.RightChop(ID.Len() + 1);
1133 TArray<FString> Components;
1134 TransformString.ParseIntoArray(Components, TEXT(
","),
true);
1136 if (Components.Num() >= 3)
1142 float X = FCString::Atof(*Components[0]);
1143 float Y = FCString::Atof(*Components[1]);
1144 float Z = FCString::Atof(*Components[2]);
1146 Location = FVector(X, Y, Z);
1148 if (Components.Num() >= 6)
1151 float Pitch = FCString::Atof(*Components[3]);
1152 float Yaw = FCString::Atof(*Components[4]);
1153 float Roll = FCString::Atof(*Components[5]);
1156 Rotation = FQuat(FRotator(Pitch, Yaw, Roll));
1170 Walker->ChangeWalkerParameters(NewParams);
1211 Drone->ResetDroneEvent();
1223 FString TransformString;
1226 TArray<FString> Tokens;
1227 Variable.ParseIntoArray(Tokens, TEXT(
" "),
true);
1228 if (Tokens.Num() >= 2)
1231 TransformString = Variable.RightChop(ID.Len() + 1);
1252 TArray<FString> Components;
1253 TransformString.ParseIntoArray(Components, TEXT(
","),
true);
1255 if (Components.Num() >= 3)
1261 float X = FCString::Atof(*Components[0]);
1262 float Y = FCString::Atof(*Components[1]);
1263 float Z = FCString::Atof(*Components[2]);
1265 Location = FVector(X, Y, Z);
1267 if (Components.Num() >= 6)
1270 float Pitch = FCString::Atof(*Components[3]);
1271 float Yaw = FCString::Atof(*Components[4]);
1272 float Roll = FCString::Atof(*Components[5]);
1275 Rotation = FQuat(FRotator(Pitch, Yaw, Roll));
1288 Drone->ChangeDroneParameters(NewParams);
1326 TArray<FString> Tokens;
1327 Variable.ParseIntoArray(Tokens, TEXT(
" "),
true);
1328 if (Tokens.Num() < 2)
1334 const FString& ID = Tokens[0];
1342 ASensor* Sensor = Cast<ASensor>(Actor);
1348 FString BooleanString = Tokens[1].ToLower();
1350 bool SimulateSensor;
1362 if (Variable.IsNumeric())
1365 if (AgrarsenseSettings)
1367 int32 IntValue = FCString::Atoi(*Variable);
1375 if (Variable.IsNumeric())
1378 if (AgrarsenseSettings)
1380 float Value = FCString::Atof(*Variable);
1398 TArray<FString> ParsedStrings;
1399 Variable.ParseIntoArray(ParsedStrings, TEXT(
" "),
true);
1401 if (ParsedStrings.Num() != 2)
1407 TArray<FString> PositionComponents;
1408 ParsedStrings[0].ParseIntoArray(PositionComponents, TEXT(
","),
true);
1410 if (PositionComponents.Num() != 3)
1415 FVector Position(FCString::Atof(*PositionComponents[0]), FCString::Atof(*PositionComponents[1]), FCString::Atof(*PositionComponents[2]));
1418 TArray<FString> BoundsComponents;
1419 ParsedStrings[1].ParseIntoArray(BoundsComponents, TEXT(
","),
true);
1421 if (BoundsComponents.Num() != 3)
1426 FVector Bounds(FCString::Atof(*BoundsComponents[0]), FCString::Atof(*BoundsComponents[1]), FCString::Atof(*BoundsComponents[2]));
1428 FTransform VolumeTransform;
1429 VolumeTransform.SetLocation(Position);
1449 TArray<FString> Tokens;
1450 Variable.ParseIntoArray(Tokens, TEXT(
" "),
true);
1452 if (Tokens.Num() < 2)
1457 const FString& ID = Tokens[0];
1458 const FString Param = Variable.RightChop(ID.Len() + 1);
1460 bool bVisible =
true;
1470 Vehicle->SetVehicleMeshVisibility(bVisible);
void DestroyOverlappingActors(bool OnlyTrees)
void ChangeOverlapBounds(FVector Bounds)
void SetSaveCombinedCloudToDisk(bool bSaveCombinedCloud)
void SetOverlapRelativePosition(const FVector &Vector)
void SetVisualizeOverlapArea(bool Visualize)
void SetOverlapBounds(const FVector &NewSize)
void SetSimulateSensor(bool SimulateSensor)
FString ExportToJsonFile(const FString &FileName)
void TeleportSpectator(const FTransform &Transform)
AActor * GetActorByInstanceID(float InstanceID)
FString ExportToJsonFile(const FString &FileName)
void TogglePhysics(bool isOn)
FString ExportToJSON(const FString &FileName)
static void Log(const FString &Message, bool LogToTextFile=true, bool LogToROS=true)
void SetQualityLevelFromString(const FString &QualityLevelString)
void AdvanceTime(float TimeToAdvance)
void ChangeMapByName(FString MapName)
void AdvanceFrameCount(int32 FramesToAdvance)
TArray< FString > GetMapNames() const
void SetGlobalTargetFrameRate(int32 NewTargetFrameRate)
void SetGlobalTimeDilation(float TimeDilation)
void SetGrassVisibility(bool Visible)
void PauseSimulationEndOfThisFrame()
void SetWorldPositionOffsetRenderDistance(int32 WorldPositionOffsetDistance)
void SetWorldRendering(bool enabled)
void SetNaniteMaxPixelsPerEdge(float MaxPixelsPerEdge=1.0f)
static ASpectator * GetSpectator(const UObject *WorldContextObject)
static UAgrarsenseSettings * GetAgrarsenseSettings()
static AWeather * GetWeatherActor(const UObject *WorldContextObject)
static UROSIntegrationGameInstance * GetROSGameInstance(const UObject *WorldContextObject)
static ALidarManager * GetLidarManager(const UObject *WorldContextObject)
static UROSHandler * GetROSHandle(const UObject *WorldContextObject)
static TArray< AInstancedActor * > GetAllAddedPropActors()
static void DestroyAllWalkers()
static TArray< FVehicleData > GetSpawnedVehicles()
static TArray< AInstancedActor * > GetAllAddedFoliageActors()
static TArray< AWalker * > GetAllWalkers()
static bool AlignTransformFromGroundInMeters(AActor *Actor, FTransform &InTransform)
void HandleTeleportActorByID(const FString &Variable)
void HandleUnrealCommand(const FString &Variable)
void HandleSetGrassVisibility(const FString &Variable)
void HandleChangeOverlapSensorBounds(const FString &Variable)
void HandlePrintAllWalkers(const FString &Variable)
void HandleTeleportSpectator(const FString &Variable)
void HandlePrintAllVehicles(const FString &Variable)
void HandlePrintAllSensors(const FString &Variable)
UROSIntegrationGameInstance * RosInstance
void HandleDestroyActorsArea(const FString &Variable)
void HandleSetWalkerMovement(const FString &Variable, bool IsPaused)
void HandleSetSpectatorOverlapRadius(const FString &Variable)
static TMap< FString, FCommand > CommandHandlers
void HandleAdvanceOneFrame(const FString &Variable)
void HandleUnPauseSimulator(const FString &Variable)
bool TryParseBoolean(const FString &String, bool &OutBool) const
void HandlePrintAvailableCommands(const FString &Variable)
void PrintActorInformation(const FString &Variable, UClass *ActorClass, const FString &ActorTypeName)
void HandleAdvanceTime(const FString &Variable)
void HandleExportAll(const FString &Variable)
void HandleExportSensors(const FString &Variable)
void HandleExportVehicles(const FString &Variable)
void HandleSetSaveCombinedPointcloudToDisk(const FString &Variable)
void HandleTeleportActorByIDHeight(const FString &Variable)
void HandleDisableAllSensors(const FString &Variable)
void HandleSetWPO(const FString &Variable)
void HandleTeleportSpectatorByInstanceID(const FString &Variable)
void HandleChangeMap(const FString &Variable)
void HandleExportWalkers(const FString &Variable)
void HandleResumeWalker(const FString &Variable)
UAgrarsenseSettings * GetSettings()
void HandleTeleportSpectatorHeight(const FString &Variable)
void HandleMoveDroneTo(const FString &Variable, EDroneEndAction EndAction)
void HandleSetWorldRendering(const FString &Variable)
void HandleSetGlobalTimeDilation(const FString &Variable)
void HandleDestroyAllSensors(const FString &Variable)
void ParseIncomingMessage(const FString Message)
void SetupROSCommandTopic()
void HandleMoveWalkerToAndStop(const FString &Variable)
void HandleExportWeather(const FString &Variable)
void HandleExportFoliage(const FString &Variable)
void HandleQuit(const FString &Variable)
void HandleSetAllSensorsEnabled(const FString &Variable)
void HandleVehicleMeshVisibility(const FString &Variable)
void HandleChangeOverlapSensorPosition(const FString &Variable)
void HandleSetSensorEnabled(const FString &Variable)
void HandleTryDestroyObjectByID(const FString &Variable)
void HandleVisualizeOverlapSensorsBounds(const FString &Variable)
void HandleEnableAllSensors(const FString &Variable)
void HandleMoveWalkerTo(const FString &Variable, EWalkerEndAction EndAction)
void HandleDestroyAllVehicles(const FString &Variable)
void HandleStopWalker(const FString &Variable)
void HandleDestroyObjectByInstanceID(const FString &Variable)
void HandleDestroyActors(const FString &Variable, bool OnlyTrees)
void HandleMoveDroneToAndStop(const FString &Variable)
void HandleDestroyAllWalkers(const FString &Variable)
void HandleMoveWalkerToAndDestroy(const FString &Variable)
void HandleSetNaniteMaxPixelsPerEdge(const FString &Variable)
void HandlePrintMaps(const FString &Variable)
void HandleSpawnObjects(const FString &Variable)
void HandleDestroyTreesArea(const FString &Variable)
bool TeleportSpectatorHeight
void HandleSetGlobalTargetFrameRate(const FString &Variable)
void HandlePrintIds(const FString &Variable)
void HandleAdvanceFrames(const FString &Variable)
void HandleSetQualityLevel(const FString &Variable)
void HandlePauseSimulator(const FString &Variable)
void HandleResetDrone(const FString &Variable)
void TryExecuteCommand(const FString &Command)
void HandleExportObjects(const FString &Variable)
void HandleExportProps(const FString &Variable)
void ROSBridgeStateChanged(EROSState state)
FROSDelegate_ROState OnROSStateChanged
static void DestroyAllSensors(const UObject *WorldContextObject, bool DestroyDefaultVehicleSensors=false)
static void EnableAllSensors(const UObject *WorldContextObject)
static void DisableAllSensors(const UObject *WorldContextObject)
static FString ExportInstancedActorsToJSON(FString FileName, const TArray< AInstancedActor * > &Actors)
static void ParseAndOperateJSONFile(const FString &Path)
EDroneEndAction DroneEndAction
EWalkerAction WalkerAction
TArray< FTransform > Points
EWalkerEndAction WalkerEndAction