From 8b8666c64ea90f34d042d415aa345292c745f014 Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Thu, 22 Oct 2020 17:33:40 +0200 Subject: [PATCH] TaskPanel: Fix assertion When loading an .rviz config with MTC displays disabled, the mainloop_job to create a TaskPanel will never be executed (because the display is disabled). Removing the display will then hit the assertion that DISPLAY_COUNT > 0. Fixed, by not relying on Display::update, but just scheduling a Qt GUI job via QTimer::singleShot(). --- visualization/motion_planning_tasks/src/task_display.cpp | 4 ++-- visualization/motion_planning_tasks/src/task_panel.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/visualization/motion_planning_tasks/src/task_display.cpp b/visualization/motion_planning_tasks/src/task_display.cpp index 149e3e9f..227e2643 100644 --- a/visualization/motion_planning_tasks/src/task_display.cpp +++ b/visualization/motion_planning_tasks/src/task_display.cpp @@ -98,8 +98,8 @@ void TaskDisplay::onInitialize() { trajectory_visual_->onInitialize(scene_node_, context_); task_list_model_->setDisplayContext(context_); // create a new TaskPanel by default - // by post-poning this to main loop, we can ensure that rviz has loaded everything before - mainloop_jobs_.addJob([this]() { TaskPanel::incDisplayCount(context_->getWindowManager()); }); + // by post-poning this to Qt's GUI loop, we can ensure that rviz has loaded everything before + QTimer::singleShot(0, [this]() { TaskPanel::incDisplayCount(context_->getWindowManager()); }); } void TaskDisplay::loadRobotModel() { diff --git a/visualization/motion_planning_tasks/src/task_panel.cpp b/visualization/motion_planning_tasks/src/task_panel.cpp index 08cf33bd..ab20b78a 100644 --- a/visualization/motion_planning_tasks/src/task_panel.cpp +++ b/visualization/motion_planning_tasks/src/task_panel.cpp @@ -135,7 +135,7 @@ void TaskPanel::incDisplayCount(rviz::WindowManagerInterface* window_manager) { rviz::VisualizationFrame* vis_frame = dynamic_cast(window_manager); if (SINGLETON || !vis_frame) - return; // already define, nothing to do + return; // already defined, nothing to do QDockWidget* dock = vis_frame->addPanelByName("Motion Planning Tasks", "moveit_task_constructor/Motion Planning Tasks",