From 3d16d778b544fa0c84f905e8535cd4d08846f975 Mon Sep 17 00:00:00 2001 From: Wouter Jansen Date: Fri, 5 Jul 2024 14:35:57 +0200 Subject: [PATCH] Added RPC API function for retrieving Instance Segmentation colormap --- AirLib/include/api/RpcLibAdaptorsBase.hpp | 18 ++++++++++++++++++ AirLib/include/api/RpcLibClientBase.hpp | 1 + AirLib/include/api/WorldSimApiBase.hpp | 1 + AirLib/src/api/RpcLibClientBase.cpp | 6 ++++++ AirLib/src/api/RpcLibServerBase.cpp | 4 ++++ .../Source/Annotation/ObjectAnnotator.cpp | 8 ++++++++ .../AirSim/Source/Annotation/ObjectAnnotator.h | 3 +++ .../AirSim/Source/SimMode/SimModeBase.cpp | 9 +++++++++ .../AirSim/Source/SimMode/SimModeBase.h | 3 ++- Unreal/Plugins/AirSim/Source/WorldSimApi.cpp | 6 ++++++ Unreal/Plugins/AirSim/Source/WorldSimApi.h | 1 + build.sh | 8 ++++---- setup.sh | 6 +++--- 13 files changed, 66 insertions(+), 8 deletions(-) diff --git a/AirLib/include/api/RpcLibAdaptorsBase.hpp b/AirLib/include/api/RpcLibAdaptorsBase.hpp index ac8ad593d..e1943a16f 100644 --- a/AirLib/include/api/RpcLibAdaptorsBase.hpp +++ b/AirLib/include/api/RpcLibAdaptorsBase.hpp @@ -79,6 +79,24 @@ namespace airlib_rpclib { return msr::airlib::Vector3r(x_val, y_val, z_val); } + static std::vector from( + const std::vector& vectors + ) { + std::vector vector_adaptor; + for (const auto& item : vectors) + vector_adaptor.push_back(Vector3r(item)); + + return vector_adaptor; + } + static std::vector to( + const std::vector& vector_adaptor + ) { + std::vector vectors; + for (const auto& item : vector_adaptor) + vectors.push_back(item.to()); + + return vectors; + } }; struct CollisionInfo diff --git a/AirLib/include/api/RpcLibClientBase.hpp b/AirLib/include/api/RpcLibClientBase.hpp index d02627de0..3bda3b997 100644 --- a/AirLib/include/api/RpcLibClientBase.hpp +++ b/AirLib/include/api/RpcLibClientBase.hpp @@ -61,6 +61,7 @@ namespace airlib vector simListSceneObjects(const string& name_regex = string(".*")) const; vector simListInstanceSegmentationObjects() const; + vector simGetInstanceSegmentationColorMap() const; vector simListInstanceSegmentationPoses(bool ned = true, bool only_visible = false) const; Pose simGetObjectPose(const std::string& object_name, bool ned = true) const; bool simLoadLevel(const string& level_name); diff --git a/AirLib/include/api/WorldSimApiBase.hpp b/AirLib/include/api/WorldSimApiBase.hpp index 0b1f86893..f117775e5 100644 --- a/AirLib/include/api/WorldSimApiBase.hpp +++ b/AirLib/include/api/WorldSimApiBase.hpp @@ -81,6 +81,7 @@ namespace airlib virtual std::vector listSceneObjects(const std::string& name_regex) const = 0; virtual std::vector listInstanceSegmentationObjects() const = 0; + virtual std::vector getInstanceSegmentationColorMap() const = 0; virtual std::vector listInstanceSegmentationPoses(bool ned = true, bool only_visible = false) const = 0; virtual Pose getObjectPose(const std::string& object_name, bool ned = true) const = 0; virtual Vector3r getObjectScale(const std::string& object_name) const = 0; diff --git a/AirLib/src/api/RpcLibClientBase.cpp b/AirLib/src/api/RpcLibClientBase.cpp index 7c4bb28e2..f9ce9d450 100644 --- a/AirLib/src/api/RpcLibClientBase.cpp +++ b/AirLib/src/api/RpcLibClientBase.cpp @@ -573,6 +573,12 @@ __pragma(warning(disable : 4239)) return pimpl_->client.call("simListInstanceSegmentationObjects").as>(); } + vector RpcLibClientBase::simGetInstanceSegmentationColorMap() const + { + const auto& response_adaptor = pimpl_->client.call("simGetInstanceSegmentationColorMap").as>(); + return RpcLibAdaptorsBase::Vector3r::to(response_adaptor); + } + vector RpcLibClientBase::simListInstanceSegmentationPoses(bool ned, bool only_visible) const { const auto& response_adaptor = pimpl_->client.call("simListInstanceSegmentationPoses", ned, only_visible).as>(); diff --git a/AirLib/src/api/RpcLibServerBase.cpp b/AirLib/src/api/RpcLibServerBase.cpp index 2136bb1a2..57ab8a7e3 100755 --- a/AirLib/src/api/RpcLibServerBase.cpp +++ b/AirLib/src/api/RpcLibServerBase.cpp @@ -444,6 +444,10 @@ namespace airlib return getWorldSimApi()->listInstanceSegmentationObjects(); }); + pimpl_->server.bind("simGetInstanceSegmentationColorMap", [&]() -> std::vector { + return RpcLibAdaptorsBase::Vector3r::from(getWorldSimApi()->getInstanceSegmentationColorMap()); + }); + pimpl_->server.bind("simListInstanceSegmentationPoses", [&](bool ned, bool only_visible) -> std::vector { return RpcLibAdaptorsBase::Pose::from(getWorldSimApi()->listInstanceSegmentationPoses(ned, only_visible)); }); diff --git a/Unreal/Plugins/AirSim/Source/Annotation/ObjectAnnotator.cpp b/Unreal/Plugins/AirSim/Source/Annotation/ObjectAnnotator.cpp index 562c65d8a..b833e2c5e 100644 --- a/Unreal/Plugins/AirSim/Source/Annotation/ObjectAnnotator.cpp +++ b/Unreal/Plugins/AirSim/Source/Annotation/ObjectAnnotator.cpp @@ -1212,6 +1212,10 @@ TMap FObjectAnnotator::GetComponentToValueMap() { return name_to_value_map_; } +TArray FObjectAnnotator::GetColorMap(){ + return ColorGenerator_.GetColorMap(); +} + void FObjectAnnotator::EndPlay() { @@ -1341,6 +1345,10 @@ int FColorGenerator::GetGammaCorrectedColor(int color_index) { return GammaCorrectionTable_[color_index]; } +static TArray FColorGenerator::GetColorMap(){ + return color_map_; +} + int32 FColorGenerator::GammaCorrectionTable_[256] = { 0, diff --git a/Unreal/Plugins/AirSim/Source/Annotation/ObjectAnnotator.h b/Unreal/Plugins/AirSim/Source/Annotation/ObjectAnnotator.h index 270477b7c..679fdaa43 100644 --- a/Unreal/Plugins/AirSim/Source/Annotation/ObjectAnnotator.h +++ b/Unreal/Plugins/AirSim/Source/Annotation/ObjectAnnotator.h @@ -13,6 +13,7 @@ class FColorGenerator FColor GetColorFromColorMap(int32 ObjectIndex); int GetIndexForColor(FColor color); int GetGammaCorrectedColor(int color_index); + static TArray GetColorMap(); private: int32 GetChannelValue(uint32 Index); @@ -71,6 +72,8 @@ class AIRSIM_API FObjectAnnotator static void SetViewForAnnotationRender(FEngineShowFlags& show_flags); + TArray GetColorMap(); + bool IsDirect(); FObjectAnnotator::AnnotatorType GetType(); diff --git a/Unreal/Plugins/AirSim/Source/SimMode/SimModeBase.cpp b/Unreal/Plugins/AirSim/Source/SimMode/SimModeBase.cpp index 2a7964d08..aa39d3fd0 100755 --- a/Unreal/Plugins/AirSim/Source/SimMode/SimModeBase.cpp +++ b/Unreal/Plugins/AirSim/Source/SimMode/SimModeBase.cpp @@ -772,6 +772,15 @@ std::vector ASimModeBase::GetAllInstanceSegmentationMeshIDs() { return instance_segmentation_annotator_.GetAllComponentNames(); } +TArray ASimModeBase::GetInstanceSegmentationColorMap() { + TArray color_map = instance_segmentation_annotator_.GetColorMap(); + TArray color_map_vector; + for (FColor color : color_map) { + color_map_vector.Add(msr::airlib::Vector3r(color.R, color.G, color.B)); + } + return color_map_vector; +} + TMap ASimModeBase::GetInstanceSegmentationComponentToNameMap() { return instance_segmentation_annotator_.GetComponentToNameMap(); } diff --git a/Unreal/Plugins/AirSim/Source/SimMode/SimModeBase.h b/Unreal/Plugins/AirSim/Source/SimMode/SimModeBase.h index 0fc5c3ba0..abc167c05 100644 --- a/Unreal/Plugins/AirSim/Source/SimMode/SimModeBase.h +++ b/Unreal/Plugins/AirSim/Source/SimMode/SimModeBase.h @@ -184,7 +184,7 @@ class AIRSIM_API ASimModeBase : public AActor const PawnSimApi* getVehicleSimApi(const std::string& vehicle_name = "") const { return static_cast(api_provider_->getVehicleSimApi(vehicle_name)); - } + }W PawnSimApi* getVehicleSimApi(const std::string& vehicle_name = "") { return static_cast(api_provider_->getVehicleSimApi(vehicle_name)); @@ -192,6 +192,7 @@ class AIRSIM_API ASimModeBase : public AActor std::vector GetAllInstanceSegmentationMeshIDs(); std::vector GetAllInstanceSegmentationMeshPoses(bool ned = true, bool only_visible = false); TMap GetInstanceSegmentationComponentToNameMap(); + TArray GetInstanceSegmentationColorMap(); bool SetMeshInstanceSegmentationID(const std::string& mesh_name, int object_id, bool is_name_regex, bool update_annotation = true); int GetMeshInstanceSegmentationID(const std::string& mesh_name); diff --git a/Unreal/Plugins/AirSim/Source/WorldSimApi.cpp b/Unreal/Plugins/AirSim/Source/WorldSimApi.cpp index fb53ad3c8..c14848cee 100644 --- a/Unreal/Plugins/AirSim/Source/WorldSimApi.cpp +++ b/Unreal/Plugins/AirSim/Source/WorldSimApi.cpp @@ -383,11 +383,17 @@ bool WorldSimApi::runConsoleCommand(const std::string& command) true); return succeeded; } + std::vector WorldSimApi::listInstanceSegmentationObjects() const { return simmode_->GetAllInstanceSegmentationMeshIDs(); } +std::vector WorldSimApi::getInstanceSegmentationColorMap() const +{ + return simmode_->GetInstanceSegmentationColorMap(); +} + std::vector WorldSimApi::listInstanceSegmentationPoses(bool ned, bool only_visible) const { return simmode_->GetAllInstanceSegmentationMeshPoses(ned, only_visible); diff --git a/Unreal/Plugins/AirSim/Source/WorldSimApi.h b/Unreal/Plugins/AirSim/Source/WorldSimApi.h index 876e7ac12..ee45bee84 100644 --- a/Unreal/Plugins/AirSim/Source/WorldSimApi.h +++ b/Unreal/Plugins/AirSim/Source/WorldSimApi.h @@ -40,6 +40,7 @@ class WorldSimApi : public msr::airlib::WorldSimApiBase virtual void setWeatherParameter(WeatherParameter param, float val); virtual std::vector listInstanceSegmentationObjects() const override; + virtual std::vector getInstanceSegmentationColorMap() const override; virtual std::vector listInstanceSegmentationPoses(bool ned = true, bool only_visible = false) const override; virtual bool setSegmentationObjectID(const std::string& mesh_name, int object_id, bool is_name_regex = false) override; diff --git a/build.sh b/build.sh index 7392922bd..137b87ba9 100755 --- a/build.sh +++ b/build.sh @@ -138,11 +138,11 @@ set +x echo "" echo "" -echo "==================================================================" -echo " AirSim plugin is built! Here's how to build Unreal project." -echo "==================================================================" +echo "===============================" +echo " Cosys-AirSim plugin is built!." +echo "===============================" echo "" -echo "For further info see:" +echo "For further info see for installation see:" echo "https://cosysgit.uantwerpen.be/sensorsimulation/airsim/-/tree/mastermaster/docs/install_linux.md" echo "==================================================================" diff --git a/setup.sh b/setup.sh index 93f9a9a06..f4c0f6fb5 100755 --- a/setup.sh +++ b/setup.sh @@ -188,6 +188,6 @@ popd >/dev/null set +x echo "" -echo "************************************" -echo "AirSim setup completed successfully!" -echo "************************************" \ No newline at end of file +echo "******************************************" +echo "Cosys-AirSim setup completed successfully!" +echo "******************************************" \ No newline at end of file