Skip to content

Commit f7fe399

Browse files
author
Jonathan
authored
Merge pull request #4066 from jonyMarino/pr/set_kinematics_for_external_physics
add simSetKinematics API
2 parents 2891632 + ca80d21 commit f7fe399

File tree

14 files changed

+61
-1
lines changed

14 files changed

+61
-1
lines changed

AirLib/include/api/RpcLibClientBase.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ namespace airlib
128128

129129
bool simCreateVoxelGrid(const Vector3r& position, const int& x_size, const int& y_size, const int& z_size, const float& res, const std::string& output_file);
130130
msr::airlib::Kinematics::State simGetGroundTruthKinematics(const std::string& vehicle_name = "") const;
131+
void simSetKinematics(const Kinematics::State& state, bool ignore_collision, const std::string& vehicle_name = "");
131132
msr::airlib::Environment::State simGetGroundTruthEnvironment(const std::string& vehicle_name = "") const;
132133
std::vector<std::string> simSwapTextures(const std::string& tags, int tex_id = 0, int component_id = 0, int material_id = 0);
133134

AirLib/include/api/VehicleSimApiBase.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ namespace airlib
5454
virtual Pose getPose() const = 0;
5555
virtual void setPose(const Pose& pose, bool ignore_collision) = 0;
5656
virtual const Kinematics::State* getGroundTruthKinematics() const = 0;
57+
virtual void setKinematics(const Kinematics::State& state, bool ignore_collision) = 0;
5758
virtual const msr::airlib::Environment* getGroundTruthEnvironment() const = 0;
5859

5960
virtual CollisionInfo getCollisionInfo() const = 0;

AirLib/src/api/RpcLibClientBase.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,11 @@ __pragma(warning(disable : 4239))
246246
pimpl_->client.call("simSetVehiclePose", RpcLibAdaptorsBase::Pose(pose), ignore_collision, vehicle_name);
247247
}
248248

249+
void RpcLibClientBase::simSetKinematics(const Kinematics::State& state, bool ignore_collision, const std::string& vehicle_name)
250+
{
251+
pimpl_->client.call("simSetKinematics", RpcLibAdaptorsBase::KinematicsState(state), ignore_collision, vehicle_name);
252+
}
253+
249254
void RpcLibClientBase::simSetTraceLine(const std::vector<float>& color_rgba, float thickness, const std::string& vehicle_name)
250255
{
251256
pimpl_->client.call("simSetTraceLine", color_rgba, thickness, vehicle_name);

AirLib/src/api/RpcLibServerBase.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,10 @@ namespace airlib
381381
return RpcLibAdaptorsBase::KinematicsState(result);
382382
});
383383

384+
pimpl_->server.bind("simSetKinematics", [&](const RpcLibAdaptorsBase::KinematicsState& state, bool ignore_collision, const std::string& vehicle_name) {
385+
getVehicleSimApi(vehicle_name)->setKinematics(state.to(), ignore_collision);
386+
});
387+
384388
pimpl_->server.bind("simGetGroundTruthEnvironment", [&](const std::string& vehicle_name) -> RpcLibAdaptorsBase::EnvironmentState {
385389
const Environment::State& result = (*getVehicleSimApi(vehicle_name)->getGroundTruthEnvironment()).getState();
386390
return RpcLibAdaptorsBase::EnvironmentState(result);

PythonClient/airsim/client.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,19 @@ def simGetGroundTruthKinematics(self, vehicle_name = ''):
683683
return KinematicsState.from_msgpack(kinematics_state)
684684
simGetGroundTruthKinematics.__annotations__ = {'return': KinematicsState}
685685

686+
def simSetKinematics(self, state, ignore_collision, vehicle_name = ''):
687+
"""
688+
Set the kinematics state of the vehicle
689+
690+
If you don't want to change position (or orientation) then just set components of position (or orientation) to floating point nan values
691+
692+
Args:
693+
state (KinematicsState): Desired Pose pf the vehicle
694+
ignore_collision (bool): Whether to ignore any collision or not
695+
vehicle_name (str, optional): Name of the vehicle to move
696+
"""
697+
self.client.call('simSetKinematics', state, ignore_collision, vehicle_name)
698+
686699
def simGetGroundTruthEnvironment(self, vehicle_name = ''):
687700
"""
688701
Get ground truth environment state

Unity/AirLibWrapper/AirsimWrapper/Source/PawnSimApi.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,12 @@ const msr::airlib::Kinematics::State* PawnSimApi::getGroundTruthKinematics() con
226226
return &kinematics_->getState();
227227
}
228228

229+
void PawnSimApi::setKinematics(const Kinematics::State& state, bool ignore_collision)
230+
{
231+
unused(ignore_collision);
232+
return kinematics_->setState(state);
233+
}
234+
229235
const msr::airlib::Environment* PawnSimApi::getGroundTruthEnvironment() const
230236
{
231237
return environment_.get();

Unity/AirLibWrapper/AirsimWrapper/Source/PawnSimApi.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ class PawnSimApi : public msr::airlib::VehicleSimApiBase
8585
virtual void updateRenderedState(float dt) override;
8686
virtual void updateRendering(float dt) override;
8787
virtual const msr::airlib::Kinematics::State* getGroundTruthKinematics() const override;
88+
virtual void setKinematics(const Kinematics::State& state, bool ignore_collision) override;
8889
virtual const msr::airlib::Environment* getGroundTruthEnvironment() const override;
8990
virtual std::string getRecordFileLine(bool is_header_line) const override;
9091
virtual void reportState(msr::airlib::StateReporter& reporter) override;

Unity/AirLibWrapper/AirsimWrapper/Source/Vehicles/Multirotor/MultirotorPawnSimApi.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,14 @@ void MultirotorPawnSimApi::setPose(const Pose& pose, bool ignore_collision)
125125
pending_pose_status_ = PendingPoseStatus::RenderStatePending;
126126
}
127127

128+
void MultirotorPawnSimApi::setKinematics(const msr::airlib::Kinematics::State& state, bool ignore_collision)
129+
{
130+
PawnSimApi::setKinematics(state, ignore_collision);
131+
132+
msr::airlib::Pose pose(state.pose.position, state.pose.orientation);
133+
setPose(pose, ignore_collision);
134+
}
135+
128136
//*** Start: UpdatableState implementation ***//
129137
void MultirotorPawnSimApi::resetImplementation()
130138
{

Unity/AirLibWrapper/AirsimWrapper/Source/Vehicles/Multirotor/MultirotorPawnSimApi.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class MultirotorPawnSimApi : public PawnSimApi
3030
virtual void reportState(StateReporter& reporter) override;
3131
virtual UpdatableObject* getPhysicsBody() override;
3232
virtual void setPose(const Pose& pose, bool ignore_collision) override;
33+
virtual void setKinematics(const msr::airlib::Kinematics::State& state, bool ignore_collision) override;
3334

3435
msr::airlib::MultirotorApiBase* getVehicleApi() const
3536
{

Unity/build.cmd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
@echo off
12
REM //---------- copy binaries and include for MavLinkCom in deps ----------
23
msbuild AirLibWrapper\AirsimWrapper.sln /target:Clean /target:Build /property:Configuration=Release /property:Platform=x64
34
if ERRORLEVEL 1 goto :buildfailed

Unreal/Plugins/AirSim/Source/PawnSimApi.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,13 @@ const msr::airlib::Kinematics::State* PawnSimApi::getGroundTruthKinematics() con
528528
{
529529
return &kinematics_->getState();
530530
}
531+
532+
void PawnSimApi::setKinematics(const Kinematics::State& state, bool ignore_collision)
533+
{
534+
unused(ignore_collision);
535+
536+
return kinematics_->setState(state);
537+
}
531538
const msr::airlib::Environment* PawnSimApi::getGroundTruthEnvironment() const
532539
{
533540
return environment_.get();

Unreal/Plugins/AirSim/Source/PawnSimApi.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class PawnSimApi : public msr::airlib::VehicleSimApiBase
3737
typedef msr::airlib::AirSimSettings::VehicleSetting VehicleSetting;
3838
typedef msr::airlib::ImageCaptureBase ImageCaptureBase;
3939
typedef msr::airlib::DetectionInfo DetectionInfo;
40+
typedef msr::airlib::Kinematics Kinematics;
4041

4142
struct Params
4243
{
@@ -92,6 +93,7 @@ class PawnSimApi : public msr::airlib::VehicleSimApiBase
9293
virtual void updateRenderedState(float dt) override;
9394
virtual void updateRendering(float dt) override;
9495
virtual const msr::airlib::Kinematics::State* getGroundTruthKinematics() const override;
96+
virtual void setKinematics(const msr::airlib::Kinematics::State& state, bool ignore_collision) override;
9597
virtual const msr::airlib::Environment* getGroundTruthEnvironment() const override;
9698
virtual std::string getRecordFileLine(bool is_header_line) const override;
9799
virtual void reportState(msr::airlib::StateReporter& reporter) override;
@@ -149,7 +151,6 @@ class PawnSimApi : public msr::airlib::VehicleSimApiBase
149151

150152
private: //vars
151153
typedef msr::airlib::AirSimSettings AirSimSettings;
152-
typedef msr::airlib::Kinematics Kinematics;
153154
typedef msr::airlib::Environment Environment;
154155

155156
Params params_;

Unreal/Plugins/AirSim/Source/Vehicles/Multirotor/MultirotorPawnSimApi.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,16 @@ void MultirotorPawnSimApi::setPose(const Pose& pose, bool ignore_collision)
139139
pending_pose_status_ = PendingPoseStatus::RenderPending;
140140
}
141141

142+
void MultirotorPawnSimApi::setKinematics(const Kinematics::State& state, bool ignore_collision)
143+
{
144+
multirotor_physics_body_->lock();
145+
multirotor_physics_body_->updateKinematics(state);
146+
multirotor_physics_body_->setGrounded(false);
147+
multirotor_physics_body_->unlock();
148+
pending_pose_collisions_ = ignore_collision;
149+
pending_pose_status_ = PendingPoseStatus::RenderPending;
150+
}
151+
142152
//*** Start: UpdatableState implementation ***//
143153
void MultirotorPawnSimApi::resetImplementation()
144154
{

Unreal/Plugins/AirSim/Source/Vehicles/Multirotor/MultirotorPawnSimApi.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class MultirotorPawnSimApi : public PawnSimApi
4343
virtual UpdatableObject* getPhysicsBody() override;
4444

4545
virtual void setPose(const Pose& pose, bool ignore_collision) override;
46+
virtual void setKinematics(const Kinematics::State& state, bool ignore_collision) override;
4647
virtual void pawnTick(float dt) override;
4748

4849
msr::airlib::MultirotorApiBase* getVehicleApi() const

0 commit comments

Comments
 (0)