diff --git a/src/rviz/visualization_manager.cpp b/src/rviz/visualization_manager.cpp index bc98c8daf2..ef39b8783d 100644 --- a/src/rviz/visualization_manager.cpp +++ b/src/rviz/visualization_manager.cpp @@ -111,6 +111,7 @@ class VisualizationManagerPrivate { public: ros::CallbackQueue threaded_queue_; + ros::CallbackQueue update_queue_; boost::thread_group threaded_queue_threads_; ros::NodeHandle update_nh_; ros::NodeHandle threaded_nh_; @@ -269,7 +270,7 @@ void VisualizationManager::unlockRender() ros::CallbackQueueInterface* VisualizationManager::getUpdateQueue() { - return ros::getGlobalCallbackQueue(); + return &private_->update_queue_; } void VisualizationManager::startUpdate() @@ -330,7 +331,7 @@ void VisualizationManager::onUpdate() resetTime(); } - ros::spinOnce(); + private_->update_queue_.callAvailable(ros::WallDuration(0.01)); Q_EMIT preUpdate(); diff --git a/src/rviz/visualizer_app.cpp b/src/rviz/visualizer_app.cpp index 09b2746978..829f175e9f 100644 --- a/src/rviz/visualizer_app.cpp +++ b/src/rviz/visualizer_app.cpp @@ -226,6 +226,13 @@ bool VisualizerApp::init(int argc, char** argv) save_config_service_ = private_nh.advertiseService("save_config", &VisualizerApp::saveConfigCallback, this); + //process any callbacks that don't use the designated callback queues of VisualizationManager + // but don't interfere with library users + QTimer* synchronous_global_timer = new QTimer(this); + synchronous_global_timer->setInterval(10); + synchronous_global_timer->setTimerType(Qt::VeryCoarseTimer); + connect(synchronous_global_timer, &QTimer::timeout, this, [](){ros::spinOnce();}); + #if CATCH_EXCEPTIONS } catch (std::exception& e)