From 078cf0f824107659a06fb8877383b1ebed539fa0 Mon Sep 17 00:00:00 2001 From: bernat Date: Mon, 25 Jul 2022 15:32:29 +0200 Subject: [PATCH] Fixing first ticks of a sensor (#5616) * Stream is removed when the sensor is destroyed * Changing log_info to log_debug * changeslog * Changes to return some non-const objects * Changing from weak_ptr to shared_ptr for storing sessions * Split long line * Changing log priority of some messages * Make sure sensor is active when an user wants to use it (before it connects to it) * Change UE tasks to any task, and not from Game thread --- LibCarla/source/carla/streaming/detail/Dispatcher.cpp | 2 ++ .../source/carla/streaming/detail/MultiStreamState.h | 9 ++++++++- .../Plugins/Carla/Source/Carla/Game/CarlaEngine.h | 1 + .../Plugins/Carla/Source/Carla/Sensor/AsyncDataStream.h | 2 +- .../Plugins/Carla/Source/Carla/Sensor/PixelReader.cpp | 2 +- .../Plugins/Carla/Source/Carla/Sensor/PixelReader.h | 5 ++++- 6 files changed, 17 insertions(+), 4 deletions(-) diff --git a/LibCarla/source/carla/streaming/detail/Dispatcher.cpp b/LibCarla/source/carla/streaming/detail/Dispatcher.cpp index 0ba537b94..29e34469b 100644 --- a/LibCarla/source/carla/streaming/detail/Dispatcher.cpp +++ b/LibCarla/source/carla/streaming/detail/Dispatcher.cpp @@ -110,6 +110,7 @@ namespace detail { if (search != _stream_map.end()) { log_debug("Found sensor id: ", sensor_id); auto stream_state = search->second; + stream_state->ForceActive(); log_debug("Getting token from stream ", sensor_id, " on port ", stream_state->token().get_port()); return stream_state->token(); } else { @@ -118,6 +119,7 @@ namespace detail { temp_token.set_stream_id(sensor_id); auto ptr = std::make_shared(temp_token); auto result = _stream_map.emplace(std::make_pair(temp_token.get_stream_id(), ptr)); + ptr->ForceActive(); if (!result.second) { log_debug("Failed to create multistream for stream ", sensor_id, " on port ", temp_token.get_port()); } diff --git a/LibCarla/source/carla/streaming/detail/MultiStreamState.h b/LibCarla/source/carla/streaming/detail/MultiStreamState.h index f53532bf8..165fe0415 100644 --- a/LibCarla/source/carla/streaming/detail/MultiStreamState.h +++ b/LibCarla/source/carla/streaming/detail/MultiStreamState.h @@ -58,8 +58,12 @@ namespace detail { } } + void ForceActive() { + _force_active = true; + } + bool AreClientsListening() { - return (_sessions.size() > 0); + return (_sessions.size() > 0 || _force_active); } void ConnectSession(std::shared_ptr session) final { @@ -84,6 +88,7 @@ namespace detail { DEBUG_ASSERT(session == _session.load()); _session.store(nullptr); _sessions.clear(); + _force_active = false; log_warning("Last session disconnected"); } else { _sessions.erase( @@ -107,6 +112,7 @@ namespace detail { } } _sessions.clear(); + _force_active = false; _session.store(nullptr); log_debug("Disconnecting all multistream sessions"); } @@ -119,6 +125,7 @@ namespace detail { AtomicSharedPtr _session; // if there are more than one session, we use vector of sessions with mutex std::vector> _sessions; + bool _force_active {false}; }; } // namespace detail diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/CarlaEngine.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/CarlaEngine.h index 5853cdf29..2644db442 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/CarlaEngine.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Game/CarlaEngine.h @@ -24,6 +24,7 @@ #include class UCarlaSettings; +class FFrameData; struct FEpisodeSettings; class FCarlaEngine : private NonCopyable diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/AsyncDataStream.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/AsyncDataStream.h index 418e50f56..33b832364 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/AsyncDataStream.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/AsyncDataStream.h @@ -66,7 +66,7 @@ public: { if (HeaderStr->frame != FrameNumber) { - carla::log_info("Re-framing stream ", HeaderStr->sensor_type, " from ", HeaderStr->frame, " to ", FrameNumber); + carla::log_debug("Re-framing sensor type ", HeaderStr->sensor_type, " from ", HeaderStr->frame, " to ", FrameNumber); HeaderStr->frame = FrameNumber; } } diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/PixelReader.cpp b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/PixelReader.cpp index df67c5f30..1764ac419 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/PixelReader.cpp +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/PixelReader.cpp @@ -76,7 +76,7 @@ void FPixelReader::WritePixelsToBuffer( RHICmdList.GetRenderQueryResult(Query, OldAbsTime, true); } - AsyncTask(ENamedThreads::GameThread, [=, Readback=std::move(BackBufferReadback)]() mutable { + AsyncTask(ENamedThreads::AnyNormalThreadNormalTask, [=, Readback=std::move(BackBufferReadback)]() mutable { { TRACE_CPUPROFILER_EVENT_SCOPE_STR("Wait GPU transfer"); while (!Readback->IsReady()) diff --git a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/PixelReader.h b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/PixelReader.h index 0a9b2005a..39feafdaa 100644 --- a/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/PixelReader.h +++ b/Unreal/CarlaUE4/Plugins/Carla/Source/Carla/Sensor/PixelReader.h @@ -10,6 +10,8 @@ #include "Engine/TextureRenderTarget2D.h" #include "Runtime/ImageWriteQueue/Public/ImagePixelData.h" +#include "Carla/Game/CarlaEngine.h" + #include #include #include @@ -111,7 +113,7 @@ void FPixelReader::SendPixelsInRenderThread(TSensor &Sensor, bool use16BitFormat if (!Sensor.IsPendingKill()) { FPixelReader::Payload FuncForSending = - [&Sensor, Conversor = std::move(Conversor)](void *LockedData, uint32 Size, uint32 Offset) + [&Sensor, Frame = FCarlaEngine::GetFrameCounter(), Conversor = std::move(Conversor)](void *LockedData, uint32 Size, uint32 Offset) { if (Sensor.IsPendingKill()) return; @@ -127,6 +129,7 @@ void FPixelReader::SendPixelsInRenderThread(TSensor &Sensor, bool use16BitFormat } auto Stream = Sensor.GetDataStream(Sensor); + Stream.SetFrameNumber(Frame); auto Buffer = Stream.PopBufferFromPool(); {