diff --git a/LibCarla/source/carla/sensor/SensorRegistry.h b/LibCarla/source/carla/sensor/SensorRegistry.h index ea9861014..f463573a1 100644 --- a/LibCarla/source/carla/sensor/SensorRegistry.h +++ b/LibCarla/source/carla/sensor/SensorRegistry.h @@ -57,6 +57,7 @@ namespace sensor { std::pair, std::pair, std::pair, + std::pair, std::pair, std::pair, std::pair @@ -78,6 +79,7 @@ namespace sensor { #include "Carla/Sensor/ObstacleDetectionSensor.h" #include "Carla/Sensor/Radar.h" #include "Carla/Sensor/RayCastLidar.h" +#include "Carla/Sensor/RssSensor.h" #include "Carla/Sensor/SceneCaptureCamera.h" #include "Carla/Sensor/SemanticSegmentationCamera.h" #include "Carla/Sensor/WorldObserver.h" diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/CarlaEpisode.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/CarlaEpisode.cpp index ffa9ff1ae..3c2e2910e 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/CarlaEpisode.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/CarlaEpisode.cpp @@ -7,14 +7,20 @@ #include "Carla.h" #include "Carla/Game/CarlaEpisode.h" +#include +#include +#include +#include + #include "Carla/Sensor/Sensor.h" #include "Carla/Util/BoundingBoxCalculator.h" #include "Carla/Util/RandomEngine.h" #include "Carla/Vehicle/VehicleSpawnPoint.h" -#include "EngineUtils.h" #include "Engine/StaticMeshActor.h" +#include "EngineUtils.h" #include "GameFramework/SpectatorPawn.h" +#include "GenericPlatform/GenericPlatformProcess.h" #include "Kismet/GameplayStatics.h" #include "Misc/FileHelper.h" #include "Misc/Paths.h" @@ -102,20 +108,89 @@ bool UCarlaEpisode::LoadNewEpisode(const FString &MapString) return bIsFileFound; } +static FString BuildRecastBuilderFile() +{ + // Define filename with extension depending on if we are on Windows or not +#if PLATFORM_WINDOWS + const FString RecastToolName = "RecastBuilder.exe"; +#else + const FString RecastToolName = "RecastBuilder"; +#endif // PLATFORM_WINDOWS + + // Define path depending on the UE4 build type (Package or Editor) +#if UE_BUILD_SHIPPING + const FString AbsoluteRecastBuilderPath = FPaths::ConvertRelativePathToFull( + FPaths::ProjectDir() + "Tools/" + RecastToolName); +#else + const FString AbsoluteRecastBuilderPath = FPaths::ConvertRelativePathToFull( + FPaths::ProjectDir() + "../../Util/DockerUtils/dist/" + RecastToolName); +#endif + return AbsoluteRecastBuilderPath; +} + bool UCarlaEpisode::LoadNewOpendriveEpisode(const FString &OpenDriveString) { if (OpenDriveString.IsEmpty()) { + UE_LOG(LogCarla, Error, TEXT("The OpenDrive string is empty.")); return false; } + // Build the Map from the OpenDRIVE data + const auto CarlaMap = carla::opendrive::OpenDriveParser::Load( + carla::rpc::FromFString(OpenDriveString)); + + // Check the Map is correclty generated + if (!CarlaMap.has_value()) + { + UE_LOG(LogCarla, Error, TEXT("The OpenDrive string is invalid or not supported")); + return false; + } + + // Generate the OBJ (as string) + const auto RecastOBJ = CarlaMap->GenerateGeometry(2).GenerateOBJForRecast(); + + const FString AbsoluteOBJPath = FPaths::ConvertRelativePathToFull( + FPaths::ProjectContentDir() + "Carla/Maps/Nav/OpenDriveMap.obj"); + + // Store the OBJ string to a file in order to that RecastBuilder can load it + FFileHelper::SaveStringToFile( + carla::rpc::ToFString(RecastOBJ), + *AbsoluteOBJPath, + FFileHelper::EEncodingOptions::ForceUTF8, + &IFileManager::Get()); + + const FString AbsoluteXODRPath = FPaths::ConvertRelativePathToFull( + FPaths::ProjectContentDir() + "Carla/Maps/OpenDrive/OpenDriveMap.xodr"); + // Copy the OpenDrive as a file in the serverside FFileHelper::SaveStringToFile( OpenDriveString, - *(FPaths::ProjectContentDir() + "/Carla/Maps/OpenDrive/OpenDriveMap.xodr"), + *AbsoluteXODRPath, FFileHelper::EEncodingOptions::ForceUTF8, &IFileManager::Get()); + if (!FPaths::FileExists(AbsoluteXODRPath)) + { + UE_LOG(LogCarla, Error, TEXT("ERROR: XODR not copied!")); + return false; + } + + const FString AbsoluteRecastBuilderPath = BuildRecastBuilderFile(); + + if (FPaths::FileExists(AbsoluteRecastBuilderPath)) + { + FPlatformProcess::CreateProc( + *AbsoluteRecastBuilderPath, *AbsoluteOBJPath, + true, false, false, nullptr, 0, nullptr, nullptr); + } + else + { + UE_LOG(LogCarla, Warning, TEXT("'RecastBuilder' not present under '%s', " + "the binaries for pedestrian navigation will not be created."), + *AbsoluteRecastBuilderPath); + } + return true; } diff --git a/Util/BuildTools/Linux.mk b/Util/BuildTools/Linux.mk index ddd1ae563..656523b84 100644 --- a/Util/BuildTools/Linux.mk +++ b/Util/BuildTools/Linux.mk @@ -12,7 +12,7 @@ launch-only: import: CarlaUE4Editor PythonAPI build.utils @${CARLA_BUILD_TOOLS_FOLDER}/Import.py $(ARGS) -package: CarlaUE4Editor PythonAPI +package: CarlaUE4Editor PythonAPI build.utils @${CARLA_BUILD_TOOLS_FOLDER}/Package.sh $(ARGS) docs: