Skip to content

Commit

Permalink
Add simSetWind API
Browse files Browse the repository at this point in the history
  • Loading branch information
rajat2004 committed Jul 21, 2020
1 parent 82cf932 commit 578fff0
Show file tree
Hide file tree
Showing 11 changed files with 42 additions and 3 deletions.
2 changes: 2 additions & 0 deletions AirLib/include/api/RpcLibClientBase.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ class RpcLibClientBase {

std::vector<std::string> simSwapTextures(const std::string& tags, int tex_id = 0, int component_id = 0, int material_id = 0);

void simSetWind(const Vector3r& wind) const;

protected:
void* getClient();
const void* getClient() const;
Expand Down
2 changes: 2 additions & 0 deletions AirLib/include/api/WorldSimApiBase.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ class WorldSimApiBase {

virtual std::unique_ptr<std::vector<std::string>> swapTextures(const std::string& tag, int tex_id = 0, int component_id = 0, int material_id = 0) = 0;
virtual vector<MeshPositionVertexBuffersResponse> getMeshPositionVertexBuffers() const = 0;

virtual void setWind(const Vector3r& wind) const = 0;
};


Expand Down
6 changes: 6 additions & 0 deletions AirLib/src/api/RpcLibClientBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,12 @@ RpcLibClientBase* RpcLibClientBase::waitOnLastTask(bool* task_result, float time
return this;
}

void RpcLibClientBase::simSetWind(const Vector3r& wind) const
{
RpcLibAdapatorsBase::Vector3r conv_wind(wind);
pimpl_->client.call("simSetWind", conv_wind);
}

void* RpcLibClientBase::getClient()
{
return &pimpl_->client;
Expand Down
4 changes: 4 additions & 0 deletions AirLib/src/api/RpcLibServerBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,10 @@ RpcLibServerBase::RpcLibServerBase(ApiProvider* api_provider, const std::string&
return *getWorldSimApi()->swapTextures(tag, tex_id, component_id, material_id);
});

pimpl_->server.bind("simSetWind", [&](const RpcLibAdapatorsBase::Vector3r& wind) -> void {
getWorldSimApi()->setWind(wind.to());
});

//if we don't suppress then server will bomb out for exceptions raised by any method
pimpl_->server.suppress_exceptions(true);
}
Expand Down
9 changes: 9 additions & 0 deletions PythonClient/airsim/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -675,6 +675,15 @@ def waitOnLastTask(self, timeout_sec = float('nan')):
"""
return self.client.call('waitOnLastTask', timeout_sec)

def simSetWind(self, wind):
"""
Set simulated wind, in World frame, NED direction, m/s
Args:
wind (Vector3r): Wind, in World frame, NED direction, in m/s
"""
self.client.call('simSetWind', wind)

# ----------------------------------- Multirotor APIs ---------------------------------------------
class MultirotorClient(VehicleClient, object):
def __init__(self, ip = "", port = 41451, timeout_value = 3600):
Expand Down
7 changes: 7 additions & 0 deletions Unreal/Plugins/AirSim/Source/SimMode/SimModeBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,13 @@ void ASimModeBase::continueForTime(double seconds)
throw std::domain_error("continueForTime is not implemented by SimMode");
}

void ASimModeBase::setWind(const msr::airlib::Vector3r& wind) const
{
// should be overridden by derived class
unused(wind);
throw std::domain_error("setWind not implemented by SimMode");
}

std::unique_ptr<msr::airlib::ApiServerBase> ASimModeBase::createApiServer() const
{
//this will be the case when compilation with RPCLIB is disabled or simmode doesn't support APIs
Expand Down
2 changes: 2 additions & 0 deletions Unreal/Plugins/AirSim/Source/SimMode/SimModeBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ class AIRSIM_API ASimModeBase : public AActor
virtual void pause(bool is_paused);
virtual void continueForTime(double seconds);

virtual void setWind(const msr::airlib::Vector3r& wind) const;

virtual void setTimeOfDay(bool is_enabled, const std::string& start_datetime, bool is_start_datetime_dst,
float celestial_clock_speed, float update_interval_secs, bool move_sun);

Expand Down
2 changes: 1 addition & 1 deletion Unreal/Plugins/AirSim/Source/SimMode/SimModeWorldBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ void ASimModeWorldBase::continueForTime(double seconds)
UGameplayStatics::SetGamePaused(this->GetWorld(), true);
}

void ASimModeWorldBase::setWind(const msr::airlib::Vector3r& wind)
void ASimModeWorldBase::setWind(const msr::airlib::Vector3r& wind) const
{
physics_engine_->setWind(wind);
}
Expand Down
2 changes: 1 addition & 1 deletion Unreal/Plugins/AirSim/Source/SimMode/SimModeWorldBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class AIRSIM_API ASimModeWorldBase : public ASimModeBase
virtual void pause(bool is_paused) override;
virtual void continueForTime(double seconds) override;

void setWind(const msr::airlib::Vector3r& wind);
virtual void setWind(const msr::airlib::Vector3r& wind) const override;

protected:
void startAsyncUpdator();
Expand Down
7 changes: 6 additions & 1 deletion Unreal/Plugins/AirSim/Source/WorldSimApi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,4 +237,9 @@ std::vector<WorldSimApi::MeshPositionVertexBuffersResponse> WorldSimApi::getMesh
responses = UAirBlueprintLib::GetStaticMeshComponents();
}, true);
return responses;
}
}

void WorldSimApi::setWind(const Vector3r& wind) const
{
simmode_->setWind(wind);
}
2 changes: 2 additions & 0 deletions Unreal/Plugins/AirSim/Source/WorldSimApi.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ class WorldSimApi : public msr::airlib::WorldSimApiBase {
virtual void simPlotTransformsWithNames(const std::vector<Pose>& poses, const std::vector<std::string>& names, float tf_scale, float tf_thickness, float text_scale, const std::vector<float>& text_color_rgba, float duration) override;
virtual std::vector<MeshPositionVertexBuffersResponse> getMeshPositionVertexBuffers() const override;

virtual void setWind(const Vector3r& wind) const override;

private:
ASimModeBase* simmode_;
};

0 comments on commit 578fff0

Please sign in to comment.