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")));
228 CommandTopic = NewObject<UTopic>(UTopic::StaticClass());
233 std::function<void(TSharedPtr<FROSBaseMsg>)> SubscribeCallback = [
this](TSharedPtr<FROSBaseMsg> msg) ->
void
235 auto Concrete = StaticCastSharedPtr<ROSMessages::std_msgs::String>(msg);
236 if (Concrete.IsValid())
238 FString message = *(Concrete->_Data);
239 AsyncTask(ENamedThreads::GameThread, [
this, message]()
260 if (Message.FindChar(
' ', SpaceIndex))
263 Command = Message.Left(SpaceIndex).ToLower();
266 Variable = Message.Mid(SpaceIndex + 1);
271 Command = Message.ToLower();
275 FString CommandMsg = FString::Printf(TEXT(
"Incoming [command variable]: %s %s"), *Command, *Variable);
282 double CurrentTime = FPlatformTime::Seconds();
285 if (TimeSinceLastExecution >= CommandInfo->
CooldownTime)
288 (this->*(CommandInfo->
Handler))(Variable);
295 float CoolDownTimeLeft = CommandInfo->
CooldownTime - TimeSinceLastExecution;
296 FString Msg = FString::Printf(TEXT(
"Command '%s' on cooldown. Retry in %.2f sec."), *Command, CoolDownTimeLeft);
302 FString Msg = FString::Printf(TEXT(
"Couldn't find command: '%s'"), *Command);
309 FString LoweredString = String.ToLower();
311 if (LoweredString.Equals(
"true") || LoweredString.Equals(
"1"))
316 else if (LoweredString.Equals(
"false") || LoweredString.Equals(
"0"))
333 FString message =
"Available Simulator ROS commands {COMMAND} {VALUE} || ";
337 const FString& CommandString = CommandPair.Key;
338 const FCommand& CommandInfo = CommandPair.Value;
341 message += FString::Printf(TEXT(
"%s || "), *CommandString);
345 message += FString::Printf(TEXT(
"%s %s || "), *CommandString, *CommandInfo.
DefaultValue);
355 if (GEngine && World)
357 GEngine->Exec(World, TEXT(
"quit force"));
364 if (AgrarsenseSettings)
373 if (AgrarsenseSettings)
382 if (AgrarsenseSettings)
390 int32 FrameCount = 0;
391 if (!Variable.IsNumeric())
396 FrameCount = FCString::Atoi(*Variable);
400 if (AgrarsenseSettings)
410 if (!Variable.IsNumeric())
415 Time = FCString::Atof(*Variable);
419 if (AgrarsenseSettings)
429 if (AgrarsenseSettings)
438 if (GEngine && World)
440 GEngine->Exec(World, *Variable);
446 if (!Variable.IsNumeric())
451 float Radius = FCString::Atof(*Variable);
457 if (
AOverlapSensor* OverlapSensor = Spectator->GetOverlapSensor())
459 OverlapSensor->SetOverlapBounds(FVector(Radius, Radius, Radius));
475 TArray<FString> Components;
476 Variable.ParseIntoArray(Components, TEXT(
","),
true);
478 if (Components.Num() >= 3)
484 float X = FCString::Atof(*Components[0]);
485 float Y = FCString::Atof(*Components[1]);
486 float Z = FCString::Atof(*Components[2]);
488 Location = FVector(X, Y, Z);
490 if (Components.Num() >= 6)
493 float Pitch = FCString::Atof(*Components[3]);
494 float Yaw = FCString::Atof(*Components[4]);
495 float Roll = FCString::Atof(*Components[5]);
498 Rotation = FQuat(FRotator(Pitch, Yaw, Roll));
532 if (!Variable.IsNumeric())
537 TArray<AActor*> Taggers;
538 UGameplayStatics::GetAllActorsOfClass(
GetGameWorld(), ATagger::StaticClass(), Taggers);
539 ATagger* Tagger = Cast<ATagger>(Taggers[0]);
548 Spectator->TeleportSpectator(Actor->GetActorTransform());
557 FString TransformString;
560 TArray<FString> Tokens;
561 Variable.ParseIntoArray(Tokens, TEXT(
" "),
true);
562 if (Tokens.Num() >= 2)
565 TransformString = Variable.RightChop(ID.Len() + 1);
569 SimulatorLog::Log(
"Invalid input. Input should be in format: ID,X,Y,Z or ID,X,Y,Z,YAW,PITCH,ROLL");
577 FString log = FString::Printf(TEXT(
"Could not find Actor with ID: %s"), *ID);
583 TArray<FString> Components;
584 TransformString.ParseIntoArray(Components, TEXT(
","),
true);
586 if (Components.Num() >= 3)
592 float X = FCString::Atof(*Components[0]);
593 float Y = FCString::Atof(*Components[1]);
594 float Z = FCString::Atof(*Components[2]);
596 Location = FVector(X, Y, Z);
598 if (Components.Num() >= 6)
601 float Pitch = FCString::Atof(*Components[3]);
602 float Yaw = FCString::Atof(*Components[4]);
603 float Roll = FCString::Atof(*Components[5]);
606 Rotation = FQuat(FRotator(Pitch, Yaw, Roll));
619 UE_LOG(LogTemp, Warning, TEXT(
"Teleporting Actor with ID: %s to: %s"), *ID, *TransformString);
623 AVehicle* VehiclePtr = Cast<AVehicle>(Actor);
649 Message = FString::Printf(TEXT(
"Object with ID %s successfully destroyed."), *Variable);
653 Message = FString::Printf(TEXT(
"Failed to destroy object with ID %s."), *Variable);
677 TArray<AActor*> Vehicles;
678 UGameplayStatics::GetAllActorsOfClass(World, AVehicle::StaticClass(), Vehicles);
679 for (AActor* Actor : Vehicles)
691 if (!Variable.IsNumeric())
696 TArray<AActor*> Taggers;
697 UGameplayStatics::GetAllActorsOfClass(
GetGameWorld(), ATagger::StaticClass(), Taggers);
698 ATagger* Tagger = Cast<ATagger>(Taggers[0]);
713 if (AgrarsenseSettings)
715 TArray<FString> Maps = AgrarsenseSettings->
GetMapNames();
719 for (
const FString& map : Maps)
721 message += FString::Printf(TEXT(
"%s, "), *map);
745 TArray<AActor*> Actors;
746 UGameplayStatics::GetAllActorsWithInterface(
GetGameWorld(), UActorInformation::StaticClass(), Actors);
748 TArray<AActor*> TypedActors;
749 for (AActor* Actor : Actors)
751 if (Actor->IsA(ActorClass))
753 TypedActors.Add(Actor);
758 if (!TypedActors.IsEmpty())
760 Msg = FString::Printf(TEXT(
"Simulation has %d %ss \n "), TypedActors.Num(), *ActorTypeName);
761 for (AActor* Actor : TypedActors)
767 FString ActorInfo = IActorInformation::Execute_GetActorInformation(Actor);
768 Msg += FString::Printf(TEXT(
"%s \n \n "), *ActorInfo);
776 Msg = FString::Printf(TEXT(
"Simulation has 0 %ss."), *ActorTypeName);
789 if (Variable.IsNumeric())
792 if (AgrarsenseSettings)
794 int32 IntValue = FCString::Atoi(*Variable);
802 if (Variable.IsNumeric())
805 if (AgrarsenseSettings)
807 float FloatValue = FCString::Atof(*Variable);
816 if (AgrarsenseSettings)
832 if (AgrarsenseSettings)
848 if (AgrarsenseSettings)
907 Walker->ExportToJsonFile(
"ExportedWalker");
917 AVehicle* VehiclePtr = VehicleData.Vehicle.Get();
934 TArray<AActor*> Vehicles;
935 UGameplayStatics::GetAllActorsOfClass(World, AVehicle::StaticClass(), Vehicles);
936 for (AActor* Actor : Vehicles)
938 AVehicle* VehiclePtr = Cast<AVehicle>(Actor);
947 UGameplayStatics::GetAllActorsOfClass(World, ASensor::StaticClass(),
Sensors);
950 ASensor* SensorPtr = Cast<ASensor>(Actor);
972 TArray<AActor*> Taggers;
973 UGameplayStatics::GetAllActorsOfClass(World, ATagger::StaticClass(), Taggers);
975 if (
ATagger* Tagger = Cast<ATagger>(Taggers[0]))
977 Tagger->ExportObjectLocationsToCSV();
999 TArray<AActor*> OverlapSensors;
1000 UGameplayStatics::GetAllActorsOfClass(World, AOverlapSensor::StaticClass(), OverlapSensors);
1002 for (AActor* SensorActor : OverlapSensors)
1016 FString BoundsString;
1018 TArray<FString> Tokens;
1019 Variable.ParseIntoArray(Tokens, TEXT(
" "),
true);
1021 if (Tokens.Num() < 2)
1028 BoundsString = Tokens[1];
1030 if (BoundsString.IsNumeric())
1032 float Radius = FCString::Atof(*BoundsString);
1046 FString BoundsString;
1048 TArray<FString> Tokens;
1049 Variable.ParseIntoArray(Tokens, TEXT(
" "),
true);
1051 if (Tokens.Num() < 2)
1058 BoundsString = Tokens[1];
1060 FVector RelativePosition;
1061 TArray<FString> BoundsTokens;
1062 BoundsString.ParseIntoArray(BoundsTokens, TEXT(
","),
true);
1064 if (BoundsTokens.Num() >= 3)
1066 RelativePosition.X = FCString::Atof(*BoundsTokens[0]);
1067 RelativePosition.Y = FCString::Atof(*BoundsTokens[1]);
1068 RelativePosition.Z = FCString::Atof(*BoundsTokens[2]);
1101 FString TransformString;
1104 TArray<FString> Tokens;
1105 Variable.ParseIntoArray(Tokens, TEXT(
" "),
true);
1106 if (Tokens.Num() >= 2)
1109 TransformString = Variable.RightChop(ID.Len() + 1);
1130 TArray<FString> Components;
1131 TransformString.ParseIntoArray(Components, TEXT(
","),
true);
1133 if (Components.Num() >= 3)
1139 float X = FCString::Atof(*Components[0]);
1140 float Y = FCString::Atof(*Components[1]);
1141 float Z = FCString::Atof(*Components[2]);
1143 Location = FVector(X, Y, Z);
1145 if (Components.Num() >= 6)
1148 float Pitch = FCString::Atof(*Components[3]);
1149 float Yaw = FCString::Atof(*Components[4]);
1150 float Roll = FCString::Atof(*Components[5]);
1153 Rotation = FQuat(FRotator(Pitch, Yaw, Roll));
1167 Walker->ChangeWalkerParameters(NewParams);
1207 FString TransformString;
1210 TArray<FString> Tokens;
1211 Variable.ParseIntoArray(Tokens, TEXT(
" "),
true);
1212 if (Tokens.Num() >= 2)
1215 TransformString = Variable.RightChop(ID.Len() + 1);
1236 TArray<FString> Components;
1237 TransformString.ParseIntoArray(Components, TEXT(
","),
true);
1239 if (Components.Num() >= 3)
1245 float X = FCString::Atof(*Components[0]);
1246 float Y = FCString::Atof(*Components[1]);
1247 float Z = FCString::Atof(*Components[2]);
1249 Location = FVector(X, Y, Z);
1251 if (Components.Num() >= 6)
1254 float Pitch = FCString::Atof(*Components[3]);
1255 float Yaw = FCString::Atof(*Components[4]);
1256 float Roll = FCString::Atof(*Components[5]);
1259 Rotation = FQuat(FRotator(Pitch, Yaw, Roll));
1272 Drone->ChangeDroneParameters(NewParams);
1310 TArray<FString> Tokens;
1311 Variable.ParseIntoArray(Tokens, TEXT(
" "),
true);
1312 if (Tokens.Num() < 2)
1318 const FString& ID = Tokens[0];
1326 ASensor* Sensor = Cast<ASensor>(Actor);
1332 FString BooleanString = Tokens[1].ToLower();
1334 bool SimulateSensor;
1346 if (Variable.IsNumeric())
1349 if (AgrarsenseSettings)
1351 int32 IntValue = FCString::Atoi(*Variable);
1359 if (Variable.IsNumeric())
1362 if (AgrarsenseSettings)
1364 float Value = FCString::Atof(*Variable);
1382 TArray<FString> ParsedStrings;
1383 Variable.ParseIntoArray(ParsedStrings, TEXT(
" "),
true);
1385 if (ParsedStrings.Num() != 2)
1391 TArray<FString> PositionComponents;
1392 ParsedStrings[0].ParseIntoArray(PositionComponents, TEXT(
","),
true);
1394 if (PositionComponents.Num() != 3)
1399 FVector Position(FCString::Atof(*PositionComponents[0]), FCString::Atof(*PositionComponents[1]), FCString::Atof(*PositionComponents[2]));
1402 TArray<FString> BoundsComponents;
1403 ParsedStrings[1].ParseIntoArray(BoundsComponents, TEXT(
","),
true);
1405 if (BoundsComponents.Num() != 3)
1410 FVector Bounds(FCString::Atof(*BoundsComponents[0]), FCString::Atof(*BoundsComponents[1]), FCString::Atof(*BoundsComponents[2]));
1412 FTransform VolumeTransform;
1413 VolumeTransform.SetLocation(Position);
1433 TArray<FString> Tokens;
1434 Variable.ParseIntoArray(Tokens, TEXT(
" "),
true);
1436 if (Tokens.Num() < 2)
1441 const FString& ID = Tokens[0];
1442 const FString Param = Variable.RightChop(ID.Len() + 1);
1444 bool bVisible =
true;
1454 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 SetGlobalTimeDilation(float TimeDilation)
void SetGlobalTargetFrameRate(int NewTargetFrameRate)
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 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