31#include "GenericPlatform/GenericPlatformFile.h"
32#include "Serialization/JsonSerializer.h"
33#include "Serialization/JsonWriter.h"
34#include "Misc/DefaultValueHelper.h"
35#include "HAL/PlatformFileManager.h"
36#include "Misc/FileHelper.h"
38#include "Engine/GameViewportClient.h"
39#include "Engine/Engine.h"
40#include "Engine/World.h"
56 VehicleName =
"Forwarder";
60 VehicleName =
"Harvester";
64 VehicleName =
"Drone";
73 if (VehicleName.IsEmpty())
80 FString ValidatedFileName = FPaths::MakeValidFileName(FileName, TEXT(
'_'));
83 TSharedPtr<FJsonObject> JsonObject = MakeShareable(
new FJsonObject);
84 TArray<TSharedPtr<FJsonValue>> ObjectsArray;
86 TSharedPtr<FJsonObject> VehicleObject = MakeShareable(
new FJsonObject);
87 VehicleObject->SetStringField(
"type",
"vehicle");
88 VehicleObject->SetStringField(
"model", VehicleName);
89 VehicleObject->SetBoolField(
"teleportSpectator",
false);
90 VehicleObject->SetBoolField(
"followObject",
false);
91 VehicleObject->SetBoolField(
"destroyOverlappingObjects",
false);
92 VehicleObject->SetStringField(
"id", IActorInformation::Execute_GetActorID(
Vehicle));
94 TSharedPtr<FJsonObject> VehicleSpawnPoint = MakeShareable(
new FJsonObject);
96 FVector SpawnLocation;
97 FRotator SpawnRotation;
99 if (OverrideTransform)
106 SpawnLocation =
Vehicle->GetActorLocation();
107 SpawnRotation =
Vehicle->GetActorRotation();
120 TArray<TSharedPtr<FJsonValue>> SensorsArray;
122 USensorsManagerComponent* SensorManager =
Vehicle->GetSensorsManager();
126 SensorsArray.Append(
ParseLidars(SensorManager->GetLidars()));
127 SensorsArray.Append(
ParseCameras(SensorManager->GetCameras()));
131 SensorsArray.Append(
ParseRadars(SensorManager->GetRadars()));
135 if (SensorsArray.Num() > 0)
137 VehicleObject->SetArrayField(
"sensors", SensorsArray);
140 ObjectsArray.Add(MakeShareable(
new FJsonValueObject(VehicleObject)));
142 JsonObject->SetArrayField(
"objects", ObjectsArray);
145 TSharedRef<TJsonWriter<TCHAR>> JsonWriter = TJsonWriterFactory<>::Create(&JsonString);
146 FJsonSerializer::Serialize(JsonObject.ToSharedRef(), JsonWriter);
149 bool Saved = FFileHelper::SaveStringToFile(JsonString, *FilePath);
156 FString Msg = FString::Printf(TEXT(
"Exported vehicle JSON file to: %s"), *FilePath);
166 FString ValidatedFileName = FPaths::MakeValidFileName(FileName, TEXT(
'_'));
171 TSharedPtr<FJsonObject> ParametersObject = MakeShareable(
new FJsonObject);
172 FJsonObjectConverter::UStructToJsonObject(FWeatherParameters::StaticStruct(), &WeatherParameters, ParametersObject.ToSharedRef());
174 TSharedPtr<FJsonObject> RootObject = MakeShareable(
new FJsonObject);
175 TArray<TSharedPtr<FJsonValue>> ObjectsArray;
176 TSharedPtr<FJsonObject> WeatherObject = MakeShareable(
new FJsonObject);
177 WeatherObject->SetStringField(
"type",
"weather");
179 WeatherObject->SetObjectField(
"parameters", ParametersObject);
181 ObjectsArray.Add(MakeShareable(
new FJsonValueObject(WeatherObject)));
183 RootObject->SetArrayField(
"objects", ObjectsArray);
186 TSharedRef<TJsonWriter<>> JsonWriter = TJsonWriterFactory<>::Create(&JsonString);
187 FJsonSerializer::Serialize(RootObject.ToSharedRef(), JsonWriter);
189 bool Saved = FFileHelper::SaveStringToFile(JsonString, *FilePath);
196 FString Msg = FString::Printf(TEXT(
"Exported Weather JSON file to: %s"), *FilePath);
206 FString ValidatedFileName = FPaths::MakeValidFileName(FileName, TEXT(
'_'));
210 if (Actors.IsEmpty())
213 UE_LOG(LogTemp, Warning, TEXT(
"ROSJsonExporter.cpp: Actors TArray is empty."));
220 TSharedPtr<FJsonObject> JsonObject = MakeShareable(
new FJsonObject);
222 TArray<TSharedPtr<FJsonValue>> ObjectsArray;
230 FString type = Actor->GetTypeIDString();
231 FString model = Actor->GetModelIDString();
234 if (type ==
"none" || model ==
"none")
239 TSharedPtr<FJsonObject> ObjectEntry = MakeShareable(
new FJsonObject);
240 ObjectEntry->SetStringField(
"type", type);
241 ObjectEntry->SetStringField(
"model", model);
244 TSharedPtr<FJsonObject> SpawnPoint = MakeShareable(
new FJsonObject);
245 FVector SpawnLocation = Actor->GetActorLocation();
246 FRotator SpawnRotation = Actor->GetActorRotation();
247 FVector Scale = Actor->GetActorScale();
248 SetSpawnPoint(ObjectEntry, SpawnLocation, SpawnRotation, Scale);
249 ObjectsArray.Add(MakeShareable(
new FJsonValueObject(ObjectEntry)));
252 JsonObject->SetArrayField(
"objects", ObjectsArray);
255 TSharedRef<TJsonWriter<TCHAR>> JsonWriter = TJsonWriterFactory<>::Create(&JsonString);
256 FJsonSerializer::Serialize(JsonObject.ToSharedRef(), JsonWriter);
258 bool Saved = FFileHelper::SaveStringToFile(JsonString, *FilePath);
265 FString Msg = FString::Printf(TEXT(
"Exported Actors JSON file to: %s"), *FilePath);
281 FString ValidatedFileName = FPaths::MakeValidFileName(FileName, TEXT(
'_'));
286 TSharedPtr<FJsonObject> RootJsonObject = MakeShareable(
new FJsonObject);
289 TArray<TSharedPtr<FJsonValue>> ObjectsArray;
290 TSharedPtr<FJsonObject> ObjectEntry = MakeShareable(
new FJsonObject);
296 ObjectEntry->SetStringField(
"type",
"Walker");
298 ObjectEntry->SetStringField(
"id", IActorInformation::Execute_GetActorID(
Walker));
301 TSharedPtr<FJsonObject> ParametersObject = MakeShareable(
new FJsonObject);
302 FJsonObjectConverter::UStructToJsonObject(FWalkerParameters::StaticStruct(), &WalkerParameters, ParametersObject.ToSharedRef());
305 ParametersObject->RemoveField(TEXT(
"points"));
307 if (WalkerParameters.
Points.Num() >= 2)
311 TSharedPtr<FJsonObject> PointsObject = MakeShareable(
new FJsonObject);
312 for (int32 i = 0; i < WalkerParameters.
Points.Num(); ++i)
314 FString PointName = FString::Printf(TEXT(
"point%d"), i);
317 FVector Location =
Transform.GetLocation();
321 TSharedPtr<FJsonObject> PointData = MakeShareable(
new FJsonObject);
322 PointData->SetNumberField(TEXT(
"x"), Location.X);
323 PointData->SetNumberField(TEXT(
"y"), Location.Y);
324 PointData->SetNumberField(TEXT(
"z"), Location.Z);
325 PointData->SetNumberField(TEXT(
"roll"), Rotation.Roll);
326 PointData->SetNumberField(TEXT(
"pitch"), Rotation.Pitch);
327 PointData->SetNumberField(TEXT(
"yaw"), Rotation.Yaw);
330 PointsObject->SetObjectField(PointName, PointData);
334 ParametersObject->SetObjectField(TEXT(
"points"), PointsObject);
339 TSharedPtr<FJsonObject> SpawnPoint = MakeShareable(
new FJsonObject);
341 FVector SpawnLocation;
342 FRotator SpawnRotation;
343 if (WalkerParameters.
Points.IsEmpty())
347 SpawnLocation =
Walker->GetActorLocation();
348 SpawnRotation =
Walker->GetActorRotation();
362 ObjectEntry->SetObjectField(
"parameters", ParametersObject);
365 ObjectsArray.Add(MakeShareable(
new FJsonValueObject(ObjectEntry)));
368 RootJsonObject->SetArrayField(
"objects", ObjectsArray);
372 TSharedRef<TJsonWriter<TCHAR>> JsonWriter = TJsonWriterFactory<>::Create(&JsonString);
373 FJsonSerializer::Serialize(RootJsonObject.ToSharedRef(), JsonWriter);
376 bool Saved = FFileHelper::SaveStringToFile(JsonString, *FilePath);
384 FString Msg = FString::Printf(TEXT(
"Exported Actors JSON file to: %s"), *FilePath);
400 FString ValidatedFileName = FPaths::MakeValidFileName(FileName, TEXT(
'_'));
407 TSharedPtr<FJsonObject> ParametersObject = MakeShareable(
new FJsonObject);
409 bool Success =
false;
415 ALidar* LidarPtr = Cast<ALidar>(Sensor);
419 FJsonObjectConverter::UStructToJsonObject(FLidarParameters::StaticStruct(), &LidarParameters, ParametersObject.ToSharedRef());
429 ACamera* CameraPtr = Cast<ACamera>(Sensor);
441 if (ThermalCameraPtr)
444 FJsonObjectConverter::UStructToJsonObject(FThermalCameraParameters::StaticStruct(), &ThermalCameraParameters, ParametersObject.ToSharedRef());
452 ACamera* CameraPtr = Cast<ACamera>(Sensor);
455 ADepthCamera* DepthCameraPtr = Cast<ADepthCamera>(Sensor);
459 FJsonObjectConverter::UStructToJsonObject(FDepthCameraParameters::StaticStruct(), &DepthCameraParameters, ParametersObject.ToSharedRef());
468 ADVSCamera* DVSPtr = Cast<ADVSCamera>(Sensor);
472 FJsonObjectConverter::UStructToJsonObject(FDVSCameraParameters::StaticStruct(), &CameraParameters, ParametersObject.ToSharedRef());
480 ARadar* RadaPtr = Cast<ARadar>(Sensor);
484 FJsonObjectConverter::UStructToJsonObject(FRadarParameters::StaticStruct(), &RadarParameters, ParametersObject.ToSharedRef());
495 UE_LOG(LogTemp, Warning, TEXT(
"ROSJsonExporter.cpp: Exporting Collision/Transform or Overlap sensor is not supported."));
509 TSharedPtr<FJsonObject> RootJsonObject = MakeShareable(
new FJsonObject);
512 TArray<TSharedPtr<FJsonValue>> ObjectsArray;
513 TSharedPtr<FJsonObject> ObjectEntry = MakeShareable(
new FJsonObject);
516 ObjectEntry->SetStringField(
"type",
"Sensor");
517 ObjectEntry->SetStringField(
"model", SensorTypeString);
518 ObjectEntry->SetStringField(
"id", IActorInformation::Execute_GetActorID(Sensor));
521 FVector SpawnLocation = Sensor->GetActorLocation();
522 FRotator SpawnRotation = Sensor->GetActorRotation();
523 SetSpawnPoint(ObjectEntry, SpawnLocation, SpawnRotation, Sensor->GetActorScale());
526 ObjectEntry->SetObjectField(
"parameters", ParametersObject);
529 ObjectsArray.Add(MakeShareable(
new FJsonValueObject(ObjectEntry)));
532 RootJsonObject->SetArrayField(
"objects", ObjectsArray);
536 TSharedRef<TJsonWriter<TCHAR>> JsonWriter = TJsonWriterFactory<>::Create(&JsonString);
537 FJsonSerializer::Serialize(RootJsonObject.ToSharedRef(), JsonWriter);
540 bool Saved = FFileHelper::SaveStringToFile(JsonString, *FilePath);
547 FString Msg = FString::Printf(TEXT(
"Exported Actors JSON file to: %s"), *FilePath);
555 TArray<TSharedPtr<FJsonValue>> LidarArray;
564 FTransform
Transform =
Lidar->GetRootComponent()->GetRelativeTransform();
567 TSharedPtr<FJsonObject> ParametersObject = MakeShareable(
new FJsonObject);
570 FJsonObjectConverter::UStructToJsonObject(FLidarParameters::StaticStruct(), &Params, ParametersObject.ToSharedRef());
572 SensorObject->SetObjectField(
"parameters", ParametersObject);
574 LidarArray.Add(MakeShareable(
new FJsonValueObject(SensorObject)));
582 TArray<TSharedPtr<FJsonValue>> CameraArray;
584 for (
ACamera* Camera : Cameras)
591 FTransform
Transform = Camera->GetRootComponent()->GetRelativeTransform();
598 SensorObject->SetObjectField(
"parameters", ParametersObject);
600 CameraArray.Add(MakeShareable(
new FJsonValueObject(SensorObject)));
608 TArray<TSharedPtr<FJsonValue>> CameraArray;
617 FTransform
Transform = Camera->GetRootComponent()->GetRelativeTransform();
620 TSharedPtr<FJsonObject> DepthCameraParametersObject = MakeShareable(
new FJsonObject);
623 FJsonObjectConverter::UStructToJsonObject(FDepthCameraParameters::StaticStruct(), &Params, DepthCameraParametersObject.ToSharedRef());
625 SensorObject->SetObjectField(
"parameters", DepthCameraParametersObject);
627 CameraArray.Add(MakeShareable(
new FJsonValueObject(SensorObject)));
635 TArray<TSharedPtr<FJsonValue>> CameraArray;
644 FTransform
Transform = Camera->GetRootComponent()->GetRelativeTransform();
647 TSharedPtr<FJsonObject> ThermalCameraParametersObject = MakeShareable(
new FJsonObject);
650 FJsonObjectConverter::UStructToJsonObject(FThermalCameraParameters::StaticStruct(), &Params, ThermalCameraParametersObject.ToSharedRef());
652 SensorObject->SetObjectField(
"parameters", ThermalCameraParametersObject);
654 CameraArray.Add(MakeShareable(
new FJsonValueObject(SensorObject)));
662 TArray<TSharedPtr<FJsonValue>> CameraArray;
671 FTransform
Transform = Camera->GetRootComponent()->GetRelativeTransform();
674 TSharedPtr<FJsonObject> DVSCameraParametersObject = MakeShareable(
new FJsonObject);
677 FJsonObjectConverter::UStructToJsonObject(FDVSCameraParameters::StaticStruct(), &Params, DVSCameraParametersObject.ToSharedRef());
679 SensorObject->SetObjectField(
"parameters", DVSCameraParametersObject);
681 CameraArray.Add(MakeShareable(
new FJsonValueObject(SensorObject)));
689 TArray<TSharedPtr<FJsonValue>> RadarArray;
698 FTransform
Transform =
Radar->GetRootComponent()->GetRelativeTransform();
701 TSharedPtr<FJsonObject> RadarParametersObject = MakeShareable(
new FJsonObject);
704 FJsonObjectConverter::UStructToJsonObject(FRadarParameters::StaticStruct(), &Params, RadarParametersObject.ToSharedRef());
706 SensorObject->SetObjectField(
"parameters", RadarParametersObject);
708 RadarArray.Add(MakeShareable(
new FJsonValueObject(SensorObject)));
716 TSharedPtr<FJsonObject> SensorObject = MakeShareable(
new FJsonObject);
721 UE_LOG(LogTemp, Warning, TEXT(
"ROSJsonExporter.cpp: SensorPtr is nullptr!"));
726 FJsonObject* SensorJsonObject = SensorObject.Get();
727 SensorJsonObject->SetStringField(
"type",
"sensor");
728 SensorJsonObject->SetStringField(
"model", SensorName);
729 SensorJsonObject->SetStringField(
"name", SensorPtr->
GetSensorName());
730 SensorJsonObject->SetStringField(
"id", IActorInformation::Execute_GetActorID(SensorPtr));
732 SensorJsonObject->SetStringField(
"attachedToBone", SensorPtr->
AttachedToBone.ToString());
734 FTransform
Transform = SensorPtr->GetRootComponent()->GetRelativeTransform();
735 FVector SensorLocation =
Transform.GetLocation();
736 FRotator SensorRotation =
Transform.Rotator();
744 TSharedPtr<FJsonObject> ParametersObject = MakeShareable(
new FJsonObject);
745 FJsonObjectConverter::UStructToJsonObject(FCameraBaseParameters::StaticStruct(), &Parameters, ParametersObject.ToSharedRef());
747 return ParametersObject;
752 TSharedPtr<FJsonObject> SpawnPoint = MakeShareable(
new FJsonObject);
755 SpawnPoint->SetNumberField(
"x", Location.X);
756 SpawnPoint->SetNumberField(
"y", Location.Y);
757 SpawnPoint->SetNumberField(
"z", Location.Z);
760 SpawnPoint->SetNumberField(
"roll", Rotation.Roll);
761 SpawnPoint->SetNumberField(
"pitch", Rotation.Pitch);
762 SpawnPoint->SetNumberField(
"yaw", Rotation.Yaw);
765 SpawnPoint->SetNumberField(
"scaleX", Scale.X);
766 SpawnPoint->SetNumberField(
"scaleY", Scale.Y);
767 SpawnPoint->SetNumberField(
"scaleZ", Scale.Z);
769 ObjectEntry->SetObjectField(
"spawnPoint", SpawnPoint);
774 APIDDrone* DronePtr = Cast<APIDDrone>(VehiclePtr);
775 if (!ObjectEntry.IsValid() || !DronePtr)
780 TSharedPtr<FJsonObject> VehicleParams = MakeShareable(
new FJsonObject);
784 FString DroneActionString = UEnum::GetDisplayValueAsText(DroneParams.
DroneAction).ToString();
785 VehicleParams->SetStringField(
"droneAction", DroneActionString);
787 FString DroneEndActionString = UEnum::GetDisplayValueAsText(DroneParams.
DroneEndAction).ToString();
788 VehicleParams->SetStringField(
"DroneEndAction", DroneEndActionString);
790 if (!DroneParams.
Points.IsEmpty())
793 TArray<TSharedPtr<FJsonValue>> PointsArray;
794 PointsArray.Reserve(DroneParams.
Points.Num());
798 TSharedPtr<FJsonObject> PointObject = MakeShareable(
new FJsonObject);
801 FVector Translation =
Transform.GetLocation();
802 PointObject->SetNumberField(
"X", Translation.X);
803 PointObject->SetNumberField(
"Y", Translation.Y);
804 PointObject->SetNumberField(
"Z", Translation.Z);
807 FRotator Rotation =
Transform.GetRotation().Rotator();
808 PointObject->SetNumberField(
"Pitch", Rotation.Pitch);
809 PointObject->SetNumberField(
"Yaw", Rotation.Yaw);
810 PointObject->SetNumberField(
"Roll", Rotation.Roll);
813 PointsArray.Add(MakeShareable(
new FJsonValueObject(PointObject)));
817 VehicleParams->SetArrayField(
"points", PointsArray);
821 ObjectEntry->SetObjectField(
"parameters", VehicleParams);
826 if (FileName.IsEmpty())
829 FileName =
"ExportedJsonFile";
833 FileName = FileName.TrimStartAndEnd();
836 FString InvalidChars = TEXT(
"\\/:*?\"<>|");
837 for (TCHAR InvalidChar : InvalidChars)
839 FileName.ReplaceCharInline(InvalidChar, TEXT(
'_'), ESearchCase::CaseSensitive);
843 FString BaseFileName = FileName;
852 FString IndexString = (FileIndex > 0) ? FString::Printf(TEXT(
"_%d"), FileIndex) : FString();
853 FinalPath = DataPathFolder / FString::Printf(TEXT(
"ExportedJsonFiles/%s%s.json"), *BaseFileName, *IndexString);
855 }
while (FPlatformFileManager::Get().GetPlatformFile().FileExists(*FinalPath));
@ SemanticSegmentationCamera
FCameraBaseParameters GetCameraParameters()
FDVSCameraParameters GetDVSCameraParameters() const
FDepthCameraParameters GetDepthCameraParameters()
FLidarParameters GetLidarParameters() const
FDroneParameters GetDroneParameters() const
FRadarParameters GetRadarParameters()
FString GetSensorName() const
virtual ESensorTypes GetSensorType() const
FString AttachedToComponent
FThermalCameraParameters GetThermalCameraParameters() const
static void Log(const FString &Message, bool LogToTextFile=true, bool LogToROS=true)
static FString GetDataFolder()
static FString ConvertSensorTypeToString(ESensorTypes Sensortype)
static FString ConvertWalkerTypeToString(EWalkerType WalkerType)
static FString ExportWalkerToJSON(const FString &FileName, AWalker *Walker)
static FString ExportWeatherToJSON(const FString &FileName, const FWeatherParameters &WeatherParameters)
static FString CreateUniqueFilePath(FString FileName)
static FString ExportVehicleAndSensorsToJSON(FString FileName, AVehicle *Vehicle, bool OverrideTransform=false, const FTransform &Transform=FTransform())
static FString ExportSensorToJSON(const FString &FileName, ASensor *Sensor)
static TArray< TSharedPtr< FJsonValue > > ParseDepthCameras(const TArray< ADepthCamera * > &DepthCameras)
static TArray< TSharedPtr< FJsonValue > > ParseDVSCameras(const TArray< ADVSCamera * > &DVSCameras)
static TArray< TSharedPtr< FJsonValue > > ParseLidars(const TArray< ALidar * > &Lidars)
static TArray< TSharedPtr< FJsonValue > > ParseThermalCameras(const TArray< AThermalCamera * > &ThermalCameras)
static TSharedPtr< FJsonObject > CreateSensorJSONObject(const ASensor *SensorPtr, FString SensorName)
static FString ExportInstancedActorsToJSON(FString FileName, const TArray< AInstancedActor * > &Actors)
static void SetSpawnPoint(TSharedPtr< FJsonObject > &ObjectEntry, const FVector &Location, const FRotator &Rotation, const FVector &Scale)
static void SetDroneParameters(TSharedPtr< FJsonObject > &ObjectEntry, AVehicle *VehiclePtr)
static TSharedPtr< FJsonObject > CameraParametersToJSONObject(const FCameraBaseParameters &Parameters)
static TArray< TSharedPtr< FJsonValue > > ParseCameras(const TArray< ACamera * > &Cameras)
static TArray< TSharedPtr< FJsonValue > > ParseRadars(const TArray< ARadar * > &Radars)
EDroneEndAction DroneEndAction
TArray< FTransform > Points
TArray< FTransform > Points