From 84f314d56a4a055b2fe3044675d71343e0ac06de Mon Sep 17 00:00:00 2001 From: Sai Vemprala Date: Fri, 31 Jul 2020 19:01:52 +0000 Subject: [PATCH] Allow for enabling physics when spawning a new object (#2902) * Allow for enabling physics when spawning a new object --- AirLib/include/api/WorldSimApiBase.hpp | 2 +- AirLib/src/api/RpcLibServerBase.cpp | 4 ++-- PythonClient/airsim/client.py | 4 ++-- .../AirLibWrapper/AirsimWrapper/Source/WorldSimApi.h | 2 +- Unreal/Plugins/AirSim/Source/WorldSimApi.cpp | 12 ++++++++---- Unreal/Plugins/AirSim/Source/WorldSimApi.h | 4 ++-- 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/AirLib/include/api/WorldSimApiBase.hpp b/AirLib/include/api/WorldSimApiBase.hpp index e07cc96363..8607c44ba1 100644 --- a/AirLib/include/api/WorldSimApiBase.hpp +++ b/AirLib/include/api/WorldSimApiBase.hpp @@ -27,7 +27,7 @@ class WorldSimApiBase { // ------ Level setting apis ----- // virtual bool loadLevel(const std::string& level_name) = 0; - virtual string spawnObject(string& object_name, const string& load_component, const Pose& pose, const Vector3r& scale) = 0; + virtual string spawnObject(string& object_name, const string& load_component, const Pose& pose, const Vector3r& scale, bool physics_enabled) = 0; virtual bool destroyObject(const string& object_name) = 0; virtual bool isPaused() const = 0; diff --git a/AirLib/src/api/RpcLibServerBase.cpp b/AirLib/src/api/RpcLibServerBase.cpp index 43e62e5341..3123e95f18 100644 --- a/AirLib/src/api/RpcLibServerBase.cpp +++ b/AirLib/src/api/RpcLibServerBase.cpp @@ -262,8 +262,8 @@ RpcLibServerBase::RpcLibServerBase(ApiProvider* api_provider, const std::string& return getWorldSimApi()->loadLevel(level_name); }); - pimpl_->server.bind("simSpawnObject", [&](string& object_name, const string& load_component, const RpcLibAdapatorsBase::Pose& pose, const RpcLibAdapatorsBase::Vector3r& scale) -> string { - return getWorldSimApi()->spawnObject(object_name, load_component, pose.to(), scale.to()); + pimpl_->server.bind("simSpawnObject", [&](string& object_name, const string& load_component, const RpcLibAdapatorsBase::Pose& pose, const RpcLibAdapatorsBase::Vector3r& scale, bool physics_enabled) -> string { + return getWorldSimApi()->spawnObject(object_name, load_component, pose.to(), scale.to(), physics_enabled); }); pimpl_->server.bind("simDestroyObject", [&](const string& object_name) -> bool { diff --git a/PythonClient/airsim/client.py b/PythonClient/airsim/client.py index ede7ce3772..a6553093bd 100644 --- a/PythonClient/airsim/client.py +++ b/PythonClient/airsim/client.py @@ -383,7 +383,7 @@ def simListSceneObjects(self, name_regex = '.*'): """ return self.client.call('simListSceneObjects', name_regex) - def simSpawnObject(self, object_name, asset_name, pose, scale): + def simSpawnObject(self, object_name, asset_name, pose, scale, physics_enabled=False): """Spawned selected object in the world Args: @@ -395,7 +395,7 @@ def simSpawnObject(self, object_name, asset_name, pose, scale): Returns: str: Name of spawned object, in case it had to be modified """ - return self.client.call('simSpawnObject', object_name, asset_name, pose, scale) + return self.client.call('simSpawnObject', object_name, asset_name, pose, scale, physics_enabled) def simDestroyObject(self, object_name): """Removes selected object from the world diff --git a/Unity/AirLibWrapper/AirsimWrapper/Source/WorldSimApi.h b/Unity/AirLibWrapper/AirsimWrapper/Source/WorldSimApi.h index a947d7cf6b..b81df7648b 100644 --- a/Unity/AirLibWrapper/AirsimWrapper/Source/WorldSimApi.h +++ b/Unity/AirLibWrapper/AirsimWrapper/Source/WorldSimApi.h @@ -16,7 +16,7 @@ class WorldSimApi : public msr::airlib::WorldSimApiBase // ------ Level setting apis ----- // virtual bool loadLevel(const std::string& level_name) { return false; }; - virtual std::string spawnObject(std::string& object_name, const std::string& load_component, const Pose& pose, const Vector3r& scale) { return ""; }; + virtual std::string spawnObject(std::string& object_name, const std::string& load_component, const Pose& pose, const Vector3r& scale, bool physics_enabled) { return ""; }; virtual bool destroyObject(const std::string& object_name) { return false; }; virtual bool isPaused() const override; diff --git a/Unreal/Plugins/AirSim/Source/WorldSimApi.cpp b/Unreal/Plugins/AirSim/Source/WorldSimApi.cpp index 7180fba12a..4a60712435 100644 --- a/Unreal/Plugins/AirSim/Source/WorldSimApi.cpp +++ b/Unreal/Plugins/AirSim/Source/WorldSimApi.cpp @@ -77,12 +77,12 @@ bool WorldSimApi::destroyObject(const std::string& object_name) return result; } -std::string WorldSimApi::spawnObject(std::string& object_name, const std::string& load_object, const WorldSimApi::Pose& pose, const WorldSimApi::Vector3r& scale) +std::string WorldSimApi::spawnObject(std::string& object_name, const std::string& load_object, const WorldSimApi::Pose& pose, const WorldSimApi::Vector3r& scale, bool physics_enabled) { // Create struct for Location and Rotation of actor in Unreal FTransform actor_transform = simmode_->getGlobalNedTransform().fromGlobalNed(pose); bool found_object; - UAirBlueprintLib::RunCommandOnGameThread([this, load_object, &object_name, &actor_transform, &found_object, &scale]() { + UAirBlueprintLib::RunCommandOnGameThread([this, load_object, &object_name, &actor_transform, &found_object, &scale, &physics_enabled]() { // Find mesh in /Game and /AirSim asset registry. When more plugins are added this function will have to change UStaticMesh* LoadObject = dynamic_cast(UAirBlueprintLib::GetMeshFromRegistry(load_object)); if (LoadObject) @@ -104,8 +104,10 @@ std::string WorldSimApi::spawnObject(std::string& object_name, const std::string } FActorSpawnParameters new_actor_spawn_params; new_actor_spawn_params.Name = FName(object_name.c_str()); - this->createNewActor(new_actor_spawn_params, actor_transform, scale, LoadObject); + AActor* NewActor = this->createNewActor(new_actor_spawn_params, actor_transform, scale, LoadObject); found_object = true; + + UAirBlueprintLib::setSimulatePhysics(NewActor, physics_enabled); } else { @@ -121,7 +123,7 @@ std::string WorldSimApi::spawnObject(std::string& object_name, const std::string return object_name; } -void WorldSimApi::createNewActor(const FActorSpawnParameters& spawn_params, const FTransform& actor_transform, const Vector3r& scale, UStaticMesh* static_mesh) +AActor* WorldSimApi::createNewActor(const FActorSpawnParameters& spawn_params, const FTransform& actor_transform, const Vector3r& scale, UStaticMesh* static_mesh) { AActor* NewActor = simmode_->GetWorld()->SpawnActor(AActor::StaticClass(), FVector::ZeroVector, FRotator::ZeroRotator, spawn_params); // new UStaticMeshComponent* ObjectComponent = NewObject(NewActor); @@ -132,6 +134,8 @@ void WorldSimApi::createNewActor(const FActorSpawnParameters& spawn_params, cons ObjectComponent->RegisterComponent(); NewActor->SetRootComponent(ObjectComponent); NewActor->SetActorLocationAndRotation(actor_transform.GetLocation(), actor_transform.GetRotation(), false, nullptr, ETeleportType::TeleportPhysics); + + return NewActor; } bool WorldSimApi::isPaused() const diff --git a/Unreal/Plugins/AirSim/Source/WorldSimApi.h b/Unreal/Plugins/AirSim/Source/WorldSimApi.h index 7b647af934..a3aef5861c 100644 --- a/Unreal/Plugins/AirSim/Source/WorldSimApi.h +++ b/Unreal/Plugins/AirSim/Source/WorldSimApi.h @@ -20,7 +20,7 @@ class WorldSimApi : public msr::airlib::WorldSimApiBase { virtual bool loadLevel(const std::string& level_name) override; - virtual std::string spawnObject(std::string& object_name, const std::string& load_name, const WorldSimApi::Pose& pose, const WorldSimApi::Vector3r& scale) override; + virtual std::string spawnObject(std::string& object_name, const std::string& load_name, const WorldSimApi::Pose& pose, const WorldSimApi::Vector3r& scale, bool physics_enabled) override; virtual bool destroyObject(const std::string& object_name) override; virtual bool isPaused() const override; @@ -64,7 +64,7 @@ class WorldSimApi : public msr::airlib::WorldSimApiBase { virtual bool isRecording() const override; private: - void createNewActor(const FActorSpawnParameters& spawn_params, const FTransform& actor_transform, const Vector3r& scale, UStaticMesh* static_mesh); + AActor* createNewActor(const FActorSpawnParameters& spawn_params, const FTransform& actor_transform, const Vector3r& scale, UStaticMesh* static_mesh); void spawnPlayer(); private: