Added timeout to World Tick (#2556)

* Added timeout to World Tick

* Updated Changelog

* Fixed timeout on SetEpisodeSettings

Co-authored-by: bernat <bernatx@gmail.com>
Co-authored-by: Jacopo Bartiromo <32928804+jackbart94@users.noreply.github.com>
Co-authored-by: Marc Garcia Puig <marcgpuig@gmail.com>
This commit is contained in:
doterop 2020-03-06 13:04:04 +01:00 committed by GitHub
parent ac32aee647
commit 94affd9b79
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 32 additions and 10 deletions

View File

@ -14,6 +14,7 @@
* Added landmark class for signal-related queries.
* Added support to parse OpenDRIVE signals.
* Added junction class as queryable object from waypoint
* Added timeout to World Tick
* Added simple physical map generation from standalone OpenDRIVE data
* Added support for generating walker navigation on server-side
* Added support for new geometry: `spiral`, `poly3`, and `paramPoly3`

View File

@ -105,8 +105,8 @@ namespace client {
_episode.Lock()->RemoveOnTickEvent(callback_id);
}
uint64_t World::Tick() {
return _episode.Lock()->Tick();
uint64_t World::Tick(time_duration timeout) {
return _episode.Lock()->Tick(timeout);
}
void World::SetPedestriansCrossFactor(float percentage) {

View File

@ -117,7 +117,7 @@ namespace client {
/// synchronous mode).
///
/// @return The id of the frame that this call started.
uint64_t Tick();
uint64_t Tick(time_duration timeout);
/// set the probability that an agent could cross the roads in its path following
/// percentage of 0.0f means no pedestrian can cross roads

View File

@ -44,13 +44,25 @@ namespace detail {
}
}
static void SynchronizeFrame(uint64_t frame, const Episode &episode) {
static bool SynchronizeFrame(uint64_t frame, const Episode &episode, time_duration timeout) {
bool result = true;
auto start = std::chrono::system_clock::now();
while (frame > episode.GetState()->GetTimestamp().frame) {
std::this_thread::yield();
auto end = std::chrono::system_clock::now();
auto diff = std::chrono::duration_cast<std::chrono::milliseconds>(end-start);
if(timeout.to_chrono() < diff) {
result = false;
break;
}
}
if(result) {
carla::traffic_manager::TrafficManager::Tick();
}
return result;
}
// ===========================================================================
// -- Constructor ------------------------------------------------------------
// ===========================================================================
@ -126,10 +138,13 @@ namespace detail {
return *result;
}
uint64_t Simulator::Tick() {
uint64_t Simulator::Tick(time_duration timeout) {
DEBUG_ASSERT(_episode != nullptr);
const auto frame = _client.SendTickCue();
SynchronizeFrame(frame, *_episode);
bool result = SynchronizeFrame(frame, *_episode, timeout);
if (!result) {
throw_exception(TimeoutException(_client.GetEndpoint(), timeout));
}
return frame;
}
@ -153,7 +168,8 @@ namespace detail {
"recommended to set 'fixed_delta_seconds' when running on synchronous mode.");
}
const auto frame = _client.SetEpisodeSettings(settings);
SynchronizeFrame(frame, *_episode);
using namespace std::literals::chrono_literals;
SynchronizeFrame(frame, *_episode, 10s);
return frame;
}

View File

@ -156,7 +156,7 @@ namespace detail {
_episode->RemoveOnTickEvent(id);
}
uint64_t Tick();
uint64_t Tick(time_duration timeout);
/// @}
// =========================================================================

View File

@ -56,6 +56,11 @@ static size_t OnTick(carla::client::World &self, boost::python::object callback)
return self.OnTick(MakeCallback(std::move(callback)));
}
static auto Tick(carla::client::World &world, double seconds) {
carla::PythonUtil::ReleaseGIL unlock;
return world.Tick(TimeDurationFromSeconds(seconds));
}
static auto GetActorsById(carla::client::World &self, const boost::python::list &actor_ids) {
std::vector<carla::ActorId> ids{
boost::python::stl_input_iterator<carla::ActorId>(actor_ids),
@ -155,7 +160,7 @@ void export_world() {
.def("wait_for_tick", &WaitForTick, (arg("seconds")=10.0))
.def("on_tick", &OnTick, (arg("callback")))
.def("remove_on_tick", &cc::World::RemoveOnTick, (arg("callback_id")))
.def("tick", CALL_WITHOUT_GIL(cc::World, Tick))
.def("tick", &Tick, (arg("seconds")=10.0))
.def("set_pedestrians_cross_factor", CALL_WITHOUT_GIL_1(cc::World, SetPedestriansCrossFactor, float), (arg("percentage")))
.def(self_ns::str(self_ns::self))
;