diff --git a/core/src/cost_terms.cpp b/core/src/cost_terms.cpp index 9ddb94ff2..15e6c2271 100644 --- a/core/src/cost_terms.cpp +++ b/core/src/cost_terms.cpp @@ -298,7 +298,7 @@ double Clearance::operator()(const SubTrajectory& s, std::string& comment) const } }; auto collision_comment = [=](const auto& distance) { - return fmt::format(PREFIX + "allegedly valid solution collides between '{}' and '{}'", distance.link_names[0], + return fmt::format(fmt::runtime(PREFIX + "allegedly valid solution collides between '{}' and '{}'"), distance.link_names[0], distance.link_names[1]); }; @@ -313,10 +313,10 @@ double Clearance::operator()(const SubTrajectory& s, std::string& comment) const } distance = distance_data.distance; if (!cumulative) - comment = fmt::format(PREFIX + "distance {} between '{}' and '{}'", distance, distance_data.link_names[0], + comment = fmt::format(fmt::runtime(PREFIX + "distance {} between '{}' and '{}'"), distance, distance_data.link_names[0], distance_data.link_names[1]); else - comment = fmt::format(PREFIX + "cumulative distance {}", distance); + comment = fmt::format(fmt::runtime(PREFIX + "cumulative distance {}"), distance); } else { // check trajectory for (size_t i = 0; i < s.trajectory()->getWayPointCount(); ++i) { auto distance_data = check_distance(state, s.trajectory()->getWayPoint(i)); @@ -327,7 +327,7 @@ double Clearance::operator()(const SubTrajectory& s, std::string& comment) const distance += distance_data.distance; } distance /= s.trajectory()->getWayPointCount(); - comment = fmt::format(PREFIX + "average{} distance: {}", (cumulative ? " cumulative" : ""), distance); + comment = fmt::format(fmt::runtime(PREFIX + "average{} distance: {}"), (cumulative ? " cumulative" : ""), distance); } return distance_to_cost(distance); diff --git a/core/src/stage.cpp b/core/src/stage.cpp index b64ce0ab3..40c5bdd58 100644 --- a/core/src/stage.cpp +++ b/core/src/stage.cpp @@ -909,8 +909,8 @@ bool Connecting::compatible(const InterfaceState& from_state, const InterfaceSta const planning_scene::PlanningSceneConstPtr& from = from_state.scene(); const planning_scene::PlanningSceneConstPtr& to = to_state.scene(); - auto false_with_debug = [](auto... args) { - RCLCPP_DEBUG_STREAM(rclcpp::get_logger("Connecting"), fmt::format(args...)); + auto false_with_debug = [](auto fmt_str, auto&&... args) { + RCLCPP_DEBUG_STREAM(rclcpp::get_logger("Connecting"), fmt::format(fmt::runtime(fmt_str), std::forward(args)...)); return false; }; diff --git a/visualization/CMakeLists.txt b/visualization/CMakeLists.txt index a220b3a62..b5c81c68c 100644 --- a/visualization/CMakeLists.txt +++ b/visualization/CMakeLists.txt @@ -19,10 +19,27 @@ find_package(rviz_ogre_vendor REQUIRED) add_definitions(-DBOOST_MATH_DISABLE_FLOAT128) # Qt Stuff -find_package(Qt5 REQUIRED COMPONENTS Core Widgets) -set(QT_LIBRARIES Qt5::Widgets) +# rviz switched to Qt6 in 15.1.14 (ros2/rviz#1635 merged 2025-12-08 but did not +# land until that patch release; 15.1.13 and earlier are still Qt5). Gate on +# rviz's version rather than Qt6 availability -- Ubuntu 24.04 ships both Qt5 and +# Qt6, and linking a Qt6 build against a Qt5 rviz is an ABI mismatch. +if(rviz_common_VERSION VERSION_GREATER_EQUAL 15.1.14) + find_package(Qt6 REQUIRED COMPONENTS Core Widgets) + set(QT_VERSION_MAJOR 6) + # Hint for transitive deps that use find_package(QT NAMES Qt6 Qt5 ...) which + # may incorrectly resolve to Qt5 due to CMake's ascending path order + set(QT_DIR "${Qt6_DIR}") +else() + find_package(Qt5 REQUIRED COMPONENTS Core Widgets) + set(QT_VERSION_MAJOR 5) +endif() +set(QT_LIBRARIES Qt${QT_VERSION_MAJOR}::Widgets) macro(qt_wrap_ui) - qt5_wrap_ui(${ARGN}) + if(QT_VERSION_MAJOR EQUAL 5) + qt5_wrap_ui(${ARGN}) + else() + qt6_wrap_ui(${ARGN}) + endif() endmacro() set(CMAKE_INCLUDE_CURRENT_DIR ON) diff --git a/visualization/motion_planning_tasks/src/remote_task_model.cpp b/visualization/motion_planning_tasks/src/remote_task_model.cpp index d28cfd60e..c84dff3cb 100644 --- a/visualization/motion_planning_tasks/src/remote_task_model.cpp +++ b/visualization/motion_planning_tasks/src/remote_task_model.cpp @@ -526,7 +526,7 @@ QVariant RemoteSolutionModel::data(const QModelIndex& index, int role) const { return item.creation_rank; case 1: if (std::isinf(item.cost)) - return tr(u8"∞"); + return tr(reinterpret_cast(u8"∞")); if (std::isnan(item.cost)) return QVariant(); return QLocale().toString(item.cost, 'f', 4); diff --git a/visualization/motion_planning_tasks/src/task_display.cpp b/visualization/motion_planning_tasks/src/task_display.cpp index 0c07a2dea..4cd01eb65 100644 --- a/visualization/motion_planning_tasks/src/task_display.cpp +++ b/visualization/motion_planning_tasks/src/task_display.cpp @@ -37,6 +37,7 @@ */ #include "task_display.h" +#include #include "task_panel.h" #include "task_list_model.h" #include "meta_task_list_model.h" @@ -184,12 +185,24 @@ void TaskDisplay::calculateOffsetPosition() { scene_node_->setOrientation(orientation); } +#if RCLCPP_VERSION_GTE(30, 0, 0) +void TaskDisplay::update(std::chrono::nanoseconds wall_dt, std::chrono::nanoseconds ros_dt) { + requestPanel(); + Display::update(wall_dt, ros_dt); + calculateOffsetPosition(); + using namespace std::chrono; + float wall_dt_s = duration_cast>(wall_dt).count(); + float ros_dt_s = duration_cast>(ros_dt).count(); + trajectory_visual_->update(wall_dt_s, ros_dt_s); +} +#else void TaskDisplay::update(float wall_dt, float ros_dt) { requestPanel(); Display::update(wall_dt, ros_dt); calculateOffsetPosition(); trajectory_visual_->update(wall_dt, ros_dt); } +#endif void TaskDisplay::changedRobotDescription() { if (isEnabled()) diff --git a/visualization/motion_planning_tasks/src/task_display.h b/visualization/motion_planning_tasks/src/task_display.h index 41fa159d1..d76d12090 100644 --- a/visualization/motion_planning_tasks/src/task_display.h +++ b/visualization/motion_planning_tasks/src/task_display.h @@ -39,6 +39,8 @@ #pragma once #include +#include +#include #include #include @@ -83,7 +85,11 @@ class TaskDisplay : public rviz_common::Display void loadRobotModel(); +#if RCLCPP_VERSION_GTE(30, 0, 0) + void update(std::chrono::nanoseconds wall_dt, std::chrono::nanoseconds ros_dt) override; +#else void update(float wall_dt, float ros_dt) override; +#endif void reset() override; void save(rviz_common::Config config) const override; void load(const rviz_common::Config& config) override; diff --git a/visualization/motion_planning_tasks/src/task_list_model.cpp b/visualization/motion_planning_tasks/src/task_list_model.cpp index 3cd646690..7b6bd1a2a 100644 --- a/visualization/motion_planning_tasks/src/task_list_model.cpp +++ b/visualization/motion_planning_tasks/src/task_list_model.cpp @@ -61,9 +61,9 @@ QVariant TaskListModel::horizontalHeader(int column, int role) { case 0: return tr("name"); case 1: - return tr(u8"✓"); + return tr(reinterpret_cast(u8"✓")); case 2: - return tr(u8"✗"); + return tr(reinterpret_cast(u8"✗")); case 3: return tr("time"); } diff --git a/visualization/package.xml b/visualization/package.xml index 6115fccaf..65092c882 100644 --- a/visualization/package.xml +++ b/visualization/package.xml @@ -11,7 +11,7 @@ ament_cmake fmt - qtbase5-dev + qt-base-dev moveit_core moveit_task_constructor_msgs moveit_task_constructor_core