From c675e22c39a2f94c19e7d95b487670597f0642f6 Mon Sep 17 00:00:00 2001 From: Bartok9 Date: Thu, 23 Jul 2026 05:23:45 -0400 Subject: [PATCH] feat(api): expose simGetClockRate RPC (salvage #4612) Add simGetClockRate on C++ RPC client/server and Python VehicleClient, crediting @davidtr99 #4612. Returns ClockFactory true scale vs wall clock. Signed-off-by: Bartok9 --- AirLib/include/api/RpcLibClientBase.hpp | 1 + AirLib/src/api/RpcLibClientBase.cpp | 5 +++++ AirLib/src/api/RpcLibServerBase.cpp | 6 ++++++ PythonClient/airsim/client.py | 10 ++++++++++ 4 files changed, 22 insertions(+) diff --git a/AirLib/include/api/RpcLibClientBase.hpp b/AirLib/include/api/RpcLibClientBase.hpp index fd90824524..09e8a6fb26 100644 --- a/AirLib/include/api/RpcLibClientBase.hpp +++ b/AirLib/include/api/RpcLibClientBase.hpp @@ -49,6 +49,7 @@ namespace airlib int getMinRequiredClientVersion() const; bool simIsPaused() const; + float simGetClockRate() const; void simPause(bool is_paused); void simContinueForTime(double seconds); void simContinueForFrames(uint32_t frames); diff --git a/AirLib/src/api/RpcLibClientBase.cpp b/AirLib/src/api/RpcLibClientBase.cpp index 891c5155d6..711d1eb733 100644 --- a/AirLib/src/api/RpcLibClientBase.cpp +++ b/AirLib/src/api/RpcLibClientBase.cpp @@ -453,6 +453,11 @@ __pragma(warning(disable : 4239)) return pimpl_->client.call("simIsPaused").as(); } + float RpcLibClientBase::simGetClockRate() const + { + return pimpl_->client.call("simGetClockRate").as(); + } + void RpcLibClientBase::simPause(bool is_paused) { pimpl_->client.call("simPause", is_paused); diff --git a/AirLib/src/api/RpcLibServerBase.cpp b/AirLib/src/api/RpcLibServerBase.cpp index 0710bd8d5a..08cd2e2e64 100644 --- a/AirLib/src/api/RpcLibServerBase.cpp +++ b/AirLib/src/api/RpcLibServerBase.cpp @@ -8,6 +8,7 @@ //if using Unreal Build system then include precompiled header file first #include "api/RpcLibServerBase.hpp" +#include "common/ClockFactory.hpp" #include "common/Common.hpp" STRICT_MODE_OFF @@ -108,6 +109,11 @@ namespace airlib return getWorldSimApi()->isPaused(); }); + // True scale of sim clock vs wall clock (credit: davidtr99 #4612 naming aligned to sim* APIs) + pimpl_->server.bind("simGetClockRate", [&]() -> float { + return ClockFactory::get()->getTrueScaleWrtWallClock(); + }); + pimpl_->server.bind("simContinueForTime", [&](double seconds) -> void { getWorldSimApi()->continueForTime(seconds); }); diff --git a/PythonClient/airsim/client.py b/PythonClient/airsim/client.py index 4f139ac552..3427010a6c 100644 --- a/PythonClient/airsim/client.py +++ b/PythonClient/airsim/client.py @@ -102,6 +102,16 @@ def simIsPause(self): """ return self.client.call("simIsPaused") + def simGetClockRate(self): + """ + Returns the true scale of the simulation clock relative to wall clock + (settings ClockSpeed). For example, ClockSpeed 0.5 yields about 0.5. + + Returns: + float: sim clock rate vs wall clock + """ + return self.client.call("simGetClockRate") + def simContinueForTime(self, seconds): """ Continue the simulation for the specified number of seconds