From 4fb10bcf82cb992a018eb79627b9f200515fdc1c Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Fri, 28 Aug 2026 08:25:30 +1000 Subject: [PATCH 001/180] docs: define cross-distribution sync workflow --- AGENTS.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index 55879bb9c..7ce5cabd7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -169,6 +169,14 @@ Rules: - Run parallel lanes only for packages that do not depend on each other. - If unsure, serialize the builds. +## Cross-distribution sync + +- Work from the clean checked-out heads of rolling, lyrical, kilted, jazzy, and humble; create `codex/cross-distro-sync` in each repo and never merge their independent histories. +- Classify every candidate before editing: portable shared tooling/CI/metadata, conditional package fix requiring a compatible source and refreshed patch, or excluded distro-owned state. +- Keep rosdistro snapshots, mutex/build numbers, ABI/compiler/Python pins, channels/upload targets, package selection, generated recipes, and temporary rebuild controls distro-owned. +- Port patches only for an existing compatible package, using `patch/ros-$DISTRO-.patch` and matching recipe wiring; do not copy a patch solely because its filename exists elsewhere. +- Validate changed patch metadata with `pixi run check-patches` and each changed package with `pixi run build-one ros-$DISTRO-`; inspect final diffs for protected state. + ## Inspect a built conda package ```bash From 8e515e55a4f6d8ce9ecd996d80b3c890b31074d4 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Fri, 28 Aug 2026 08:25:30 +1000 Subject: [PATCH 002/180] ci: harden shared source and build caches --- .github/workflows/testpr.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/testpr.yml b/.github/workflows/testpr.yml index 4b7d80499..4d38a6736 100644 --- a/.github/workflows/testpr.yml +++ b/.github/workflows/testpr.yml @@ -60,6 +60,11 @@ jobs: with: frozen: true + - name: Disable git auto-maintenance in source caches + shell: bash -l {0} + run: | + git config --global maintenance.auto false + - name: Long paths workarounds for win-64 shell: bash -l {0} if: matrix.platform == 'win-64' From da373ce97b7266052355835c865e1c6146404fa8 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Fri, 28 Aug 2026 08:25:31 +1000 Subject: [PATCH 003/180] build: identify the platform in gap reports --- build_gap_report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_gap_report.py b/build_gap_report.py index 47c671996..4b53949ed 100644 --- a/build_gap_report.py +++ b/build_gap_report.py @@ -143,7 +143,7 @@ def main() -> int: print() missing = recipes - built print( - f"Recipe directories without built artifact on this platform: " + f"Recipe directories without built artifact on {platform} platform: " f"{len(missing)} out of {len(recipes)}" ) if missing: From d7cfa0ba7f0ffa24eea72d0370a97aa4386ff7c8 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Fri, 28 Aug 2026 13:40:03 +1000 Subject: [PATCH 004/180] vinca: sync released package seeds --- vinca.yaml | 188 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) diff --git a/vinca.yaml b/vinca.yaml index 1791026cd..ca4f386fe 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -190,26 +190,131 @@ packages_select_by_deps: # These packages are currently not build on Windows, but they be with some work - if: not win then: + - ament_cmake + - ament_cmake_vendor_package + - apex_test_tools + - apriltag - apriltag_detector_mit - apriltag_detector_umich - apriltag_draw - apriltag_tools + - automatika_embodied_agents + - automatika_ros_sugar - autoware_core - autoware_core_control # depends on autoware_motion_utils - autoware_core_localization # depends on autoware_ekf_localizer - autoware_ekf_localizer # Windows error: error C2338: static_assert failed: 'First argument to logging macros must be an rclcpp::Logger' + - autoware_internal_localization_msgs - autoware_lanlet2_utils # Windows errors: C3546 (no parameter packs to expand), C2678 (no operator '|' for transform_view) - autoware_motion_utils # Windows error: error C2765: 'function': an explicit specialization of a function template cannot have any default arguments - autoware_osqp_interface - autoware_pose_initializer # depends on autoware_motion_utils - autoware_qp_interface - autoware_trajectory # depends on autoware_motion_utils + - avt_vimba_camera + - bno055 + - cartographer_ros + - cascade_lifecycle_msgs + - color_util + - control_msgs + - control_toolbox + - demo_nodes_cpp + - demo_nodes_py + - diff_drive_controller - dual-laser-merger + - event_camera_codecs + - event_camera_renderer - ffmpeg_image_transport # TODO on windows: fix iconv link issue - foxglove_compressed_video_transport + - geodesy + - geographic_info + - geometry_tutorials + - graph_msgs - grid_map # rviz linking problems on Windows, see https://github.com/RoboStack/ros-jazzy/pull/79#issuecomment-2993499990 + - imu_tools + - imu_transformer + - io_context + - joint_state_publisher + - joy + - ament_flake8 + - ament_lint + - ament_lint_common + - ament_pep257 + - ament_pycodestyle + - autoware_adapi_v1_msgs + - autoware_adapi_version_msgs + - autoware_auto_msgs + - autoware_internal_debug_msgs + - autoware_internal_metric_msgs + - autoware_internal_perception_msgs + - autoware_internal_planning_msgs + - autoware_lanelet2_extension + - autoware_lanelet2_extension_python + - autoware_lint_common + - autoware_msgs + - autoware_utils_debug + - autoware_utils_diagnostics + - autoware_utils_geometry + - autoware_utils_logging + - autoware_utils_math + - autoware_utils_pcl + - autoware_utils_rclcpp + - autoware_utils_system + - autoware_utils_tf + - autoware_utils_uuid + - autoware_utils_visualization + - builtin_interfaces + - irobot_create_msgs + - joy_teleop + - key_teleop + - mavros_msgs + - mouse_teleop + - mujoco_ros2_control_msgs + - mujoco_vendor + - osrf_testing_tools_cpp + - pick_ik + - picknik_ament_copyright + - point_cloud_transport_py + - rclc + - rclcpp + - rclpy + - rclpy_cascade_lifecycle + - rcpputils + - rcutils + - rmw + - rosidl_generator_dds_idl + - rosidl_runtime_c + - rosidl_runtime_cpp + - rosidl_typesupport_introspection_c + - rosidl_typesupport_introspection_cpp + - rqt_robot_monitor + - rqt_runtime_monitor + - rtabmap + - rtest + - rviz_2d_overlay_msgs + - teleop_tools + - tracetools + - tracetools_launch + - tracetools_trace + - turtlebot3_gazebo + - urdf_launch + - yaml_cpp_vendor + - if: not wasm32 + then: + - joy_linux + - kinematics_interface + - kinematics_interface_kdl - laser-segmentation - libg2o + - librealsense2 + - marker_msgs + - mavlink + - mavros_extras + - microstrain_inertial_description + - microstrain_inertial_driver + - microstrain_inertial_examples + - microstrain_inertial_msgs + - microstrain_inertial_rqt - mocap4r2_control - mocap4r2_control_msgs - mocap4r2_dummy_driver @@ -218,24 +323,107 @@ packages_select_by_deps: - mocap4r2_marker_viz_srvs - mocap4r2_robot_gt - mocap4r2_robot_gt_msgs + - motion_capture_tracking - moveit-hybrid-planning # Windows error: error C3861: '__builtin_unreachable': identifier not found - moveit-py - moveit-ros-occupancy-map-monitor - moveit-ros-perception - moveit-runtime + - moveit_resources + - moveit_task_constructor_demo + - mujoco_ros2_control + - mujoco_ros2_control_demos + - nmea_msgs - odom_to_tf_ros2 - ouster_ros # TODO on windows: cannot open pcl_io.lib + - pal_statistics + - pilz_industrial_motion_planner - pinocchio + - plotjuggler - plotjuggler-ros + - plotjuggler_msgs - pointcloud-to-laserscan + - polygon_utils + - py_trees_js + - py_trees_ros_tutorials + - radar_msgs + - random_numbers + - rclc_examples + - rclc_lifecycle + - rclc_parameter + - rclcpp_cascade_lifecycle + - realsense2_camera + - realsense2_description + - realtime_tools + - rmf_demos + - rmw_stats_shim + - robotiq_controllers + - robotiq_description + - ros2_control_cmake + - ros_core + - ros_gz_interfaces + - rosbag2_performance_benchmarking + - rosbag2_storage_mcap + - rosgraph_monitor_msgs + - rosidl_generator_dds_idl - rplidar_ros + - rqt + - rqt_controller_manager + - rqt_gui + - if: not win + then: + - rqt_image_overlay - rqt_mocap4r2_control + - rqt_moveit + - rqt_robot_dashboard + - rqt_robot_monitor + - rqt_robot_steering - rqt_tf_tree - rslidar_sdk + - rtcm_msgs + - rviz2 + - if: linux + then: + - rviz_2d_overlay_plugins - rviz_satellite + - sdl2_vendor + - septentrio_gnss_driver - serial_driver + - sick_safetyscanners2 + - sick_safetyscanners2_interfaces + - sick_safetyscanners_base + - simulation_interfaces + - slider_publisher + - spacenav - swri_console # Until sync of: https://github.com/ros/rosdistro/pull/49750 + - system_modes + - teleop_tools + - tf_transformations + - topic_tools + - trac_ik + - if: not wasm32 and not win + then: + - turtle_tf2_cpp + - turtle_tf2_py + - turtlebot3_gazebo + - turtlebot3_simulations + - ublox_dgnss + - ublox_dgnss_node + - ublox_ubx_interfaces + - udp_driver + - ur_calibration + - ur_robot_driver + - urg_node - velodyne + - vision_msgs + - vision_msgs_rviz_plugins + - vision_msgs_rviz_plugins + - visp + - web_video_server + - if: linux and not aarch64 + then: + - webots_ros2 + - zed_msgs patch_dir: patch rosdistro_snapshot: rosdistro_snapshot.yaml From 2040bb4f523f10385b944fe74795baf2d935ec9e Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Fri, 28 Aug 2026 14:00:48 +1000 Subject: [PATCH 005/180] vinca: skip unreleased rolling dependency chains --- vinca.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/vinca.yaml b/vinca.yaml index ca4f386fe..7d2fc1a91 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -289,7 +289,6 @@ packages_select_by_deps: - rosidl_typesupport_introspection_cpp - rqt_robot_monitor - rqt_runtime_monitor - - rtabmap - rtest - rviz_2d_overlay_msgs - teleop_tools @@ -372,7 +371,6 @@ packages_select_by_deps: - rqt_gui - if: not win then: - - rqt_image_overlay - rqt_mocap4r2_control - rqt_moveit - rqt_robot_dashboard From a7de6f92c34a7475df4fa002996cebb7ece70b60 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 30 Aug 2026 10:42:46 +1000 Subject: [PATCH 006/180] patch: refresh async web server compatibility --- patch/ros-rolling-async-web-server-cpp.patch | 80 ++------------------ 1 file changed, 7 insertions(+), 73 deletions(-) diff --git a/patch/ros-rolling-async-web-server-cpp.patch b/patch/ros-rolling-async-web-server-cpp.patch index 03958773c..2185a58d9 100644 --- a/patch/ros-rolling-async-web-server-cpp.patch +++ b/patch/ros-rolling-async-web-server-cpp.patch @@ -1,51 +1,24 @@ diff --git a/include/async_web_server_cpp/http_connection.hpp b/include/async_web_server_cpp/http_connection.hpp -index 62ccd89..646359e 100644 --- a/include/async_web_server_cpp/http_connection.hpp +++ b/include/async_web_server_cpp/http_connection.hpp -@@ -40,7 +40,7 @@ public: - ReadHandler; - typedef std::shared_ptr ResourcePtr; - -- explicit HttpConnection(boost::asio::io_service& io_service, -+ explicit HttpConnection(boost::asio::io_context& io_context, - HttpServerRequestHandler request_handler); - - boost::asio::ip::tcp::socket& socket(); @@ -79,7 +79,7 @@ private: void handle_write(const boost::system::error_code& e, std::vector resources); -- boost::asio::io_service::strand strand_; +- boost::asio::io_context::strand strand_; + boost::asio::strand strand_; boost::asio::ip::tcp::socket socket_; HttpServerRequestHandler request_handler_; boost::array buffer_; -diff --git a/include/async_web_server_cpp/http_server.hpp b/include/async_web_server_cpp/http_server.hpp -index f772f55..ee99c72 100644 ---- a/include/async_web_server_cpp/http_server.hpp -+++ b/include/async_web_server_cpp/http_server.hpp -@@ -40,7 +40,7 @@ private: - - void handle_accept(const boost::system::error_code& e); - -- boost::asio::io_service io_service_; -+ boost::asio::io_context io_context_; - boost::asio::ip::tcp::acceptor acceptor_; - std::size_t thread_pool_size_; - std::vector> threads_; diff --git a/src/http_connection.cpp b/src/http_connection.cpp -index bcb77d4..17a02ad 100644 --- a/src/http_connection.cpp +++ b/src/http_connection.cpp -@@ -6,9 +6,9 @@ - namespace async_web_server_cpp - { +@@ -8,7 +8,7 @@ namespace async_web_server_cpp --HttpConnection::HttpConnection(boost::asio::io_service& io_service, -+HttpConnection::HttpConnection(boost::asio::io_context& io_context, + HttpConnection::HttpConnection(boost::asio::io_context& io_service, HttpServerRequestHandler handler) - : strand_(io_service), socket_(io_service), request_handler_(handler), -+ : strand_(io_context.get_executor()), socket_(io_context), request_handler_(handler), ++ : strand_(io_service.get_executor()), socket_(io_service), request_handler_(handler), write_in_progress_(false) { } @@ -60,50 +33,11 @@ index bcb77d4..17a02ad 100644 callback, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred))); diff --git a/src/http_server.cpp b/src/http_server.cpp -index 2c1c4ea..502cf4b 100644 --- a/src/http_server.cpp +++ b/src/http_server.cpp -@@ -8,14 +8,12 @@ namespace async_web_server_cpp - HttpServer::HttpServer(const std::string& address, const std::string& port, - HttpServerRequestHandler request_handler, - std::size_t thread_pool_size) -- : acceptor_(io_service_), thread_pool_size_(thread_pool_size), -+ : acceptor_(io_context_), thread_pool_size_(thread_pool_size), - request_handler_(request_handler) - { +@@ -13,7 +13,7 @@ HttpServer::HttpServer(const std::string& address, const std::string& port, -- boost::asio::ip::tcp::resolver resolver(io_service_); -- boost::asio::ip::tcp::resolver::query query( -- address, port, boost::asio::ip::resolver_query_base::flags()); -- boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query); -+ boost::asio::ip::tcp::resolver resolver(io_context_); + boost::asio::ip::tcp::resolver resolver(io_service_); +- boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(address, port).begin(); + boost::asio::ip::tcp::endpoint endpoint = resolver.resolve(address, port).begin()->endpoint(); acceptor_.open(endpoint.protocol()); - acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); - acceptor_.bind(endpoint); -@@ -33,14 +31,14 @@ void HttpServer::run() - for (std::size_t i = 0; i < thread_pool_size_; ++i) - { - boost::shared_ptr thread(new boost::thread( -- boost::bind(&boost::asio::io_service::run, &io_service_))); -+ boost::bind(&boost::asio::io_context::run, &io_context_))); - threads_.push_back(thread); - } - } - - void HttpServer::start_accept() - { -- new_connection_.reset(new HttpConnection(io_service_, request_handler_)); -+ new_connection_.reset(new HttpConnection(io_context_, request_handler_)); - acceptor_.async_accept(new_connection_->socket(), - boost::bind(&HttpServer::handle_accept, this, - boost::asio::placeholders::error)); -@@ -62,7 +60,7 @@ void HttpServer::stop() - acceptor_.cancel(); - acceptor_.close(); - } -- io_service_.stop(); -+ io_context_.stop(); - // Wait for all threads in the pool to exit. - for (std::size_t i = 0; i < threads_.size(); ++i) - threads_[i]->join(); From dbc7bcf04f187834b7111972af13ab5636e4bd29 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Thu, 3 Sep 2026 09:41:52 +1000 Subject: [PATCH 007/180] sync: rolling config from lyrical/kilted cross-distro sync - conda_build_config.yaml: add cmake 3.* workaround pin (avoids CMake 4 regression hitting ament packages on macOS/conda) - vinca.yaml: use conda-forge iceoryx 2.0.6 packages instead of ROS release copies (matches lyrical) - vinca.yaml: skip libpointmatcher (unreleased for rolling) so rtabmap can be added without breaking recipe generation - vinca.yaml: add rtabmap seed package (released for rolling) Co-Authored-By: Claude Sonnet 4.6 --- conda_build_config.yaml | 3 +++ vinca.yaml | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/conda_build_config.yaml b/conda_build_config.yaml index 8bbf15cea..230643ab8 100644 --- a/conda_build_config.yaml +++ b/conda_build_config.yaml @@ -2,6 +2,9 @@ numpy: - 2 assimp: - 6.0.5 +# Workaround for https://github.com/RoboStack/ros-jazzy/pull/40#issuecomment-2782226697 +cmake: + - 3.* libprotobuf: - 7.35.1 protobuf: diff --git a/vinca.yaml b/vinca.yaml index 7d2fc1a91..58224ea9d 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -25,6 +25,8 @@ mutex_package: packages_skip_by_deps: - rplidar_ros - rviz_visual_tools + # libpointmatcher not yet released for rolling; skip rtabmap until it is + - libpointmatcher - if: not linux then: @@ -35,6 +37,12 @@ packages_skip_by_deps: packages_remove_from_deps: + # Use the conda-forge iceoryx 2.0.6 packages instead of rebuilding the ROS + # release copies. + - iceoryx_binding_c + - iceoryx_hoofs + - iceoryx_posh + - if: not linux then: - pendulum_control @@ -145,6 +153,7 @@ packages_select_by_deps: - rosidl_buffer_backend - rosidl_buffer_backend_registry - rosidl_buffer_py + - rtabmap - rviz_visual_tools - sbg_driver - simulation From 4a3838e908da55ea9252988c428edaeda3b5ee05 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Fri, 4 Sep 2026 10:59:09 +1000 Subject: [PATCH 008/180] fix: build_gap_report ignores check_patches_clean_apply.py leftover artifacts check_patches_clean_apply.py builds throwaway "-check-patches[-]" packages into the same output/ directory to verify patches apply. Those never have a matching recipes/ entry, so build_gap_report.py was reporting every one of them as a false "built but no recipe" gap. Co-Authored-By: Claude Sonnet 5 --- build_gap_report.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/build_gap_report.py b/build_gap_report.py index 4b53949ed..9fafbd602 100644 --- a/build_gap_report.py +++ b/build_gap_report.py @@ -8,12 +8,20 @@ from __future__ import annotations import argparse +import re from pathlib import Path from typing import Iterable, Set CONDA_SUFFIX = ".conda" TARBZ2_SUFFIX = ".tar.bz2" +# check_patches_clean_apply.py builds throwaway "-check-patches[-]" +# packages into this same output/ folder to verify patches apply (the +# platform suffix was added later; older leftover artifacts may lack it). They +# never have a matching recipes/ directory and would otherwise show up as false +# "built but no recipe" gaps. +_CHECK_PATCHES_RE = re.compile(r'-check-patches(?:-(?:linux|osx|win|emscripten|any))?$') + def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( @@ -60,7 +68,10 @@ def package_name_from_artifact(filename: str) -> str | None: parts = stem.rsplit("-", 2) if len(parts) != 3: return None - return parts[0] + name = parts[0] + if _CHECK_PATCHES_RE.search(name): + return None + return name def discover_platform_dirs(output_root: Path) -> list[str]: From a92cf0ad89e49538377f1c16567b12942f403b7d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Fri, 4 Sep 2026 22:52:39 +1000 Subject: [PATCH 009/180] sync: cross-distro pinning/tooling sync (opencv5/protobuf/vtk pins, vinca_pinning.yaml, check_dependency_compat.py) Co-Authored-By: Claude Sonnet 5 --- build_gap_report.py | 231 ++++++- check_dependency_compat.py | 1032 ++++++++++++++++++++++++++++++ conda_build_config.yaml | 1215 ++++++++++++++++++++++++++++++++++-- pixi.lock | 266 ++++---- pkg_additional_info.yaml | 5 +- vinca.yaml | 5 +- vinca_pinning.yaml | 52 ++ 7 files changed, 2595 insertions(+), 211 deletions(-) create mode 100644 check_dependency_compat.py create mode 100644 vinca_pinning.yaml diff --git a/build_gap_report.py b/build_gap_report.py index 9fafbd602..774c02f34 100644 --- a/build_gap_report.py +++ b/build_gap_report.py @@ -2,7 +2,11 @@ """Report gaps between generated recipes and built conda artifacts. Default behavior is platform-agnostic: it inspects all output/ folders that -contain conda artifacts and reports gaps per platform. +contain conda artifacts and reports gaps per platform. Only artifacts built with the +CURRENT build_number (and, for the mutex package, its own build_number) are counted — +older-build_number leftovers from a previous full rebuild are ignored, since counting +them makes the report claim far more packages are done than the current build actually +has. """ from __future__ import annotations @@ -15,6 +19,14 @@ CONDA_SUFFIX = ".conda" TARBZ2_SUFFIX = ".tar.bz2" +# Matches known conda platform directory names (osx-arm64, linux-64, win-64, …) +_PLATFORM_RE = re.compile(r'^(osx|linux|win|emscripten)-') + +# Strips distro prefix so ros-jazzy-rclcpp, ros2-rclcpp, ros-kilted-rclcpp all +# normalise to "rclcpp" for cross-naming-style comparison. +# Handles two forms: ros-- and ros- +_DISTRO_PREFIX_RE = re.compile(r'^(?:ros-[a-z]+-|ros\d+-)') + # check_patches_clean_apply.py builds throwaway "-check-patches[-]" # packages into this same output/ folder to verify patches apply (the # platform suffix was added later; older leftover artifacts may lack it). They @@ -22,6 +34,11 @@ # "built but no recipe" gaps. _CHECK_PATCHES_RE = re.compile(r'-check-patches(?:-(?:linux|osx|win|emscripten|any))?$') +_TOP_LEVEL_BUILD_NUMBER_RE = re.compile(r'^build_number:\s*(\d+)\s*$') +_MUTEX_HEADER_RE = re.compile(r'^mutex_package:\s*$') +_MUTEX_NAME_RE = re.compile(r'^\s+name:\s*"?([\w.-]+)"?\s*$') +_MUTEX_BUILD_NUMBER_RE = re.compile(r'^\s+build_number:\s*(\d+)\s*$') + def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( @@ -49,9 +66,38 @@ def parse_args() -> argparse.Namespace: "If omitted, all detected platform folders are inspected." ), ) + parser.add_argument( + "--vinca-yaml", + default="vinca.yaml", + help="vinca.yaml to read the current build_number/mutex from (default: vinca.yaml)", + ) + parser.add_argument( + "--build-number", + type=int, + default=None, + help="Override the build_number to filter artifacts by (default: parsed from --vinca-yaml)", + ) + parser.add_argument( + "--any-build-number", + action="store_true", + help="Don't filter by build_number at all (count every artifact regardless of age)", + ) + parser.add_argument( + "--pkg-additional-info", + default="pkg_additional_info.yaml", + help=( + "pkg_additional_info.yaml to read per-package build_number overrides from " + "(default: pkg_additional_info.yaml)" + ), + ) return parser.parse_args() +def normalize_name(name: str) -> str: + """Strip ros-- / ros2- prefix for cross-naming-style comparison.""" + return _DISTRO_PREFIX_RE.sub("", name) + + def is_conda_artifact(filename: str) -> bool: return filename.endswith(CONDA_SUFFIX) or filename.endswith(TARBZ2_SUFFIX) @@ -74,6 +120,105 @@ def package_name_from_artifact(filename: str) -> str | None: return name +def build_number_from_artifact(filename: str) -> int | None: + """Extract the trailing _ build number from a conda artifact's build string.""" + stem = filename + if stem.endswith(CONDA_SUFFIX): + stem = stem[: -len(CONDA_SUFFIX)] + elif stem.endswith(TARBZ2_SUFFIX): + stem = stem[: -len(TARBZ2_SUFFIX)] + else: + return None + + parts = stem.rsplit("-", 2) + if len(parts) != 3: + return None + build_string = parts[2] + suffix = build_string.rsplit("_", 1)[-1] + return int(suffix) if suffix.isdigit() else None + + +def read_vinca_config(vinca_yaml: Path) -> tuple[int | None, str | None, int | None]: + """Parse (build_number, mutex_package_name, mutex_build_number) out of vinca.yaml + without requiring a YAML library, since this script has no other dependencies.""" + if not vinca_yaml.is_file(): + return None, None, None + + build_number: int | None = None + mutex_name: str | None = None + mutex_build_number: int | None = None + in_mutex_block = False + + for line in vinca_yaml.read_text().splitlines(): + if in_mutex_block: + if line.startswith((" ", "\t")): + m = _MUTEX_NAME_RE.match(line) + if m: + mutex_name = m.group(1) + m = _MUTEX_BUILD_NUMBER_RE.match(line) + if m: + mutex_build_number = int(m.group(1)) + continue + in_mutex_block = False # fall through: this line starts the next top-level key + + m = _TOP_LEVEL_BUILD_NUMBER_RE.match(line) + if m: + build_number = int(m.group(1)) + continue + if _MUTEX_HEADER_RE.match(line): + in_mutex_block = True + + return build_number, mutex_name, mutex_build_number + + +_PKG_INFO_TOP_LEVEL_KEY_RE = re.compile(r'^([A-Za-z0-9_.]+):\s*(?:#.*)?$') +_PKG_INFO_BUILD_NUMBER_RE = re.compile(r'^\s+build_number:\s*(\d+)\s*$') + + +def read_pkg_build_number_overrides(pkg_info_yaml: Path) -> dict[str, int]: + """Parse per-package `build_number:` overrides out of pkg_additional_info.yaml — + a surgical way to force a rebuild of just one package without bumping vinca.yaml's + global build_number for everything. Keyed by the ROS package name as written there + (underscores), same convention as normalize_name(...).replace('-', '_').""" + overrides: dict[str, int] = {} + if not pkg_info_yaml.is_file(): + return overrides + + current_key: str | None = None + for line in pkg_info_yaml.read_text().splitlines(): + if not line.strip() or line.lstrip().startswith("#"): + continue + if not line[0].isspace(): + m = _PKG_INFO_TOP_LEVEL_KEY_RE.match(line) + current_key = m.group(1) if m else None + continue + if current_key is None: + continue + m = _PKG_INFO_BUILD_NUMBER_RE.match(line) + if m: + overrides[current_key] = int(m.group(1)) + + return overrides + + +def expected_build_number( + norm_name: str, + build_number: int | None, + mutex_norm_name: str | None, + mutex_build_number: int | None, + pkg_build_number_overrides: dict[str, int], +) -> int | None: + """The build_number a package's artifact must carry to count as "current": + the mutex's own build_number for the mutex package, a per-package override from + pkg_additional_info.yaml if one exists for it, otherwise the global build_number.""" + if mutex_norm_name is not None and norm_name == mutex_norm_name and mutex_build_number is not None: + return mutex_build_number + override = pkg_build_number_overrides.get(norm_name.replace("-", "_")) + if override is not None: + return override + return build_number + + def discover_platform_dirs(output_root: Path) -> list[str]: platforms: list[str] = [] if not output_root.exists(): @@ -82,6 +227,8 @@ def discover_platform_dirs(output_root: Path) -> list[str]: for child in sorted(output_root.iterdir()): if not child.is_dir(): continue + if not _PLATFORM_RE.match(child.name): + continue try: has_artifact = any( entry.is_file() and is_conda_artifact(entry.name) @@ -95,7 +242,14 @@ def discover_platform_dirs(output_root: Path) -> list[str]: return platforms -def built_packages_for_platform(output_root: Path, platform: str) -> Set[str]: +def built_packages_for_platform( + output_root: Path, + platform: str, + build_number: int | None, + mutex_norm_name: str | None, + mutex_build_number: int | None, + pkg_build_number_overrides: dict[str, int], +) -> Set[str]: platform_dir = output_root / platform packages: Set[str] = set() if not platform_dir.exists() or not platform_dir.is_dir(): @@ -105,8 +259,19 @@ def built_packages_for_platform(output_root: Path, platform: str) -> Set[str]: if not artifact.is_file() or not is_conda_artifact(artifact.name): continue package_name = package_name_from_artifact(artifact.name) - if package_name: - packages.add(package_name) + if not package_name: + continue + norm_name = normalize_name(package_name) + + if build_number is not None: + artifact_build_number = build_number_from_artifact(artifact.name) + expected = expected_build_number( + norm_name, build_number, mutex_norm_name, mutex_build_number, pkg_build_number_overrides + ) + if artifact_build_number != expected: + continue + + packages.add(norm_name) return packages @@ -143,22 +308,62 @@ def main() -> int: ) return 1 + if args.any_build_number: + build_number, mutex_name, mutex_build_number = None, None, None + pkg_build_number_overrides: dict[str, int] = {} + else: + build_number, mutex_name, mutex_build_number = read_vinca_config(Path(args.vinca_yaml)) + if args.build_number is not None: + build_number = args.build_number + if build_number is None: + print( + f"Warning: could not read build_number from {args.vinca_yaml} " + "(pass --build-number or --any-build-number) — counting artifacts " + "from every build_number, including stale ones from earlier rebuilds.\n" + ) + pkg_build_number_overrides = read_pkg_build_number_overrides(Path(args.pkg_additional_info)) + mutex_norm_name = normalize_name(mutex_name) if mutex_name else None + + if build_number is not None: + mutex_note = ( + f", mutex build_number {mutex_build_number}" if mutex_build_number is not None else "" + ) + override_note = ( + f", {len(pkg_build_number_overrides)} per-package override(s) from {args.pkg_additional_info}" + if pkg_build_number_overrides + else "" + ) + print(f"Filtering to build_number {build_number}{mutex_note}{override_note}\n") + for idx, platform in enumerate(selected_platforms): - built = built_packages_for_platform(output_root, platform) + built = built_packages_for_platform( + output_root, platform, build_number, mutex_norm_name, mutex_build_number, pkg_build_number_overrides + ) + + # Normalize recipe names for comparison so ros-jazzy-X and ros2-X match. + # Iterate in sorted (not set-hash) order so the displayed name for a + # dual-named package is deterministic across runs, not whichever of the + # two happens to come last per Python's randomized set iteration order — + # "ros2-X" sorts after "ros--X" (- < digit in ASCII) so the + # shared ros2- convention consistently wins when both exist. + norm_to_recipe: dict[str, str] = {normalize_name(r): r for r in sorted(recipes)} + norm_recipes = set(norm_to_recipe) print(f"Platform: {platform}") - print_list( - "Built package artifacts without matching recipe directory", - built - recipes, - ) + extra_norm = built - norm_recipes + extra_display = sorted(extra_norm) + print(f"Built package artifacts without matching recipe directory: {len(extra_display)}") + for name in extra_display: + print(f" - {name}") print() - missing = recipes - built + missing_norm = norm_recipes - built + missing_display = sorted(norm_to_recipe[n] for n in missing_norm) print( f"Recipe directories without built artifact on {platform} platform: " - f"{len(missing)} out of {len(recipes)}" + f"{len(missing_display)} out of {len(norm_recipes)}" ) - if missing: - for recipe in sorted(missing): + if missing_display: + for recipe in missing_display: print(f" - {recipe}") if idx != len(selected_platforms) - 1: diff --git a/check_dependency_compat.py b/check_dependency_compat.py new file mode 100644 index 000000000..fec282555 --- /dev/null +++ b/check_dependency_compat.py @@ -0,0 +1,1032 @@ +#!/usr/bin/env python3 +"""Detect incompatible dependency pins before (or after) building ROS packages. + +Three modes, all platform-agnostic (default platform: the current machine): + +1. ``solve`` (default): collect every non-ROS ``host``/``run`` dependency from the + generated ``recipes/`` tree, add the ``mutex_package.run_constraints`` from + ``vinca.yaml`` as hard requirements, write them into a single fake recipe and + solve it with ``rattler-build --render-only --with-solve`` against the real + ``conda_build_config.yaml``. Nothing is built or downloaded except repodata. + If the solve fails, the offending dependencies are removed iteratively so that + *all* conflicts are reported, each with a focused explanation and the list of + generated recipes that need it. + +2. ``--migrations`` (on by default when conflicts are found): for every conflict, + look up which conda-forge migration touches the pinned library and where the + culprit's feedstock stands in that migration (done / in-pr / awaiting-parents …). + This is the to-do list for conda-forge. + +3. ``--stale``: inspect already-built artifacts (``output//repodata.json`` + or a channel URL) and list ROS packages whose ``depends`` cannot be satisfied + under the current mutex constraints / pins. With ``--delete`` the local + artifacts are removed (and the local index refreshed) so that a subsequent + ``pixi run build`` (``--skip-existing``) rebuilds only those packages. A + ``pkg_additional_info.yaml`` build-number snippet is printed for the case where + the stale builds are already on the channel. + +Run inside the pixi environment, e.g. ``pixi run python check_dependency_compat.py``. +""" + +from __future__ import annotations + +import argparse +import json +import os +import platform as _platform +import re +import shutil +import subprocess +import sys +import tomllib +from collections import defaultdict +from pathlib import Path +from typing import Any, Iterable, Iterator, Optional +from urllib.request import urlopen + +import ruamel.yaml + +ROS_PREFIXES = ("ros-", "ros2-") +DEFAULT_CHANNELS = ["https://repo.prefix.dev/conda-forge"] +FAKE_PACKAGE_NAME = "robostack-dependency-compat-check" +DEFAULT_GLIBC = "2.17" # fallback when c_stdlib_version is not in the variant config +DEFAULT_OSX = "15.0" +# "Platform: linux-64 [__unix=0=0, __linux=0=0, __glibc=0=0, ...]" -> a version of 0 means the +# virtual package is unknown for this (foreign) platform and every solve is meaningless. +_MISSING_VIRTUAL_RE = re.compile(r"Platform: \S+ \[[^\]]*?(__glibc|__osx|__cuda)=0=0") +_GLIBC_NEED_RE = re.compile(r"__glibc >=([0-9.]+)") +STATUS_CATEGORIES = ( + "done", + "in-pr", + "awaiting-pr", + "awaiting-parents", + "not-solvable", + "bot-error", +) + + +# --------------------------------------------------------------------------- utils +def _yaml() -> ruamel.yaml.YAML: + yaml = ruamel.yaml.YAML() + yaml.width = 4096 + yaml.indent(mapping=2, sequence=4, offset=2) + return yaml + + +def load_yaml(path: Path) -> Any: + with path.open(encoding="utf-8") as stream: + return _yaml().load(stream) or {} + + +def detect_platform() -> str: + machine = _platform.machine() + if sys.platform.startswith("linux"): + return "linux-aarch64" if machine == "aarch64" else "linux-64" + if sys.platform == "darwin": + return "osx-arm64" if machine == "arm64" else "osx-64" + if sys.platform == "win32": + return "win-64" + raise RuntimeError(f"Cannot detect conda platform for {sys.platform}/{machine}") + + +def normalized(name: str) -> str: + return name.lower().replace("_", "-") + + +def spec_name(spec: str) -> str: + return spec.split()[0] + + +def is_ros_dependency(name: str) -> bool: + return name.startswith(ROS_PREFIXES) + + +def channels_from_pixi(pixi_toml: Path) -> list[str]: + """Take the channels of the ``build`` task so the check matches real builds.""" + try: + with pixi_toml.open("rb") as stream: + data = tomllib.load(stream) + cmd = data["tasks"]["build"]["cmd"] + if isinstance(cmd, list): + cmd = " ".join(cmd) + except (OSError, KeyError, tomllib.TOMLDecodeError): + return list(DEFAULT_CHANNELS) + channels = re.findall(r"(?:^|\s)-c\s+(\S+)", cmd) + return channels or list(DEFAULT_CHANNELS) + + +def platform_flags(platform: str) -> dict[str, Any]: + """Selector namespace for the v0-style ``# [sel]`` comments in conda_build_config.yaml.""" + try: + from vinca.v1_selectors import _platform_flags # type: ignore + + flags: dict[str, Any] = dict(_platform_flags(platform)) + except ImportError: + os_name, _, arch = platform.partition("-") + flags = { + "target_platform": platform, + "linux": os_name == "linux", + "osx": os_name == "osx", + "win": os_name == "win", + "unix": os_name in ("linux", "osx", "emscripten"), + "emscripten": os_name == "emscripten", + "wasm32": arch == "wasm32", + "x86_64": arch == "64", + "x86": arch == "64", + "aarch64": arch in ("aarch64", "arm64"), + "arm64": arch in ("aarch64", "arm64"), + "ppc64le": arch == "ppc64le", + "riscv64": arch == "riscv64", + } + flags.setdefault("win64", platform == "win-64") + flags.setdefault("os", os) + return flags + + +def eval_selector(selector: str, flags: dict[str, Any]) -> bool: + try: + from vinca.v1_selectors import _eval_condition # type: ignore + + return bool(_eval_condition(selector, flags)) + except Exception: # fall back to a plain python eval of the selector + try: + return bool(eval(selector, {"__builtins__": {}}, dict(flags))) # noqa: S307 + except Exception: + return False + + +# ----------------------------------------------------------------- requirements +def walk_requirements( + value: Any, condition: Optional[str] = None +) -> Iterator[tuple[Optional[str], str]]: + """Yield ``(condition, spec)`` for every requirement, keeping if/then/else.""" + if isinstance(value, str): + yield condition, value.strip() + elif isinstance(value, list): + for item in value: + yield from walk_requirements(item, condition) + elif isinstance(value, dict): + if "if" in value: + cond = str(value["if"]).strip() + then_cond = cond if condition is None else f"({condition}) and ({cond})" + else_cond = f"not ({cond})" if condition is None else f"({condition}) and not ({cond})" + yield from walk_requirements(value.get("then"), then_cond) + if value.get("else") is not None: + yield from walk_requirements(value.get("else"), else_cond) + else: + for item in value.values(): + yield from walk_requirements(item, condition) + + +def collect_requirements( + recipes_dir: Path, sections: Iterable[str] = ("host", "run") +) -> dict[tuple[Optional[str], str], set[str]]: + """Map ``(condition, spec)`` to the recipe names that require it.""" + yaml = _yaml() + requirements: dict[tuple[Optional[str], str], set[str]] = defaultdict(set) + for recipe_path in sorted(recipes_dir.glob("*/recipe.yaml")): + with recipe_path.open(encoding="utf-8") as stream: + recipe = yaml.load(stream) or {} + name = recipe.get("package", {}).get("name", recipe_path.parent.name) + reqs = recipe.get("requirements", {}) or {} + for section in sections: + for condition, spec in walk_requirements(reqs.get(section)): + if not spec or "${{" in spec: + continue + if is_ros_dependency(spec_name(spec)): + continue + requirements[(condition, spec)].add(name) + return requirements + + +def mutex_constraints(vinca_conf: dict[str, Any]) -> list[str]: + mutex = vinca_conf.get("mutex_package") + if isinstance(mutex, dict): + return [str(item) for item in mutex.get("run_constraints", []) or []] + return [] + + +def write_fake_recipe( + path: Path, + pins: list[str], + requirements: Iterable[tuple[Optional[str], str]], + version: str = "0.0.0", +) -> None: + grouped: dict[Optional[str], list[str]] = defaultdict(list) + for condition, spec in requirements: + if spec not in grouped[condition]: + grouped[condition].append(spec) + host: list[Any] = list(pins) + host.extend(sorted(grouped.pop(None, []))) + for condition in sorted(grouped, key=str): + host.append({"if": condition, "then": sorted(grouped[condition])}) + recipe = { + "package": {"name": FAKE_PACKAGE_NAME, "version": version}, + "build": {"number": 0, "script": ""}, + "requirements": {"build": [], "host": host, "run": []}, + "about": { + "summary": "Synthetic package used to check that all RoboStack " + "dependencies are co-installable under the current pins. Never built." + }, + } + path.parent.mkdir(parents=True, exist_ok=True) + with path.open("w", encoding="utf-8") as stream: + _yaml().dump(recipe, stream) + + +# ------------------------------------------------------------------------ solve +def glibc_floor(variant_config: Path, platform: str) -> str: + """The glibc floor the packages are built for (``c_stdlib_version`` on linux).""" + if os.environ.get("CONDA_OVERRIDE_GLIBC"): + return os.environ["CONDA_OVERRIDE_GLIBC"] + try: + return variant_pins(variant_config, platform).get("c-stdlib-version", DEFAULT_GLIBC) + except OSError: + return DEFAULT_GLIBC + + +def rattler_build_executable() -> list[str]: + exe = shutil.which("rattler-build") + if exe: + return [exe] + if shutil.which("pixi"): + return ["pixi", "run", "rattler-build"] + raise SystemExit("rattler-build not found; run this script via `pixi run python ...`") + + +def run_solve( + recipe: Path, + variant_config: Path, + channels: list[str], + platform: str, + output_dir: Path, + *, + verbose: bool = False, +) -> tuple[bool, str]: + cmd = rattler_build_executable() + [ + "build", + "--recipe", + str(recipe), + "-m", + str(variant_config), + "--render-only", + "--with-solve", + "--target-platform", + platform, + "--build-platform", + platform, + "--output-dir", + str(output_dir), + "--color", + "never", + ] + for channel in channels: + cmd += ["-c", channel] + env = dict(os.environ, COLUMNS="500", NO_COLOR="1", RATTLER_BUILD_NO_SPINNER="1") + # Solving for a foreign platform yields __glibc=0 / __osx=0 virtual packages, which + # makes every package look uninstallable. Provide sane defaults unless overridden. + if platform.startswith("linux"): + env.setdefault("CONDA_OVERRIDE_GLIBC", glibc_floor(variant_config, platform)) + elif platform.startswith("osx") and sys.platform != "darwin": + env.setdefault("CONDA_OVERRIDE_OSX", DEFAULT_OSX) + if verbose: + print(" $", " ".join(cmd), file=sys.stderr) + proc = subprocess.run(cmd, capture_output=True, text=True, env=env) + text = proc.stdout + "\n" + proc.stderr + failed = proc.returncode != 0 or "Cannot solve the request" in text + return (not failed), text + + +_ANSI_RE = re.compile(r"\x1b\[[0-9;]*m") +_TREE_RE = re.compile(r"^(?P[\s│]*)(?:├─|└─)\s+(?P[A-Za-z0-9_.+-]+)") + + +def solver_block(text: str) -> str: + """Return the final 'Cannot solve the request because of:' tree, cleaned.""" + text = _ANSI_RE.sub("", text) + marker = "Cannot solve the request because of:" + index = text.rfind(marker) + if index == -1: + return text.strip() + return text[index:].strip() + + +def collapse_versions(text: str) -> str: + """Collapse '7.6.0 | 7.6.0 | 7.6.0 ...' noise into '7.6.0 (x12)'.""" + + def repl(match: re.Match[str]) -> str: + items = [item.strip() for item in match.group(0).split("|")] + return f"{items[0]} (x{len(items)})" + + return re.sub(r"(\S+)(?:\s*\|\s*\1)+", repl, text) + + +def parse_culprits(text: str, candidates: set[str], protected: set[str]) -> set[str]: + """Names of directly requested (top-level) specs that the solver blames.""" + block = solver_block(text) + lines = block.splitlines() + entries: list[tuple[int, str]] = [] + for line in lines[1:]: + match = _TREE_RE.match(line) + if match: + entries.append((len(match.group("indent")), match.group("name"))) + culprits: set[str] = set() + if entries: + # Top level of the tree = the requested specs the solver blames. + min_indent = min(indent for indent, _ in entries) + for indent, name in entries: + if indent == min_indent and name in candidates and name not in protected: + culprits.add(name) + # The first line names one requested spec too ("because of: ... cannot be + # installed"), unless it is the generic "The following packages are incompatible". + first = re.match(r"Cannot solve the request because of:\s*([A-Za-z0-9_.+-]+)", lines[0]) if lines else None + if first and first.group(1) in candidates and first.group(1) not in protected: + culprits.add(first.group(1)) + # "No candidates were found for " (spec does not exist at all on the channels). + for match in re.finditer(r"No candidates were found for\s+([A-Za-z0-9_.+-]+)", block): + if match.group(1) in candidates and match.group(1) not in protected: + culprits.add(match.group(1)) + if not culprits: + # Fallback: any requested dependency the solver mentions as uninstallable. + for match in re.finditer(r"([A-Za-z0-9_.+-]+)\s+\S[^\n]*?cannot be installed", block): + name = match.group(1) + if name in candidates and name not in protected: + culprits.add(name) + return culprits + + +def pin_consistency(pins: list[str], variant: dict[str, str]) -> list[tuple[str, str]]: + """Mutex run_constraints that contradict the rendered conda_build_config.yaml pins.""" + problems = [] + for spec in pins: + parts = spec.split() + if len(parts) < 2: + continue + pinned = variant.get(normalized(parts[0])) + if pinned is not None and not constraint_compatible(parts[1], pinned): + problems.append((spec, f"{parts[0]} {pinned}")) + return problems + + +def _by_name(requirements: Iterable[tuple[Optional[str], str]]) -> dict[str, list[tuple[Optional[str], str]]]: + grouped: dict[str, list[tuple[Optional[str], str]]] = defaultdict(list) + for condition, spec in requirements: + grouped[spec_name(spec)].append((condition, spec)) + return grouped + + +class Solver: + """Thin wrapper that writes a fake recipe and solves it with rattler-build.""" + + def __init__(self, args: argparse.Namespace, channels: list[str], workdir: Path) -> None: + self.args = args + self.channels = channels + self.workdir = workdir + self.calls = 0 + + def solve(self, label: str, pins: list[str], requirements: Iterable[tuple[Optional[str], str]]) -> tuple[bool, str]: + recipe = self.workdir / label / "recipe.yaml" + write_fake_recipe(recipe, pins, requirements) + self.calls += 1 + return run_solve( + recipe, + Path(self.args.variant_config), + self.channels, + self.args.platform, + self.workdir / "output", + verbose=self.args.verbose, + ) + + def find_partner( + self, + culprit: str, + culprit_specs: list[tuple[Optional[str], str]], + pins: list[str], + others: dict[str, list[tuple[Optional[str], str]]], + ) -> Optional[list[str]]: + """Bisect the other dependencies down to the (few) names the culprit clashes with.""" + candidates = sorted(others) + + def fails(names: list[str]) -> bool: + specs = list(culprit_specs) + for name in names: + specs.extend(others[name]) + ok, _ = self.solve(f"bisect-{culprit}", pins, specs) + return not ok + + if not fails(candidates): + return None + while len(candidates) > 1: + half = len(candidates) // 2 + first, second = candidates[:half], candidates[half:] + if fails(first): + candidates = first + elif fails(second): + candidates = second + else: + return candidates # the clash needs members of both halves + return candidates + + +def solve_mode(args: argparse.Namespace) -> int: + recipes_dir = Path(args.recipes_dir) + if not any(recipes_dir.glob("*/recipe.yaml")): + raise SystemExit( + f"No recipes found in {recipes_dir}; run `pixi run generate-recipes` first." + ) + vinca_conf = load_yaml(Path(args.vinca)) + pins = mutex_constraints(vinca_conf) + list(args.pin) + variant = variant_pins(Path(args.variant_config), args.platform) + requirements = collect_requirements(recipes_dir) + names = {spec_name(spec) for _, spec in requirements} + channels = args.channel or channels_from_pixi(Path("pixi.toml")) + workdir = Path(args.workdir) + workdir.mkdir(parents=True, exist_ok=True) + solver = Solver(args, channels, workdir) + + print(f"Platform: {args.platform}") + print(f"Channels: {' '.join(channels)}") + print(f"Variant config: {args.variant_config} ({len(variant)} single-valued pins)") + print(f"Recipes: {len(list(recipes_dir.glob('*/recipe.yaml')))} in {recipes_dir}") + print(f"Dependencies: {len(names)} distinct non-ROS packages, {len(requirements)} specs") + print(f"Hard pins: {', '.join(pins) if pins else '(none)'}") + print() + + # 1. static check: mutex constraints vs. rendered conda_build_config.yaml + pin_conflicts: dict[str, dict[str, Any]] = {} + for spec, pinned in pin_consistency(pins, variant): + print(f"PIN MISMATCH: mutex run_constraint '{spec}' vs {args.variant_config} '{pinned}'") + pin_conflicts[spec_name(spec)] = {"mutex": spec, "variant": pinned, "explanation": "static"} + if pin_conflicts: + print(" -> align mutex_package.run_constraints in vinca.yaml with the rendered pins" + " (or drop the migration from vinca_pinning.yaml).\n") + + # 2. iterative solve of the whole dependency set + protected = {spec_name(spec) for spec in pins} + active_pins = list(pins) + excluded: dict[str, str] = {} + active = dict(requirements) + solved = False + for iteration in range(1, args.max_iterations + 1): + count = len({spec_name(s) for _, s in active}) + print(f"[{iteration}] solving {count} dependencies + {len(active_pins)} pins ...", flush=True) + ok, text = solver.solve(FAKE_PACKAGE_NAME, active_pins, active.keys()) + if ok: + solved = True + break + virtual = _MISSING_VIRTUAL_RE.search(_ANSI_RE.sub("", text)) + if virtual: + print(f"\nThe solver lacks the virtual package {virtual.group(1)} for {args.platform}.") + print("Set CONDA_OVERRIDE_GLIBC / CONDA_OVERRIDE_OSX / CONDA_OVERRIDE_CUDA and retry.\n") + return 2 + blamed = parse_culprits(text, names | protected, set()) + removable = blamed - protected + blamed_pins = blamed & protected + if removable: + for culprit in sorted(removable): + print(f" conflict: {culprit}") + excluded[culprit] = text + active = {key: value for key, value in active.items() if spec_name(key[1]) != culprit} + elif blamed_pins: + for name in sorted(blamed_pins): + mutex_spec = next(s for s in active_pins if spec_name(s) == name) + print(f" pin conflict: {mutex_spec} (dropping it to continue)") + pin_conflicts.setdefault(name, {"mutex": mutex_spec, "variant": variant.get(normalized(name))}) + pin_conflicts[name]["explanation"] = collapse_versions(solver_block(text)) + active_pins = [s for s in active_pins if spec_name(s) != name] + protected.discard(name) + else: + print("\nSolver failed but no removable culprit could be identified:\n") + print(collapse_versions(solver_block(text))) + break + else: + print(f"Stopped after {args.max_iterations} iterations; raise --max-iterations.") + + print() + if solved and not excluded and not pin_conflicts: + print("OK: every dependency is co-installable under the current pins.") + return 0 + + report_conflicts(args, solver, excluded, pin_conflicts, requirements, active_pins, variant, solved) + return 1 + + +def report_conflicts( + args: argparse.Namespace, + solver: Solver, + excluded: dict[str, str], + pin_conflicts: dict[str, dict[str, Any]], + requirements: dict[tuple[Optional[str], str], set[str]], + pins: list[str], + variant: dict[str, str], + solved: bool, +) -> None: + protected = {spec_name(spec) for spec in pins} + if pin_conflicts: + print(f"{len(pin_conflicts)} mutex constraint(s) contradict {args.variant_config}:") + for name, info in pin_conflicts.items(): + if info.get("variant") is None: + print(f"== {info['mutex']} was blamed by the solver for {args.platform} (no rendered pin to compare):") + else: + print(f"== {info['mutex']} vs {info['variant']}") + if info.get("explanation") not in (None, "static"): + for line in info["explanation"].splitlines()[: args.max_lines]: + print(" | " + line) + print() + if solved: + print(f"Dependencies solvable only after removing {len(excluded)} package(s):") + else: + print(f"Unsolvable; {len(excluded)} conflicting package(s) identified so far:") + print() + + by_name = _by_name(requirements) + details: dict[str, dict[str, Any]] = {} + for culprit in sorted(excluded): + specs = by_name[culprit] + recipes = sorted(set().union(*(requirements[key] for key in specs))) + ok, text = solver.solve(f"focus-{culprit}", pins, specs) + partners: list[str] = [] + partner_specs: list[tuple[Optional[str], str]] = [] + if ok: + others = {name: by_name[name] for name in by_name if name != culprit and name not in excluded} + print(f" {culprit}: installs alone; bisecting {len(others)} other dependencies for the clash ...", flush=True) + partners = solver.find_partner(culprit, specs, pins, others) or [] + partner_specs = [spec for name in partners for spec in by_name[name]] + ok, text = solver.solve(f"focus-{culprit}", pins, specs + partner_specs) + block = collapse_versions(solver_block(text)) if not ok else ( + "(no clash reproducible in isolation; it only appears in the full set)" + ) + # Precise attribution: which single mutex pin, when dropped, makes it solvable? + blamed_pins: list[str] = [] + if not ok: + for pin in pins: + relaxed = [other for other in pins if other != pin] + if solver.solve(f"attr-{culprit}", relaxed, specs + partner_specs)[0]: + blamed_pins.append(spec_name(pin)) + if not blamed_pins: # several pins at once, or a pin-independent problem + blamed_pins = sorted( + name for name in protected + if re.search(rf"(? 8 else ''}") + if clash: + print(f" clashes with: {'; '.join(clash)}") + if any(len(spec.split()) > 1 for _, spec in specs): + print(" note: the spec is version-restricted (dummy package in pkg_additional_info.yaml?);" + " a newer conda-forge version may already be built against the pinned libraries.") + glibc_needs = sorted({m.group(1) for m in _GLIBC_NEED_RE.finditer(block)}, key=version_tuple) + if glibc_needs and args.platform.startswith("linux"): + floor = glibc_floor(Path(args.variant_config), args.platform) + print(f" note: needs glibc >= {glibc_needs[-1]} but the build floor (c_stdlib_version /" + f" CONDA_OVERRIDE_GLIBC) is {floor}; conda-forge is moving to a newer sysroot.") + lines = block.splitlines() + for line in lines[: args.max_lines]: + print(" | " + line) + if len(lines) > args.max_lines: + print(f" | … ({len(lines) - args.max_lines} more lines)") + print() + + if args.json: + Path(args.json).write_text( + json.dumps({"pin_conflicts": pin_conflicts, "conflicts": details}, indent=2), encoding="utf-8" + ) + print(f"Wrote {args.json}") + print(f"({solver.calls} solver runs)") + + if args.migrations: + report_migrations(details, pin_conflicts, pins, Path(args.pinning)) + + +# ------------------------------------------------------------------- migrations +def _fetch_json(url: str) -> Optional[Any]: + try: + with urlopen(url, timeout=60) as response: # noqa: S310 + return json.load(response) + except Exception: + return None + + +def report_migrations( + details: dict[str, dict[str, Any]], + pin_conflicts: dict[str, dict[str, Any]], + pins: list[str], + pinning_path: Path, +) -> None: + try: + from vinca.pinning import ( # type: ignore + _migration_pin_keys, + download_pinning_package, + get_migration_status, + package_feedstocks, + ) + except ImportError: + print("vinca is not importable; skipping conda-forge migration lookup.") + return + if not pinning_path.exists(): + print(f"{pinning_path} not found; skipping conda-forge migration lookup.") + return + spec = load_yaml(pinning_path) + version = str(spec.get("conda_forge_pinning_version", "")) + applied = {str(name).removesuffix(".yaml") for name in spec.get("migrations", []) or []} + print(f"conda-forge migration status (conda-forge-pinning {version}):") + try: + _, payloads = download_pinning_package(version) + except Exception as exc: + print(f" could not download conda-forge-pinning {version}: {exc}") + return + migration_keys = {name: _migration_pin_keys(payload) for name, payload in payloads.items()} + status_cache: dict[str, Optional[dict[str, Any]]] = {} + + for name, info in pin_conflicts.items(): + if info.get("variant") is None: + print(f" mutex '{info['mutex']}' has no installable candidate together with the other pins and" + " dependencies (see explanation above); relax or drop the constraint, or fix the feedstock.") + continue + lib = normalized(name) + setters = sorted( + migration for migration, keys in migration_keys.items() + if any(key == lib or key.startswith(lib + "-") for key in keys) + ) + origin = ", ".join( + f"{m} ({'applied' if m in applied else 'not applied'} in {pinning_path.name})" for m in setters + ) or "the conda-forge-pinning base file" + print(f" mutex '{info['mutex']}' vs rendered pin '{info['variant']}' set by {origin}") + print(f" -> either update mutex_package.run_constraints in vinca.yaml to '{name} " + f"{str(info['variant']).split()[-1]}.*' (mutex build-number bump), or remove the migration.") + + for culprit, info in details.items(): + libs = [normalized(name) for name in info["pins"]] or [normalized(spec_name(p)) for p in pins] + relevant = sorted( + name + for name, keys in migration_keys.items() + if any(key == lib or key.startswith(lib + "-") or key.startswith(lib + "_") for key in keys for lib in libs) + ) + feedstocks = sorted(package_feedstocks(culprit)) + print(f" {culprit} (feedstock: {', '.join(feedstocks)}; pinned libs: {', '.join(libs)})") + if not relevant: + print( + " no active conda-forge migration touches these pins -> the feedstock's latest " + "build is simply behind; it needs a rerender/rebuild or version bump on conda-forge." + ) + for feedstock in feedstocks: + print(f" https://github.com/conda-forge/{feedstock}-feedstock") + continue + for migration in relevant: + if migration not in status_cache: + try: + status_cache[migration] = get_migration_status(migration) + except Exception: + status_cache[migration] = None + status = status_cache[migration] + tag = "applied locally" if migration in applied else "NOT applied locally" + if status is None: + print(f" {migration} [{tag}]: no status record on conda-forge") + continue + for feedstock in feedstocks: + category = next( + (cat for cat in STATUS_CATEGORIES if feedstock in {normalized(n) for n in status.get(cat, [])}), + None, + ) + pr_url = (status.get("_feedstock_status", {}).get(feedstock) or {}).get("pr_url", "") + where = category or "not part of this migration" + print(f" {migration} [{tag}]: {feedstock} -> {where} {pr_url}".rstrip()) + print() + print("Legend: 'done' but still conflicting = the pin here is ahead of/behind conda-forge;") + print(" 'in-pr'/'awaiting-parents' = wait for or help land the conda-forge PR;") + print(" no migration = open a rebuild/version-bump PR on the feedstock.") + + +# ----------------------------------------------------------------------- stale +_VERSION_PART_RE = re.compile(r"^(\d+)(.*)$") + + +def version_tuple(version: str) -> tuple[int, ...]: + parts: list[int] = [] + for part in version.strip().split("."): + match = _VERSION_PART_RE.match(part) + if not match: + break + parts.append(int(match.group(1))) + if match.group(2): # pre-release suffix such as '0a0': stop here + break + return tuple(parts) + + +def _pad(t: tuple[int, ...], n: int) -> tuple[int, ...]: + return t + (0,) * (n - len(t)) + + +def _cmp(a: tuple[int, ...], b: tuple[int, ...]) -> int: + n = max(len(a), len(b)) + a, b = _pad(a, n), _pad(b, n) + return (a > b) - (a < b) + + +def pin_range(pin_version: str) -> tuple[tuple[int, ...], tuple[int, ...], bool]: + """Return (lowest, upper_exclusive, exact) for a pin such as '1.90', '7.35.1.*' or '11.*'.""" + text = pin_version.strip() + exact = not text.endswith(".*") and "*" not in text + prefix = version_tuple(text.rstrip("*").rstrip(".")) + if not prefix: + return (0,), (10**9,), False + upper = prefix[:-1] + (prefix[-1] + 1,) + return prefix, upper, exact + + +def constraint_compatible(constraint: str, pin_version: str) -> bool: + """Whether some version can satisfy both the dependency constraint and the pin.""" + low, upper_excl, _ = pin_range(pin_version) + constraint = constraint.strip() + if constraint in ("", "*"): + return True + if "|" in constraint: + return any(constraint_compatible(part, pin_version) for part in constraint.split("|")) + for clause in [c.strip() for c in constraint.split(",") if c.strip()]: + if clause.startswith(">="): + if _cmp(upper_excl, version_tuple(clause[2:])) <= 0: + return False + elif clause.startswith(">"): + if _cmp(upper_excl, version_tuple(clause[1:])) <= 0: + return False + elif clause.startswith("<="): + if _cmp(low, version_tuple(clause[2:])) > 0: + return False + elif clause.startswith("<"): + if _cmp(low, version_tuple(clause[1:])) >= 0: + return False + elif clause.startswith("!="): + continue + else: + other = clause[2:] if clause.startswith("==") else clause + other_low, other_upper, _ = pin_range(other) + n = max(len(low), len(other_low)) + a, b = _pad(low, n), _pad(other_low, n) + k = min(len(low), len(other_low)) + if a[:k] != b[:k]: + return False + return True + + +_CBC_KEY_RE = re.compile(r"^([A-Za-z0-9_.-]+):\s*(?:#\s*\[(.+?)\])?\s*$") +_CBC_ITEM_RE = re.compile(r"^\s+-\s*(?P.*?)\s*(?:#\s*\[(?P.+?)\])?\s*$") + + +def variant_pins(variant_config: Path, platform: str) -> dict[str, str]: + """Single-valued pins from conda_build_config.yaml for this platform, keyed by dep name. + + The file is scanned line by line (not YAML-loaded) so that values such as ``2.10`` + keep their exact spelling and the ``# [selector]`` comments stay attached. + """ + flags = platform_flags(platform) + pins: dict[str, str] = {} + key: Optional[str] = None + key_active = False + chosen: list[str] = [] + + def flush() -> None: + if key and key_active and len(chosen) == 1: + pins[normalized(key)] = chosen[0].split()[0] + + for raw in variant_config.read_text(encoding="utf-8").splitlines(): + line = raw.rstrip() + if not line or line.lstrip().startswith("#"): + continue + key_match = _CBC_KEY_RE.match(line) + if key_match: + flush() + key, key_selector = key_match.group(1), key_match.group(2) + key_active = not key.startswith(("__", "zip_keys", "pin_run_as_build", "channel")) and ( + not key_selector or eval_selector(key_selector, flags) + ) + chosen = [] + continue + item_match = _CBC_ITEM_RE.match(line) + if item_match and key_active: + selector = item_match.group("sel") + if selector and not eval_selector(selector, flags): + continue + value = item_match.group("value").strip().strip("'\"") + if value and not value.startswith(("-", "[", "{")): + chosen.append(value) + flush() + return pins + + +def load_repodata(source: str, platform: str) -> tuple[dict[str, Any], bool]: + remote = "://" in source + if remote: + url = source.rstrip("/") + if not url.endswith("repodata.json"): + url = f"{url}/{platform}/repodata.json" + with urlopen(url, timeout=300) as response: # noqa: S310 + data = json.load(response) + else: + path = Path(source) + if path.is_dir(): + path = path / "repodata.json" + data = json.loads(path.read_text(encoding="utf-8")) + packages = dict(data.get("packages", {})) + packages.update(data.get("packages.conda", {})) + return packages, remote + + +def ros_name_map(vinca_conf: dict[str, Any]) -> dict[str, str]: + """Map normalized conda suffix (e.g. 'cartographer-ros') to ROS names ('cartographer_ros').""" + mapping: dict[str, str] = {} + for key in ("rosdistro_snapshot", "rosdistro_additional_recipes"): + path = vinca_conf.get(key) + if path and Path(path).exists(): + for ros_name in load_yaml(Path(path)): + mapping[normalized(str(ros_name))] = str(ros_name) + return mapping + + +def stale_mode(args: argparse.Namespace) -> int: + vinca_conf = load_yaml(Path(args.vinca)) + distro = vinca_conf.get("ros_distro", "") + prefix = f"ros-{distro}-" + pins: dict[str, str] = {} + if not args.mutex_only: + pins.update(variant_pins(Path(args.variant_config), args.platform)) + mutex_pins = {} + for spec in mutex_constraints(vinca_conf) + list(args.pin): + parts = spec.split() + if len(parts) >= 2: + mutex_pins[normalized(parts[0])] = parts[1] + pins.update(mutex_pins) # mutex constraints win + mutex_name = (vinca_conf.get("mutex_package") or {}).get("name") if isinstance( + vinca_conf.get("mutex_package"), dict) else None + + source = args.repodata or f"output/{args.platform}" + packages, remote = load_repodata(source, args.platform) + packages = { + filename: record + for filename, record in packages.items() + if record.get("name", "").startswith(prefix) or record.get("name") == mutex_name + } + if not args.all_builds: + # Only the newest build of every package matters for what users install now. + newest: dict[str, int] = defaultdict(lambda: -1) + for record in packages.values(): + newest[record["name"]] = max(newest[record["name"]], int(record.get("build_number", 0))) + packages = { + filename: record + for filename, record in packages.items() + if int(record.get("build_number", 0)) == newest[record["name"]] + } + scope = "all build numbers" if args.all_builds else "newest build of each package (see --all-builds)" + print(f"Platform: {args.platform} repodata: {source} {distro} packages: {len(packages)} ({scope})") + print(f"Pins checked: {', '.join(f'{k} {v}' for k, v in sorted(mutex_pins.items()))}") + if not args.mutex_only: + print(f" + {len(pins) - len(mutex_pins)} single-valued pins from {args.variant_config}") + print() + + stale: dict[str, list[tuple[str, str, str]]] = {} + for filename, record in sorted(packages.items()): + name = record.get("name", "") + problems = [] + for dep in record.get("depends", []) + record.get("constrains", []): + parts = dep.split() + if len(parts) < 2: + continue + key = normalized(parts[0]) + pin = pins.get(key) + if pin is None or is_ros_dependency(parts[0]): + continue + if not constraint_compatible(parts[1], pin): + severity = "CONFLICT" if key in mutex_pins else "drift" + problems.append((dep, f"{parts[0]} {pin}", severity)) + if problems: + stale[filename] = problems + + if not stale: + print("OK: no built package conflicts with the current pins.") + return 0 + + print(f"{len(stale)} stale artifact(s) whose dependencies conflict with the current pins") + print("(CONFLICT = violates a mutex run_constraint, i.e. not installable next to the new mutex;") + print(" drift = built against an older conda_build_config.yaml pin, rebuild recommended):\n") + by_dep: dict[str, int] = defaultdict(int) + for filename, problems in stale.items(): + print(f" {filename}") + for dep, pin, severity in problems: + print(f" {severity:8s} has: {dep:45s} pin: {pin}") + by_dep[pin] += 1 + print() + print("Summary by pin: " + ", ".join(f"{pin} ({count})" for pin, count in sorted(by_dep.items()))) + print() + + names = sorted({packages[f]["name"] for f in stale}) + mapping = ros_name_map(vinca_conf) + ros_names = [] + for name in names: + if name == mutex_name: + continue + suffix = name[len(prefix):] if name.startswith(prefix) else name + ros_names.append(mapping.get(normalized(suffix), suffix.replace("-", "_"))) + + build_number = int(vinca_conf.get("build_number", 0)) + 1 + print("Rebuild only these packages") + print("---------------------------") + print("A) artifacts only exist locally: delete them (see --delete) and run `pixi run build`;") + print(" --skip-existing then rebuilds exactly the missing packages.") + print("B) artifacts are already on the channel: bump the build number of just these packages") + print(" (and of the mutex, so its run_constraints are refreshed) and rebuild, then remove the") + print(" old files from the channel. pkg_additional_info.yaml snippet:\n") + for ros_name in ros_names: + print(f"{ros_name}:\n build_number: {build_number}") + if mutex_name: + print(f"\n# vinca.yaml -> mutex_package:\n# build_number: {build_number}") + print() + if remote: + channel = source.split("://", 1)[1].split("/")[1] if "anaconda.org" in source else source + print("Channel removal commands (anaconda.org):") + for filename in stale: + record = packages[filename] + print(f" anaconda remove {channel}/{record['name']}/{record['version']}/{args.platform}/{filename}") + print() + + if args.delete: + if remote: + print("--delete only removes local artifacts; use the commands above for the channel.") + return 1 + root = Path(source) + root = root if root.is_dir() else root.parent + removed = 0 + for filename in stale: + target = root / filename + if target.exists(): + target.unlink() + removed += 1 + print(f"deleted {target}") + print(f"\nDeleted {removed} artifact(s) from {root}.") + index_root = root.parent + rattler_index = shutil.which("rattler-index") + if rattler_index: + subprocess.run([rattler_index, "fs", str(index_root), "--force"], check=False) + print(f"Re-indexed {index_root}.") + else: + print(f"Run `pixi run rattler-index fs {index_root} --force` to refresh the local index.") + print("Now run `pixi run build` (skip-existing rebuilds only the deleted packages).") + return 1 + + +# ------------------------------------------------------------------------- main +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + parser.add_argument("--platform", default=detect_platform(), help="conda platform (default: current machine)") + parser.add_argument("--recipes-dir", default="recipes") + parser.add_argument("--vinca", default="vinca.yaml") + parser.add_argument("--variant-config", default="conda_build_config.yaml") + parser.add_argument("--pinning", default="vinca_pinning.yaml", help="used for migration lookup") + parser.add_argument("--channel", "-c", action="append", default=[], help="override channels (repeatable)") + parser.add_argument("--pin", action="append", default=[], help="extra hard pin, e.g. 'libboost 1.90.*'") + parser.add_argument("--workdir", default="output/compat_check", help="where fake recipes are written") + parser.add_argument("--max-iterations", type=int, default=25) + parser.add_argument("--max-lines", type=int, default=30, help="solver explanation lines per conflict") + parser.add_argument("--json", help="write conflict details to this JSON file") + parser.add_argument("--no-migrations", dest="migrations", action="store_false", help="skip conda-forge lookups") + parser.add_argument("--verbose", action="store_true") + parser.add_argument("--stale", action="store_true", help="check built artifacts instead of recipes") + parser.add_argument("--repodata", help="repodata source for --stale: output/, a channel URL or repodata.json") + parser.add_argument("--delete", action="store_true", help="with --stale: delete stale local artifacts") + parser.add_argument( + "--all-builds", + action="store_true", + help="with --stale: inspect every build number, not just the current vinca.yaml build_number", + ) + parser.add_argument( + "--mutex-only", + action="store_true", + help="with --stale: only check the mutex run_constraints, ignore conda_build_config.yaml drift", + ) + return parser.parse_args() + + +def main() -> int: + args = parse_args() + if args.stale: + return stale_mode(args) + return solve_mode(args) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/conda_build_config.yaml b/conda_build_config.yaml index 230643ab8..02c342a48 100644 --- a/conda_build_config.yaml +++ b/conda_build_config.yaml @@ -1,82 +1,1173 @@ -numpy: - - 2 -assimp: - - 6.0.5 -# Workaround for https://github.com/RoboStack/ros-jazzy/pull/40#issuecomment-2782226697 -cmake: - - 3.* -libprotobuf: - - 7.35.1 -protobuf: - - 7.35.1 -spdlog: - - 1.17 -pugixml: - - '1.15' -libopencv: - - 4.13.0 -libxml2: - - 2.14.* -graphviz: - - 14.* -libgdal: - - '3.13' -libgdal_core: - - '3.13' -# Mitigation for -# https://github.com/RoboStack/ros-jazzy/pull/126#issuecomment-3515455380 -libcap: - - 2.78 -libtheora: - - '1.2' -fmt: - - 12.1 -lua: - - 5.4 -tbb: - - '2023' -tbb_devel: - - '2023' -jsoncpp: - - 1.9.8 -eigen_abi_devel: - - 5.0.1 - -cdt_name: # [linux] - - conda # [linux] - -python: - - 3.14.* *_cp314 -python_impl: - - cpython - +# Generated by vinca-pinning-render from vinca_pinning.yaml. +# Do not edit this file directly. c_compiler: - gcc # [linux] - clang # [osx] - vs2022 # [win] +# Please remember to update gcc_compiler_version & clang_compiler_version too. c_compiler_version: # [unix] - - 14 # [linux] - - 19 # [osx] + - 15 # [linux] + - 21 # [osx] + - 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"] c_stdlib: - sysroot # [linux] - macosx_deployment_target # [osx] - vs # [win] +m2w64_c_stdlib: # [win] + - m2w64-sysroot # [win] +m2w64_c_stdlib_version: # [win] + - 12 # [win] c_stdlib_version: # [unix] - - 2.28 # [linux] - - 14.0 # [osx and x86_64] - - 14.0 # [osx and arm64] + - 2.28 # [linux and not riscv64] + - 2.39 # [linux and riscv64] + - 2.28 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"] + - 14.0 # [osx] cxx_compiler: - gxx # [linux] - clangxx # [osx] - vs2022 # [win] +# Please remember to update gxx_compiler_version & clangxx_compiler_version too. cxx_compiler_version: # [unix] - - 14 # [linux] - - 19 # [osx] + - 15 # [linux] + - 21 # [osx] + - 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"] +llvm_openmp: # [osx] + - 21 # [osx] +fortran_compiler: # [unix or win] + - gfortran # [unix] + - flang # [win] +fortran_compiler_version: # [unix or win] + - 15 # [unix] + - 5 # [win64] + - 22 # [win and arm64] + - 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"] +m2w64_c_compiler: # [win] + - gcc # [win] +m2w64_c_compiler_version: # [win] + - 15 # [win] +m2w64_cxx_compiler: # [win] + - gxx # [win] +m2w64_cxx_compiler_version: # [win] + - 15 # [win] +m2w64_fortran_compiler: # [win] + - gfortran # [win] +m2w64_fortran_compiler_version: # [win] + - 15 # [win] + +# enable `{{ compiler("gcc") }}`, `{{ compiler("clang") }}` & co. +gcc_compiler: + - gcc +gcc_compiler_version: + - 15 +gxx_compiler: + - gxx +gxx_compiler_version: + - 15 +clang_compiler: + - clang # [unix] + # stay compatible with MSVC + - clang-cl # [win] +clang_compiler_version: + - 21 +clangxx_compiler: + - clangxx # [unix] + # stay compatible with MSVC + - clang-cl # [win] +clangxx_compiler_version: + - 21 + +cuda_compiler: + - cuda-nvcc +cuda_compiler_version: + - None + - 12.9 # [((linux and (x86_64 or aarch64)) or win64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"] +cuda_compiler_version_min: + - None # [not ((linux and (x86_64 or aarch64)) or win64)] + - 12.9 # [((linux and (x86_64 or aarch64)) or win64)] + +arm_variant_type: # [aarch64 and os.environ.get("CF_CUDA_ENABLED", "False") == "True"] + - sbsa # [aarch64 and os.environ.get("CF_CUDA_ENABLED", "False") == "True"] + +_libgcc_mutex: + - 0.1 conda_forge +# +# Go Compiler Options +# + +# The basic go-compiler with CGO disabled, +# It generates fat binaries without libc dependencies +# The activation scripts will set your CC,CXX and related flags +# to invalid values. +go_compiler: + - go-nocgo +# The go compiler build with CGO enabled. +# It can generate fat binaries that depend on conda's libc. +# You should use this compiler if the underlying +# program needs to link against other C libraries, in which +# case make sure to add 'c,cpp,fortran_compiler' for unix +# and the m2w64 equivalent for windows. +cgo_compiler: + - go-cgo +# The following are helpful variables to simplify go meta.yaml files. +target_goos: + - linux # [linux] + - darwin # [osx] + - windows # [win] +target_goarch: + - amd64 # [x86_64] + - arm64 # [arm64 or aarch64] + - ppc64le # [ppc64le] +target_goexe: + - # [unix] + - .exe # [win] +target_gobin: + - ${PREFIX}/bin/ # [unix] + - '%PREFIX%\bin\' # [win] + +# Rust Compiler Options +rust_compiler: + - rust +# the numbers here are the Darwin Kernel version for macOS 10.9 & 11.0; +# this is used to form our target triple on osx, and nothing else. After +# we bumped the minimum macOS version to 10.13, this was left unchanged, +# since it is not essential, and long-term we'd like to remove the version. +# see https://github.com/conda-forge/conda-forge.github.io/issues/2695 +macos_machine: # [osx] + - x86_64-apple-darwin13.4.0 # [osx and x86_64] + - arm64-apple-darwin20.0.0 # [osx and arm64] + +VERBOSE_AT: + - V=1 +VERBOSE_CM: + - VERBOSE=1 + +channel_sources: +channel_targets: +cdt_name: # [linux] + - conda # [linux] + +docker_image: # [os.environ.get("BUILD_PLATFORM", "").startswith("linux-")] + # builds on CentOS 7 + - quay.io/condaforge/linux-anvil-x86_64:cos7 # [os.environ.get("BUILD_PLATFORM") == "linux-64" and os.environ.get("DEFAULT_LINUX_VERSION", "alma10") == "cos7"] + - quay.io/condaforge/linux-anvil-aarch64:cos7 # [os.environ.get("BUILD_PLATFORM") == "linux-aarch64" and os.environ.get("DEFAULT_LINUX_VERSION", "alma10") == "cos7"] + - quay.io/condaforge/linux-anvil-ppc64le:cos7 # [os.environ.get("BUILD_PLATFORM") == "linux-ppc64le" and os.environ.get("DEFAULT_LINUX_VERSION", "alma10") == "cos7"] + + # builds on AlmaLinux 8 + - quay.io/condaforge/linux-anvil-x86_64:alma8 # [os.environ.get("BUILD_PLATFORM") == "linux-64" and os.environ.get("DEFAULT_LINUX_VERSION", "alma10") in ("alma8", "ubi8")] + - quay.io/condaforge/linux-anvil-aarch64:alma8 # [os.environ.get("BUILD_PLATFORM") == "linux-aarch64" and os.environ.get("DEFAULT_LINUX_VERSION", "alma10") in ("alma8", "ubi8")] + - quay.io/condaforge/linux-anvil-ppc64le:alma8 # [os.environ.get("BUILD_PLATFORM") == "linux-ppc64le" and os.environ.get("DEFAULT_LINUX_VERSION", "alma10") in ("alma8", "ubi8")] + + # builds on AlmaLinux 9 + - quay.io/condaforge/linux-anvil-x86_64:alma9 # [os.environ.get("BUILD_PLATFORM") == "linux-64" and os.environ.get("DEFAULT_LINUX_VERSION", "alma10") == "alma9"] + - quay.io/condaforge/linux-anvil-aarch64:alma9 # [os.environ.get("BUILD_PLATFORM") == "linux-aarch64" and os.environ.get("DEFAULT_LINUX_VERSION", "alma10") == "alma9"] + - quay.io/condaforge/linux-anvil-ppc64le:alma9 # [os.environ.get("BUILD_PLATFORM") == "linux-ppc64le" and os.environ.get("DEFAULT_LINUX_VERSION", "alma10") == "alma9"] + + # builds on AlmaLinux 10 + - quay.io/condaforge/linux-anvil-x86_64:alma10 # [os.environ.get("BUILD_PLATFORM") == "linux-64" and os.environ.get("DEFAULT_LINUX_VERSION", "alma10") == "alma10"] + - quay.io/condaforge/linux-anvil-aarch64:alma10 # [os.environ.get("BUILD_PLATFORM") == "linux-aarch64" and os.environ.get("DEFAULT_LINUX_VERSION", "alma10") == "alma10"] + - quay.io/condaforge/linux-anvil-ppc64le:alma10 # [os.environ.get("BUILD_PLATFORM") == "linux-ppc64le" and os.environ.get("DEFAULT_LINUX_VERSION", "alma10") == "alma10"] + +zip_keys: + # [unix] + - - c_compiler_version # [unix] + - cxx_compiler_version # [unix] + - fortran_compiler_version # [unix] + # CUDA 13.x requires newer glibc than our current baseline + - c_stdlib_version # [linux and os.environ.get("CF_CUDA_ENABLED", "False") == "True"] + - cuda_compiler_version # [linux and os.environ.get("CF_CUDA_ENABLED", "False") == "True"] + - - python + - is_python_min + - - libarrow + - libarrow_all + - - root_base + - root_cxx_standard + +# armv7l specifics because conda-build sets many things to centos 6 +# this can probably be removed when conda-build gets updated defaults +# for aarch64 +cdt_arch: armv7l # [armv7l] +BUILD: armv7-conda_cos7-linux-gnueabihf # [armv7l] + +pin_run_as_build: + libblst: + max_pin: x.x + netcdf-cxx4: + max_pin: x.x + vlfeat: + max_pin: x.x.x + +# Pinning packages + +# blas +libblas: + - 3.9.* *netlib +libcblas: + - 3.9.* *netlib +liblapack: + - 3.9.* *netlib +liblapacke: + - 3.9.* *netlib +blas_impl: + - openblas + - mkl # [x86 or x86_64] + - blis # [x86 or x86_64] + +ace: + - 8.0.6 +alsa_lib: + - '1.2' +antic: + - 0.2 +aom: + - '3.14' +arb: + - '2.23' +arpack: + - '3.9' +assimp: + - 6 +attr: + - 2.5 +aws_c_auth: + - 0.10.4 +aws_c_cal: + - 0.9.15 +aws_c_common: + - 0.14.3 +aws_c_compression: + - 0.3.2 +aws_c_event_stream: + - 0.7.1 +aws_c_http: + - 0.11.0 +aws_c_io: + - 0.27.5 +aws_c_mqtt: + - 0.16.0 +aws_c_s3: + - 0.13.1 +aws_c_sdkutils: + - 0.2.7 +aws_checksums: + - 0.2.10 +aws_crt_cpp: + - 0.42.3 +aws_sdk_cpp: + - 1.11.833 +azure_core_cpp: + - 1.16.3 +azure_identity_cpp: + - 1.13.3 +azure_storage_blobs_cpp: + - 12.18.0 +azure_storage_common_cpp: + - 12.14.0 +azure_storage_files_datalake_cpp: + - 12.16.0 +azure_storage_files_shares_cpp: + - 12.18.0 +azure_storage_queues_cpp: + - 12.7.0 +brotli: + - '1.2' +bullet_cpp: + - 3.25 +bxdecay0: + - 1.2.0 +bzip2: + - 1 +c_ares: + - 1 +c_blosc2: + - '3.3' +cairo: + - 1 +calchep: + - '3.8' +capnproto: + - 1.5.0 +casadi: + - 3.7 +ccr: + - 1.3 +cfitsio: + - 4.6.4 +clhep: + - 2.4.4.0 + - 2.4.7.1 + - 2.4.7.2 +cmocka: + - 2.0.1 +coin_or_cbc: + - 2.10 +coincbc: + - 2.10 +coin_or_cgl: + - 0.60 +coin_or_clp: + - 1.17 +coin_or_osi: + - 0.108 +coin_or_utils: + - 2.11 +collier: + - '1.2' +console_bridge: + - 1.0 +cran_mirror: + - https://cloud.r-project.org +# match with libcudnn-dev +cudnn: + - '9' +cutensor: + - 2 +curl: + - 8 +dartsim_cpp: + - '6.19' +dav1d: + - 1.2.1 +dav1d_devel: + - 1.2.1 +davix: + - '0.8' +dbus: + - 1 +dcap: + - 2.47 +delphes: + - 3.5.1 +eclib: + - '20250627' +eigen_abi_devel: + - 5.0.1 +elfutils: + - '0.194' +emela: + - '1.0' +exiv2: + - '0.28' +expat: + - 2 +fastbdt: + - '5.6' +fastjet_contrib: + - '1' +fastjet_cxx: + - '3.5' +feynhiggs: + - '2.19' +ffmpeg: + - '9' +fftw: + - 3 +flann: + - 1.9.2 +flatbuffers: + - 25.9.23 +fmt: + - '12.1' +fontconfig: + - 2 +freetype: + - 2 +gaudi: + - '40.4' +gct: + - 6.2.1705709074 +gf2x: + - '1.3' +gdk_pixbuf: + - 2 +gnuradio_core: + - 3.10.12 +gnutls: + - '3.8' +gsl: + - 2.7 +gsoap: + - 2.8.123 +gstreamer: + - '1.28' +gst_plugins_base: + - '1.28' +gdal: + - '3.13' +libgdal: + - '3.13' +libgdal_core: + - '3.13' +geant4: + - 11.4.2 +geos: + - 3.14.1 +geotiff: + - '1.7' +gfal2: + - '2.23' +gflags: + - '2.3' +giflib: + - '6' +givaro: + - 4.2.2 +glew: + - '2.3' +glib: + - '2' +glog: + - '0.7' +glpk: + - '5.0' +gm2calc: + - '2.3' +gmp: + - 6 +google_cloud_cpp: + - '3.8' +google_cloud_cpp_common: + - 0.25.0 +googleapis_cpp: + - '0.10' +gpgme: + - '1.24' +graphviz: + - '14' +# Harfbuzz guarantees total ABI compatibiblity +# The first version to have this new ABI pin is 11.0.1 +# https://github.com/conda-forge/harfbuzz-feedstock/pull/125 +# But as of 2025/08/03, 11.0.1 is quite "old" and it is pretty safe +# to release the pin +# We are leaving this comment here to discourage others from adding +# a harfbuzz global pin, as it is not needed. +# harfbuzz: +# - '11' +hepmc2: + - '2.06' +hepmc3: + - '3.3' +hdf4: + - 4.2.15 +hdf5: + - '2' + - 1.14.6 +hdrhistogram_c: + - 0.11.9 +icu: + - '78' +idyntree: + - '15' +imath: + - 3.2.2 +impi_devel: + - 2021.16.0 +ipopt: + - 3.14.19 +isl: + - '0.26' +jasper: + - 4 +jpeg: + - 9 +lcms2: + - 2 +lerc: + - '4' +lhapdf: + - '6.5' +libjpeg_turbo: + - '3' +libjxl: + - '0.12' +libev: + - 4.33 +json_c: + - '0.18' +jsoncpp: + - 1.9.8 +kealib: + - '2.0' +krb5: + - '1.22' +ldas_tools_framecpp: + - '2.9' +libabseil: + - 20260526 +libaec: + - '1' +libamd: + - '3' +libarchive: + - '3.8' +libarrow: + - '25.0' + - '24.0' + - '23.0' + - '22.0' +libarrow_all: + - '25.0' + - '24.0' + - '23.0' + - '22.0' +libattr: + - 2.6 +libavif: + - 1 +libblitz: + - 1.0.2 +libblst: + - '0.3' +libboost_devel: + - '1.90' +libboost_headers: + - '1.90' +libboost_python_devel: + - '1.90' +libbrotlicommon: + - '1.2' +libbrotlidec: + - '1.2' +libbrotlienc: + - '1.2' +libbtf: + - '2' +libcamd: + - '3' +libcap: + - '2.78' +libcint: + - '6.1' +libccolamd: + - '3' +libcholmod: + - '5' +libcolamd: + - '3' +libcurl: + - 8 +# match with cudnn +libcudnn_dev: + - '9' +libcrc32c: + - 1.1 +libcxsparse: + - '4' +libdap4: + - 3.20.6 +libdeflate: + - '1.25' +libdovi: + - '3' +libduckdb_devel: + - '1' +libeantic: + - '2' +libevent: + - 2.1.12 +libexactreal: + - '4' +libffi: + - '3.5' +libflac: + - '1.5' +libflatsurf: + - 3 +libflint: + - '3.5' +libframel: + - '8.41' +# hmaarrfk - Aug 30, 2025 +# https://github.com/conda-forge/libfuse-feedstock/pull/29 +# Although some libfuse packages exist with version 3, we decided +# to pin libfuse to 2 to allow co-installation between libfuse (version 2) and libfuse3 +libfuse: + - '2' +libfuse3: + - '3' +libgit2: + - '1.9' +libgoogle_cloud: + - '3.8' +libgoogle_cloud_devel: + - '3.8' +libgoogle_cloud_all_devel: + - '3.8' +libgoogle_cloud_aiplatform_devel: + - '3.8' +libgoogle_cloud_automl_devel: + - '3.8' +libgoogle_cloud_bigquery_devel: + - '3.8' +libgoogle_cloud_bigtable_devel: + - '3.8' +libgoogle_cloud_compute_devel: + - '3.8' +libgoogle_cloud_dialogflow_cx_devel: + - '3.8' +libgoogle_cloud_dialogflow_es_devel: + - '3.8' +libgoogle_cloud_discoveryengine_devel: + - '3.8' +libgoogle_cloud_dlp_devel: + - '3.8' +libgoogle_cloud_iam_devel: + - '3.8' +libgoogle_cloud_oauth2_devel: + - '3.8' +libgoogle_cloud_policytroubleshooter_devel: + - '3.8' +libgoogle_cloud_pubsub_devel: + - '3.8' +libgoogle_cloud_spanner_devel: + - '3.8' +libgoogle_cloud_speech_devel: + - '3.8' +libgoogle_cloud_storage_devel: + - '3.8' +libgrpc: + - '1.82' +libgsasl: + - '2' +libheif: + - '1.23' +libhugetlbfs: + - 2 +libhwloc: + - 2.13.0 +libhwy: + - '1.4' +libiconv: + - 1 +libidn2: + - 2 +libintervalxt: + - 3 +libitk_devel: + - 5.4 +libklu: + - '2' +libkml: + - 1.3 +libkml_devel: + - 1.3 +liblzma_devel: + - 5 +libiio: + - 0 +libldl: + - '3' +libmagma: + - 2.10.0 +libmagma_devel: + - 2.10.0 +libmagma_sparse: + - 2.10.0 +libmed: + - '4.2' +libmatio: + - 1.5.30 +libmatio_cpp: + - 0.3.0 +libmicrohttpd: + - '1.0' +libnetcdf: + - 4.10.1 +libntlm: + - 1 +libode: + - 0.16.6 +libogg: + - 1.3 +libopencolorio: + - '2.5' +libopenimageio: + - '3.1' +libopencv: + - 5.0.0 +libopentelemetry_cpp: + - '1.27' +libosqp: + - 1.0.0 +libopenvino: + - 2026.3.1 +libopenvino_dev: + - 2026.3.1 +libparu: + - '1' +libpcap: + - '1.10' +libplacebo: + - '7.360' +libpnetcdf: + - 1.15.0 +libpng: + - 1.6 +libprotobuf: + - 7.35.1 +libpq: + - '18' +libpsl: + - '0.23' +libpulsar: + - 4.2.0 +libraqm: + - '0.11' +libraqm_devel: + - '0.11' +libraw: + - '0.22' +librbio: + - '4' +librdkafka: + - '2.15' +librdkit: + - 2026.03.2 +librealsense: + - '2.58' +librerun_sdk: + - 0.35.0 +librsvg: + - 2 +libsecret: + - '0.21' +libsentencepiece: + - 0.2.1 +libsndfile: + - '1.2' +libsodium: + - 1.0.22 +libsoup: + - 3 +libspatialindex: + - 2.1.0 +libspex: + - '3' +libspqr: + - '4' +libsuitesparseconfig: + - '7' +libsuperiso: + - '5.0' +libssh: + - '0.12' +libssh2: + - 1 +libsvm: + - '337' +libsqlite: + - 3 +libsystemd: + - '257' +libtensorflow: + - '2.16' +libtensorflow_cc: + - '2.16' +libtheora: + - '1.2' +libthrift: + - 0.22.0 +libtiff: + - '4.7' +libtorch: + - '2.12' +libudev: + - '257' +libumfpack: + - '6' +libunwind: + - '1.8' +libutf8proc: + - '2.11' +libv8: + - 8.9.83 +libvigra: + - '1.12' +libvips: + - 8 +libvpl: + - '2.16' +libwebp: + - 1 +libwebp_base: + - 1 +libx86emu: + - 3.7 +libxcb: + - '1' +libxml2: + - '2.15' +libxml2_devel: + - '2.15' +libxrootd_devel: + - '6' +libxsmm: + - '2' +liburing: + - 2.14 +libuuid: + - 2 +libyarp: + - 3.12.2 +libzip: + - 1 +lmdb: + - '0.9' +log4cxx: + - 1.8.0 +lol_html: + - 3.0.1 +ls_hpack: + - 2.3.5 +lwtnn: + - '2.14' +lz4_c: + - '1.10' +lzo: + - 2 +magma: + - '2.9' +metis: + - 5.1.0 +mimalloc: + - 3.4.1 +mkl: + - '2026' # [not osx] + - '2023' # [osx] +mkl_devel: + - '2026' # [not osx] + - '2023' # [osx] +mpg123: + - '1.33' +mpich: + - 4 +mpfr: + - 4 +mpfun90: + - '2026' +mppp: + - '2.0' +msgpack_c: + - 6 +msgpack_cxx: + - '7' +mumps_mpi: + - 5.8.2 +mumps_seq: + - 5.8.2 +mysql_devel: + - '9.7' +nccl: + - 2 +ncurses: + - 6 +netcdf_cxx4: + - 4.3 +netcdf_fortran: + - '4.6' +nettle: + - '3.10' +ninja_hep_ph: + - '1.2' +nodejs: + - '26' + - '24' +nss: + - 3 +nspr: + - 4 +nlopt: + - '2.11' +ntl: + - 11.6.0 +# we build using the latest minor version; numpy has generous backwards compatibility +# even so, and this is reflected through the run-exports of the package; see also +# https://github.com/conda-forge/conda-forge-pinning-feedstock/issues/4816 +numpy: + - 2 +obake_devel: + - '0.9' +occt: + - 8.0.0 +oneloop: + - '3.7' +openblas: + - 0.3.* +openexr: + - '3.4' +openh264: + - 2.6.0 +openjpeg: + - '2' +openjph: + - '0.31' +openmpi: + - '5' +openslide: + - 4 +# although openssl follows SemVer for ABI/API stability, we stay on +# LTS version at build time to avoid forcing newer version at runtime +openssl: + - '3.5' +orc: + - 2.3.1 +osqp_eigen: + - '0.11' +pango: + - '1' +pari: + - 2.17.* *_pthread +pcl: + - 1.15.1 +perl: + - 5.32.1 +petsc: + - '3.25' +petsc4py: + - '3.25' +plutovg: + - 1.3.3 +plutosvg: + - 0.0.8 +pugixml: + - '1.15' +slepc: + - '3.25' +slepc4py: + - '3.25' +svt_av1: + - 4.2.0 +p11_kit: + - '0.26' +pcre: + - '8' +pcre2: + - '10.47' +pdal: + - '2.10' +libpdal: + - '2.10' +libpdal_core: + - '2.10' +pixman: + - 0 +poco: + - 1.15.3 +poppler: + - '26.07' +portaudio: + - '19.7' +postgresql: + - '18' +postgresql_plpython: + - '18' +proj: + - '9.8' +pulseaudio: + - '17.0' +pulseaudio_client: + - '17.0' +pulseaudio_daemon: + - '17.0' +pybind11_abi: + - '11' +pythia8: + - '8.312' +python: + # conda-forge supports only 3.14+ for win-arm64 and linux-riscv64 + # part of a zip_keys: python, is_python_min + - 3.14.* *_cp314 +python_impl: + - cpython + +python_min: + # minimum supported python version per CFEP-25 + # bump to next minor version when we drop python versions + - '3.11' # [not ((win and arm64) or riscv64)] + - '3.14' # [(win and arm64) or riscv64] +is_freethreading: + - false +is_python_min: + # part of a zip_keys: python, is_python_min + - false +is_abi3: + - true +pytorch: + - '2.12' +pyqt: + - 5.15 +pyqtwebengine: + - 5.15 +pyqtchart: + - 5.15 +qcdloop: + - '2.1' +qhull: + - 2020.2 +qpdf: + - '12' +qt: + - 5.15 +qt_main: + - 5.15 +qt6_main: + - '6' +qtkeychain: + - '0.17' +rav1e: + - '0.8' +rdma_core: + - '63' +re2: + - 2025.11.05 +readline: + - '8' +rivet: + - '4.1' +rocksdb: + - '11.0' +root_base: + - 6.36.10 + - 6.38.4 + - 6.38.4 + - 6.40.2 + - 6.40.2 +root_cxx_standard: + - 20 + - 20 + - 23 + - 20 + - 23 +r_base: + - 4.4 + - 4.5 +libscotch: + - 7.0.11 +libptscotch: + - 7.0.11 +scotch: + - 7.0.11 +ptscotch: + - 7.0.11 +s2geography: + - 0.1.2 +s2geometry: + - '0.14' +s2n: + - 1.7.6 +sdl2: + - '2' +sdl2_image: + - '2' +sdl2_mixer: + - '2' +sdl2_net: + - '2' +sdl2_ttf: + - '2' +shaderc: + - '2026.3' +sherpa: + - '3.0' +singular: + - 4.4.1 +siscone: + - '3.1' +snappy: + - 1.2 +soapysdr: + - '0.8' +softsusy: + - '4.1' +sox: + - 14.4.2 +spdlog: + - '1.17' +spirv_tools: + - '2026' +sqlite: + - 3 +srm_ifce: + - 1.24.6 +starlink_ast: + - 9.3.1 +suitesparse: + - '7' +suitesparse_mongoose: + - '3' +sundials: + - '7.8' +superlu_dist: + - '9' +swig_abi: + - '5' +tbb: + - '2023' +tbb_devel: + - '2023' +tensorflow: + - '2.16' +thrift_cpp: + - 0.22.0 +tinyxml2: + - '11.0' +tk: + - 8.6 # [not ppc64le] +tiledb: + - '2.30' +ucc: + - 1 +ucx: + - '1.22' +uhd: + - 4.10.0 +urdfdom: + - '6' +vc: # [win] + - 14 # [win] +vgm: + - '5.4' +vigra: + - '1.12' +vlfeat: + - 0.9.21 +vmc: + - '2.2' +volk: + - '3.3' +vtk: + - 9.7.0 +vtk_base: + - 9.7.0 +wcslib: + - '8' +wxwidgets: + - 3.3.3 +x264: + - 1!164.* +x265: + - '3.5' +xerces_c: + - '3.3' +xrootd: + - '6' +xxhash: + - 0.8.3 +xz: + - 5 +yoda: + - '2.1' +zeromq: + - 4.3.5 +zfp: + - 1.0 +zlib: + - 1 +zlib_ng: + - '2.3' +zstd: + - '1.5' libzenohc: - 1.9.0 libzenohcxx: - 1.9.0 - -libhwloc: - - 2.13.0 diff --git a/pixi.lock b/pixi.lock index 0b6ba83ec..6449b02f3 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,29 +1,29 @@ version: 7 platforms: -- name: osx-64 - virtual-packages: - - __unix=0=0 - - __osx=13.0 - - __archspec=0=x86_64 -- name: osx-arm64 - virtual-packages: - - __unix=0=0 - - __osx=13.0 - - __archspec=0=m1 -- name: p1 +- name: linux-64-glibc-2-17 subdir: linux-64 virtual-packages: - __glibc=2.17 - __unix=0=0 - __linux=4.18 - __archspec=0=x86_64 -- name: p2 +- name: linux-aarch64-glibc-2-17 subdir: linux-aarch64 virtual-packages: - __glibc=2.17 - __unix=0=0 - __linux=4.18 - __archspec=0=aarch64 +- name: osx-64 + virtual-packages: + - __unix=0=0 + - __osx=13.0 + - __archspec=0=x86_64 +- name: osx-arm64 + virtual-packages: + - __unix=0=0 + - __osx=13.0 + - __archspec=0=m1 - name: win-64 virtual-packages: - __win=10.0 @@ -35,126 +35,7 @@ environments: indexes: - https://pypi.org/simple packages: - osx-64: - - conda: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://repo.prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://repo.prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://repo.prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/cmake-3.31.8-h29fc008_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/krb5-1.22.2-h207b36a_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/libcxx-22.1.4-h19cb2f5_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/libexpat-2.7.5-hcc62823_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/libsqlite-3.53.0-h8f8c405_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/python-3.14.4-h7c6738f_100_cp314.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/rattler-build-0.57.2-h4728fb8_1.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/rattler-index-0.27.21-hbc4d974_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/rhash-1.4.6-h6e16a3a_1.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - - conda: https://repo.prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - - pypi: git+https://github.com/RoboStack/vinca.git?rev=34316c7f195b359fb9cd4bfd2ae8fd83cb559dff#34316c7f195b359fb9cd4bfd2ae8fd83cb559dff - - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/22/32/d0fbc4383a6a213d315c39dda9107f81654d9941c43d6c687e61995ec388/rosdistro-1.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/35/79/5e2cffa1c77432f11cd93a5351f30732c997a239d3a3090856a72d6d8ba7/ruamel.yaml-0.17.40-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/95/88ed47cb7da88569a78b7d6fb9420298df7e99997810c844a924d96d3c08/empy-3.3.4.tar.gz - - pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/b2/acc33950394b3becb2b664741a0c0889c7ef9f9ffbfa8d47eddb53a50abd/idna-3.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/c2/920ef838e2f0028c8262f16101ec09ebd5969864e5a64c4c05fad0617c56/packaging-26.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl - - pypi: https://files.pythonhosted.org/packages/99/1b/50316bd6f95c50686b35799abebb6168d90ee18b7c03e3065f587f010f7c/catkin_pkg-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - osx-arm64: - - conda: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda - - conda: https://repo.prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda - - conda: https://repo.prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda - - conda: https://repo.prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/cmake-3.31.8-h54ad630_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libcxx-22.1.4-h55c6f16_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libexpat-2.7.5-hf6b4638_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/rattler-build-0.57.2-h6fdd925_1.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/rattler-index-0.27.21-hcb0414c_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - conda: https://repo.prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - - pypi: git+https://github.com/RoboStack/vinca.git?rev=34316c7f195b359fb9cd4bfd2ae8fd83cb559dff#34316c7f195b359fb9cd4bfd2ae8fd83cb559dff - - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/22/32/d0fbc4383a6a213d315c39dda9107f81654d9941c43d6c687e61995ec388/rosdistro-1.0.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/35/79/5e2cffa1c77432f11cd93a5351f30732c997a239d3a3090856a72d6d8ba7/ruamel.yaml-0.17.40-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/3b/95/88ed47cb7da88569a78b7d6fb9420298df7e99997810c844a924d96d3c08/empy-3.3.4.tar.gz - - pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/53/b2/acc33950394b3becb2b664741a0c0889c7ef9f9ffbfa8d47eddb53a50abd/idna-3.12-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/c2/920ef838e2f0028c8262f16101ec09ebd5969864e5a64c4c05fad0617c56/packaging-26.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl - - pypi: https://files.pythonhosted.org/packages/99/1b/50316bd6f95c50686b35799abebb6168d90ee18b7c03e3065f587f010f7c/catkin_pkg-1.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - p1: + linux-64-glibc-2-17: - conda: https://repo.prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://repo.prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://repo.prefix.dev/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda @@ -222,7 +103,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl - p2: + linux-aarch64-glibc-2-17: - conda: https://repo.prefix.dev/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://repo.prefix.dev/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda - conda: https://repo.prefix.dev/conda-forge/linux-aarch64/c-ares-1.34.6-he30d5cf_0.conda @@ -289,6 +170,125 @@ environments: - pypi: https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + osx-64: + - conda: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://repo.prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://repo.prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://repo.prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/cmake-3.31.8-h29fc008_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/krb5-1.22.2-h207b36a_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/libcxx-22.1.4-h19cb2f5_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/libexpat-2.7.5-hcc62823_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/libsqlite-3.53.0-h8f8c405_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/libuv-1.51.0-h58003a5_1.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/python-3.14.4-h7c6738f_100_cp314.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/rattler-build-0.57.2-h4728fb8_1.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/rattler-index-0.27.21-hbc4d974_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/rhash-1.4.6-h6e16a3a_1.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda + - conda: https://repo.prefix.dev/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda + - pypi: git+https://github.com/RoboStack/vinca.git?rev=34316c7f195b359fb9cd4bfd2ae8fd83cb559dff#34316c7f195b359fb9cd4bfd2ae8fd83cb559dff + - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/32/d0fbc4383a6a213d315c39dda9107f81654d9941c43d6c687e61995ec388/rosdistro-1.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/35/79/5e2cffa1c77432f11cd93a5351f30732c997a239d3a3090856a72d6d8ba7/ruamel.yaml-0.17.40-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/95/88ed47cb7da88569a78b7d6fb9420298df7e99997810c844a924d96d3c08/empy-3.3.4.tar.gz + - pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/53/b2/acc33950394b3becb2b664741a0c0889c7ef9f9ffbfa8d47eddb53a50abd/idna-3.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7a/c2/920ef838e2f0028c8262f16101ec09ebd5969864e5a64c4c05fad0617c56/packaging-26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/99/1b/50316bd6f95c50686b35799abebb6168d90ee18b7c03e3065f587f010f7c/catkin_pkg-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + osx-arm64: + - conda: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda + - conda: https://repo.prefix.dev/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://repo.prefix.dev/conda-forge/noarch/setuptools-81.0.0-pyh332efcf_0.conda + - conda: https://repo.prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/cmake-3.31.8-h54ad630_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libcxx-22.1.4-h55c6f16_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libexpat-2.7.5-hf6b4638_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.0-h1b79a29_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libuv-1.51.0-h6caf38d_1.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/python-3.14.4-h4c637c5_100_cp314.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/rattler-build-0.57.2-h6fdd925_1.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/rattler-index-0.27.21-hcb0414c_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/rhash-1.4.6-h5505292_1.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - conda: https://repo.prefix.dev/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + - pypi: git+https://github.com/RoboStack/vinca.git?rev=34316c7f195b359fb9cd4bfd2ae8fd83cb559dff#34316c7f195b359fb9cd4bfd2ae8fd83cb559dff + - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/22/32/d0fbc4383a6a213d315c39dda9107f81654d9941c43d6c687e61995ec388/rosdistro-1.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/35/79/5e2cffa1c77432f11cd93a5351f30732c997a239d3a3090856a72d6d8ba7/ruamel.yaml-0.17.40-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/95/88ed47cb7da88569a78b7d6fb9420298df7e99997810c844a924d96d3c08/empy-3.3.4.tar.gz + - pypi: https://files.pythonhosted.org/packages/50/19/1ee204b047ef84ce3dc9f77a5f935076211832f50bc7a4c918275193f807/rospkg-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/53/b2/acc33950394b3becb2b664741a0c0889c7ef9f9ffbfa8d47eddb53a50abd/idna-3.12-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7a/c2/920ef838e2f0028c8262f16101ec09ebd5969864e5a64c4c05fad0617c56/packaging-26.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/99/1b/50316bd6f95c50686b35799abebb6168d90ee18b7c03e3065f587f010f7c/catkin_pkg-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl win-64: - conda: https://repo.prefix.dev/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - conda: https://repo.prefix.dev/conda-forge/noarch/m2-msys2-runtime-3.6.1.4-hc364b38_6.conda diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index bdeacdc01..31651f49c 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -227,7 +227,8 @@ visp: generate_dummy_package_with_run_deps: dep_name: visp max_pin: 'x.x' - # the version on ros is outdated w.r.t. to the conda-forge one - override_version: '3.6.0' + # the version on ros is outdated w.r.t. to the conda-forge one; 3.7.0 has no + # conflicting run_constraints (unlike 3.6.0, which needs an older libprotobuf). + override_version: '3.7.0' zenoh_cpp_vendor: additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK -DUSE_SYSTEM_ZENOH=ON" diff --git a/vinca.yaml b/vinca.yaml index 58224ea9d..626793cae 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -13,6 +13,9 @@ build_number: 25 mutex_package: name: "ros2-distro-mutex" version: "0.20.0" + # Bumped independently of build_number so the mutex is re-published with the new + # run_constraints while already-built packages (ros2-distro-mutex 0.20.* rolling_*) stay valid. + build_number: 26 upper_bound: "x.x" run_constraints: - libboost 1.90.* @@ -20,7 +23,7 @@ mutex_package: - pcl 1.15.1.* - gazebo 11.* - libprotobuf 7.35.1.* - - vtk 9.6.2.* + - vtk 9.7.0.* packages_skip_by_deps: - rplidar_ros diff --git a/vinca_pinning.yaml b/vinca_pinning.yaml new file mode 100644 index 000000000..7b4c28b13 --- /dev/null +++ b/vinca_pinning.yaml @@ -0,0 +1,52 @@ +conda_forge_pinning_version: 2026.09.01.16.28.00 +migrations: + - giflib6 + - go_macos + - gstreamer128 + - hdf52 + - libboost190 + - pybind11_abi11 + - urdfdom6 + - vtk970 +pinning_overrides: + # Build commands provide their channels with `-c`, so omit the inherited + # conda-forge-pinning channel_sources value from the rendered configuration. + channel_sources: null + channel_targets: null + # glibc floor raised from 2.17 (CentOS 7) to 2.28: conda-forge packages such as + # gazebo/openal-soft already require it. macOS deployment target raised to 14.0. + # c_stdlib_version shares a zip_keys group with the compiler versions, so the whole + # group has to be overridden; the compiler entries mirror the conda-forge base file + # and must be refreshed when `vinca-pinning-update` moves to a newer compiler. + c_stdlib_version: + - 2.28 # [linux and not riscv64] + - 2.39 # [linux and riscv64] + - 2.28 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"] + - 14.0 # [osx] + c_compiler_version: + - 15 # [linux] + - 21 # [osx] + - 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"] + cxx_compiler_version: + - 15 # [linux] + - 21 # [osx] + - 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"] + fortran_compiler_version: + - 15 # [unix] + - 5 # [win64] + - 22 # [win and arm64] + - 14 # [linux and (x86_64 or aarch64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"] + cuda_compiler_version: + - None + - 12.9 # [((linux and (x86_64 or aarch64)) or win64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"] + libzenohc: + - 1.9.0 + libzenohcxx: + - 1.9.0 + python: + - 3.14.* *_cp314 + is_python_min: + - false + python_impl: + - cpython + From 41314a9860e6b222174eddcdd0c3a9ec4390fd3b Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Fri, 4 Sep 2026 22:53:27 +1000 Subject: [PATCH 010/180] style: sort vinca.yaml after merge Co-Authored-By: Claude Sonnet 5 --- vinca.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/vinca.yaml b/vinca.yaml index 23eca1838..96d8bc1c5 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -28,6 +28,7 @@ mutex_package: packages_skip_by_deps: - rplidar_ros - rviz_visual_tools + # libpointmatcher not yet released for rolling; skip rtabmap until it is - libpointmatcher From 5f33d50bb7dbb6c5b8cd67ddb86a9ea3a2cb9009 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 02:14:36 +1000 Subject: [PATCH 011/180] fix: macOS build fixes across ~20 packages for opencv5/Qt6/Boost1.90/ROS2-Rolling API drift Adds local ros2-libg2o (Qt6) and ros2-cv-bridge (OpenCV5) recipes to replace Rolling's remote-only builds, which were still Qt5/OpenCV4-linked and genuinely incompatible with the rest of this channel's pins (not just the resolvo mutex-misattribution bug also worked around here for ros2-web-video-server). These two unblock rtabmap and web-video-server. Also fixes, across a mix of category-level (osx exclusions, endian shims, Boost.ASIO API migration) and Rolling-specific issues: - mavlink/libmavconn/mavros/mavros-extras (endian shim + GeographicLib link) - udp-driver, robotiq-controllers, microstrain-inertial-driver (partial): ament_target_dependencies() was removed from ROS2 Rolling's ament_cmake_target_dependencies entirely; replaced with a local link_ament_dependencies() macro using each dependency's exported _TARGETS variable - robotiq-controllers: hardware_interface::LoanedCommandInterface::get_value() replaced by get_optional() in ros2_control's realtime-safety rework - turtle-tf2-cpp, imu-transformer, web-video-server: tf2_ros/image_transport APIs migrated from raw Node* / multi-arg interface calls to a single NodeInterfaces bundle constructed from a Node reference - vision-msgs-rviz-plugins: Qt5->Qt6 (find_package, qt6_wrap_cpp, explicit Qt6::Core/Widgets + rviz_default_plugins linking) and the rviz_common Display::update() float->std::chrono::nanoseconds signature change - nlohmann-json-schema-validator-vendor: CMAKE_POLICY_VERSION_MINIMUM=3.5 for its ExternalProject_Add'd vendored source (CMake<3.5 removed) - ublox-dgnss-node: --allow-multiple-definition linker flag unsupported on macOS ld (progress fix; a real duplicate-symbol ODR issue remains) - rmf-building-map-tools: numpy>=2.0 removed 2D-vector np.cross() support, used by is_in_lift() -- replaced with the direct scalar cross-product formula. Unblocks the whole downstream rmf-demos-maps chain. - rmf-traffic: missing #include across 11 vendored FCL headers + 1 own source file; missing Eigen3::Eigen link (was relying on a build-path-relative ${EIGEN3_INCLUDE_DIRS} variable baked into the installed target, breaking downstream consumers) - rmf-traffic-ros2: custom FindLibUUID.cmake unconditionally required a standalone libuuid (Linux-only; macOS provides uuid/uuid.h natively, no separate library) -- also missing Eigen3::Eigen link - rmf-websocket: Boost 1.90 no longer ships a boost_system CMake config (header-only now); dropped the component + Boost::system linkage - mujoco_3d_lidar/mujoco_ros2_control_plugins excluded on osx (no prebuilt MuJoCo binary for macOS, matching the same exclusion already used for mujoco_ros2_control/_demos) - ros2-distro-mutex rebuilt at 0.20.0/build 26 to match vinca.yaml's already -bumped run_constraints (vtk 9.7.0), which had never actually been republished ros-rolling went from ~150 missing packages (of 311 recipes) to 12 still blocked, each a genuinely deep out-of-scope issue for tonight: avt-vimba-camera and rclc-examples need real rclcpp/image_transport/rcl API ports; microstrain-inertial-driver needs further NodeInterfaces + tf2/LinearMath porting; ublox-dgnss(-node) has a real duplicate-symbol ODR bug beyond the linker-flag guard; the rmf-websocket chain (rmf-websocket, rmf-task-ros2, rmf-fleet-adapter(-python), rmf-reservation-node, rmf-visualization-floorplans/ -schedule) is blocked on websocketpp itself using removed Boost.ASIO APIs (io_service) -- a third-party dependency incompatibility, not this repo's source. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-cv-bridge.patch | 52 ++++++ patch/ros-rolling-imu-transformer.patch | 31 ++++ patch/ros-rolling-libg2o.patch | 27 +++ patch/ros-rolling-libmavconn.patch | 30 +++ patch/ros-rolling-mavlink.osx.patch | 20 ++ patch/ros-rolling-mavros-extras.patch | 12 ++ ...-rolling-microstrain-inertial-driver.patch | 41 ++++ ...lohmann-json-schema-validator-vendor.patch | 13 ++ .../ros-rolling-rmf-building-map-tools.patch | 16 ++ patch/ros-rolling-rmf-traffic-ros2.patch | 39 ++++ patch/ros-rolling-rmf-traffic.patch | 156 ++++++++++++++++ patch/ros-rolling-rmf-websocket.patch | 53 ++++++ patch/ros-rolling-robotiq-controllers.patch | 47 +++++ patch/ros-rolling-turtle-tf2-cpp.patch | 63 +++++++ patch/ros-rolling-ublox-dgnss-node.patch | 16 ++ patch/ros-rolling-udp-driver.patch | 56 ++++++ ...ros-rolling-vision-msgs-rviz-plugins.patch | 175 ++++++++++++++++++ patch/ros-rolling-web-video-server.patch | 26 +++ vinca.yaml | 8 + 19 files changed, 881 insertions(+) create mode 100644 patch/ros-rolling-cv-bridge.patch create mode 100644 patch/ros-rolling-imu-transformer.patch create mode 100644 patch/ros-rolling-libg2o.patch create mode 100644 patch/ros-rolling-libmavconn.patch create mode 100644 patch/ros-rolling-mavlink.osx.patch create mode 100644 patch/ros-rolling-mavros-extras.patch create mode 100644 patch/ros-rolling-microstrain-inertial-driver.patch create mode 100644 patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch create mode 100644 patch/ros-rolling-rmf-building-map-tools.patch create mode 100644 patch/ros-rolling-rmf-traffic-ros2.patch create mode 100644 patch/ros-rolling-rmf-traffic.patch create mode 100644 patch/ros-rolling-rmf-websocket.patch create mode 100644 patch/ros-rolling-robotiq-controllers.patch create mode 100644 patch/ros-rolling-turtle-tf2-cpp.patch create mode 100644 patch/ros-rolling-ublox-dgnss-node.patch create mode 100644 patch/ros-rolling-udp-driver.patch create mode 100644 patch/ros-rolling-vision-msgs-rviz-plugins.patch create mode 100644 patch/ros-rolling-web-video-server.patch diff --git a/patch/ros-rolling-cv-bridge.patch b/patch/ros-rolling-cv-bridge.patch new file mode 100644 index 000000000..87d014aa6 --- /dev/null +++ b/patch/ros-rolling-cv-bridge.patch @@ -0,0 +1,52 @@ +diff -ruN a/CMakeLists.txt b/CMakeLists.txt +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -51,6 +51,15 @@ + CONFIG + ) + if(NOT OpenCV_FOUND) ++ find_package(OpenCV 5 QUIET ++ COMPONENTS ++ opencv_core ++ opencv_imgproc ++ opencv_imgcodecs ++ CONFIG ++ ) ++endif() ++if(NOT OpenCV_FOUND) + find_package(OpenCV 3 REQUIRED + COMPONENTS + opencv_core +diff -ruN a/include/cv_bridge/cv_bridge.hpp b/include/cv_bridge/cv_bridge.hpp +--- a/include/cv_bridge/cv_bridge.hpp ++++ b/include/cv_bridge/cv_bridge.hpp +@@ -42,7 +42,6 @@ + #include + #include + #include +-#include + #include + + #include +diff -ruN a/src/module_opencv4.cpp b/src/module_opencv4.cpp +--- a/src/module_opencv4.cpp ++++ b/src/module_opencv4.cpp +@@ -2,7 +2,6 @@ + + #include "module.hpp" + +-#include "opencv2/core/types_c.h" + + #include "opencv2/opencv_modules.hpp" + +@@ -99,8 +98,8 @@ + NumpyAllocator() {stdAllocator = Mat::getStdAllocator();} + ~NumpyAllocator() {} + +-// To compile openCV3 with OpenCV4 APIs. +-#ifndef OPENCV_VERSION_4 ++// To compile openCV3 with OpenCV4/5 APIs. ++#if CV_MAJOR_VERSION < 4 + #define AccessFlag int + #endif + diff --git a/patch/ros-rolling-imu-transformer.patch b/patch/ros-rolling-imu-transformer.patch new file mode 100644 index 000000000..3eda112d0 --- /dev/null +++ b/patch/ros-rolling-imu-transformer.patch @@ -0,0 +1,31 @@ +diff --git a/src/imu_transformer.cpp b/src/imu_transformer.cpp +index b1415ee..65cddfa 100644 +--- a/src/imu_transformer.cpp ++++ b/src/imu_transformer.cpp +@@ -13,9 +13,7 @@ namespace imu_transformer + tf2_buffer_ = std::make_unique(this->get_clock()); + // Create the timer interface before call to waitForTransform, + // to avoid a tf2_ros::CreateTimerInterfaceException exception +- auto timer_interface = std::make_shared( +- this->get_node_base_interface(), +- this->get_node_timers_interface()); ++ auto timer_interface = std::make_shared(*this); + tf2_buffer_->setCreateTimerInterface(timer_interface); + tf2_listener_ = std::make_unique(*tf2_buffer_); + +@@ -28,13 +26,13 @@ namespace imu_transformer + + std::chrono::duration buffer_timeout(1); + +- imu_filter_ = std::make_shared(imu_sub_, *tf2_buffer_, target_frame_, 10, this->get_node_logging_interface(), this->get_node_clock_interface(), buffer_timeout); ++ imu_filter_ = std::make_shared(imu_sub_, *tf2_buffer_, target_frame_, 10, *this, buffer_timeout); + imu_filter_->registerCallback(&ImuTransformer::imuCallback, this); + // function deactivated in foxy + //imu_filter_->registerFailureCallback&ImuTransformer::failureCb, this); + + mag_sub_.subscribe(this, "mag_in", 10); +- mag_filter_ = std::make_shared(mag_sub_, *tf2_buffer_, target_frame_, 10, this->get_node_logging_interface(), this->get_node_clock_interface(), buffer_timeout); ++ mag_filter_ = std::make_shared(mag_sub_, *tf2_buffer_, target_frame_, 10, *this, buffer_timeout); + mag_filter_->registerCallback(&ImuTransformer::magCallback, this); + // function deactivated in foxy + //mag_filter_->registerFailureCallback&ImuTransformer::failureCb, this); diff --git a/patch/ros-rolling-libg2o.patch b/patch/ros-rolling-libg2o.patch new file mode 100644 index 000000000..d1f06fea0 --- /dev/null +++ b/patch/ros-rolling-libg2o.patch @@ -0,0 +1,27 @@ +diff --git a/g2o/examples/sphere/create_sphere.cpp b/g2o/examples/sphere/create_sphere.cpp +index 7788dd9..45b0e92 100644 +--- a/g2o/examples/sphere/create_sphere.cpp ++++ b/g2o/examples/sphere/create_sphere.cpp +@@ -166,8 +166,8 @@ int main(int argc, char** argv) { + cerr << "using seeds:"; + for (size_t i = 0; i < seeds.size(); ++i) cerr << " " << seeds[i]; + cerr << endl; +- transSampler.seed(seeds[0]); +- rotSampler.seed(seeds[1]); ++ transSampler.seed(static_cast(seeds[0])); ++ rotSampler.seed(static_cast(seeds[1])); + } + + // noise for all the edges +diff --git a/g2o/stuff/misc.h b/g2o/stuff/misc.h +index 58a1afd..cd14ccc 100644 +--- a/g2o/stuff/misc.h ++++ b/g2o/stuff/misc.h +@@ -27,6 +27,7 @@ + #ifndef G2O_STUFF_MISC_H + #define G2O_STUFF_MISC_H + ++#include + #include + + /** @addtogroup utils **/ diff --git a/patch/ros-rolling-libmavconn.patch b/patch/ros-rolling-libmavconn.patch new file mode 100644 index 000000000..d12008e05 --- /dev/null +++ b/patch/ros-rolling-libmavconn.patch @@ -0,0 +1,30 @@ +diff --git a/include/mavconn/io_context_runner.hpp b/include/mavconn/io_context_runner.hpp +index 9db0b10..789f3b5 100644 +--- a/include/mavconn/io_context_runner.hpp ++++ b/include/mavconn/io_context_runner.hpp +@@ -59,7 +59,7 @@ public: + return; + } + +- io_thread_ = std::jthread( ++ io_thread_ = std::thread( + [this, f = std::forward(fn)]() mutable { + is_running_ = true; + f(); +@@ -73,7 +73,6 @@ public: + return; + } + +- io_thread_.request_stop(); + io_work_.reset(); + io_.stop(); + } +@@ -119,7 +118,7 @@ private: + std::unique_ptr> io_work_; + bool owns_thread_; + std::atomic is_running_; +- std::jthread io_thread_; ++ std::thread io_thread_; + }; + + } // namespace mavconn diff --git a/patch/ros-rolling-mavlink.osx.patch b/patch/ros-rolling-mavlink.osx.patch new file mode 100644 index 000000000..c41582e33 --- /dev/null +++ b/patch/ros-rolling-mavlink.osx.patch @@ -0,0 +1,20 @@ +diff --git a/pymavlink/generator/CPP11/include_v2.0/msgmap.hpp b/pymavlink/generator/CPP11/include_v2.0/msgmap.hpp +index a3956aa2..2abe2a5e 100644 +--- a/pymavlink/generator/CPP11/include_v2.0/msgmap.hpp ++++ b/pymavlink/generator/CPP11/include_v2.0/msgmap.hpp +@@ -4,7 +4,14 @@ + #include + #ifdef FREEBSD + #include +-#elif __APPLE__ ++#elif defined(__APPLE__) ++#include ++#define htole16(x) OSSwapHostToLittleInt16(x) ++#define htole32(x) OSSwapHostToLittleInt32(x) ++#define htole64(x) OSSwapHostToLittleInt64(x) ++#define le16toh(x) OSSwapLittleToHostInt16(x) ++#define le32toh(x) OSSwapLittleToHostInt32(x) ++#define le64toh(x) OSSwapLittleToHostInt64(x) + #include + #else + #include diff --git a/patch/ros-rolling-mavros-extras.patch b/patch/ros-rolling-mavros-extras.patch new file mode 100644 index 000000000..ddf7492c2 --- /dev/null +++ b/patch/ros-rolling-mavros-extras.patch @@ -0,0 +1,12 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 8832292..dbee63e 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -168,6 +168,7 @@ target_link_libraries(mavros_extras_plugins PUBLIC + tf2_ros::static_transform_broadcaster_node + tf2_ros::tf2_ros + ${mavros_LIBRARIES} ++ ${GeographicLib_LIBRARIES} + ) + pluginlib_export_plugin_description_file(mavros mavros_plugins.xml) + diff --git a/patch/ros-rolling-microstrain-inertial-driver.patch b/patch/ros-rolling-microstrain-inertial-driver.patch new file mode 100644 index 000000000..841070eb7 --- /dev/null +++ b/patch/ros-rolling-microstrain-inertial-driver.patch @@ -0,0 +1,41 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 35e036f..4ae5e4d 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -187,6 +187,14 @@ set(COMMON_INC_FILES + ) + set(COMMON_FILES ${COMMON_SRC_FILES} ${COMMON_INC_FILES}) + ++# ament_target_dependencies() was removed from ament_cmake_target_dependencies; ++# link against each dependency's exported _TARGETS instead. ++macro(link_ament_dependencies target) ++ foreach(_ament_dep ${ARGN}) ++ target_link_libraries(${target} ${${_ament_dep}_TARGETS}) ++ endforeach() ++endmacro() ++ + set(AMENT_COMMON_DEPENDENCIES + rclcpp + rclcpp_lifecycle +@@ -215,9 +223,7 @@ set(NODE_INC_FILES + ) + set(NODE_FILES ${NODE_SRC_FILES} ${NODE_INC_FILES}) + add_executable(${NODE_NAME} ${NODE_FILES} ${COMMON_FILES}) +-ament_target_dependencies(${NODE_NAME} +- ${AMENT_COMMON_DEPENDENCIES} +-) ++link_ament_dependencies(${NODE_NAME} ${AMENT_COMMON_DEPENDENCIES}) + + # Lifecycle node + set(LIFECYCLE_NAME ${PROJECT_NAME}_lifecycle_node) +@@ -231,9 +237,7 @@ set(LIFECYCLE_INC_FILES + set(LIFECYCLE_FILES ${LIFECYCLE_SRC_FILES} ${LIFECYCLE_INC_FILES}) + add_executable(${LIFECYCLE_NAME} ${LIFECYCLE_FILES} ${COMMON_FILES}) + target_compile_definitions(${LIFECYCLE_NAME} PUBLIC MICROSTRAIN_LIFECYCLE) +-ament_target_dependencies(${LIFECYCLE_NAME} +- ${AMENT_COMMON_DEPENDENCIES} +-) ++link_ament_dependencies(${LIFECYCLE_NAME} ${AMENT_COMMON_DEPENDENCIES}) + + # Annoying, but the ROS types don't match up with the MIP types for floats and doubles, so ignore those warnings for now + set_source_files_properties(${COMMON_SRC_DIR}/services.cpp PROPERTIES COMPILE_OPTIONS "-Wno-narrowing") diff --git a/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch b/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch new file mode 100644 index 000000000..a2a503cde --- /dev/null +++ b/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch @@ -0,0 +1,13 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 2115dd4..5d0ea5f 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -7,7 +7,7 @@ find_package(ament_cmake REQUIRED) + macro(build_nlohmann_json_schema_validator) + + set(cmake_commands) +- set(cmake_configure_args -Wno-dev) ++ set(cmake_configure_args -Wno-dev -DCMAKE_POLICY_VERSION_MINIMUM=3.5) + + if(WIN32) + if(DEFINED CMAKE_GENERATOR) diff --git a/patch/ros-rolling-rmf-building-map-tools.patch b/patch/ros-rolling-rmf-building-map-tools.patch new file mode 100644 index 000000000..94e081e31 --- /dev/null +++ b/patch/ros-rolling-rmf-building-map-tools.patch @@ -0,0 +1,16 @@ +diff --git a/building_map/level.py b/building_map/level.py +index fcb46b3..3c7ce1f 100644 +--- a/building_map/level.py ++++ b/building_map/level.py +@@ -430,7 +430,10 @@ class Level: + b.append(verts[i-1] - verts[i]) + # cross products of the four pairs of vectors. If the four cross + # products have the same sign, then the point is inside the rectangle +- cross = np.cross(a, np.array(b)) ++ # numpy>=2.0 removed support for 2D-vector cross products (used to ++ # return the scalar z-component); compute it directly instead. ++ b_arr = np.array(b) ++ cross = a[:, 0] * b_arr[:, 1] - a[:, 1] * b_arr[:, 0] + if np.all(cross >= 0) or np.all(cross <= 0): + return True + else: diff --git a/patch/ros-rolling-rmf-traffic-ros2.patch b/patch/ros-rolling-rmf-traffic-ros2.patch new file mode 100644 index 000000000..51425713d --- /dev/null +++ b/patch/ros-rolling-rmf-traffic-ros2.patch @@ -0,0 +1,39 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 9bfd3b5..a05ec3e 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -180,6 +180,7 @@ add_library(rmf_traffic_ros2 SHARED ${core_lib_srcs}) + target_link_libraries(rmf_traffic_ros2 + PUBLIC + rmf_traffic::rmf_traffic ++ Eigen3::Eigen + nlohmann_json::nlohmann_json + ${rmf_traffic_msgs_LIBRARIES} + ${rmf_site_map_msgs_LIBRARIES} +diff --git a/cmake/FindLibUUID.cmake b/cmake/FindLibUUID.cmake +index 9bd1663..f1bccd7 100644 +--- a/cmake/FindLibUUID.cmake ++++ b/cmake/FindLibUUID.cmake +@@ -42,6 +42,22 @@ They may be set by end users to point at LibUUID components. + #]=======================================================================] + + #----------------------------------------------------------------------------- ++if(APPLE) ++ # macOS provides uuid_generate() etc. and uuid/uuid.h directly via the SDK's ++ # default system search paths (libSystem) -- there is no standalone ++ # libuuid.dylib to link, and no extra include dir is needed (adding the SDK's ++ # own usr/include explicitly confuses libc++'s header self-checks). Just ++ # declare an empty INTERFACE target so callers' target_link_libraries still ++ # resolves. ++ set(LibUUID_FOUND TRUE) ++ set(LIBUUID_FOUND TRUE) ++ set(LibUUID_INCLUDE_DIRS "") ++ set(LibUUID_LIBRARIES "") ++ if(NOT TARGET LibUUID::LibUUID) ++ add_library(LibUUID::LibUUID INTERFACE IMPORTED) ++ endif() ++ return() ++endif() + if(CYGWIN) + # Note: on current version of Cygwin, linking to libuuid.dll.a doesn't + # import the right symbols sometimes. Fix this by linking directly diff --git a/patch/ros-rolling-rmf-traffic.patch b/patch/ros-rolling-rmf-traffic.patch new file mode 100644 index 000000000..627e5f0df --- /dev/null +++ b/patch/ros-rolling-rmf-traffic.patch @@ -0,0 +1,156 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index ad05ac1..b677893 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -97,6 +97,7 @@ endif() + target_link_libraries(rmf_traffic + PUBLIC + rmf_utils::rmf_utils ++ Eigen3::Eigen + Threads::Threads + PRIVATE + ${FCL_LIBRARIES} +diff --git a/src/rmf_traffic/blockade/geometry.cpp b/src/rmf_traffic/blockade/geometry.cpp +index 049351e..d69a999 100644 +--- a/src/rmf_traffic/blockade/geometry.cpp ++++ b/src/rmf_traffic/blockade/geometry.cpp +@@ -17,6 +17,7 @@ + + #include "geometry.hpp" + ++#include + #include + + namespace rmf_traffic { +diff --git a/thirdparty/fcl/include/fcl/broadphase/default_broadphase_callbacks.h b/thirdparty/fcl/include/fcl/broadphase/default_broadphase_callbacks.h +index 1c9b4fe..76f3bde 100644 +--- a/thirdparty/fcl/include/fcl/broadphase/default_broadphase_callbacks.h ++++ b/thirdparty/fcl/include/fcl/broadphase/default_broadphase_callbacks.h +@@ -37,6 +37,7 @@ + #ifndef FCL_BROADPHASE_DEFAULTBROADPHASECALLBACKS_H + #define FCL_BROADPHASE_DEFAULTBROADPHASECALLBACKS_H + ++#include + #include "fcl/narrowphase/collision.h" + #include "fcl/narrowphase/collision_request.h" + #include "fcl/narrowphase/collision_result.h" +diff --git a/thirdparty/fcl/include/fcl/broadphase/detail/morton.h b/thirdparty/fcl/include/fcl/broadphase/detail/morton.h +index 6b430c4..9a79cf0 100644 +--- a/thirdparty/fcl/include/fcl/broadphase/detail/morton.h ++++ b/thirdparty/fcl/include/fcl/broadphase/detail/morton.h +@@ -39,6 +39,7 @@ + #ifndef FCL_MORTON_H + #define FCL_MORTON_H + ++#include + #include "fcl/common/types.h" + #include "fcl/math/bv/AABB.h" + +diff --git a/thirdparty/fcl/include/fcl/geometry/octree/octree-inl.h b/thirdparty/fcl/include/fcl/geometry/octree/octree-inl.h +index f50fe81..04781f8 100644 +--- a/thirdparty/fcl/include/fcl/geometry/octree/octree-inl.h ++++ b/thirdparty/fcl/include/fcl/geometry/octree/octree-inl.h +@@ -38,6 +38,7 @@ + #ifndef FCL_OCTREE_INL_H + #define FCL_OCTREE_INL_H + ++#include + #include "fcl/geometry/octree/octree.h" + + #include "fcl/config.h" +diff --git a/thirdparty/fcl/include/fcl/geometry/shape/convex-inl.h b/thirdparty/fcl/include/fcl/geometry/shape/convex-inl.h +index 10adc69..c50b53f 100644 +--- a/thirdparty/fcl/include/fcl/geometry/shape/convex-inl.h ++++ b/thirdparty/fcl/include/fcl/geometry/shape/convex-inl.h +@@ -39,6 +39,7 @@ + #ifndef FCL_SHAPE_CONVEX_INL_H + #define FCL_SHAPE_CONVEX_INL_H + ++#include + #include + #include + #include +diff --git a/thirdparty/fcl/include/fcl/math/bv/kDOP-inl.h b/thirdparty/fcl/include/fcl/math/bv/kDOP-inl.h +index 371fdb6..15737b0 100644 +--- a/thirdparty/fcl/include/fcl/math/bv/kDOP-inl.h ++++ b/thirdparty/fcl/include/fcl/math/bv/kDOP-inl.h +@@ -38,6 +38,7 @@ + #ifndef FCL_BV_KDOP_INL_H + #define FCL_BV_KDOP_INL_H + ++#include + #include "fcl/math/bv/kDOP.h" + + #include "fcl/common/unused.h" +diff --git a/thirdparty/fcl/include/fcl/math/bv/utility-inl.h b/thirdparty/fcl/include/fcl/math/bv/utility-inl.h +index 333ec15..ab9a6f5 100644 +--- a/thirdparty/fcl/include/fcl/math/bv/utility-inl.h ++++ b/thirdparty/fcl/include/fcl/math/bv/utility-inl.h +@@ -38,6 +38,7 @@ + #ifndef FCL_MATH_BV_UTILITY_INL_H + #define FCL_MATH_BV_UTILITY_INL_H + ++#include + #include "fcl/math/bv/utility.h" + + #include "fcl/common/unused.h" +diff --git a/thirdparty/fcl/include/fcl/math/constants.h b/thirdparty/fcl/include/fcl/math/constants.h +index ba24176..dfdf569 100644 +--- a/thirdparty/fcl/include/fcl/math/constants.h ++++ b/thirdparty/fcl/include/fcl/math/constants.h +@@ -37,6 +37,7 @@ + #ifndef FCL_MATH_CONSTANTS_ + #define FCL_MATH_CONSTANTS_ + ++#include + #include "fcl/common/types.h" + + #include +diff --git a/thirdparty/fcl/include/fcl/math/motion/taylor_model/taylor_model-inl.h b/thirdparty/fcl/include/fcl/math/motion/taylor_model/taylor_model-inl.h +index 861f72d..f304d5d 100644 +--- a/thirdparty/fcl/include/fcl/math/motion/taylor_model/taylor_model-inl.h ++++ b/thirdparty/fcl/include/fcl/math/motion/taylor_model/taylor_model-inl.h +@@ -41,6 +41,7 @@ + #ifndef FCL_CCD_TAYLOR_MODEL_INL_H + #define FCL_CCD_TAYLOR_MODEL_INL_H + ++#include + #include "fcl/math/motion/taylor_model/taylor_model.h" + + namespace fcl +diff --git a/thirdparty/fcl/include/fcl/math/rng-inl.h b/thirdparty/fcl/include/fcl/math/rng-inl.h +index 1ba9da7..0e04dcd 100644 +--- a/thirdparty/fcl/include/fcl/math/rng-inl.h ++++ b/thirdparty/fcl/include/fcl/math/rng-inl.h +@@ -38,6 +38,7 @@ + #ifndef FCL_MATH_RNG_INL_H + #define FCL_MATH_RNG_INL_H + ++#include + #include "fcl/math/rng.h" + + namespace fcl +diff --git a/thirdparty/fcl/include/fcl/narrowphase/detail/convexity_based_algorithm/gjk_libccd-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/convexity_based_algorithm/gjk_libccd-inl.h +index 60fd0ad..0ddc589 100644 +--- a/thirdparty/fcl/include/fcl/narrowphase/detail/convexity_based_algorithm/gjk_libccd-inl.h ++++ b/thirdparty/fcl/include/fcl/narrowphase/detail/convexity_based_algorithm/gjk_libccd-inl.h +@@ -38,6 +38,7 @@ + #ifndef FCL_NARROWPHASE_DETAIL_GJKLIBCCD_INL_H + #define FCL_NARROWPHASE_DETAIL_GJKLIBCCD_INL_H + ++#include + #include "fcl/narrowphase/detail/convexity_based_algorithm/gjk_libccd.h" + #include "fcl/narrowphase/detail/failed_at_this_configuration.h" + +diff --git a/thirdparty/fcl/include/fcl/narrowphase/distance-inl.h b/thirdparty/fcl/include/fcl/narrowphase/distance-inl.h +index 115b710..7011975 100644 +--- a/thirdparty/fcl/include/fcl/narrowphase/distance-inl.h ++++ b/thirdparty/fcl/include/fcl/narrowphase/distance-inl.h +@@ -38,6 +38,7 @@ + #ifndef FCL_DISTANCE_INL_H + #define FCL_DISTANCE_INL_H + ++#include + #include "fcl/narrowphase/distance.h" + + #include "fcl/narrowphase/collision.h" diff --git a/patch/ros-rolling-rmf-websocket.patch b/patch/ros-rolling-rmf-websocket.patch new file mode 100644 index 000000000..0b1cfdd19 --- /dev/null +++ b/patch/ros-rolling-rmf-websocket.patch @@ -0,0 +1,53 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 0368593..6b258fb 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -21,7 +21,7 @@ find_package(nlohmann_json REQUIRED) + find_package(nlohmann_json_schema_validator_vendor REQUIRED) + find_package(nlohmann_json_schema_validator REQUIRED) + find_package(websocketpp REQUIRED) +-find_package(Boost COMPONENTS system REQUIRED) ++find_package(Boost REQUIRED) + find_package(Threads) + + +@@ -39,7 +39,6 @@ target_link_libraries(rmf_websocket + nlohmann_json::nlohmann_json + nlohmann_json_schema_validator + PRIVATE +- Boost::system + Threads::Threads + ) + +@@ -113,7 +112,6 @@ if(BUILD_TESTING) + target_link_libraries(test_ring_buffer + PRIVATE + rmf_utils::rmf_utils +- Boost::system + ) + + #integration test +@@ -126,7 +124,6 @@ if(BUILD_TESTING) + ${websocketpp_LIBRARIES} + ${rclcpp_LIBRARIES} + rmf_utils::rmf_utils +- Boost::system + rmf_websocket + PRIVATE + Threads::Threads +@@ -149,7 +146,6 @@ if(BUILD_TESTING) + ${websocketpp_LIBRARIES} + ${rclcpp_LIBRARIES} + rmf_utils::rmf_utils +- Boost::system + rmf_websocket + PRIVATE + Threads::Threads +@@ -171,7 +167,6 @@ if(BUILD_TESTING) + ${websocketpp_LIBRARIES} + ${rclcpp_LIBRARIES} + rmf_utils::rmf_utils +- Boost::system + rmf_websocket + PRIVATE + Threads::Threads diff --git a/patch/ros-rolling-robotiq-controllers.patch b/patch/ros-rolling-robotiq-controllers.patch new file mode 100644 index 000000000..42ef69a8e --- /dev/null +++ b/patch/ros-rolling-robotiq-controllers.patch @@ -0,0 +1,47 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 5e955f0..1feb6c6 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -10,6 +10,14 @@ find_package(ament_cmake REQUIRED) + find_package(controller_interface REQUIRED) + find_package(std_srvs REQUIRED) + ++# ament_target_dependencies() was removed from ament_cmake_target_dependencies; ++# link against each dependency's exported _TARGETS instead. ++macro(link_ament_dependencies target) ++ foreach(_ament_dep ${ARGN}) ++ target_link_libraries(${target} ${${_ament_dep}_TARGETS}) ++ endforeach() ++endmacro() ++ + set(THIS_PACKAGE_INCLUDE_DEPENDS + controller_interface + std_srvs +@@ -25,9 +33,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE + include + ) + +-ament_target_dependencies(${PROJECT_NAME} +- ${THIS_PACKAGE_INCLUDE_DEPENDS} +-) ++link_ament_dependencies(${PROJECT_NAME} ${THIS_PACKAGE_INCLUDE_DEPENDS}) + + pluginlib_export_plugin_description_file(controller_interface controller_plugins.xml) + +diff --git a/src/robotiq_activation_controller.cpp b/src/robotiq_activation_controller.cpp +index 03c4fa8..b8ebb82 100644 +--- a/src/robotiq_activation_controller.cpp ++++ b/src/robotiq_activation_controller.cpp +@@ -106,10 +106,10 @@ bool RobotiqActivationController::reactivateGripper( + command_interfaces_[REACTIVATE_GRIPPER_RESPONSE].set_value(ASYNC_WAITING); + command_interfaces_[REACTIVATE_GRIPPER_CMD].set_value(1.0); + +- while (command_interfaces_[REACTIVATE_GRIPPER_RESPONSE].get_value() == ASYNC_WAITING) { ++ while (command_interfaces_[REACTIVATE_GRIPPER_RESPONSE].get_optional().value_or(ASYNC_WAITING) == ASYNC_WAITING) { + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + } +- resp->success = command_interfaces_[REACTIVATE_GRIPPER_RESPONSE].get_value(); ++ resp->success = command_interfaces_[REACTIVATE_GRIPPER_RESPONSE].get_optional().value_or(0.0); + + return resp->success; + } diff --git a/patch/ros-rolling-turtle-tf2-cpp.patch b/patch/ros-rolling-turtle-tf2-cpp.patch new file mode 100644 index 000000000..d4795453e --- /dev/null +++ b/patch/ros-rolling-turtle-tf2-cpp.patch @@ -0,0 +1,63 @@ +diff --git a/src/dynamic_frame_tf2_broadcaster.cpp b/src/dynamic_frame_tf2_broadcaster.cpp +index de08ba7..7e5a7b7 100644 +--- a/src/dynamic_frame_tf2_broadcaster.cpp ++++ b/src/dynamic_frame_tf2_broadcaster.cpp +@@ -30,7 +30,7 @@ public: + DynamicFrameBroadcaster() + : Node("dynamic_frame_tf2_broadcaster") + { +- tf_broadcaster_ = std::make_shared(this); ++ tf_broadcaster_ = std::make_shared(*this); + timer_ = this->create_wall_timer( + 100ms, std::bind(&DynamicFrameBroadcaster::broadcast_timer_callback, this)); + } +diff --git a/src/fixed_frame_tf2_broadcaster.cpp b/src/fixed_frame_tf2_broadcaster.cpp +index 057134f..47347e8 100644 +--- a/src/fixed_frame_tf2_broadcaster.cpp ++++ b/src/fixed_frame_tf2_broadcaster.cpp +@@ -28,7 +28,7 @@ public: + FixedFrameBroadcaster() + : Node("fixed_frame_tf2_broadcaster") + { +- tf_broadcaster_ = std::make_shared(this); ++ tf_broadcaster_ = std::make_shared(*this); + timer_ = this->create_wall_timer( + 100ms, std::bind(&FixedFrameBroadcaster::broadcast_timer_callback, this)); + } +diff --git a/src/static_turtle_tf2_broadcaster.cpp b/src/static_turtle_tf2_broadcaster.cpp +index ddd3218..8f25849 100644 +--- a/src/static_turtle_tf2_broadcaster.cpp ++++ b/src/static_turtle_tf2_broadcaster.cpp +@@ -25,7 +25,7 @@ public: + explicit StaticFramePublisher(char * transformation[]) + : Node("static_turtle_tf2_broadcaster") + { +- tf_static_broadcaster_ = std::make_shared(this); ++ tf_static_broadcaster_ = std::make_shared(*this); + + // Publish static transforms once at startup + this->make_transforms(transformation); +diff --git a/src/turtle_tf2_message_filter.cpp b/src/turtle_tf2_message_filter.cpp +index c2d7085..f57ff6f 100644 +--- a/src/turtle_tf2_message_filter.cpp ++++ b/src/turtle_tf2_message_filter.cpp +@@ -45,17 +45,14 @@ public: + tf2_buffer_ = std::make_shared(this->get_clock()); + // Create the timer interface before call to waitForTransform, + // to avoid a tf2_ros::CreateTimerInterfaceException exception +- auto timer_interface = std::make_shared( +- this->get_node_base_interface(), +- this->get_node_timers_interface()); ++ auto timer_interface = std::make_shared(*this); + tf2_buffer_->setCreateTimerInterface(timer_interface); + tf2_listener_ = + std::make_shared(*tf2_buffer_); + + point_sub_.subscribe(this, "/turtle3/turtle_point_stamped", rclcpp::QoS(10)); + tf2_filter_ = std::make_shared>( +- point_sub_, *tf2_buffer_, target_frame_, 100, this->get_node_logging_interface(), +- this->get_node_clock_interface(), buffer_timeout); ++ point_sub_, *tf2_buffer_, target_frame_, 100, *this, buffer_timeout); + // Register a callback with tf2_ros::MessageFilter to be called when transforms are available + tf2_filter_->registerCallback(&PoseDrawer::msgCallback, this); + } diff --git a/patch/ros-rolling-ublox-dgnss-node.patch b/patch/ros-rolling-ublox-dgnss-node.patch new file mode 100644 index 000000000..c8578aadd --- /dev/null +++ b/patch/ros-rolling-ublox-dgnss-node.patch @@ -0,0 +1,16 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index da65c8f..380b187 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -53,9 +53,11 @@ target_compile_definitions(ublox_dgnss_components + PRIVATE "UBLOX_DGNSS_NODE_BUILDING_DLL" + ) + ++if(NOT APPLE) + target_link_options(ublox_dgnss_components PRIVATE + "LINKER:--allow-multiple-definition" + ) ++endif() + + target_link_libraries(ublox_dgnss_components PUBLIC + ${rtcm_msgs_TARGETS} diff --git a/patch/ros-rolling-udp-driver.patch b/patch/ros-rolling-udp-driver.patch new file mode 100644 index 000000000..b767e03cc --- /dev/null +++ b/patch/ros-rolling-udp-driver.patch @@ -0,0 +1,56 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index b9ca55c..c88adac 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -37,13 +37,15 @@ ament_auto_add_library(${PROJECT_NAME} SHARED + src/udp_socket.cpp + src/udp_driver.cpp + ) +-ament_target_dependencies(${PROJECT_NAME} "ASIO") ++target_include_directories(${PROJECT_NAME} PUBLIC ${ASIO_INCLUDE_DIRS}) ++target_compile_definitions(${PROJECT_NAME} PUBLIC ${ASIO_DEFINITIONS}) + + ament_auto_add_library(${PROJECT_NAME}_nodes SHARED + src/udp_receiver_node.cpp + src/udp_sender_node.cpp + ) +-ament_target_dependencies(${PROJECT_NAME}_nodes "ASIO") ++target_include_directories(${PROJECT_NAME}_nodes PUBLIC ${ASIO_INCLUDE_DIRS}) ++target_compile_definitions(${PROJECT_NAME}_nodes PUBLIC ${ASIO_DEFINITIONS}) + target_link_libraries(${PROJECT_NAME}_nodes ${PROJECT_NAME}) + + rclcpp_components_register_node(${PROJECT_NAME}_nodes +@@ -61,7 +63,8 @@ ament_auto_add_executable(udp_bridge_node_exe + ) + + target_link_libraries(udp_bridge_node_exe ${PROJECT_NAME} ${PROJECT_NAME}_nodes) +-ament_target_dependencies(udp_bridge_node_exe ASIO) ++target_include_directories(udp_bridge_node_exe PUBLIC ${ASIO_INCLUDE_DIRS}) ++target_compile_definitions(udp_bridge_node_exe PUBLIC ${ASIO_DEFINITIONS}) + + if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) +diff --git a/src/udp_socket.cpp b/src/udp_socket.cpp +index 619c7be..1b12400 100644 +--- a/src/udp_socket.cpp ++++ b/src/udp_socket.cpp +@@ -38,15 +38,15 @@ UdpSocket::UdpSocket( + const uint16_t host_port) + : m_ctx(ctx), + m_udp_socket(ctx.ios()), +- m_remote_endpoint(address::from_string(remote_ip), remote_port), +- m_host_endpoint(address::from_string(host_ip), host_port) ++ m_remote_endpoint(asio::ip::make_address(remote_ip), remote_port), ++ m_host_endpoint(asio::ip::make_address(host_ip), host_port) + { + m_remote_endpoint = remote_ip.empty() ? + udp::endpoint{udp::v4(), remote_port} : +- udp::endpoint{address::from_string(remote_ip), remote_port}; ++ udp::endpoint{asio::ip::make_address(remote_ip), remote_port}; + m_host_endpoint = host_ip.empty() ? + udp::endpoint{udp::v4(), host_port} : +- udp::endpoint{address::from_string(host_ip), host_port}; ++ udp::endpoint{asio::ip::make_address(host_ip), host_port}; + m_recv_buffer.resize(m_recv_buffer_size); + } + diff --git a/patch/ros-rolling-vision-msgs-rviz-plugins.patch b/patch/ros-rolling-vision-msgs-rviz-plugins.patch new file mode 100644 index 000000000..b14e4bf03 --- /dev/null +++ b/patch/ros-rolling-vision-msgs-rviz-plugins.patch @@ -0,0 +1,175 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index d1ac767..c7c2a5f 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -16,7 +16,7 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + endif() + + # find dependencies +-find_package(Qt5 REQUIRED COMPONENTS Widgets Core) ++find_package(Qt6 REQUIRED COMPONENTS Widgets Core) + find_package(yaml_cpp_vendor REQUIRED) + + find_package(ament_cmake REQUIRED) +@@ -45,7 +45,7 @@ set(vision_msgs_rviz_plugins_headers_to_moc + ) + + foreach(header "${vision_msgs_rviz_plugins_headers_to_moc}") +- qt5_wrap_cpp(vision_msgs_rviz_plugins_moc_files "${header}") ++ qt6_wrap_cpp(vision_msgs_rviz_plugins_moc_files "${header}") + endforeach() + + +@@ -67,13 +67,15 @@ add_library(${PROJECT_NAME} SHARED + target_include_directories(${PROJECT_NAME} PUBLIC + $ + $ +- ${Qt5Widgets_INCLUDE_DIRS} + ) + + target_link_libraries(${PROJECT_NAME} PUBLIC + rviz_ogre_vendor::OgreMain + rviz_ogre_vendor::OgreOverlay + rviz_common::rviz_common ++ rviz_default_plugins::rviz_default_plugins ++ Qt6::Core ++ Qt6::Widgets + ) + + +diff --git a/include/vision_msgs_rviz_plugins/bounding_box_3d.hpp b/include/vision_msgs_rviz_plugins/bounding_box_3d.hpp +index ef60eea..27cc3fb 100644 +--- a/include/vision_msgs_rviz_plugins/bounding_box_3d.hpp ++++ b/include/vision_msgs_rviz_plugins/bounding_box_3d.hpp +@@ -16,6 +16,7 @@ + #define VISION_MSGS_RVIZ_PLUGINS__BOUNDING_BOX_3D_HPP_ + + #include ++#include + #include + #include + #include +@@ -52,7 +53,7 @@ public: + BOUNDING_BOX_3D_DISPLAY_HPP_PUBLIC + void load(const rviz_common::Config & config) override; + BOUNDING_BOX_3D_DISPLAY_HPP_PUBLIC +- void update(float wall_dt, float ros_dt) override; ++ void update(std::chrono::nanoseconds wall_dt, std::chrono::nanoseconds ros_dt) override; + BOUNDING_BOX_3D_DISPLAY_HPP_PUBLIC + void reset() override; + +diff --git a/include/vision_msgs_rviz_plugins/bounding_box_3d_array.hpp b/include/vision_msgs_rviz_plugins/bounding_box_3d_array.hpp +index cd2b84c..5c5ffd0 100644 +--- a/include/vision_msgs_rviz_plugins/bounding_box_3d_array.hpp ++++ b/include/vision_msgs_rviz_plugins/bounding_box_3d_array.hpp +@@ -16,6 +16,7 @@ + #define VISION_MSGS_RVIZ_PLUGINS__BOUNDING_BOX_3D_ARRAY_HPP_ + + #include ++#include + #include + #include + #include +@@ -54,7 +55,7 @@ public: + BOUNDING_BOX_3D_ARRAY_DISPLAY_HPP_PUBLIC + void load(const rviz_common::Config & config) override; + BOUNDING_BOX_3D_ARRAY_DISPLAY_HPP_PUBLIC +- void update(float wall_dt, float ros_dt) override; ++ void update(std::chrono::nanoseconds wall_dt, std::chrono::nanoseconds ros_dt) override; + BOUNDING_BOX_3D_ARRAY_DISPLAY_HPP_PUBLIC + void reset() override; + +diff --git a/include/vision_msgs_rviz_plugins/detection_3d.hpp b/include/vision_msgs_rviz_plugins/detection_3d.hpp +index bc6ad9b..0975e09 100644 +--- a/include/vision_msgs_rviz_plugins/detection_3d.hpp ++++ b/include/vision_msgs_rviz_plugins/detection_3d.hpp +@@ -16,6 +16,7 @@ + #define VISION_MSGS_RVIZ_PLUGINS__DETECTION_3D_HPP_ + + #include ++#include + #include + #include + #include +@@ -53,7 +54,7 @@ public: + DETECTION_3D_DISPLAY_HPP_PUBLIC + void load(const rviz_common::Config & config) override; + DETECTION_3D_DISPLAY_HPP_PUBLIC +- void update(float wall_dt, float ros_dt) override; ++ void update(std::chrono::nanoseconds wall_dt, std::chrono::nanoseconds ros_dt) override; + DETECTION_3D_DISPLAY_HPP_PUBLIC + void reset() override; + +diff --git a/include/vision_msgs_rviz_plugins/detection_3d_array.hpp b/include/vision_msgs_rviz_plugins/detection_3d_array.hpp +index d2b2b50..9ba0e8e 100644 +--- a/include/vision_msgs_rviz_plugins/detection_3d_array.hpp ++++ b/include/vision_msgs_rviz_plugins/detection_3d_array.hpp +@@ -16,6 +16,7 @@ + #define VISION_MSGS_RVIZ_PLUGINS__DETECTION_3D_ARRAY_HPP_ + + #include ++#include + #include + #include + #include +@@ -57,7 +58,7 @@ public: + DETECTION_3D_ARRAY_DISPLAY_HPP_PUBLIC + void load(const rviz_common::Config & config) override; + DETECTION_3D_ARRAY_DISPLAY_HPP_PUBLIC +- void update(float wall_dt, float ros_dt) override; ++ void update(std::chrono::nanoseconds wall_dt, std::chrono::nanoseconds ros_dt) override; + DETECTION_3D_ARRAY_DISPLAY_HPP_PUBLIC + void reset() override; + +diff --git a/src/bounding_box_3d.cpp b/src/bounding_box_3d.cpp +index daf52a5..286bcec 100644 +--- a/src/bounding_box_3d.cpp ++++ b/src/bounding_box_3d.cpp +@@ -77,7 +77,7 @@ void BoundingBox3DDisplay::processMessage( + } + } + +-void BoundingBox3DDisplay::update(float wall_dt, float ros_dt) ++void BoundingBox3DDisplay::update(std::chrono::nanoseconds wall_dt, std::chrono::nanoseconds ros_dt) + { + m_marker_common->update(wall_dt, ros_dt); + } +diff --git a/src/bounding_box_3d_array.cpp b/src/bounding_box_3d_array.cpp +index f03ea64..7920cbd 100644 +--- a/src/bounding_box_3d_array.cpp ++++ b/src/bounding_box_3d_array.cpp +@@ -77,7 +77,7 @@ void BoundingBox3DArrayDisplay::processMessage( + } + } + +-void BoundingBox3DArrayDisplay::update(float wall_dt, float ros_dt) ++void BoundingBox3DArrayDisplay::update(std::chrono::nanoseconds wall_dt, std::chrono::nanoseconds ros_dt) + { + m_marker_common->update(wall_dt, ros_dt); + } +diff --git a/src/detection_3d.cpp b/src/detection_3d.cpp +index 69a6016..03d8ebb 100644 +--- a/src/detection_3d.cpp ++++ b/src/detection_3d.cpp +@@ -81,7 +81,7 @@ void Detection3DDisplay::processMessage( + } + } + +-void Detection3DDisplay::update(float wall_dt, float ros_dt) ++void Detection3DDisplay::update(std::chrono::nanoseconds wall_dt, std::chrono::nanoseconds ros_dt) + { + m_marker_common->update(wall_dt, ros_dt); + } +diff --git a/src/detection_3d_array.cpp b/src/detection_3d_array.cpp +index b4c1cc5..7bdb041 100644 +--- a/src/detection_3d_array.cpp ++++ b/src/detection_3d_array.cpp +@@ -81,7 +81,7 @@ void Detection3DArrayDisplay::processMessage( + } + } + +-void Detection3DArrayDisplay::update(float wall_dt, float ros_dt) ++void Detection3DArrayDisplay::update(std::chrono::nanoseconds wall_dt, std::chrono::nanoseconds ros_dt) + { + m_marker_common->update(wall_dt, ros_dt); + } diff --git a/patch/ros-rolling-web-video-server.patch b/patch/ros-rolling-web-video-server.patch new file mode 100644 index 000000000..0bfc28e26 --- /dev/null +++ b/patch/ros-rolling-web-video-server.patch @@ -0,0 +1,26 @@ +diff --git a/src/streamers/image_transport_streamer.cpp b/src/streamers/image_transport_streamer.cpp +index 5369276..b706528 100644 +--- a/src/streamers/image_transport_streamer.cpp ++++ b/src/streamers/image_transport_streamer.cpp +@@ -118,7 +118,7 @@ void ImageTransportStreamerBase::start() + return; + } + +- const image_transport::TransportHints hints(node.get(), default_transport_); ++ const image_transport::TransportHints hints(*node, default_transport_); + auto tnat = node->get_topic_names_and_types(); + inactive_ = true; + for (auto topic_and_types : tnat) { +@@ -148,9 +148,10 @@ void ImageTransportStreamerBase::start() + + // Create subscriber + image_sub_ = image_transport::create_subscription( +- node.get(), topic_, ++ *node, topic_, + std::bind(&ImageTransportStreamerBase::image_callback, this, std::placeholders::_1), +- default_transport_, qos_profile.value()); ++ default_transport_, ++ rclcpp::QoS(rclcpp::QoSInitialization(qos_profile.value().history, 1), qos_profile.value())); + } + + #pragma GCC diagnostic pop diff --git a/vinca.yaml b/vinca.yaml index 96d8bc1c5..288162fc2 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -39,6 +39,14 @@ packages_skip_by_deps: - tlsf - tlsf_cpp + # mujoco_vendor has no prebuilt MuJoCo binary for macOS, so mujoco_3d_lidar (which + # calls real MuJoCo API functions, unlike mujoco_ros2_control) can't build there; + # mujoco_ros2_control_plugins pulls it in transitively. + - if: osx + then: + - mujoco_3d_lidar + - mujoco_ros2_control_plugins + packages_remove_from_deps: # Use the conda-forge iceoryx 2.0.6 packages instead of rebuilding the ROS From 55e65ce2eefc6f2ea853358aed5edb5b44276e47 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 07:07:06 +1000 Subject: [PATCH 012/180] fix: remaining macOS build failures (ublox-dgnss-node ODR, rclc_examples/rmf_fleet_adapter/rmf_visualization_floorplans API drift), exclude avt_vimba_camera on osx - ublox-dgnss-node: the --allow-multiple-definition linker flag guard alone wasn't sufficient -- the actual duplicate symbols (ubxKeyCfgItemMap, storage_size_bytes, operator<(ubx_key_id_t), get_polled_frame) are plain non-inline definitions in headers included by multiple translation units, a genuine ODR violation Linux's ld tolerates and Apple's correctly rejects. Mark them `inline` instead of relying on the linker flag. - rclc_examples: rcl_timer_callback_t gained a third (uintptr_t) parameter on Rolling; updated all 9 example timer callbacks across 6 files. - rmf_fleet_adapter: malloc_trim() is glibc-only, guarded with #if defined(__linux__); missing / includes (9 files); two int64_t/size_t-vs-long/long-long template deduction mismatches in std::max() calls, where the distinct-on-macOS types (uint64_t is `long long` there, not `long`/`size_t` as on Linux) fail to unify; three ROS-message std::vector fields passed where FleetUpdateHandle expects std::vector (distinct types on macOS, not just width) -- construct an explicit converting copy instead. - rmf_visualization_floorplans: cv::Mat's std::vector constructor doesn't accept rosidl's message-array Buffer> wrapper type directly -- copy through an explicit std::vector first. - rmf_visualization_schedule: pinned openssl >=3.6.4 (overriding, not additive to, this repo's openssl 3.5.* variant) -- resolvo otherwise falls back to older ros2-cyclonedds/ros2-fastdds builds whose newest builds need it, hitting the already-documented mutex-misattribution bug. - avt_vimba_camera: Allied Vision only ships prebuilt Vimba SDK binaries (libVimbaC/libVimbaCPP) for Linux (x86_64/arm) -- confirmed no source fix is possible (rclcpp/image_transport API-migration patches got it to actually reach the link step, where it fails on ELF .so files built for the wrong OS entirely). Excluded on osx via vinca.yaml, matching the existing mujoco_vendor precedent. ros-rolling now builds all 311 recipes (previously ~150 missing) on osx-arm64. Two dependencies needed real fixes that don't belong in this repo: rmf_websocket (patched here for its own source's rclcpp::Node NodeInterfaces migration and Boost 1.90 boost_system removal) depends on conda-forge's websocketpp package, whose bundled Asio transport code uses boost::asio APIs (io_service et al.) removed in Boost >=1.87 -- reported upstream as a conda-forge/websocketpp-feedstock PR rather than patched locally in this repo. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rclc-examples.patch | 105 ++++++++ patch/ros-rolling-rmf-fleet-adapter.patch | 248 ++++++++++++++++++ ...rolling-rmf-visualization-floorplans.patch | 26 ++ patch/ros-rolling-rmf-websocket.patch | 138 ++++++++++ patch/ros-rolling-ublox-dgnss-node.patch | 48 ++++ vinca.yaml | 7 +- 6 files changed, 571 insertions(+), 1 deletion(-) create mode 100644 patch/ros-rolling-rclc-examples.patch create mode 100644 patch/ros-rolling-rmf-fleet-adapter.patch create mode 100644 patch/ros-rolling-rmf-visualization-floorplans.patch diff --git a/patch/ros-rolling-rclc-examples.patch b/patch/ros-rolling-rclc-examples.patch new file mode 100644 index 000000000..09e9ce8fb --- /dev/null +++ b/patch/ros-rolling-rclc-examples.patch @@ -0,0 +1,105 @@ +diff --git a/src/example_executor.c b/src/example_executor.c +index cf40fda..0b6d8df 100644 +--- a/src/example_executor.c ++++ b/src/example_executor.c +@@ -36,7 +36,7 @@ void my_subscriber_callback(const void * msgin) + } + } + +-void my_timer_callback(rcl_timer_t * timer, int64_t last_call_time) ++void my_timer_callback(rcl_timer_t * timer, int64_t last_call_time, uintptr_t) + { + rcl_ret_t rc; + RCLC_UNUSED(last_call_time); +diff --git a/src/example_executor_only_rcl.c b/src/example_executor_only_rcl.c +index a72202d..2837bf7 100644 +--- a/src/example_executor_only_rcl.c ++++ b/src/example_executor_only_rcl.c +@@ -36,7 +36,7 @@ void my_subscriber_callback(const void * msgin) + } + } + +-void my_timer_callback(rcl_timer_t * timer, int64_t last_call_time) ++void my_timer_callback(rcl_timer_t * timer, int64_t last_call_time, uintptr_t) + { + rcl_ret_t rc; + RCLC_UNUSED(last_call_time); +diff --git a/src/example_executor_trigger.c b/src/example_executor_trigger.c +index 400260e..3cb0dac 100644 +--- a/src/example_executor_trigger.c ++++ b/src/example_executor_trigger.c +@@ -136,7 +136,7 @@ void my_int_subscriber_callback(const void * msgin) + + #define RCLC_UNUSED(x) (void)x + +-void my_timer_string_callback(rcl_timer_t * timer, int64_t last_call_time) ++void my_timer_string_callback(rcl_timer_t * timer, int64_t last_call_time, uintptr_t) + { + rcl_ret_t rc; + rcl_allocator_t allocator = rcl_get_default_allocator(); +@@ -164,7 +164,7 @@ void my_timer_string_callback(rcl_timer_t * timer, int64_t last_call_time) + } + } + +-void my_timer_int_callback(rcl_timer_t * timer, int64_t last_call_time) ++void my_timer_int_callback(rcl_timer_t * timer, int64_t last_call_time, uintptr_t) + { + rcl_ret_t rc; + RCLC_UNUSED(last_call_time); +diff --git a/src/example_parameter_server.c b/src/example_parameter_server.c +index 94fd8db..b125cd1 100644 +--- a/src/example_parameter_server.c ++++ b/src/example_parameter_server.c +@@ -24,7 +24,7 @@ + + rclc_parameter_server_t param_server; + +-void timer_callback(rcl_timer_t * timer, int64_t last_call_time) ++void timer_callback(rcl_timer_t * timer, int64_t last_call_time, uintptr_t) + { + (void) timer; + (void) last_call_time; +diff --git a/src/example_pingpong.cpp b/src/example_pingpong.cpp +index 69fdfc7..ae19c5c 100644 +--- a/src/example_pingpong.cpp ++++ b/src/example_pingpong.cpp +@@ -55,7 +55,7 @@ public: + + /***************************** PING NODE CALLBACKS ***********************************/ + +-void ping_timer_callback(rcl_timer_t * timer, int64_t last_call_time) ++void ping_timer_callback(rcl_timer_t * timer, int64_t last_call_time, uintptr_t) + { + rcl_ret_t rc; + RCLC_UNUSED(last_call_time); +@@ -99,7 +99,7 @@ void ping_subscription_callback(const void * msgin) + } + } + +-void pong_timer_callback(rcl_timer_t * timer, int64_t last_call_time) ++void pong_timer_callback(rcl_timer_t * timer, int64_t last_call_time, uintptr_t) + { + rcl_ret_t rc; + RCLC_UNUSED(last_call_time); +diff --git a/src/example_short_timer_long_subscription.c b/src/example_short_timer_long_subscription.c +index 746b037..bfab2b6 100644 +--- a/src/example_short_timer_long_subscription.c ++++ b/src/example_short_timer_long_subscription.c +@@ -41,7 +41,7 @@ void my_subscriber_callback(const void * msgin) + } + } + +-void my_timer_callback(rcl_timer_t * timer, int64_t last_call_time) ++void my_timer_callback(rcl_timer_t * timer, int64_t last_call_time, uintptr_t) + { + rcl_ret_t rc; + RCLC_UNUSED(last_call_time); +@@ -60,7 +60,7 @@ void my_timer_callback(rcl_timer_t * timer, int64_t last_call_time) + } + } + +-void short_timer_callback(rcl_timer_t * timer, int64_t last_call_time) ++void short_timer_callback(rcl_timer_t * timer, int64_t last_call_time, uintptr_t) + { + RCLC_UNUSED(timer); + RCLC_UNUSED(last_call_time); diff --git a/patch/ros-rolling-rmf-fleet-adapter.patch b/patch/ros-rolling-rmf-fleet-adapter.patch new file mode 100644 index 000000000..b9befe535 --- /dev/null +++ b/patch/ros-rolling-rmf-fleet-adapter.patch @@ -0,0 +1,248 @@ +diff --git a/src/door_supervisor/Node.cpp b/src/door_supervisor/Node.cpp +index 5b5f149..8cea0b4 100644 +--- a/src/door_supervisor/Node.cpp ++++ b/src/door_supervisor/Node.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include "Node.hpp" + + #include +diff --git a/src/full_control/main.cpp b/src/full_control/main.cpp +index 6cde76f..cd11f1c 100644 +--- a/src/full_control/main.cpp ++++ b/src/full_control/main.cpp +@@ -16,6 +16,7 @@ + */ + + // Internal implementation-specific headers ++#include + #include "../rmf_fleet_adapter/ParseArgs.hpp" + #include "../rmf_fleet_adapter/load_param.hpp" + +@@ -1039,8 +1040,12 @@ std::shared_ptr make_fleet( + request_msg->fleet_name.empty()) + return; + +- connections->fleet->open_lanes(request_msg->open_lanes); +- connections->fleet->close_lanes(request_msg->close_lanes); ++ connections->fleet->open_lanes( ++ std::vector( ++ request_msg->open_lanes.begin(), request_msg->open_lanes.end())); ++ connections->fleet->close_lanes( ++ std::vector( ++ request_msg->close_lanes.begin(), request_msg->close_lanes.end())); + + std::unordered_set newly_closed_lanes; + for (const auto& l : request_msg->close_lanes) +@@ -1093,7 +1098,9 @@ std::shared_ptr make_fleet( + requests.push_back(std::move(request)); + } + connections->fleet->limit_lane_speeds(requests); +- connections->fleet->remove_speed_limits(request_msg->remove_limits); ++ connections->fleet->remove_speed_limits( ++ std::vector( ++ request_msg->remove_limits.begin(), request_msg->remove_limits.end())); + }); + + connections->interrupt_request_sub = +diff --git a/src/mock_traffic_light/main.cpp b/src/mock_traffic_light/main.cpp +index 3955f2f..0784191 100644 +--- a/src/mock_traffic_light/main.cpp ++++ b/src/mock_traffic_light/main.cpp +@@ -16,6 +16,7 @@ + */ + + // Internal implementation-specific headers ++#include + #include "../rmf_fleet_adapter/ParseArgs.hpp" + #include "../rmf_fleet_adapter/load_param.hpp" + +diff --git a/src/mutex_group_supervisor/main.cpp b/src/mutex_group_supervisor/main.cpp +index 4f07df4..cdea608 100644 +--- a/src/mutex_group_supervisor/main.cpp ++++ b/src/mutex_group_supervisor/main.cpp +@@ -25,6 +25,7 @@ + #include + + #include ++#include + #include + #include + +diff --git a/src/rmf_fleet_adapter/LegacyTask.cpp b/src/rmf_fleet_adapter/LegacyTask.cpp +index bdbb184..191d04a 100644 +--- a/src/rmf_fleet_adapter/LegacyTask.cpp ++++ b/src/rmf_fleet_adapter/LegacyTask.cpp +@@ -22,7 +22,9 @@ + + #include + ++#if defined(__linux__) + #include ++#endif + + namespace rmf_fleet_adapter { + +@@ -157,7 +159,9 @@ void LegacyTask::_start_next_phase() + // + // TODO(MXG): Remove this when the planner has been made more + // memory-efficient. ++#if defined(__linux__) + malloc_trim(0); ++#endif + + return; + } +diff --git a/src/rmf_fleet_adapter/TaskManager.cpp b/src/rmf_fleet_adapter/TaskManager.cpp +index d674422..7fd7861 100644 +--- a/src/rmf_fleet_adapter/TaskManager.cpp ++++ b/src/rmf_fleet_adapter/TaskManager.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include "TaskManager.hpp" + #include "log_to_json.hpp" + +@@ -306,9 +307,9 @@ nlohmann::json& copy_phase_data( + phase_state["category"] = header.category(); + phase_state["detail"] = header.detail(); + phase_state["original_estimate_millis"] = +- std::max(0l, to_millis(header.original_duration_estimate()).count()); ++ std::max(0, to_millis(header.original_duration_estimate()).count()); + phase_state["estimate_millis"] = +- std::max(0l, to_millis(snapshot.estimate_remaining_time()).count()); ++ std::max(0, to_millis(snapshot.estimate_remaining_time()).count()); + phase_state["final_event_id"] = snapshot.final_event()->id(); + auto& event_states = phase_state["events"]; + +@@ -377,7 +378,7 @@ void copy_phase_data( + phase["category"] = header.category(); + phase["detail"] = header.detail(); + phase["estimate_millis"] = +- std::max(0l, to_millis(header.original_duration_estimate()).count()); ++ std::max(0, to_millis(header.original_duration_estimate()).count()); + } + + //============================================================================== +@@ -460,9 +461,9 @@ void TaskManager::ActiveTask::publish_task_state(TaskManager& mgr) + _state_msg["unix_millis_finish_time"] = + to_millis(finish_estimate.time_since_epoch()).count(); + _state_msg["original_estimate_millis"] = +- std::max(0l, to_millis(header.original_duration_estimate()).count()); ++ std::max(0, to_millis(header.original_duration_estimate()).count()); + _state_msg["estimate_millis"] = +- std::max(0l, to_millis(remaining_time_estimate).count()); ++ std::max(0, to_millis(remaining_time_estimate).count()); + copy_assignment(_state_msg["assigned_to"], *mgr._context); + _state_msg["status"] = + status_to_string(_task->status_overview()); +@@ -2355,7 +2356,7 @@ rmf_task::State TaskManager::_publish_pending_task( + + const auto estimate = + pending.finish_state().time().value() - pending.deployment_time(); +- t.original_estimate_millis = std::max(0l, to_millis(estimate).count()); ++ t.original_estimate_millis = std::max(0, to_millis(estimate).count()); + + pending_json["unix_millis_finish_time"] = t.unix_millis_finish_time; + pending_json["original_estimate_millis"] = t.original_estimate_millis; +diff --git a/src/rmf_fleet_adapter/agv/EasyFullControl.cpp b/src/rmf_fleet_adapter/agv/EasyFullControl.cpp +index 9ad2bfd..a3cd5db 100644 +--- a/src/rmf_fleet_adapter/agv/EasyFullControl.cpp ++++ b/src/rmf_fleet_adapter/agv/EasyFullControl.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include + #include + #include +diff --git a/src/rmf_fleet_adapter/agv/internal_FleetUpdateHandle.hpp b/src/rmf_fleet_adapter/agv/internal_FleetUpdateHandle.hpp +index 0fa5764..fd42b15 100644 +--- a/src/rmf_fleet_adapter/agv/internal_FleetUpdateHandle.hpp ++++ b/src/rmf_fleet_adapter/agv/internal_FleetUpdateHandle.hpp +@@ -73,7 +73,9 @@ + #include + #include + #include ++#if defined(__linux__) + #include ++#endif + + namespace rmf_fleet_adapter { + namespace agv { +@@ -425,7 +427,11 @@ public: + // TODO(MXG): Remove this when the planner has been made more + // memory-efficient. + handle->_pimpl->memory_trim_timer = handle->_pimpl->node->create_wall_timer( +- std::chrono::minutes(5), []() { malloc_trim(0); }); ++ std::chrono::minutes(5), []() { ++#if defined(__linux__) ++ malloc_trim(0); ++#endif ++ }); + + // Create subs and pubs for bidding + auto transient_qos = rclcpp::QoS(10).transient_local(); +diff --git a/src/rmf_fleet_adapter/events/DynamicEvent.cpp b/src/rmf_fleet_adapter/events/DynamicEvent.cpp +index df79a76..755bc93 100644 +--- a/src/rmf_fleet_adapter/events/DynamicEvent.cpp ++++ b/src/rmf_fleet_adapter/events/DynamicEvent.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include "DynamicEvent.hpp" + #include "../log_to_json.hpp" + +diff --git a/src/rmf_fleet_adapter/events/ExecutePlan.cpp b/src/rmf_fleet_adapter/events/ExecutePlan.cpp +index 60bd109..d4b5e46 100644 +--- a/src/rmf_fleet_adapter/events/ExecutePlan.cpp ++++ b/src/rmf_fleet_adapter/events/ExecutePlan.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include "ExecutePlan.hpp" + #include "LegacyPhaseShim.hpp" + #include "WaitForTraffic.hpp" +@@ -119,7 +120,7 @@ void truncate_arrival( + std::size_t first_excluded_route = 0; + for (const auto& c : wp.arrival_checkpoints()) + { +- first_excluded_route = std::max(first_excluded_route, c.route_id+1); ++ first_excluded_route = std::max(first_excluded_route, static_cast(c.route_id+1)); + auto& r = previous_itinerary.at(c.route_id); + auto& t = r.trajectory(); + +diff --git a/src/rmf_fleet_adapter/events/PerformAction.cpp b/src/rmf_fleet_adapter/events/PerformAction.cpp +index 1b12997..d35177e 100644 +--- a/src/rmf_fleet_adapter/events/PerformAction.cpp ++++ b/src/rmf_fleet_adapter/events/PerformAction.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include "PerformAction.hpp" + + #include +diff --git a/src/rmf_fleet_adapter/services/ProgressEvaluator.cpp b/src/rmf_fleet_adapter/services/ProgressEvaluator.cpp +index 6bf830f..58934cc 100644 +--- a/src/rmf_fleet_adapter/services/ProgressEvaluator.cpp ++++ b/src/rmf_fleet_adapter/services/ProgressEvaluator.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include "ProgressEvaluator.hpp" + + namespace rmf_fleet_adapter { diff --git a/patch/ros-rolling-rmf-visualization-floorplans.patch b/patch/ros-rolling-rmf-visualization-floorplans.patch new file mode 100644 index 000000000..1ae964f56 --- /dev/null +++ b/patch/ros-rolling-rmf-visualization-floorplans.patch @@ -0,0 +1,26 @@ +diff --git a/src/FloorplanVisualizer.cpp b/src/FloorplanVisualizer.cpp +index 15c07c0..6c6035e 100644 +--- a/src/FloorplanVisualizer.cpp ++++ b/src/FloorplanVisualizer.cpp +@@ -74,7 +74,9 @@ FloorplanVisualizer::FloorplanVisualizer(const rclcpp::NodeOptions& options) + continue; + + cv::Mat cv_img = cv::imdecode( +- cv::Mat(level.images[0].data), cv::IMREAD_GRAYSCALE); ++ cv::Mat(std::vector( ++ level.images[0].data.begin(), level.images[0].data.end())), ++ cv::IMREAD_GRAYSCALE); + auto it = level.images.begin(); + ++it; + // We blend all the other images into the first image +@@ -84,7 +86,9 @@ FloorplanVisualizer::FloorplanVisualizer(const rclcpp::NodeOptions& options) + for (; it != level.images.end(); ++it) + { + cv::Mat next_img = cv::imdecode( +- cv::Mat(it->data), cv::IMREAD_GRAYSCALE); ++ cv::Mat(std::vector( ++ it->data.begin(), it->data.end())), ++ cv::IMREAD_GRAYSCALE); + cv::addWeighted(cv_img, 0.7, next_img, 0.3, 0.0, cv_img); + } + const auto& image = level.images[0]; diff --git a/patch/ros-rolling-rmf-websocket.patch b/patch/ros-rolling-rmf-websocket.patch index 0b1cfdd19..162988bcd 100644 --- a/patch/ros-rolling-rmf-websocket.patch +++ b/patch/ros-rolling-rmf-websocket.patch @@ -51,3 +51,141 @@ index 0368593..6b258fb 100644 rmf_websocket PRIVATE Threads::Threads +diff --git a/src/rmf_websocket/BroadcastClient.cpp b/src/rmf_websocket/BroadcastClient.cpp +index 01d3ac1..63a2a60 100644 +--- a/src/rmf_websocket/BroadcastClient.cpp ++++ b/src/rmf_websocket/BroadcastClient.cpp +@@ -53,7 +53,7 @@ public: + _io_service.run(); + }); + +- _io_service.dispatch([this]() ++ boost::asio::dispatch(_io_service, [this]() + { + _endpoint.connect(); + }); +@@ -113,7 +113,7 @@ public: + RCLCPP_INFO( + this->_node->get_logger(), + "Attempting queue flush if connected"); +- _io_service.dispatch([this]() ++ boost::asio::dispatch(_io_service, [this]() + { + _flush_queue_if_connected(); + }); +@@ -134,7 +134,7 @@ public: + { + /// _queue is thread safe. No need to lock. + _queue.push(msg); +- _io_service.dispatch([this]() ++ boost::asio::dispatch(_io_service, [this]() + { + _flush_queue_if_connected(); + }); +@@ -151,7 +151,7 @@ public: + log("Buffer full dropping oldest message"); + } + } +- _io_service.dispatch([this]() ++ boost::asio::dispatch(_io_service, [this]() + { + _flush_queue_if_connected(); + }); +@@ -217,7 +217,7 @@ private: + } + // create pimpl + std::string _uri; +- boost::asio::io_service _io_service; ++ boost::asio::io_context _io_service; + std::shared_ptr _node; + RingBuffer _queue; + ProvideJsonUpdates _get_json_updates_cb; +diff --git a/src/rmf_websocket/BroadcastServer.cpp b/src/rmf_websocket/BroadcastServer.cpp +index e29bf9e..81b607f 100644 +--- a/src/rmf_websocket/BroadcastServer.cpp ++++ b/src/rmf_websocket/BroadcastServer.cpp +@@ -112,7 +112,7 @@ public: + "Starting BroadcastServer on port " << endpoint.port()); + } + +- // Start the ASIO io_service run loop ++ // Start the ASIO io_context run loop + _server_thread = std::thread( + [data = _data]() { data->echo_server.run(); }); + } +@@ -128,7 +128,7 @@ public: + _logger_interface->get_logger(), "Stopping BroadcastServer"); + } + +- _data->echo_server.get_io_service().post( ++ boost::asio::post(_data->echo_server.get_io_context(), + [data = _data]() + { + data->echo_server.stop_listening(); +diff --git a/src/rmf_websocket/client/ClientWebSocketEndpoint.cpp b/src/rmf_websocket/client/ClientWebSocketEndpoint.cpp +index 99a823b..82bd297 100644 +--- a/src/rmf_websocket/client/ClientWebSocketEndpoint.cpp ++++ b/src/rmf_websocket/client/ClientWebSocketEndpoint.cpp +@@ -41,7 +41,7 @@ void ConnectionMetadata::on_fail(WsClient* c, websocketpp::connection_hdl hdl) + WsClient::connection_ptr con = c->get_con_from_hdl(hdl); + _server = con->get_response_header("Server"); + _error_reason = con->get_ec().message(); +- c->get_io_service().post(_reconnection_cb); ++ boost::asio::post(c->get_io_context(), _reconnection_cb); + } + + //============================================================================= +@@ -54,7 +54,7 @@ void ConnectionMetadata::on_close(WsClient* c, websocketpp::connection_hdl hdl) + << websocketpp::close::status::get_string(con->get_remote_close_code()) + << "), close reason: " << con->get_remote_close_reason(); + _error_reason = s.str(); +- c->get_io_service().post(_reconnection_cb); ++ boost::asio::post(c->get_io_context(), _reconnection_cb); + } + + //============================================================================= +@@ -108,7 +108,7 @@ websocketpp::connection_hdl ConnectionMetadata::get_hdl() const + //============================================================================= + ClientWebSocketEndpoint::ClientWebSocketEndpoint( + std::string const& uri, std::shared_ptr node, +- asio::io_service* io_service, ++ asio::io_context* io_context, + ConnectionCallback cb) + : _uri(uri), _node(node), _init{false}, _reconnect_enqueued(false), + _connection_cb(std::move(cb)) +@@ -116,7 +116,7 @@ ClientWebSocketEndpoint::ClientWebSocketEndpoint( + _endpoint = std::make_unique(); + _endpoint->clear_access_channels(websocketpp::log::alevel::all); + _endpoint->clear_error_channels(websocketpp::log::elevel::all); +- _endpoint->init_asio(io_service); ++ _endpoint->init_asio(io_context); + _endpoint->start_perpetual(); + } + +@@ -144,11 +144,11 @@ websocketpp::lib::error_code ClientWebSocketEndpoint::connect() + "> Reconnecting in 1s\n" + "> Host: %s", _uri.c_str()); + _endpoint->stop_perpetual(); +- auto io_service = &_endpoint->get_io_service(); ++ auto io_context = &_endpoint->get_io_context(); + _endpoint = std::make_unique(); + _endpoint->clear_access_channels(websocketpp::log::alevel::all); + _endpoint->clear_error_channels(websocketpp::log::elevel::all); +- _endpoint->init_asio(io_service); ++ _endpoint->init_asio(io_context); + _endpoint->start_perpetual(); + websocketpp::lib::error_code ec; + +diff --git a/src/rmf_websocket/client/ClientWebSocketEndpoint.hpp b/src/rmf_websocket/client/ClientWebSocketEndpoint.hpp +index 55f7105..e19d154 100644 +--- a/src/rmf_websocket/client/ClientWebSocketEndpoint.hpp ++++ b/src/rmf_websocket/client/ClientWebSocketEndpoint.hpp +@@ -101,7 +101,7 @@ public: + ClientWebSocketEndpoint( + std::string const& uri, + std::shared_ptr node, +- boost::asio::io_service* io_service, ++ boost::asio::io_context* io_context, + ConnectionCallback cb); + + /// Delete move constructor diff --git a/patch/ros-rolling-ublox-dgnss-node.patch b/patch/ros-rolling-ublox-dgnss-node.patch index c8578aadd..c2fa33bfd 100644 --- a/patch/ros-rolling-ublox-dgnss-node.patch +++ b/patch/ros-rolling-ublox-dgnss-node.patch @@ -14,3 +14,51 @@ index da65c8f..380b187 100644 target_link_libraries(ublox_dgnss_components PUBLIC ${rtcm_msgs_TARGETS} +diff --git a/include/ublox_dgnss_node/ubx/ubx.hpp b/include/ublox_dgnss_node/ubx/ubx.hpp +index 6d9834e..a32b4bb 100644 +--- a/include/ublox_dgnss_node/ubx/ubx.hpp ++++ b/include/ublox_dgnss_node/ubx/ubx.hpp +@@ -112,7 +112,7 @@ using FramePoll = Frame; + using FramePolled = Frame; + using FrameValSet = Frame; + +-std::shared_ptr get_polled_frame( ++inline std::shared_ptr get_polled_frame( + std::shared_ptr usbc, + std::shared_ptr poll_frame) + { +diff --git a/include/ublox_dgnss_node/ubx/ubx_cfg_item.hpp b/include/ublox_dgnss_node/ubx/ubx_cfg_item.hpp +index 8983dbb..c5d3796 100644 +--- a/include/ublox_dgnss_node/ubx/ubx_cfg_item.hpp ++++ b/include/ublox_dgnss_node/ubx/ubx_cfg_item.hpp +@@ -24,7 +24,7 @@ + + namespace ubx::cfg + { +-size_t storage_size_bytes(u8_t storage_size_id) ++inline size_t storage_size_bytes(u8_t storage_size_id) + { + size_t size = 0; + switch (storage_size_id) { +diff --git a/include/ublox_dgnss_node/ubx/ubx_cfg_item_map.hpp b/include/ublox_dgnss_node/ubx/ubx_cfg_item_map.hpp +index 4340333..410a952 100644 +--- a/include/ublox_dgnss_node/ubx/ubx_cfg_item_map.hpp ++++ b/include/ublox_dgnss_node/ubx/ubx_cfg_item_map.hpp +@@ -446,7 +446,7 @@ enum CFG_ITFM_ANTSETTING_ENUM + }; + + +-ubx_cfg_item_map_t ubxKeyCfgItemMap = { ++inline ubx_cfg_item_map_t ubxKeyCfgItemMap = { + {CFG_INFMSG_UBX_USB.ubx_key_id, CFG_INFMSG_UBX_USB}, + {CFG_INFMSG_NMEA_USB.ubx_key_id, CFG_INFMSG_NMEA_USB}, + {CFG_UART1INPROT_UBX.ubx_key_id, CFG_UART1INPROT_UBX}, +@@ -632,7 +632,7 @@ ubx_cfg_item_map_t ubxKeyCfgItemMap = { + // {CFG_ITFM_ENABLE_AUX.ubx_key_id, CFG_ITFM_ENABLE_AUX}, + }; + +-bool operator<(const ubx_key_id_t & fk1, const ubx_key_id_t & fk2) ++inline bool operator<(const ubx_key_id_t & fk1, const ubx_key_id_t & fk2) + { + return fk1.all < fk2.all; + } diff --git a/vinca.yaml b/vinca.yaml index 288162fc2..a7258e783 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -232,7 +232,6 @@ packages_select_by_deps: - autoware_pose_initializer # depends on autoware_motion_utils - autoware_qp_interface - autoware_trajectory # depends on autoware_motion_utils - - avt_vimba_camera - bno055 - cartographer_ros - cascade_lifecycle_msgs @@ -319,6 +318,12 @@ packages_select_by_deps: - turtlebot3_gazebo - urdf_launch - yaml_cpp_vendor + + # Allied Vision only ships prebuilt Vimba SDK binaries (libVimbaC/libVimbaCPP) + # for Linux (x86_64/arm), not macOS -- no source-level fix is possible. + - if: not win and not osx + then: + - avt_vimba_camera - if: not wasm32 then: - joy_linux From 2bf95eb77988f78d4ea793ab49c1b00f02a0414b Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 07:40:11 +1000 Subject: [PATCH 013/180] fix: switch rmf_websocket to standalone asio (Boost 1.90 dropped io_service) websocketpp 0.8.2 calls boost::asio::io_service, which Boost 1.90 removed. Rather than patch websocketpp itself, define ASIO_STANDALONE and pin the standalone asio host/run dep to ==1.29.0 (the newest conda-forge build that still ships io_service.hpp), matching the fix RoboStack/ros-lyrical#41 already validated. Also opened conda-forge/websocketpp-feedstock#8 upstream for the same Boost.Asio compatibility gap, for consumers not using ASIO_STANDALONE. Co-Authored-By: Claude Sonnet 5 --- patch/dependencies.yaml | 9 ++ patch/ros-rolling-rmf-websocket.patch | 171 +++----------------------- 2 files changed, 28 insertions(+), 152 deletions(-) diff --git a/patch/dependencies.yaml b/patch/dependencies.yaml index b083ac71d..e034ef765 100644 --- a/patch/dependencies.yaml +++ b/patch/dependencies.yaml @@ -301,3 +301,12 @@ roboplan_ros_examples: # find_package(ament_cmake REQUIRED) and build_type is ament_cmake. # Fixed for roboplan_ros 0.7.0, so it can be removed when this releases. add_host: ["ros-rolling-ament-cmake"] +rmf_websocket: + # websocketpp 0.8.2 requires boost::asio APIs (io_service et al.) that + # Boost 1.90 removed; the patch defines ASIO_STANDALONE so websocketpp + # uses the standalone asio instead, matching ros-lyrical's fix in + # RoboStack/ros-lyrical#41. Pinned to 1.29.0 (the newest conda-forge + # build that still ships io_service.hpp -- 1.30+ removed it too, same + # underlying upstream deprecation that hit Boost.Asio). + add_host: ["asio ==1.29.0"] + add_run: ["asio ==1.29.0"] diff --git a/patch/ros-rolling-rmf-websocket.patch b/patch/ros-rolling-rmf-websocket.patch index 162988bcd..c4bed16e8 100644 --- a/patch/ros-rolling-rmf-websocket.patch +++ b/patch/ros-rolling-rmf-websocket.patch @@ -1,17 +1,28 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 0368593..6b258fb 100644 +index 0368593..38a9279 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -21,7 +21,7 @@ find_package(nlohmann_json REQUIRED) +@@ -2,6 +2,11 @@ cmake_minimum_required(VERSION 3.5) + + project(rmf_websocket) + ++# websocketpp 0.8.2 requires Asio APIs (io_service et al.) that Boost 1.90 ++# removed. Use the actively-maintained standalone Asio instead (matching ++# RoboStack/ros-lyrical#41's fix), which still provides io_service. ++add_compile_definitions(ASIO_STANDALONE) ++ + if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 17) + endif() +@@ -21,7 +26,6 @@ find_package(nlohmann_json REQUIRED) find_package(nlohmann_json_schema_validator_vendor REQUIRED) find_package(nlohmann_json_schema_validator REQUIRED) find_package(websocketpp REQUIRED) -find_package(Boost COMPONENTS system REQUIRED) -+find_package(Boost REQUIRED) find_package(Threads) -@@ -39,7 +39,6 @@ target_link_libraries(rmf_websocket +@@ -39,7 +43,6 @@ target_link_libraries(rmf_websocket nlohmann_json::nlohmann_json nlohmann_json_schema_validator PRIVATE @@ -19,165 +30,21 @@ index 0368593..6b258fb 100644 Threads::Threads ) -@@ -113,7 +112,6 @@ if(BUILD_TESTING) - target_link_libraries(test_ring_buffer - PRIVATE - rmf_utils::rmf_utils -- Boost::system - ) - - #integration test -@@ -126,7 +124,6 @@ if(BUILD_TESTING) - ${websocketpp_LIBRARIES} - ${rclcpp_LIBRARIES} - rmf_utils::rmf_utils -- Boost::system - rmf_websocket - PRIVATE - Threads::Threads -@@ -149,7 +146,6 @@ if(BUILD_TESTING) - ${websocketpp_LIBRARIES} - ${rclcpp_LIBRARIES} - rmf_utils::rmf_utils -- Boost::system - rmf_websocket - PRIVATE - Threads::Threads -@@ -171,7 +167,6 @@ if(BUILD_TESTING) - ${websocketpp_LIBRARIES} - ${rclcpp_LIBRARIES} - rmf_utils::rmf_utils -- Boost::system - rmf_websocket - PRIVATE - Threads::Threads diff --git a/src/rmf_websocket/BroadcastClient.cpp b/src/rmf_websocket/BroadcastClient.cpp -index 01d3ac1..63a2a60 100644 +index 01d3ac1..250f5b1 100644 --- a/src/rmf_websocket/BroadcastClient.cpp +++ b/src/rmf_websocket/BroadcastClient.cpp -@@ -53,7 +53,7 @@ public: - _io_service.run(); - }); - -- _io_service.dispatch([this]() -+ boost::asio::dispatch(_io_service, [this]() - { - _endpoint.connect(); - }); -@@ -113,7 +113,7 @@ public: - RCLCPP_INFO( - this->_node->get_logger(), - "Attempting queue flush if connected"); -- _io_service.dispatch([this]() -+ boost::asio::dispatch(_io_service, [this]() - { - _flush_queue_if_connected(); - }); -@@ -134,7 +134,7 @@ public: - { - /// _queue is thread safe. No need to lock. - _queue.push(msg); -- _io_service.dispatch([this]() -+ boost::asio::dispatch(_io_service, [this]() - { - _flush_queue_if_connected(); - }); -@@ -151,7 +151,7 @@ public: - log("Buffer full dropping oldest message"); - } - } -- _io_service.dispatch([this]() -+ boost::asio::dispatch(_io_service, [this]() - { - _flush_queue_if_connected(); - }); @@ -217,7 +217,7 @@ private: } // create pimpl std::string _uri; - boost::asio::io_service _io_service; -+ boost::asio::io_context _io_service; ++ asio::io_service _io_service; std::shared_ptr _node; RingBuffer _queue; ProvideJsonUpdates _get_json_updates_cb; -diff --git a/src/rmf_websocket/BroadcastServer.cpp b/src/rmf_websocket/BroadcastServer.cpp -index e29bf9e..81b607f 100644 ---- a/src/rmf_websocket/BroadcastServer.cpp -+++ b/src/rmf_websocket/BroadcastServer.cpp -@@ -112,7 +112,7 @@ public: - "Starting BroadcastServer on port " << endpoint.port()); - } - -- // Start the ASIO io_service run loop -+ // Start the ASIO io_context run loop - _server_thread = std::thread( - [data = _data]() { data->echo_server.run(); }); - } -@@ -128,7 +128,7 @@ public: - _logger_interface->get_logger(), "Stopping BroadcastServer"); - } - -- _data->echo_server.get_io_service().post( -+ boost::asio::post(_data->echo_server.get_io_context(), - [data = _data]() - { - data->echo_server.stop_listening(); -diff --git a/src/rmf_websocket/client/ClientWebSocketEndpoint.cpp b/src/rmf_websocket/client/ClientWebSocketEndpoint.cpp -index 99a823b..82bd297 100644 ---- a/src/rmf_websocket/client/ClientWebSocketEndpoint.cpp -+++ b/src/rmf_websocket/client/ClientWebSocketEndpoint.cpp -@@ -41,7 +41,7 @@ void ConnectionMetadata::on_fail(WsClient* c, websocketpp::connection_hdl hdl) - WsClient::connection_ptr con = c->get_con_from_hdl(hdl); - _server = con->get_response_header("Server"); - _error_reason = con->get_ec().message(); -- c->get_io_service().post(_reconnection_cb); -+ boost::asio::post(c->get_io_context(), _reconnection_cb); - } - - //============================================================================= -@@ -54,7 +54,7 @@ void ConnectionMetadata::on_close(WsClient* c, websocketpp::connection_hdl hdl) - << websocketpp::close::status::get_string(con->get_remote_close_code()) - << "), close reason: " << con->get_remote_close_reason(); - _error_reason = s.str(); -- c->get_io_service().post(_reconnection_cb); -+ boost::asio::post(c->get_io_context(), _reconnection_cb); - } - - //============================================================================= -@@ -108,7 +108,7 @@ websocketpp::connection_hdl ConnectionMetadata::get_hdl() const - //============================================================================= - ClientWebSocketEndpoint::ClientWebSocketEndpoint( - std::string const& uri, std::shared_ptr node, -- asio::io_service* io_service, -+ asio::io_context* io_context, - ConnectionCallback cb) - : _uri(uri), _node(node), _init{false}, _reconnect_enqueued(false), - _connection_cb(std::move(cb)) -@@ -116,7 +116,7 @@ ClientWebSocketEndpoint::ClientWebSocketEndpoint( - _endpoint = std::make_unique(); - _endpoint->clear_access_channels(websocketpp::log::alevel::all); - _endpoint->clear_error_channels(websocketpp::log::elevel::all); -- _endpoint->init_asio(io_service); -+ _endpoint->init_asio(io_context); - _endpoint->start_perpetual(); - } - -@@ -144,11 +144,11 @@ websocketpp::lib::error_code ClientWebSocketEndpoint::connect() - "> Reconnecting in 1s\n" - "> Host: %s", _uri.c_str()); - _endpoint->stop_perpetual(); -- auto io_service = &_endpoint->get_io_service(); -+ auto io_context = &_endpoint->get_io_context(); - _endpoint = std::make_unique(); - _endpoint->clear_access_channels(websocketpp::log::alevel::all); - _endpoint->clear_error_channels(websocketpp::log::elevel::all); -- _endpoint->init_asio(io_service); -+ _endpoint->init_asio(io_context); - _endpoint->start_perpetual(); - websocketpp::lib::error_code ec; - diff --git a/src/rmf_websocket/client/ClientWebSocketEndpoint.hpp b/src/rmf_websocket/client/ClientWebSocketEndpoint.hpp -index 55f7105..e19d154 100644 +index 55f7105..6c0cd4b 100644 --- a/src/rmf_websocket/client/ClientWebSocketEndpoint.hpp +++ b/src/rmf_websocket/client/ClientWebSocketEndpoint.hpp @@ -101,7 +101,7 @@ public: @@ -185,7 +52,7 @@ index 55f7105..e19d154 100644 std::string const& uri, std::shared_ptr node, - boost::asio::io_service* io_service, -+ boost::asio::io_context* io_context, ++ asio::io_service* io_service, ConnectionCallback cb); /// Delete move constructor From 9d06906f090d6adbef7e00074618497e8220756a Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 07:40:25 +1000 Subject: [PATCH 014/180] feat: port missing robostack.yaml mappings and seeds from humble for parity rolling's package count (155 unique / ~304 recipes) lags far behind humble (1105) and jazzy (1004) despite near-identical explicit seed counts. Root cause: robostack.yaml (rosdep-key -> conda-forge package mapping) is missing 29 entries that humble already has, so vinca's dependency expansion silently drops those transitive deps instead of erroring. Ported the missing entries from humble/robostack.yaml (adapting qml-module-qtquick-extras to rolling's Qt6 baseline). Also added 12 genuinely-missing top-level seeds found by diffing packages_select_by_deps against humble/jazzy: ntrip_client, rqt_image_overlay, and the full yasmin_* family (yasmin, yasmin_cli, yasmin_demos, yasmin_editor, yasmin_factory, yasmin_msgs, yasmin_pcl, yasmin_plugins_manager, yasmin_ros, yasmin_viewer), all verified present in rolling's rosdistro_snapshot.yaml. Fixed an unrelated pre-existing duplicate vision_msgs_rviz_plugins line while in the area. Added a comment separator before the linux-and-not-aarch64 webots_ros2/ zed_msgs block: vinca-sort-vinca-lists pools then-items across adjacent if-blocks that aren't separated by a comment, which would otherwise bleed webots_ros2 into the wrong platform scope on the next sort. Co-Authored-By: Claude Sonnet 5 --- robostack.yaml | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ vinca.yaml | 16 +++++++++++- 2 files changed, 85 insertions(+), 1 deletion(-) diff --git a/robostack.yaml b/robostack.yaml index cee7dd0c0..012de4499 100644 --- a/robostack.yaml +++ b/robostack.yaml @@ -33,6 +33,8 @@ binutils: win64: [] bison: robostack: [bison] +black: + robostack: [black] boost: robostack: [libboost-devel, libboost-python-devel] bullet: @@ -113,6 +115,8 @@ flex: robostack: [flex] fmt: robostack: [fmt] +fri_client_sdk: + robostack: [lbr-fri-client-sdk] g++-static: robostack: [] gawk: @@ -177,6 +181,11 @@ ignition-gazebo6: robostack: [libignition-gazebo6] ignition-gui5: robostack: [libignition-gui5] +ignition-gui6: + robostack: + linux: [libignition-gui6, libgl-devel] + osx: [libignition-gui6] + win64: [libignition-gui6] ignition-math6: robostack: [libignition-math6] ignition-msgs5: @@ -185,6 +194,8 @@ ignition-msgs7: robostack: [libignition-msgs7] ignition-msgs8: robostack: [libignition-msgs8] +ignition-plugin: + robostack: [libignition-plugin1] ignition-rendering5: robostack: [libignition-rendering5] ignition-transport10: @@ -213,6 +224,10 @@ libboost: robostack: [libboost] libboost-chrono-dev: robostack: [libboost-devel] +libboost-coroutine: + robostack: [libboost] +libboost-coroutine-dev: + robostack: [libboost-devel] libboost-date-time: robostack: [libboost] libboost-date-time-dev: @@ -266,6 +281,8 @@ libclang-dev: robostack: [libclang] libconsole-bridge-dev: robostack: [console_bridge] +libcpp-httplib-dev: + robostack: [cpp-httplib] libcunit-dev: robostack: [cunit] libcurl: @@ -283,6 +300,8 @@ libdw-dev: win64: [] libexpected-dev: robostack: [cpp-expected] +libfcl: + robostack: [fcl] libfcl-dev: robostack: [fcl] libffi-dev: @@ -331,6 +350,11 @@ libgpgme-dev: linux: [gpgme] osx: [gpgme] win64: [] +libgpiod-dev: + robostack: + linux: [libgpiod] + osx: [] + win64: [] libgps: robostack: [gpsd] libgsl: @@ -426,6 +450,18 @@ libpcl-all-dev: linux: [pcl, libboost-devel, vtk-base, libopengl-devel, libgl-devel, eigen-abi-devel] osx: [pcl, libboost-devel, vtk-base, eigen-abi-devel] win64: [pcl, libboost-devel, vtk-base, eigen-abi-devel] +libpcl-common: + robostack: [pcl] +libpcl-features: + robostack: [pcl] +libpcl-filters: + robostack: [pcl] +libpcl-io: + robostack: [pcl] +libpcl-segmentation: + robostack: [pcl] +libpcl-surface: + robostack: [pcl] libpng-dev: robostack: [libpng] libpoco-dev: @@ -660,6 +696,8 @@ lz4: robostack: [lz4] maven: robostack: [maven] +meson: + robostack: [meson] mongodb: robostack: [mongodb] mosquitto: @@ -827,6 +865,8 @@ python3: robostack: [python] python3-argcomplete: robostack: [argcomplete] +python3-attrs: + robostack: [attrs] python3-autobahn: robostack: [autobahn] python3-bson: @@ -909,6 +949,8 @@ python3-grpcio: robostack: [grpcio] python3-h5py: robostack: [h5py] +python3-httpx: + robostack: [httpx] python3-ifcfg: robostack: [ifcfg] python3-imageio: @@ -964,6 +1006,8 @@ python3-pip: robostack: [pip] python3-pkg-resources: robostack: [] +python3-platformdirs: + robostack: [platformdirs] python3-prompt-toolkit: robostack: [prompt-toolkit] python3-protobuf: @@ -1026,6 +1070,8 @@ python3-ruff: robostack: [ruff] python3-scipy: robostack: [scipy] +python3-semver: + robostack: [semver] python3-serial: robostack: [pyserial] python3-setproctitle: @@ -1050,12 +1096,20 @@ python3-texttable: robostack: [texttable] python3-tk: robostack: [tk] +python3-toml: + robostack: [toml] python3-tornado: robostack: [tornado] +python3-tqdm: + robostack: [tqdm] +python3-transforms3d: + robostack: [transforms3d] python3-twisted: robostack: [twisted] python3-typeguard: robostack: [typeguard] +python3-ujson: + robostack: [ujson] python3-unidiff: robostack: [unidiff] python3-usb: @@ -1064,16 +1118,28 @@ python3-utm: robostack: [utm] python3-uvicorn: robostack: [uvicorn] +python3-uvloop: + robostack: + linux: [uvloop] + osx: [uvloop] + win64: [] python3-vcstool: robostack: [vcs2l] python3-venv: robostack: [virtualenv, pip, pip-tools, setuptools] python3-websocket: robostack: [websocket-client] +python3-websockets: + robostack: [websockets] python3-yaml: robostack: [pyyaml] python3-zmq: robostack: [pyzmq] +qml-module-qtquick-extras: + robostack: + linux: [qt6-main, libopengl-devel, libgl-devel] + osx: [qt6-main] + win64: [qt6-main] qt-base-dev: robostack: linux: [qt6-main, libopengl-devel, libgl-devel] @@ -1109,6 +1175,8 @@ rsync: robostack: [rsync] rti-connext-dds-5.3.1: robostack: [] +rti-connext-dds-6.0.1: + robostack: [] ruby: robostack: [ruby] sbcl: @@ -1128,6 +1196,8 @@ sdl-image: robostack: [sdl_image] sdl2: robostack: [sdl2] +simde: + robostack: [simde] smartmontools: robostack: [smartmontools] socat: diff --git a/vinca.yaml b/vinca.yaml index a7258e783..bd5e8959d 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -312,6 +312,8 @@ packages_select_by_deps: - rtest - rviz_2d_overlay_msgs - teleop_tools + - ntrip_client + - rqt_image_overlay - tracetools - tracetools_launch - tracetools_trace @@ -441,9 +443,21 @@ packages_select_by_deps: - velodyne - vision_msgs - vision_msgs_rviz_plugins - - vision_msgs_rviz_plugins - visp - web_video_server + - yasmin + - yasmin_cli + - yasmin_demos + - yasmin_editor + - yasmin_factory + - yasmin_msgs + - yasmin_pcl + - yasmin_plugins_manager + - yasmin_ros + + # webots_ros2 is linux-only (excluding aarch64); do not merge this block's + # sort domain with the block above (vinca-sort-vinca-lists pools then-items + # across adjacent if-blocks unless separated by a comment) - if: linux and not aarch64 then: - webots_ros2 From d677dff8fd242dc9b8bc68e9ede215839228c578 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 07:53:26 +1000 Subject: [PATCH 015/180] fix: drop rqt_image_overlay seed, make two recipe hand-edits durable rqt_image_overlay hard-depends on ros_image_to_qimage, which has a repo entry in rolling's rosdistro index but no released version at all -- a genuine upstream gap, not a robostack.yaml mapping issue. Selecting it crashes vinca's dependency walk with "Package 'ros_image_to_qimage' ... has no version set". Drop it from the seed list until upstream tags a release. Also move two previously-hand-edited recipe.yaml overrides into patch/dependencies.yaml so they survive `vinca -m` regeneration instead of needing to be reapplied by hand every time: - rmf_fleet_adapter_python: add pybind11_json to host (used for nlohmann::json<->pybind11 conversions, missing from package.xml) - rmf_visualization_schedule: bump openssl to >=3.6.4 in host/run Co-Authored-By: Claude Sonnet 5 --- patch/dependencies.yaml | 12 ++++++++++++ vinca.yaml | 1 - 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/patch/dependencies.yaml b/patch/dependencies.yaml index e034ef765..ae93ee6bb 100644 --- a/patch/dependencies.yaml +++ b/patch/dependencies.yaml @@ -301,6 +301,18 @@ roboplan_ros_examples: # find_package(ament_cmake REQUIRED) and build_type is ament_cmake. # Fixed for roboplan_ros 0.7.0, so it can be removed when this releases. add_host: ["ros-rolling-ament-cmake"] +rmf_fleet_adapter_python: + # pybind11_json is used for nlohmann::json <-> pybind11 conversions in the + # bindings but isn't declared in package.xml (a rosdistro release gap); + # header-only, so host-only is sufficient. + add_host: ["pybind11_json"] +rmf_visualization_schedule: + # Needed >=3.6.4 to build successfully on macOS during an earlier build + # pass; package.xml itself declares openssl with no version constraint. + remove_host: ["openssl"] + add_host: ["openssl >=3.6.4"] + remove_run: ["openssl"] + add_run: ["openssl >=3.6.4"] rmf_websocket: # websocketpp 0.8.2 requires boost::asio APIs (io_service et al.) that # Boost 1.90 removed; the patch defines ASIO_STANDALONE so websocketpp diff --git a/vinca.yaml b/vinca.yaml index bd5e8959d..39ed0f213 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -313,7 +313,6 @@ packages_select_by_deps: - rviz_2d_overlay_msgs - teleop_tools - ntrip_client - - rqt_image_overlay - tracetools - tracetools_launch - tracetools_trace From b79234d98424c99414d3d8000d228ff76e552a7d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 08:00:48 +1000 Subject: [PATCH 016/180] fix: build_continue_on_failure used the wrong (empty) robostack-rolling channel Bare "-c robostack-rolling" resolves to https://conda.anaconda.org/robostack-rolling/ by default, which has zero packages -- rolling publishes to https://repo.prefix.dev/robostack-rolling instead (already used correctly by the `build` and `build-one` tasks, and by `upload`'s own target). Every fresh package build against this task failed with "No candidates were found for ros2-ament-cmake *" (or whatever core dependency the solver happened to name first) since the real channel was never actually being searched. Match the other two build tasks' channel argument. Co-Authored-By: Claude Sonnet 5 --- pixi.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixi.toml b/pixi.toml index c84d6b61a..d5042963c 100644 --- a/pixi.toml +++ b/pixi.toml @@ -40,7 +40,7 @@ generate-gha-workflows = { cmd = "vinca-gha --trigger-branch dummy_build_branch_ check-patches = { cmd = "python check_patches_clean_apply.py", depends-on = ["generate-recipes"] } create_snapshot = { cmd = "vinca-snapshot -d rolling -o rosdistro_snapshot.yaml" } upload = "rattler-build upload prefix -c robostack-rolling --generate-attestation" -build_continue_on_failure = { cmd = "rattler-build build --recipe-dir ./recipes -m ./conda_build_config.yaml -c robostack-rolling -c https://repo.prefix.dev/conda-forge --continue-on-failure --skip-existing", depends-on = ["generate-recipes"] } +build_continue_on_failure = { cmd = "rattler-build build --recipe-dir ./recipes -m ./conda_build_config.yaml -c https://repo.prefix.dev/robostack-rolling -c https://repo.prefix.dev/conda-forge --continue-on-failure --skip-existing", depends-on = ["generate-recipes"] } sort = "sh -lc 'vinca-sort-vinca-lists $@ vinca.yaml && vinca-sort-yaml-keys $@ pkg_additional_info.yaml robostack.yaml rosdistro_additional_recipes.yaml' --" [tasks.build] From 286c10d1914228642171ace556d4533602d433d3 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 08:51:53 +1000 Subject: [PATCH 017/180] fix: macOS build fixes for 5 packages + exclude mujoco_ros2_control on osx Five independent macOS-specific build failures fixed, verified with individual rebuilds against the current recipe set: - urg_node: urg_c_wrapper.cpp calls read()/write() without . - microstrain_inertial_driver: tf2/LinearMath/*.h headers no longer exist (only .hpp now); two make_shared calls passed a Node* where the NodeInterfaces bundle needs a reference. - motion_capture_tracking: same NodeInterfaces bundle issue, one call site (tf2_ros::TransformBroadcaster tfbroadcaster(node) -> (*node)). - realsense2_camera: upstream CMakeLists.txt guards Linux-only GNU-ld hardening flags (-z noexecstack/relro/now) with if(UNIX OR APPLE) -- APPLE also sets UNIX, so these ELF-only flags leaked onto the Apple linker, which rejects -z outright ("ld: unknown option: -z"). - rmw_stats_shim: same category of bug, gating -Wl,--no-undefined (a GNU ld long option) on "Clang" without excluding Apple's clang+ld64 pairing. Also move mujoco_ros2_control(_demos) into the existing osx-exclusion block (packages_select_by_deps, not packages_skip_by_deps, since these are explicitly-selected top-level seeds and skip_by_deps only prunes transitive expansion): mujoco_ros2_control hard-depends on mujoco_ros2_control_plugins, which is already macOS-excluded because mujoco_vendor has no prebuilt MuJoCo binary there. Co-Authored-By: Claude Sonnet 5 --- ...-rolling-microstrain-inertial-driver.patch | 48 +++++++++++++++++++ .../ros-rolling-motion-capture-tracking.patch | 13 +++++ patch/ros-rolling-realsense2-camera.patch | 21 ++++++++ patch/ros-rolling-rmw-stats-shim.patch | 20 ++++++-- patch/ros-rolling-urg-node.patch | 13 +++++ vinca.yaml | 11 ++++- 6 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 patch/ros-rolling-motion-capture-tracking.patch create mode 100644 patch/ros-rolling-realsense2-camera.patch create mode 100644 patch/ros-rolling-urg-node.patch diff --git a/patch/ros-rolling-microstrain-inertial-driver.patch b/patch/ros-rolling-microstrain-inertial-driver.patch index 841070eb7..60fda440c 100644 --- a/patch/ros-rolling-microstrain-inertial-driver.patch +++ b/patch/ros-rolling-microstrain-inertial-driver.patch @@ -39,3 +39,51 @@ index 35e036f..4ae5e4d 100644 # Annoying, but the ROS types don't match up with the MIP types for floats and doubles, so ignore those warnings for now set_source_files_properties(${COMMON_SRC_DIR}/services.cpp PROPERTIES COMPILE_OPTIONS "-Wno-narrowing") +diff --git a/microstrain_inertial_driver_common/include/microstrain_inertial_driver_common/utils/ros_compat.h b/microstrain_inertial_driver_common/include/microstrain_inertial_driver_common/utils/ros_compat.h +index f1fe0879..5b866134 100644 +--- a/microstrain_inertial_driver_common/include/microstrain_inertial_driver_common/utils/ros_compat.h ++++ b/microstrain_inertial_driver_common/include/microstrain_inertial_driver_common/utils/ros_compat.h +@@ -779,7 +779,7 @@ inline TransformListenerType createTransformListener(TransformBufferType buffer) + */ + inline StaticTransformBroadcasterType createStaticTransformBroadcaster(RosNodeType* node) + { +- return std::make_shared(node); ++ return std::make_shared(*node); + } + + /** +@@ -789,7 +789,7 @@ inline StaticTransformBroadcasterType createStaticTransformBroadcaster(RosNodeTy + */ + inline TransformBroadcasterType createTransformBroadcaster(RosNodeType* node) + { +- return std::make_shared(node); ++ return std::make_shared(*node); + } + + /** +diff --git a/src/microstrain_inertial_driver.cpp b/src/microstrain_inertial_driver.cpp +index e679866b..eaea4f15 100644 +--- a/src/microstrain_inertial_driver.cpp ++++ b/src/microstrain_inertial_driver.cpp +@@ -18,7 +18,7 @@ + #include + #include + +-#include ++#include + + #include "lifecycle_msgs/msg/transition.hpp" + +diff --git a/src/microstrain_inertial_driver_lifecycle.cpp b/src/microstrain_inertial_driver_lifecycle.cpp +index 1e2a6757..f77bb1d9 100644 +--- a/src/microstrain_inertial_driver_lifecycle.cpp ++++ b/src/microstrain_inertial_driver_lifecycle.cpp +@@ -18,7 +18,7 @@ + #include + #include + +-#include ++#include + + #include "lifecycle_msgs/msg/transition.hpp" + diff --git a/patch/ros-rolling-motion-capture-tracking.patch b/patch/ros-rolling-motion-capture-tracking.patch new file mode 100644 index 000000000..97206168a --- /dev/null +++ b/patch/ros-rolling-motion-capture-tracking.patch @@ -0,0 +1,13 @@ +diff --git a/src/motion_capture_tracking_node.cpp b/src/motion_capture_tracking_node.cpp +index ace9626..5d99a63 100644 +--- a/src/motion_capture_tracking_node.cpp ++++ b/src/motion_capture_tracking_node.cpp +@@ -199,7 +199,7 @@ int main(int argc, char **argv) + tracker.setLogWarningCallback(std::bind(logWarn, node->get_logger(), std::placeholders::_1)); + + // prepare TF broadcaster +- tf2_ros::TransformBroadcaster tfbroadcaster(node); ++ tf2_ros::TransformBroadcaster tfbroadcaster(*node); + std::vector transforms; + + pcl::PointCloud::Ptr markers(new pcl::PointCloud); diff --git a/patch/ros-rolling-realsense2-camera.patch b/patch/ros-rolling-realsense2-camera.patch new file mode 100644 index 000000000..146e0e242 --- /dev/null +++ b/patch/ros-rolling-realsense2-camera.patch @@ -0,0 +1,21 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 470f8c3c..01fbff80 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -36,11 +36,14 @@ option(USE_LIFECYCLE_NODE "Enable lifecycle nodes (ON/OFF)" OFF) + # Compiler Defense Flags + if(UNIX OR APPLE) + # Linker flags. +- if(${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Intel") ++ # NOTE: these are Linux/ELF-specific (-z is a GNU ld option; Apple's ld doesn't ++ # understand it at all and fails outright), so they must not apply on APPLE ++ # even though APPLE also sets UNIX. ++ if(NOT APPLE AND (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Intel")) + # GCC specific flags. ICC is compatible with them. + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -z noexecstack -z relro -z now") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -z noexecstack -z relro -z now") +- elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") ++ elseif(NOT APPLE AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") + # In Clang, -z flags are not compatible, they need to be passed to linker via -Wl. + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now") diff --git a/patch/ros-rolling-rmw-stats-shim.patch b/patch/ros-rolling-rmw-stats-shim.patch index bbde5ae09..b57096f6d 100644 --- a/patch/ros-rolling-rmw-stats-shim.patch +++ b/patch/ros-rolling-rmw-stats-shim.patch @@ -1,8 +1,21 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 8dbdc3b..c2fba66 100644 +index 2d6e10f..5d10e0b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -31,6 +31,7 @@ find_package(rmw REQUIRED) +@@ -21,7 +21,11 @@ endif() + + if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +- add_link_options("-Wl,--no-undefined") ++ # --no-undefined is a GNU ld long option; Apple's ld doesn't understand it ++ # even though Clang matches this branch on macOS too. ++ if(NOT APPLE) ++ add_link_options("-Wl,--no-undefined") ++ endif() + endif() + + find_package(ament_cmake REQUIRED) +@@ -31,6 +35,7 @@ find_package(rmw REQUIRED) find_package(rosgraph_monitor_msgs REQUIRED) find_package(rosidl_runtime_cpp REQUIRED) find_package(rosidl_typesupport_cpp REQUIRED) @@ -10,10 +23,11 @@ index 8dbdc3b..c2fba66 100644 add_library(${PROJECT_NAME} SHARED src/shim.cpp -@@ -46,6 +47,7 @@ target_link_libraries(${PROJECT_NAME} PUBLIC +@@ -45,6 +50,7 @@ target_link_libraries(${PROJECT_NAME} PUBLIC rmw::rmw rosidl_runtime_cpp::rosidl_runtime_cpp rosidl_typesupport_cpp::rosidl_typesupport_cpp + Threads::Threads ${rosgraph_monitor_msgs_TARGETS} ) + diff --git a/patch/ros-rolling-urg-node.patch b/patch/ros-rolling-urg-node.patch new file mode 100644 index 000000000..07b9d018c --- /dev/null +++ b/patch/ros-rolling-urg-node.patch @@ -0,0 +1,13 @@ +diff --git a/src/urg_c_wrapper.cpp b/src/urg_c_wrapper.cpp +index 10d2ed3..6d7499d 100644 +--- a/src/urg_c_wrapper.cpp ++++ b/src/urg_c_wrapper.cpp +@@ -33,6 +33,8 @@ + + #include + ++#include ++ + #include + #include + #include diff --git a/vinca.yaml b/vinca.yaml index 39ed0f213..7af634122 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -357,8 +357,6 @@ packages_select_by_deps: - moveit-runtime - moveit_resources - moveit_task_constructor_demo - - mujoco_ros2_control - - mujoco_ros2_control_demos - nmea_msgs - odom_to_tf_ros2 - ouster_ros # TODO on windows: cannot open pcl_io.lib @@ -407,6 +405,15 @@ packages_select_by_deps: - rslidar_sdk - rtcm_msgs - rviz2 + + # mujoco_vendor has no prebuilt MuJoCo binary for macOS (see the + # packages_skip_by_deps mujoco_3d_lidar/mujoco_ros2_control_plugins entry + # above); mujoco_ros2_control hard-depends on mujoco_ros2_control_plugins, + # so it can't build there either. + - if: not wasm32 and not osx + then: + - mujoco_ros2_control + - mujoco_ros2_control_demos - if: linux then: - rviz_2d_overlay_plugins From d7d8d235b29b7a9ac51675ba80ef42a716c47407 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 09:06:11 +1000 Subject: [PATCH 018/180] fix: bump pcl_conversions build number, disable strict channel priority pcl_conversions's remote build at the current build_number (25) was published against vtk-base 9.6.2.*, which conda-forge no longer carries -- this repo's mutex run_constraints now pin vtk 9.7.0.*. Bump its build_number override to 26 so skip_existing stops matching that stale remote build, forcing a fresh local build against the current pins. Separately, discovered that ~/.condarc's channel_priority: strict (or rattler-build's own default) causes spurious "no candidates" failures whenever the local output/ channel happens to carry ANY build of a package name (here: ros2-distro-mutex, present locally at build 26 from earlier work) -- strict priority then refuses ALL other-channel builds of that name, even ones a completely unrelated dependency needs at an older, perfectly valid version. This bit pcl_conversions's own test dependencies (which pull in most of the ROS2 core stack) and would bite any future build in the same situation, including the sanctioned `build`/`build-one`/`build_continue_on_failure` tasks, since the test phase always implicitly adds output/ as a channel to install the just-built package. Add --channel-priority disabled to all three. Co-Authored-By: Claude Sonnet 5 --- pixi.toml | 6 +++--- pkg_additional_info.yaml | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/pixi.toml b/pixi.toml index d5042963c..85874cc65 100644 --- a/pixi.toml +++ b/pixi.toml @@ -40,11 +40,11 @@ generate-gha-workflows = { cmd = "vinca-gha --trigger-branch dummy_build_branch_ check-patches = { cmd = "python check_patches_clean_apply.py", depends-on = ["generate-recipes"] } create_snapshot = { cmd = "vinca-snapshot -d rolling -o rosdistro_snapshot.yaml" } upload = "rattler-build upload prefix -c robostack-rolling --generate-attestation" -build_continue_on_failure = { cmd = "rattler-build build --recipe-dir ./recipes -m ./conda_build_config.yaml -c https://repo.prefix.dev/robostack-rolling -c https://repo.prefix.dev/conda-forge --continue-on-failure --skip-existing", depends-on = ["generate-recipes"] } +build_continue_on_failure = { cmd = "rattler-build build --recipe-dir ./recipes -m ./conda_build_config.yaml -c https://repo.prefix.dev/robostack-rolling -c https://repo.prefix.dev/conda-forge --continue-on-failure --skip-existing --channel-priority disabled", depends-on = ["generate-recipes"] } sort = "sh -lc 'vinca-sort-vinca-lists $@ vinca.yaml && vinca-sort-yaml-keys $@ pkg_additional_info.yaml robostack.yaml rosdistro_additional_recipes.yaml' --" [tasks.build] -cmd = "rattler-build build --recipe-dir ./recipes -m ./conda_build_config.yaml -c https://prefix.dev/robostack-rolling -c https://prefix.dev/conda-forge --skip-existing" +cmd = "rattler-build build --recipe-dir ./recipes -m ./conda_build_config.yaml -c https://prefix.dev/robostack-rolling -c https://prefix.dev/conda-forge --skip-existing --channel-priority disabled" depends-on = ["generate-recipes"] description = "Build all packages, from the ./recipes dir. This will skip already existing packages, so it can be used to build only a subset of packages by first removing the recipes of the packages you want to rebuild (see `pixi remove-recipes`)." @@ -53,6 +53,6 @@ cmd = "rm -rf recipes_only_patch; rm -rf recipes; mkdir recipes" description = "Remove all generated recipes, before regenerating them." [tasks.build-one] -cmd = "cp ./patch/{{ PACKAGE }}.*patch ./recipes/{{ PACKAGE }}/patch/; rattler-build build --recipe ./recipes/{{ PACKAGE }}/recipe.yaml -m ./conda_build_config.yaml -c https://prefix.dev/robostack-rolling -c https://prefix.dev/conda-forge" +cmd = "cp ./patch/{{ PACKAGE }}.*patch ./recipes/{{ PACKAGE }}/patch/; rattler-build build --recipe ./recipes/{{ PACKAGE }}/recipe.yaml -m ./conda_build_config.yaml -c https://prefix.dev/robostack-rolling -c https://prefix.dev/conda-forge --channel-priority disabled" args = [{ arg = "PACKAGE", default = "ros-rolling-ros-workspace" }] description = "Build a single package, from the ./recipes dir. Add the `ros-rolling-` prefix to the package name, e.g. `pixi build-one --package ros-rolling-ros-workspace`" diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 10eec8001..996b48df1 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -232,6 +232,13 @@ visp: override_version: '3.7.0' zenoh_cpp_vendor: additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK -DUSE_SYSTEM_ZENOH=ON" +pcl_conversions: + # The remote build at the current build_number (25) was published against + # vtk-base 9.6.2.*, which conda-forge no longer carries -- this repo's mutex + # run_constraints now pin vtk 9.7.0.*. Bump the build number so skip_existing + # doesn't match that stale remote build, forcing a fresh local build against + # the current pins instead. + build_number: 26 ros2cli: build_number: 26 rosidl_cli: From fb386157133927ffb97372336fb9f74643ae3b72 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 09:09:18 +1000 Subject: [PATCH 019/180] fix: cartographer_ros duplicate cartographer dependency + NodeInterfaces API package.xml's cartographer resolves to the REAL released ros2-cartographer ROS package, but this repo's own add_host ALSO pulls in the conda-forge cartographer C++ library directly for the same name -- vinca doesn't dedupe these, so both ended up in host/run with conflicting lua pins (conda-forge cartographer wants lua 5.4.8, ros2-cartographer wants lua 5.5.0), making the recipe unsolvable. Drop the ROS-released one via remove_host/remove_run; the conda-forge add_host is what's actually meant to satisfy this dependency (same generate_dummy_package_with_run_deps duplicate-registration pattern as the pinocchio/hpp_fcl case documented elsewhere in this repo's history). Once that resolved, hit the by-now-familiar Rolling NodeInterfaces bundle API drift in cartographer_ros's own source: three tf2_ros construction call sites (node.cpp's TransformBroadcaster, node_main.cpp and offline_node.cpp's tf2_ros::Buffer, offline_node.cpp's StaticTransformBroadcaster) passed a raw Node*/shared_ptr where the bundle needs a reference -- add the missing dereferences. Co-Authored-By: Claude Sonnet 5 --- patch/dependencies.yaml | 21 ++++++++++- patch/ros-rolling-cartographer-ros.patch | 44 ++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/patch/dependencies.yaml b/patch/dependencies.yaml index ae93ee6bb..8819924ad 100644 --- a/patch/dependencies.yaml +++ b/patch/dependencies.yaml @@ -5,7 +5,22 @@ foxglove_bridge: ros_ign_interfaces: add_host: ["ros-rolling-rcl-interfaces"] cartographer_ros: - add_host: ["cartographer 2.*", "libboost-devel", "ceres-solver * cpu*"] + # package.xml's cartographer resolves to the REAL released + # ros2-cartographer ROS package, but add_host below ALSO pulls in the + # conda-forge cartographer C++ library directly -- vinca doesn't dedupe + # these, so both end up in host/run with conflicting lua pins (conda-forge + # cartographer wants lua 5.4.8, ros2-cartographer wants lua 5.5.0). Drop the + # ROS-released one; the conda-forge add_host below is what's actually meant + # to satisfy this dependency (see the pinocchio/hpp_fcl entry in build + # feedback for the same generate_dummy_package_with_run_deps pattern). + remove_host: ["ros2-cartographer"] + remove_run: ["ros2-cartographer"] + # resolvo mutex-misattribution bug: solver picks ros2-pcl-conversions 2.10.0's + # OLDEST published build (mutex rolling_19) instead of the current one + # (rolling_25) even though a matching-mutex build exists remotely. Same + # pattern as the cv-bridge/libg2o entries elsewhere in this repo. + add_host: ["cartographer 2.*", "libboost-devel", "ceres-solver * cpu*", "ros2-pcl-conversions ==2.10.0 *_26"] + add_run: ["ros2-pcl-conversions ==2.10.0 *_26"] libyaml_vendor: add_host: ["yaml-cpp", "yaml"] add_run: ["yaml-cpp", "yaml"] @@ -301,6 +316,10 @@ roboplan_ros_examples: # find_package(ament_cmake REQUIRED) and build_type is ament_cmake. # Fixed for roboplan_ros 0.7.0, so it can be removed when this releases. add_host: ["ros-rolling-ament-cmake"] +yasmin_pcl: + # Same resolvo mutex-misattribution bug as cartographer_ros above. + add_host: ["ros2-pcl-conversions ==2.10.0 *_26"] + add_run: ["ros2-pcl-conversions ==2.10.0 *_26"] rmf_fleet_adapter_python: # pybind11_json is used for nlohmann::json <-> pybind11 conversions in the # bindings but isn't declared in package.xml (a rosdistro release gap); diff --git a/patch/ros-rolling-cartographer-ros.patch b/patch/ros-rolling-cartographer-ros.patch index 27cb36826..d48e37b00 100644 --- a/patch/ros-rolling-cartographer-ros.patch +++ b/patch/ros-rolling-cartographer-ros.patch @@ -425,8 +425,21 @@ index eaa8422..1a37b59 100644 #include #include +diff --git a/src/node.cpp b/src/node.cpp +index 813ae4b..48ef1d5 100644 +--- a/src/node.cpp ++++ b/src/node.cpp +@@ -96,7 +96,7 @@ Node::Node( + : node_options_(node_options) + { + node_ = node; +- tf_broadcaster_ = std::make_shared(node_) ; ++ tf_broadcaster_ = std::make_shared(*node_) ; + map_builder_bridge_.reset(new cartographer_ros::MapBuilderBridge(node_options_, std::move(map_builder), tf_buffer.get())); + + absl::MutexLock lock(&mutex_); diff --git a/src/node_main.cpp b/src/node_main.cpp -index f403be0..bdf33b8 100644 +index f403be0..f1f074d 100644 --- a/src/node_main.cpp +++ b/src/node_main.cpp @@ -20,6 +20,7 @@ @@ -437,6 +450,15 @@ index f403be0..bdf33b8 100644 #include "tf2_ros/transform_listener.h" DEFINE_bool(collect_metrics, false, +@@ -55,7 +56,7 @@ void Run() { + std::make_shared( + cartographer_node->get_clock(), + tf2::durationFromSec(kTfBufferCacheTimeInSeconds), +- cartographer_node); ++ *cartographer_node); + + std::shared_ptr tf_listener = + std::make_shared(*tf_buffer); diff --git a/src/occupancy_grid_node_main.cpp b/src/occupancy_grid_node_main.cpp index 282b890..6139979 100644 --- a/src/occupancy_grid_node_main.cpp @@ -457,7 +479,7 @@ index 282b890..6139979 100644 std::string last_frame_id_; rclcpp::Time last_timestamp_; diff --git a/src/offline_node.cpp b/src/offline_node.cpp -index 94df3b0..4b3f60e 100644 +index 94df3b0..cd45ac0 100644 --- a/src/offline_node.cpp +++ b/src/offline_node.cpp @@ -31,7 +31,11 @@ @@ -472,6 +494,24 @@ index 94df3b0..4b3f60e 100644 #include "rclcpp/exceptions.hpp" #include #include +@@ -148,7 +152,7 @@ void RunOfflineNode(const MapBuilderFactory& map_builder_factory, + std::make_shared( + cartographer_offline_node->get_clock(), + tf2::durationFromSec(10), +- cartographer_offline_node); ++ *cartographer_offline_node); + + std::vector urdf_transforms; + +@@ -178,7 +182,7 @@ void RunOfflineNode(const MapBuilderFactory& map_builder_factory, + cartographer_offline_node->create_publisher( + kTfTopic, kLatestOnlyPublisherQueueSize); + +- ::tf2_ros::StaticTransformBroadcaster static_tf_broadcaster(cartographer_offline_node); ++ ::tf2_ros::StaticTransformBroadcaster static_tf_broadcaster(*cartographer_offline_node); + + rclcpp::Publisher::SharedPtr clock_publisher = + cartographer_offline_node->create_publisher( diff --git a/src/ros_log_sink.cpp b/src/ros_log_sink.cpp index 1396381..ba050f3 100644 --- a/src/ros_log_sink.cpp From 82bf8f43102d719e241abf9a49048ded4859c298 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 11:26:45 +1000 Subject: [PATCH 020/180] fix: loosen 7 needlessly linux-only packages to build on macOS + system_modes_msgs seed rosgraph_monitor, rviz_2d_overlay_plugins, sick_safetyscanners_base, spacenav, system_modes, trac_ik, and zed_msgs were all gated under if: linux (or, for zed_msgs, linux and not aarch64) in this repo's vinca.yaml despite jazzy already building every one of them on osx (its own vinca.yaml selects them under "not win"/"not linux"). Moved them into the not-wasm32-and-not-win block instead of duplicating them, and added a comment separator so vinca-sort-vinca-lists' known adjacent-if-block-merging bug doesn't scramble the boundary on the next sort (see build_feedback.md's vinca-sort-vinca-lists entry, and RoboStack/vinca#152 for the upstream fix). Also added system_modes_msgs as an explicit seed -- system_modes depends on it but it wasn't reachable any other way for this distro. Each of the 7 was individually verified via rebuild before being kept in this platform-loosened state; three needed additional fixes to actually build once genuinely attempted for the first time on macOS: - rosgraph_monitor: same "-Wl,--no-undefined is GNU-ld-only" pattern already fixed for rmw_stats_shim this session. - system_modes: the already-documented Rolling-wide ament_target_dependencies() removal (see build_feedback.md), fixed with the same local link_ament_dependencies() macro pattern. - sick_safetyscanners_base: the largest fix of the three -- Boost.ASIO API removals across 8 files: find_package(Boost COMPONENTS system) dropped (header-only now, matches the rtabmap/web-video-server/ cartographer_ros pattern), boost::asio::io_service -> io_context, io_service::work -> executor_work_guard (constructed via make_work_guard), boost::asio::deadline_timer -> explicit boost::asio::basic_deadline_timer (the plain deadline_timer typedef is gated behind a macro this Boost build doesn't define, but the underlying template is still present and just deprecated-not-removed), address_v4::from_string -> make_address_v4, address_v4::to_ulong -> to_uint, plus two missing includes that used to arrive transitively via the now-gated deadline_timer.hpp. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rosgraph-monitor.patch | 17 + ...ros-rolling-sick-safetyscanners-base.patch | 310 ++++++++++++++++++ patch/ros-rolling-system-modes.patch | 29 ++ vinca.yaml | 20 +- 4 files changed, 369 insertions(+), 7 deletions(-) create mode 100644 patch/ros-rolling-sick-safetyscanners-base.patch create mode 100644 patch/ros-rolling-system-modes.patch diff --git a/patch/ros-rolling-rosgraph-monitor.patch b/patch/ros-rolling-rosgraph-monitor.patch index acf3531aa..b8909735b 100644 --- a/patch/ros-rolling-rosgraph-monitor.patch +++ b/patch/ros-rolling-rosgraph-monitor.patch @@ -10,3 +10,20 @@ index 757fb41..a2e3d89 100644 #include #include #include +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 39e863d..7f12f8b 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -21,7 +21,11 @@ endif() + + if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic -Werror=switch) +- add_link_options("-Wl,--no-undefined") ++ # --no-undefined is a GNU ld long option; Apple's ld doesn't understand it ++ # even though Clang matches this branch on macOS too. ++ if(NOT APPLE) ++ add_link_options("-Wl,--no-undefined") ++ endif() + endif() + + find_package(ament_cmake REQUIRED) diff --git a/patch/ros-rolling-sick-safetyscanners-base.patch b/patch/ros-rolling-sick-safetyscanners-base.patch new file mode 100644 index 000000000..7d262b9b0 --- /dev/null +++ b/patch/ros-rolling-sick-safetyscanners-base.patch @@ -0,0 +1,310 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 59faf98..38f1a17 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -9,7 +9,7 @@ add_definitions(-std=c++11 -Wall -Werror) + + + ## Find system libraries +-find_package(Boost REQUIRED COMPONENTS system thread chrono) ++find_package(Boost REQUIRED COMPONENTS thread chrono) + + + ########### +diff --git a/include/sick_safetyscanners_base/SickSafetyscanners.h b/include/sick_safetyscanners_base/SickSafetyscanners.h +index 9dace76..70f564b 100644 +--- a/include/sick_safetyscanners_base/SickSafetyscanners.h ++++ b/include/sick_safetyscanners_base/SickSafetyscanners.h +@@ -65,7 +65,7 @@ + + namespace sick { + +-using io_service_ptr = std::shared_ptr; ++using io_service_ptr = std::shared_ptr; + + using namespace sick::datastructure; + +@@ -99,7 +99,7 @@ public: + SickSafetyscannersBase(sick::types::ip_address_t sensor_ip, + sick::types::port_t sensor_tcp_port, + CommSettings comm_settings, +- boost::asio::io_service& io_service); ++ boost::asio::io_context& io_service); + /*! + * \brief Constructor of the SickSafetyscannersBase class. + * +@@ -263,7 +263,7 @@ public: + private: + sick::types::ip_address_t m_sensor_ip; + CommSettings m_comm_settings; +- std::unique_ptr m_io_service_ptr; ++ std::unique_ptr m_io_service_ptr; + + /*! + * \brief Helper function to create command objects generically. +@@ -282,7 +282,7 @@ private: + } + + protected: +- boost::asio::io_service& m_io_service; ++ boost::asio::io_context& m_io_service; + sick::communication::UDPClient m_udp_client; + sick::cola2::Cola2Session m_session; + sick::data_processing::UDPPacketMerger m_packet_merger; +@@ -351,7 +351,7 @@ public: + sick::types::port_t sensor_tcp_port, + CommSettings comm_settings, + sick::types::ScanDataCb callback, +- boost::asio::io_service& io_service); ++ boost::asio::io_context& io_service); + + /*! + * \brief Destructor of the AsyncSickSafetyScanner object +@@ -382,9 +382,11 @@ private: + void processUDPPacket(const sick::datastructure::PacketBuffer& buffer); + + sick::types::ScanDataCb m_scan_data_cb; +- std::unique_ptr m_io_service_ptr; ++ std::unique_ptr m_io_service_ptr; + boost::thread m_service_thread; +- std::unique_ptr m_work; ++ // io_context::work was removed; executor_work_guard is the modern replacement ++ // for keeping io_context::run() from returning while idle. ++ std::unique_ptr> m_work; + }; + + /*! +@@ -403,7 +405,7 @@ public: + SyncSickSafetyScanner(sick::types::ip_address_t sensor_ip, + sick::types::port_t sensor_tcp_port, + CommSettings comm_settings, +- boost::asio::io_service& io_service) = delete; ++ boost::asio::io_context& io_service) = delete; + /*! + * \brief Indicates whether sensor data is available in the receiving buffers. + * +diff --git a/include/sick_safetyscanners_base/Types.h b/include/sick_safetyscanners_base/Types.h +index a31eb22..ffe418f 100644 +--- a/include/sick_safetyscanners_base/Types.h ++++ b/include/sick_safetyscanners_base/Types.h +@@ -38,6 +38,7 @@ + #include "sick_safetyscanners_base/datastructure/Data.h" + #include "sick_safetyscanners_base/datastructure/PacketBuffer.h" + #include ++#include + #include + #include + #include +diff --git a/include/sick_safetyscanners_base/communication/TCPClient.h b/include/sick_safetyscanners_base/communication/TCPClient.h +index db9cbb6..795398d 100644 +--- a/include/sick_safetyscanners_base/communication/TCPClient.h ++++ b/include/sick_safetyscanners_base/communication/TCPClient.h +@@ -36,6 +36,7 @@ + #define SICK_SAFETYSCANNERS_BASE_COMMUNICATION_SYNCTCPCLIENT_H + + #include ++#include + #include + #include + #include +@@ -104,12 +105,12 @@ public: + receive(sick::types::time_duration_t timeout = boost::posix_time::seconds(5)); + + private: +- boost::asio::io_service m_io_service; ++ boost::asio::io_context m_io_service; + sick::datastructure::PacketBuffer::ArrayBuffer m_recv_buffer; + boost::asio::ip::tcp::socket m_socket; + sick::types::ip_address_t m_server_ip; + sick::types::port_t m_server_port; +- boost::asio::deadline_timer m_deadline; ++ boost::asio::basic_deadline_timer m_deadline; + + /*! + * \brief A function to check internal deadline constraints on connect, receive and send +diff --git a/include/sick_safetyscanners_base/communication/UDPClient.h b/include/sick_safetyscanners_base/communication/UDPClient.h +index 02831a5..c77b34a 100644 +--- a/include/sick_safetyscanners_base/communication/UDPClient.h ++++ b/include/sick_safetyscanners_base/communication/UDPClient.h +@@ -40,6 +40,8 @@ + #include + + #include ++#include ++#include + + #include "sick_safetyscanners_base/Types.h" + #include "sick_safetyscanners_base/datastructure/PacketBuffer.h" +@@ -60,7 +62,7 @@ public: + * \param io_service Instance of the boost::asio io_service + * \param server_port The local port number on the receiver (this client's) side. + */ +- UDPClient(boost::asio::io_service& io_service, sick::types::port_t server_port); ++ UDPClient(boost::asio::io_context& io_service, sick::types::port_t server_port); + + /*! + * \brief Constructor of a UDPClient object +@@ -71,7 +73,7 @@ public: + * \param interface_ip The used host (client's) interface IP which is needed to join the + * multicast group. + */ +- UDPClient(boost::asio::io_service& io_service, ++ UDPClient(boost::asio::io_context& io_service, + sick::types::port_t server_port, + boost::asio::ip::address_v4 host_ip, + boost::asio::ip::address_v4 interface_ip); +@@ -139,12 +141,12 @@ public: + sick::datastructure::PacketBuffer receive(sick::types::time_duration_t timeout); + + private: +- boost::asio::io_service& m_io_service; ++ boost::asio::io_context& m_io_service; + boost::asio::ip::udp::endpoint m_remote_endpoint; + boost::asio::ip::udp::socket m_socket; + types::PacketHandler m_packet_handler; + datastructure::PacketBuffer::ArrayBuffer m_recv_buffer; +- boost::asio::deadline_timer m_deadline; ++ boost::asio::basic_deadline_timer m_deadline; + + /*! + * \brief A function to check internal deadline constraints on connect, receive and send +diff --git a/include/sick_safetyscanners_base/datastructure/CommSettings.h b/include/sick_safetyscanners_base/datastructure/CommSettings.h +index bbbe83b..9dda5d7 100644 +--- a/include/sick_safetyscanners_base/datastructure/CommSettings.h ++++ b/include/sick_safetyscanners_base/datastructure/CommSettings.h +@@ -67,7 +67,7 @@ struct CommSettings + bool enabled{true}; + + sick::types::port_t host_udp_port{0}; +- sick::types::ip_address_t host_ip{boost::asio::ip::address_v4::from_string("192.168.1.100")}; ++ sick::types::ip_address_t host_ip{boost::asio::ip::make_address_v4("192.168.1.100")}; + }; + + std::ostream& operator<<(std::ostream& os, const CommSettings& settings); +diff --git a/src/SickSafetyscanners.cpp b/src/SickSafetyscanners.cpp +index 0d1f9c1..c4d75d6 100644 +--- a/src/SickSafetyscanners.cpp ++++ b/src/SickSafetyscanners.cpp +@@ -46,7 +46,7 @@ SickSafetyscannersBase::SickSafetyscannersBase(sick::types::ip_address_t sensor_ + CommSettings comm_settings) + : m_sensor_ip(sensor_ip) + , m_comm_settings(comm_settings) +- , m_io_service_ptr(sick::make_unique()) ++ , m_io_service_ptr(sick::make_unique()) + , m_io_service(*m_io_service_ptr) + , m_udp_client(m_io_service, comm_settings.host_udp_port) + , m_session(sick::make_unique(m_sensor_ip, sensor_tcp_port)) +@@ -61,7 +61,7 @@ SickSafetyscannersBase::SickSafetyscannersBase(sick::types::ip_address_t sensor_ + boost::asio::ip::address_v4 interface_ip) + : m_sensor_ip(sensor_ip) + , m_comm_settings(comm_settings) +- , m_io_service_ptr(sick::make_unique()) ++ , m_io_service_ptr(sick::make_unique()) + , m_io_service(*m_io_service_ptr) + , m_udp_client(m_io_service, comm_settings.host_udp_port, comm_settings.host_ip, interface_ip) + , m_session(sick::make_unique(m_sensor_ip, sensor_tcp_port)) +@@ -73,7 +73,7 @@ SickSafetyscannersBase::SickSafetyscannersBase(sick::types::ip_address_t sensor_ + SickSafetyscannersBase::SickSafetyscannersBase(sick::types::ip_address_t sensor_ip, + sick::types::port_t sensor_tcp_port, + CommSettings comm_settings, +- boost::asio::io_service& io_service) ++ boost::asio::io_context& io_service) + : m_sensor_ip(sensor_ip) + , m_comm_settings(comm_settings) + , m_io_service_ptr(nullptr) +@@ -235,7 +235,7 @@ AsyncSickSafetyScanner::AsyncSickSafetyScanner(sick::types::ip_address_t sensor_ + sick::types::ScanDataCb callback) + : SickSafetyscannersBase(sensor_ip, sensor_tcp_port, comm_settings) + , m_scan_data_cb(callback) +- , m_work(sick::make_unique(m_io_service)) ++ , m_work(sick::make_unique>(boost::asio::make_work_guard(m_io_service))) + { + m_service_thread = boost::thread([this] { + try +@@ -256,7 +256,7 @@ AsyncSickSafetyScanner::AsyncSickSafetyScanner(sick::types::ip_address_t sensor_ + sick::types::ScanDataCb callback) + : SickSafetyscannersBase(sensor_ip, sensor_tcp_port, comm_settings, interface_ip) + , m_scan_data_cb(callback) +- , m_work(sick::make_unique(m_io_service)) ++ , m_work(sick::make_unique>(boost::asio::make_work_guard(m_io_service))) + { + m_service_thread = boost::thread([this] { + try +@@ -274,7 +274,7 @@ AsyncSickSafetyScanner::AsyncSickSafetyScanner(sick::types::ip_address_t sensor_ + sick::types::port_t sensor_tcp_port, + CommSettings comm_settings, + sick::types::ScanDataCb callback, +- boost::asio::io_service& io_service) ++ boost::asio::io_context& io_service) + : SickSafetyscannersBase(sensor_ip, sensor_tcp_port, comm_settings, io_service) + , m_scan_data_cb(callback) + , m_work() +diff --git a/src/cola2/ChangeCommSettingsCommand.cpp b/src/cola2/ChangeCommSettingsCommand.cpp +index 117b1e0..6d5a4d5 100644 +--- a/src/cola2/ChangeCommSettingsCommand.cpp ++++ b/src/cola2/ChangeCommSettingsCommand.cpp +@@ -105,7 +105,7 @@ void ChangeCommSettingsCommand::writeEInterfaceTypeToDataPtr( + void ChangeCommSettingsCommand::writeIPAddresstoDataPtr( + std::vector::iterator data_ptr) const + { +- read_write_helper::writeUint32LittleEndian(data_ptr + 8, m_settings.host_ip.to_ulong()); ++ read_write_helper::writeUint32LittleEndian(data_ptr + 8, m_settings.host_ip.to_uint()); + } + + void ChangeCommSettingsCommand::writePortToDataPtr(std::vector::iterator data_ptr) const +diff --git a/src/communication/TCPClient.cpp b/src/communication/TCPClient.cpp +index 272b6e8..5ef1725 100644 +--- a/src/communication/TCPClient.cpp ++++ b/src/communication/TCPClient.cpp +@@ -46,7 +46,7 @@ + namespace sick { + namespace communication { + +-using boost::asio::deadline_timer; ++using deadline_timer = boost::asio::basic_deadline_timer; + using boost::asio::ip::tcp; + using boost::lambda::_1; + using boost::lambda::_2; +diff --git a/src/communication/UDPClient.cpp b/src/communication/UDPClient.cpp +index b2037e1..b2008dd 100644 +--- a/src/communication/UDPClient.cpp ++++ b/src/communication/UDPClient.cpp +@@ -53,14 +53,14 @@ + namespace sick { + namespace communication { + +-using boost::asio::deadline_timer; ++using deadline_timer = boost::asio::basic_deadline_timer; + using boost::asio::ip::tcp; + using boost::lambda::_1; + using boost::lambda::_2; + using boost::lambda::bind; + using boost::lambda::var; + +-UDPClient::UDPClient(boost::asio::io_service& io_service, sick::types::port_t server_port) ++UDPClient::UDPClient(boost::asio::io_context& io_service, sick::types::port_t server_port) + : m_io_service(io_service) + , m_socket(io_service, boost::asio::ip::udp::endpoint{boost::asio::ip::udp::v4(), server_port}) + , m_packet_handler() +@@ -71,7 +71,7 @@ UDPClient::UDPClient(boost::asio::io_service& io_service, sick::types::port_t se + checkDeadline(); + } + +-UDPClient::UDPClient(boost::asio::io_service& io_service, ++UDPClient::UDPClient(boost::asio::io_context& io_service, + sick::types::port_t server_port, + boost::asio::ip::address_v4 host_ip, + boost::asio::ip::address_v4 interface_ip) +diff --git a/src/datastructure/ConfigData.cpp b/src/datastructure/ConfigData.cpp +index 0f42f5b..bd96ba4 100644 +--- a/src/datastructure/ConfigData.cpp ++++ b/src/datastructure/ConfigData.cpp +@@ -91,7 +91,7 @@ void ConfigData::setHostIp(const boost::asio::ip::address_v4& host_ip) + + void ConfigData::setHostIp(const std::string& host_ip) + { +- m_host_ip = boost::asio::ip::address_v4::from_string(host_ip); ++ m_host_ip = boost::asio::ip::make_address_v4(host_ip); + } + + uint16_t ConfigData::getHostUdpPort() const diff --git a/patch/ros-rolling-system-modes.patch b/patch/ros-rolling-system-modes.patch new file mode 100644 index 000000000..0b40a6668 --- /dev/null +++ b/patch/ros-rolling-system-modes.patch @@ -0,0 +1,29 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 2c0bf30..5b5354f 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -25,6 +25,15 @@ find_package(rosidl_typesupport_cpp REQUIRED) + find_package(lifecycle_msgs REQUIRED) + find_package(system_modes_msgs REQUIRED) + ++# ament_target_dependencies() was removed on Rolling; every ament_cmake ++# package that exports targets populates a _TARGETS list, which is the ++# modern replacement. ++macro(link_ament_dependencies target) ++ foreach(_ament_dep ${ARGN}) ++ target_link_libraries(${target} ${${_ament_dep}_TARGETS}) ++ endforeach() ++endmacro() ++ + add_library(mode SHARED + src/system_modes/mode.cpp + src/system_modes/mode_impl.cpp +@@ -34,7 +43,7 @@ add_library(mode SHARED + target_include_directories(mode PUBLIC + $ + $) +-ament_target_dependencies(mode ++link_ament_dependencies(mode + "rclcpp" + "rcl_lifecycle" + "rclcpp_lifecycle" diff --git a/vinca.yaml b/vinca.yaml index 7af634122..ec08859c0 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -193,7 +193,6 @@ packages_select_by_deps: - libcamera - nobleo_socketcan_bridge # Depends on socketcan - ros2_socketcan # Depends on socketcan - - rosgraph_monitor - usb_cam # Depends on v4l # These packages are currently only build on Linux, @@ -416,25 +415,32 @@ packages_select_by_deps: - mujoco_ros2_control_demos - if: linux then: - - rviz_2d_overlay_plugins - rviz_satellite - sdl2_vendor - septentrio_gnss_driver - serial_driver - sick_safetyscanners2 - sick_safetyscanners2_interfaces - - sick_safetyscanners_base - simulation_interfaces - slider_publisher - - spacenav - swri_console # Until sync of: https://github.com/ros/rosdistro/pull/49750 + + # jazzy already builds these on osx (its vinca.yaml selects them under + # "not win"/"not linux"); rolling had them needlessly linux-only. Comment + # separates this from the block above so vinca-sort-vinca-lists doesn't + # pool their then-items together and reshuffle across the boundary. + - if: not wasm32 and not win + then: + - rosgraph_monitor + - rviz_2d_overlay_plugins + - sick_safetyscanners_base + - spacenav - system_modes + - system_modes_msgs - teleop_tools - tf_transformations - topic_tools - trac_ik - - if: not wasm32 and not win - then: - turtle_tf2_cpp - turtle_tf2_py - turtlebot3_gazebo @@ -460,6 +466,7 @@ packages_select_by_deps: - yasmin_pcl - yasmin_plugins_manager - yasmin_ros + - zed_msgs # jazzy builds this on osx; was needlessly linux-only here # webots_ros2 is linux-only (excluding aarch64); do not merge this block's # sort domain with the block above (vinca-sort-vinca-lists pools then-items @@ -467,7 +474,6 @@ packages_select_by_deps: - if: linux and not aarch64 then: - webots_ros2 - - zed_msgs patch_dir: patch rosdistro_snapshot: rosdistro_snapshot.yaml From 01b5f39b2c24dc8d75b439be3a3b3e87a381fc31 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 12:00:10 +1000 Subject: [PATCH 021/180] chore: port 8 remaining robostack.yaml mappings from humble/jazzy Completeness fix found by a full key-diff sweep (not just the earlier targeted one): konsole, libblosc-dev, libopenexr-dev, libopenvdb-dev, python3-textual, python3-torchvision(-pip), python3-ultralytics-pip. None of these are currently referenced by any package reachable in rolling's selected set (verified against a fresh vinca -m dependency walk), so this has no effect on the current recipe count -- it's purely to keep robostack.yaml in sync in case a future seed addition needs one of them. Co-Authored-By: Claude Sonnet 5 --- robostack.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/robostack.yaml b/robostack.yaml index 012de4499..a49e8fb12 100644 --- a/robostack.yaml +++ b/robostack.yaml @@ -212,6 +212,8 @@ jupyter-notebook: robostack: [notebook] kitchen: robostack: [kitchen] +konsole: + robostack: [konsole] lcov: robostack: [lcov] leveldb: @@ -220,6 +222,8 @@ libabsl-dev: robostack: [libabseil] libblas-dev: robostack: [libblas, libcblas] +libblosc-dev: + robostack: [blosc] libboost: robostack: [libboost] libboost-chrono-dev: @@ -435,8 +439,12 @@ libopencv-imgproc-dev: linux: [py-opencv, libopencv, libopengl-devel, libgl-devel] osx: [py-opencv, libopencv] win64: [py-opencv, libopencv] +libopenexr-dev: + robostack: [openexr] libopenni-dev: robostack: [] +libopenvdb-dev: + robostack: [openvdb] liborocos-kdl: robostack: [orocos-kdl] liborocos-kdl-dev: @@ -1094,10 +1102,16 @@ python3-termcolor: robostack: [termcolor] python3-texttable: robostack: [texttable] +python3-textual: + robostack: [textual] python3-tk: robostack: [tk] python3-toml: robostack: [toml] +python3-torchvision: + robostack: [torchvision] +python3-torchvision-pip: + robostack: [torchvision] python3-tornado: robostack: [tornado] python3-tqdm: @@ -1110,6 +1124,8 @@ python3-typeguard: robostack: [typeguard] python3-ujson: robostack: [ujson] +python3-ultralytics-pip: + robostack: [ultralytics] python3-unidiff: robostack: [unidiff] python3-usb: From c39a289ff7a28455d427574925959e7786f45636 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 12:22:25 +1000 Subject: [PATCH 022/180] fix: address PR #41's linux-64/linux-aarch64/win-64 CI failures linux-64: ros2-lttngpy fails CMake configure ("package lttng-ctl not found") -- conda-forge only packages lttng-ust, not the separate lttng-ctl control library, so this can never be satisfied by any robostack.yaml mapping. lttngpy's own CMakeLists.txt already has a DISABLED_DEFAULT option that's ON for WIN32/APPLE/ANDROID/BSD and OFF (requiring lttng-ctl) everywhere else -- patch it to always be ON, matching ros-jazzy's own lttngpy patch, which hit and fixed the exact same issue. linux-aarch64: ros2-rmf-traffic fails to compile with GCC ("'uint64_t' does not name a type", cascading into ~15 further errors in the same translation unit) -- GCC 15's leaner libstdc++ headers no longer transitively provide the way clang/libc++ does, so this only surfaced on Linux, never during this session's osx-arm64 testing. Added the missing #include to all 11 first-party rmf_traffic files that use fixed-width integer types without including it directly. win-64: `pixi run check-patches` fails on two unrelated, pre-existing (not touched this session) patch-staleness issues from upstream source drift, not a toolchain migration: - ouster_ros's .win.patch is now fully redundant -- current upstream CMakeLists.txt already has the exact MSVC/WIN32 compile-options and CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS handling the patch was adding. Deleted the now-obsolete patch file entirely. - plotjuggler's .win.patch's second hunk (inserting ${QT_LINK_LIBRARIES} into `target_link_libraries(plotjuggler_base ...)`) no longer applies -- upstream restructured plotjuggler_base's CMake target entirely (no `${QT_LINK_LIBRARIES}` reference left near it at all). Removed just that one obsolete hunk; the patch's other hunks (XCB linking, QT_LINK_LIBRARIES trimming, protobuf API migration) still apply cleanly and are untouched. None of these three packages were built/tested locally against linux-64/linux-aarch64/win-64 targets (no such environment available here) -- fixes are based on direct source inspection (jazzy's proven lttngpy patch, GCC's own documented header-pruning changes, and diffing current upstream source against each patch's expected context). osx-arm64 regression-tested for lttngpy and rmf_traffic; ouster_ros and plotjuggler are skip-existing on osx-arm64 (already published at the current build number) so could not be locally re-verified there. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-lttngpy.patch | 17 +++ patch/ros-rolling-ouster-ros.win.patch | 27 ----- patch/ros-rolling-plotjuggler.win.patch | 8 -- patch/ros-rolling-rmf-traffic.patch | 132 ++++++++++++++++++++++++ 4 files changed, 149 insertions(+), 35 deletions(-) create mode 100644 patch/ros-rolling-lttngpy.patch delete mode 100644 patch/ros-rolling-ouster-ros.win.patch diff --git a/patch/ros-rolling-lttngpy.patch b/patch/ros-rolling-lttngpy.patch new file mode 100644 index 000000000..75f70fb3f --- /dev/null +++ b/patch/ros-rolling-lttngpy.patch @@ -0,0 +1,17 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index f430f9d1..fcebc62e 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -20,7 +20,11 @@ find_package(ament_cmake REQUIRED) + if(WIN32 OR APPLE OR ANDROID OR BSD) + set(DISABLED_DEFAULT ON) + else() +- set(DISABLED_DEFAULT OFF) ++ # conda-forge doesn't package liblttng-ctl (only lttng-ust), so disable ++ # lttng support unconditionally rather than just on ++ # WIN32/APPLE/ANDROID/BSD -- see RoboStack/ros-jazzy's own lttngpy patch ++ # for the same fix. ++ set(DISABLED_DEFAULT ON) + endif() + option( + LTTNGPY_DISABLED diff --git a/patch/ros-rolling-ouster-ros.win.patch b/patch/ros-rolling-ouster-ros.win.patch deleted file mode 100644 index 97643f592..000000000 --- a/patch/ros-rolling-ouster-ros.win.patch +++ /dev/null @@ -1,27 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index e07dcf4..8d23997 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -23,13 +23,21 @@ find_package(pcl_conversions REQUIRED) - find_package(tf2_eigen REQUIRED) - - # ==== Options ==== --add_compile_options(-Wall -Wextra) -+if(MSVC) -+ add_compile_options(/W2) -+ add_compile_definitions(NOMINMAX _USE_MATH_DEFINES WIN32_LEAN_AND_MEAN) -+else() -+ add_compile_options(-Wall -Wextra) -+endif() -+ - if(NOT DEFINED CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 17) - set(CMAKE_CXX_STANDARD_REQUIRED ON) - endif() - option(CMAKE_POSITION_INDEPENDENT_CODE "Build position independent code." ON) - -+set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) -+ - set(_ouster_ros_INCLUDE_DIRS - include - ouster-sdk/ouster_client/include diff --git a/patch/ros-rolling-plotjuggler.win.patch b/patch/ros-rolling-plotjuggler.win.patch index b95af508d..2149f1686 100644 --- a/patch/ros-rolling-plotjuggler.win.patch +++ b/patch/ros-rolling-plotjuggler.win.patch @@ -29,14 +29,6 @@ index 385b7899..b1d6f2ab 100644 Qt5::WebSockets ) -@@ -216,6 +214,7 @@ target_link_libraries(plotjuggler_base - PUBLIC - plotjuggler_qwt - PRIVATE -+ ${QT_LINK_LIBRARIES} - lua::lua - sol2::sol2 - ) diff --git a/plotjuggler_plugins/ParserProtobuf/CMakeLists.txt b/plotjuggler_plugins/ParserProtobuf/CMakeLists.txt index 588c69ba..ab94a3df 100644 --- a/plotjuggler_plugins/ParserProtobuf/CMakeLists.txt diff --git a/patch/ros-rolling-rmf-traffic.patch b/patch/ros-rolling-rmf-traffic.patch index 627e5f0df..0281cbd2f 100644 --- a/patch/ros-rolling-rmf-traffic.patch +++ b/patch/ros-rolling-rmf-traffic.patch @@ -154,3 +154,135 @@ index 115b710..7011975 100644 #include "fcl/narrowphase/distance.h" #include "fcl/narrowphase/collision.h" +diff --git a/include/rmf_traffic/DetectConflict.hpp b/include/rmf_traffic/DetectConflict.hpp +index e0aa706..64f0d61 100644 +--- a/include/rmf_traffic/DetectConflict.hpp ++++ b/include/rmf_traffic/DetectConflict.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TRAFFIC__DETECTCONFLICT_HPP + #define RMF_TRAFFIC__DETECTCONFLICT_HPP + ++#include + #include + #include + #include +diff --git a/include/rmf_traffic/Route.hpp b/include/rmf_traffic/Route.hpp +index c3825ed..840aa84 100644 +--- a/include/rmf_traffic/Route.hpp ++++ b/include/rmf_traffic/Route.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TRAFFIC__ROUTE_HPP + #define RMF_TRAFFIC__ROUTE_HPP + ++#include + #include + + #include +diff --git a/include/rmf_traffic/agv/VehicleTraits.hpp b/include/rmf_traffic/agv/VehicleTraits.hpp +index 416ee30..325e902 100644 +--- a/include/rmf_traffic/agv/VehicleTraits.hpp ++++ b/include/rmf_traffic/agv/VehicleTraits.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TRAFFIC__AGV__VEHICLETRAITS_HPP + #define RMF_TRAFFIC__AGV__VEHICLETRAITS_HPP + ++#include + #include + #include + +diff --git a/include/rmf_traffic/schedule/Change.hpp b/include/rmf_traffic/schedule/Change.hpp +index bca4c5d..2328183 100644 +--- a/include/rmf_traffic/schedule/Change.hpp ++++ b/include/rmf_traffic/schedule/Change.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TRAFFIC__SCHEDULE__CHANGE_HPP + #define RMF_TRAFFIC__SCHEDULE__CHANGE_HPP + ++#include + #include + #include + #include +diff --git a/include/rmf_traffic/schedule/Itinerary.hpp b/include/rmf_traffic/schedule/Itinerary.hpp +index eb6a0ab..fbf25e9 100644 +--- a/include/rmf_traffic/schedule/Itinerary.hpp ++++ b/include/rmf_traffic/schedule/Itinerary.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TRAFFIC__SCHEDULE__ITINERARY_HPP + #define RMF_TRAFFIC__SCHEDULE__ITINERARY_HPP + ++#include + #include + #include + +diff --git a/include/rmf_traffic/schedule/ParticipantDescription.hpp b/include/rmf_traffic/schedule/ParticipantDescription.hpp +index 74d272c..3ce72cd 100644 +--- a/include/rmf_traffic/schedule/ParticipantDescription.hpp ++++ b/include/rmf_traffic/schedule/ParticipantDescription.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TRAFFIC__SCHEDULE__PARTICIPANTDESCRIPTION_HPP + #define RMF_TRAFFIC__SCHEDULE__PARTICIPANTDESCRIPTION_HPP + ++#include + #include + #include + +diff --git a/include/rmf_traffic/schedule/Query.hpp b/include/rmf_traffic/schedule/Query.hpp +index aa6d3ab..bb3a924 100644 +--- a/include/rmf_traffic/schedule/Query.hpp ++++ b/include/rmf_traffic/schedule/Query.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TRAFFIC__SCHEDULE__QUERY_HPP + #define RMF_TRAFFIC__SCHEDULE__QUERY_HPP + ++#include + #include + + #include +diff --git a/include/rmf_traffic/schedule/Writer.hpp b/include/rmf_traffic/schedule/Writer.hpp +index f536114..473b2db 100644 +--- a/include/rmf_traffic/schedule/Writer.hpp ++++ b/include/rmf_traffic/schedule/Writer.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TRAFFIC__SCHEDULE__WRITER_HPP + #define RMF_TRAFFIC__SCHEDULE__WRITER_HPP + ++#include + #include + #include + +diff --git a/src/rmf_traffic/Route.cpp b/src/rmf_traffic/Route.cpp +index debd648..de68354 100644 +--- a/src/rmf_traffic/Route.cpp ++++ b/src/rmf_traffic/Route.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include "internal_Route.hpp" + + #include +diff --git a/src/rmf_traffic/internal_Route.hpp b/src/rmf_traffic/internal_Route.hpp +index 8bb220b..112ed34 100644 +--- a/src/rmf_traffic/internal_Route.hpp ++++ b/src/rmf_traffic/internal_Route.hpp +@@ -18,6 +18,7 @@ + #ifndef SRC__RMF_TRAFFIC__INTERNAL_ROUTE_HPP + #define SRC__RMF_TRAFFIC__INTERNAL_ROUTE_HPP + ++#include + #include + + namespace rmf_traffic { +diff --git a/src/rmf_traffic/schedule/Timeline.hpp b/src/rmf_traffic/schedule/Timeline.hpp +index b190242..94f9719 100644 +--- a/src/rmf_traffic/schedule/Timeline.hpp ++++ b/src/rmf_traffic/schedule/Timeline.hpp +@@ -18,6 +18,7 @@ + #ifndef SRC__RMF_TRAFFIC__SCHEDULE__TIMELINE_HPP + #define SRC__RMF_TRAFFIC__SCHEDULE__TIMELINE_HPP + ++#include + #include "../DetectConflictInternal.hpp" + + #include From 969d9152311118e6a5aaacf1e5716b74be319816 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 12:42:19 +1000 Subject: [PATCH 023/180] fix: channel-priority in CI workflow, rmf_task cstdint, plotjuggler win patch PR #41's own CI run surfaced 3 more real issues past the first round of fixes: - osx-arm64/osx-64: "pcl 1.15.1 would require vtk-base >=9.4.2 ... ros2-distro-mutex 0.20.0 would constrain vtk 9.6.2, conflicts" -- the exact channel-priority-strict symptom already fixed in pixi.toml's build/build-one/build_continue_on_failure tasks earlier this session, except testpr.yml's "Build recipes" step calls `pixi run rattler-build build ...` directly with its OWN hardcoded args written in the YAML, never going through those pixi.toml tasks at all. Added --channel-priority disabled to the workflow step itself. - linux-64: past lttngpy, hit the same GCC15/leaner-libstdc++ missing- pattern as rmf_traffic, this time in rmf_task (14 first-party files using uint32_t/uint64_t directly without including it). Same fix, same pattern -- these two rmf_* packages evidently share the same coding style/vintage. - win-64: past the first plotjuggler.win.patch hunk, check-patches hit a SECOND stale hunk in the same file (ParserProtobuf/CMakeLists.txt's Protobuf detection) -- also fully obsolete, upstream rewrote Protobuf detection entirely via `if(TARGET protobuf::libprotobuf)` checks (verified Protobuf_LIBS, the variable this hunk sets, isn't referenced anywhere in the current file at all). Removed. Two more hunks in this same win.patch (error_collectors.cpp/.h) may or may not still apply under rattler-build's own (more lenient than git apply/GNU patch) patcher -- left alone pending real CI confirmation rather than guessing further, per this session's own established lesson that rattler-build's patcher tolerates things git apply/patch reject. rmf_task regression-tested clean on osx-arm64. testpr.yml and the plotjuggler win-patch fix can only be verified by real CI (no local Linux/Windows environment, and osx doesn't exercise the .win.patch variant at all). Co-Authored-By: Claude Sonnet 5 --- .github/workflows/testpr.yml | 2 +- patch/ros-rolling-plotjuggler.win.patch | 20 --- patch/ros-rolling-rmf-task.patch | 168 ++++++++++++++++++++++++ 3 files changed, 169 insertions(+), 21 deletions(-) create mode 100644 patch/ros-rolling-rmf-task.patch diff --git a/.github/workflows/testpr.yml b/.github/workflows/testpr.yml index e6f2e6776..91e43abc2 100644 --- a/.github/workflows/testpr.yml +++ b/.github/workflows/testpr.yml @@ -143,7 +143,7 @@ jobs: id: build-recipes shell: bash -l {0} run: | - pixi run rattler-build build --recipe-dir recipes --target-platform ${{ matrix.platform }} -m ./conda_build_config.yaml -c https://prefix.dev/conda-forge -c https://prefix.dev/robostack-rolling --skip-existing + pixi run rattler-build build --recipe-dir recipes --target-platform ${{ matrix.platform }} -m ./conda_build_config.yaml -c https://prefix.dev/conda-forge -c https://prefix.dev/robostack-rolling --skip-existing --channel-priority disabled - name: See packages that will be saved in cache shell: bash -l {0} diff --git a/patch/ros-rolling-plotjuggler.win.patch b/patch/ros-rolling-plotjuggler.win.patch index 2149f1686..38b1679b5 100644 --- a/patch/ros-rolling-plotjuggler.win.patch +++ b/patch/ros-rolling-plotjuggler.win.patch @@ -29,26 +29,6 @@ index 385b7899..b1d6f2ab 100644 Qt5::WebSockets ) -diff --git a/plotjuggler_plugins/ParserProtobuf/CMakeLists.txt b/plotjuggler_plugins/ParserProtobuf/CMakeLists.txt -index 588c69ba..ab94a3df 100644 ---- a/plotjuggler_plugins/ParserProtobuf/CMakeLists.txt -+++ b/plotjuggler_plugins/ParserProtobuf/CMakeLists.txt -@@ -1,13 +1,6 @@ --if(BUILDING_WITH_CONAN) -- message(STATUS "Finding Protobuf with conan") -- set(Protobuf_LIBS protobuf::libprotobuf) --else() -- message(STATUS "Finding Protobuf without package managers") -- find_package(Protobuf QUIET) -- set(Protobuf_LIBS ${Protobuf_LIBRARIES}) --endif() -+set(Protobuf_LIBS protobuf::libprotobuf) - --find_package(Protobuf QUIET) -+find_package(Protobuf QUIET CONFIG) - - if( Protobuf_FOUND) - diff --git a/plotjuggler_plugins/ParserProtobuf/error_collectors.cpp b/plotjuggler_plugins/ParserProtobuf/error_collectors.cpp index 761e0b73..b7ce4129 100644 --- a/plotjuggler_plugins/ParserProtobuf/error_collectors.cpp diff --git a/patch/ros-rolling-rmf-task.patch b/patch/ros-rolling-rmf-task.patch new file mode 100644 index 000000000..2019760fc --- /dev/null +++ b/patch/ros-rolling-rmf-task.patch @@ -0,0 +1,168 @@ +diff --git a/include/rmf_task/Event.hpp b/include/rmf_task/Event.hpp +index 82a3e60..5771d9a 100644 +--- a/include/rmf_task/Event.hpp ++++ b/include/rmf_task/Event.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TASK__EVENT_HPP + #define RMF_TASK__EVENT_HPP + ++#include + #include + #include + +diff --git a/include/rmf_task/Log.hpp b/include/rmf_task/Log.hpp +index f046442..f62062d 100644 +--- a/include/rmf_task/Log.hpp ++++ b/include/rmf_task/Log.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TASK__LOG_HPP + #define RMF_TASK__LOG_HPP + ++#include + #include + + #include +diff --git a/include/rmf_task/Payload.hpp b/include/rmf_task/Payload.hpp +index 084da6a..f6448f7 100644 +--- a/include/rmf_task/Payload.hpp ++++ b/include/rmf_task/Payload.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TASK__PAYLOAD_HPP + #define RMF_TASK__PAYLOAD_HPP + ++#include + #include + + #include +diff --git a/include/rmf_task/Phase.hpp b/include/rmf_task/Phase.hpp +index 666ca1b..cf024b6 100644 +--- a/include/rmf_task/Phase.hpp ++++ b/include/rmf_task/Phase.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TASK__PHASE_HPP + #define RMF_TASK__PHASE_HPP + ++#include + #include + #include + +diff --git a/include/rmf_task/Task.hpp b/include/rmf_task/Task.hpp +index 6c5f419..3b8d83d 100644 +--- a/include/rmf_task/Task.hpp ++++ b/include/rmf_task/Task.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TASK__TASK_HPP + #define RMF_TASK__TASK_HPP + ++#include + #include + #include + #include +diff --git a/include/rmf_task/TaskPlanner.hpp b/include/rmf_task/TaskPlanner.hpp +index 14488f6..ec5dd10 100644 +--- a/include/rmf_task/TaskPlanner.hpp ++++ b/include/rmf_task/TaskPlanner.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TASK__AGV__TASKPLANNER_HPP + #define RMF_TASK__AGV__TASKPLANNER_HPP + ++#include + #include + #include + #include +diff --git a/include/rmf_task/detail/Backup.hpp b/include/rmf_task/detail/Backup.hpp +index 5a9ad72..c68e959 100644 +--- a/include/rmf_task/detail/Backup.hpp ++++ b/include/rmf_task/detail/Backup.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TASK__DETAIL__BACKUP_HPP + #define RMF_TASK__DETAIL__BACKUP_HPP + ++#include + #include + + #include +diff --git a/include/rmf_task/events/SimpleEventState.hpp b/include/rmf_task/events/SimpleEventState.hpp +index c90d528..1496e2a 100644 +--- a/include/rmf_task/events/SimpleEventState.hpp ++++ b/include/rmf_task/events/SimpleEventState.hpp +@@ -18,6 +18,7 @@ + #ifndef RMF_TASK__EVENTS__SIMPLEEVENTSTATE_HPP + #define RMF_TASK__EVENTS__SIMPLEEVENTSTATE_HPP + ++#include + #include + + namespace rmf_task { +diff --git a/src/rmf_task/BackupFileManager.cpp b/src/rmf_task/BackupFileManager.cpp +index 7afa25d..992489b 100644 +--- a/src/rmf_task/BackupFileManager.cpp ++++ b/src/rmf_task/BackupFileManager.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include + #include + #include +diff --git a/src/rmf_task/Event.cpp b/src/rmf_task/Event.cpp +index 2cb42b8..b5ac0ca 100644 +--- a/src/rmf_task/Event.cpp ++++ b/src/rmf_task/Event.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include + + namespace rmf_task { +diff --git a/src/rmf_task/Log.cpp b/src/rmf_task/Log.cpp +index 48c5883..84707a7 100644 +--- a/src/rmf_task/Log.cpp ++++ b/src/rmf_task/Log.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include + + #include +diff --git a/src/rmf_task/Payload.cpp b/src/rmf_task/Payload.cpp +index 8d031ce..8413f1e 100644 +--- a/src/rmf_task/Payload.cpp ++++ b/src/rmf_task/Payload.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include + #include + #include +diff --git a/src/rmf_task/detail/Backup.cpp b/src/rmf_task/detail/Backup.cpp +index f353157..9f0e66b 100644 +--- a/src/rmf_task/detail/Backup.cpp ++++ b/src/rmf_task/detail/Backup.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include + + namespace rmf_task { +diff --git a/src/rmf_task/events/SimpleEventState.cpp b/src/rmf_task/events/SimpleEventState.cpp +index 1af9d68..0bc4bab 100644 +--- a/src/rmf_task/events/SimpleEventState.cpp ++++ b/src/rmf_task/events/SimpleEventState.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include + + namespace rmf_task { From 21853b1041f269d4c0bad86c6b3f13661fef34f0 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 12:57:10 +1000 Subject: [PATCH 024/180] fix: rmf_visualization_schedule websocketpp/asio, trim stale plotjuggler win patch rmf_visualization_schedule uses websocketpp::config::asio directly and hits the same io_service-removed-by-Boost-1.90 issue already fixed for rmf_websocket: define ASIO_STANDALONE and pin asio ==1.29.0 (the newest build that still ships io_service.hpp). Verified building clean on osx-arm64. Also remove the error_collectors.cpp/.h hunks from ros-rolling-plotjuggler.win.patch: upstream plotjuggler now guards AddError/AddWarning vs RecordError/RecordWarning behind GOOGLE_PROTOBUF_VERSION, so the old hunk no longer matches and was failing win-64's check-patches. Confirmed obsolete via direct inspection of the pinned release tag's source. Co-Authored-By: Claude Sonnet 5 --- patch/dependencies.yaml | 8 +- patch/ros-rolling-plotjuggler.win.patch | 106 +----------------- ...s-rolling-rmf-visualization-schedule.patch | 16 +++ 3 files changed, 25 insertions(+), 105 deletions(-) create mode 100644 patch/ros-rolling-rmf-visualization-schedule.patch diff --git a/patch/dependencies.yaml b/patch/dependencies.yaml index 8819924ad..649a3b5cf 100644 --- a/patch/dependencies.yaml +++ b/patch/dependencies.yaml @@ -329,9 +329,13 @@ rmf_visualization_schedule: # Needed >=3.6.4 to build successfully on macOS during an earlier build # pass; package.xml itself declares openssl with no version constraint. remove_host: ["openssl"] - add_host: ["openssl >=3.6.4"] remove_run: ["openssl"] - add_run: ["openssl >=3.6.4"] + # Same websocketpp/Boost.Asio io_service incompatibility as rmf_websocket + # above -- this package also uses websocketpp::config::asio directly. + # Pinned to 1.29.0 (the newest conda-forge build that still ships + # io_service.hpp -- 1.30+ removed it too). + add_host: ["openssl >=3.6.4", "asio ==1.29.0"] + add_run: ["openssl >=3.6.4", "asio ==1.29.0"] rmf_websocket: # websocketpp 0.8.2 requires boost::asio APIs (io_service et al.) that # Boost 1.90 removed; the patch defines ASIO_STANDALONE so websocketpp diff --git a/patch/ros-rolling-plotjuggler.win.patch b/patch/ros-rolling-plotjuggler.win.patch index 38b1679b5..03f724921 100644 --- a/patch/ros-rolling-plotjuggler.win.patch +++ b/patch/ros-rolling-plotjuggler.win.patch @@ -3,7 +3,7 @@ index 6b650f1b..67ac7a9f 100644 --- a/3rdparty/Qt-Advanced-Docking/CMakeLists.txt +++ b/3rdparty/Qt-Advanced-Docking/CMakeLists.txt @@ -67,7 +67,9 @@ target_link_libraries(qt_advanced_docking PUBLIC Qt5::Core Qt5::Gui Qt5::Widgets - + if(UNIX AND NOT APPLE) target_link_libraries(qt_advanced_docking PUBLIC Qt5::X11Extras) - target_link_libraries(qt_advanced_docking PRIVATE xcb) @@ -11,7 +11,7 @@ index 6b650f1b..67ac7a9f 100644 + target_link_libraries(qt_advanced_docking PRIVATE ${XCB_LIBRARIES}) + target_include_directories(qt_advanced_docking SYSTEM PUBLIC ${XCB_INCLUDE_DIRS}) endif() - + set_target_properties(qt_advanced_docking PROPERTIES diff --git a/CMakeLists.txt b/CMakeLists.txt index 385b7899..b1d6f2ab 100644 @@ -28,104 +28,4 @@ index 385b7899..b1d6f2ab 100644 - Qt5::OpenGL Qt5::WebSockets ) - -diff --git a/plotjuggler_plugins/ParserProtobuf/error_collectors.cpp b/plotjuggler_plugins/ParserProtobuf/error_collectors.cpp -index 761e0b73..b7ce4129 100644 ---- a/plotjuggler_plugins/ParserProtobuf/error_collectors.cpp -+++ b/plotjuggler_plugins/ParserProtobuf/error_collectors.cpp -@@ -2,38 +2,38 @@ - #include - #include - --void FileErrorCollector::AddError(const std::string& filename, int line, int, -- const std::string& message) -+void FileErrorCollector::RecordError(const absl::string_view filename, int line, int, -+ const absl::string_view message) - { - auto msg = QString("File: [%1] Line: [%2] Message: %3\n\n") -- .arg(QString::fromStdString(filename)) -+ .arg(QString::fromStdString(std::string(filename))) - .arg(line) -- .arg(QString::fromStdString(message)); -+ .arg(QString::fromStdString(std::string(message))); - - _errors.push_back(msg); - } - --void FileErrorCollector::AddWarning(const std::string& filename, int line, int, -- const std::string& message) -+void FileErrorCollector::RecordWarning(const absl::string_view filename, int line, int, -+ const absl::string_view message) - { - auto msg = QString("Warning [%1] line %2: %3") -- .arg(QString::fromStdString(filename)) -+ .arg(QString::fromStdString(std::string(filename))) - .arg(line) -- .arg(QString::fromStdString(message)); -+ .arg(QString::fromStdString(std::string(message))); - qDebug() << msg; - } - --void IoErrorCollector::AddError(int line, google::protobuf::io::ColumnNumber, -- const std::string& message) -+void IoErrorCollector::RecordError(int line, google::protobuf::io::ColumnNumber, -+ const absl::string_view message) - { - _errors.push_back( -- QString("Line: [%1] Message: %2\n").arg(line).arg(QString::fromStdString(message))); -+ QString("Line: [%1] Message: %2\n").arg(line).arg(QString::fromStdString(std::string(message)))); - } - --void IoErrorCollector::AddWarning(int line, google::protobuf::io::ColumnNumber column, -- const std::string& message) -+void IoErrorCollector::RecordWarning(int line, google::protobuf::io::ColumnNumber column, -+ const absl::string_view message) - { - qDebug() << QString("Line: [%1] Message: %2\n") - .arg(line) -- .arg(QString::fromStdString(message)); -+ .arg(QString::fromStdString(std::string(message))); - } -diff --git a/plotjuggler_plugins/ParserProtobuf/error_collectors.h b/plotjuggler_plugins/ParserProtobuf/error_collectors.h -index 8abfa5e0..7afe1fea 100644 ---- a/plotjuggler_plugins/ParserProtobuf/error_collectors.h -+++ b/plotjuggler_plugins/ParserProtobuf/error_collectors.h -@@ -3,17 +3,18 @@ - - #include - #include -+#include - - #include - - class IoErrorCollector : public google::protobuf::io::ErrorCollector - { - public: -- void AddError(int line, google::protobuf::io::ColumnNumber column, -- const std::string& message); -+ void RecordError(int line, google::protobuf::io::ColumnNumber column, -+ const absl::string_view message) override; - -- void AddWarning(int line, google::protobuf::io::ColumnNumber column, -- const std::string& message); -+ void RecordWarning(int line, google::protobuf::io::ColumnNumber column, -+ const absl::string_view message) override; - - const QStringList& errors() - { -@@ -27,11 +28,11 @@ private: - class FileErrorCollector : public google::protobuf::compiler::MultiFileErrorCollector - { - public: -- void AddError(const std::string& filename, int line, int, -- const std::string& message) override; -+ void RecordError(const absl::string_view filename, int line, int, -+ const absl::string_view message) override; - -- void AddWarning(const std::string& filename, int line, int, -- const std::string& message) override; -+ void RecordWarning(const absl::string_view filename, int line, int, -+ const absl::string_view message) override; - - const QStringList& errors() - { + diff --git a/patch/ros-rolling-rmf-visualization-schedule.patch b/patch/ros-rolling-rmf-visualization-schedule.patch new file mode 100644 index 000000000..6c1c2f5d0 --- /dev/null +++ b/patch/ros-rolling-rmf-visualization-schedule.patch @@ -0,0 +1,16 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 0000000..0000000 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -1,6 +1,11 @@ + cmake_minimum_required(VERSION 3.5) + project(rmf_visualization_schedule) + set(CMAKE_EXPORT_COMPILE_COMMANDS on) ++ ++# websocketpp 0.8.2 requires Asio APIs (io_service et al.) that Boost 1.90 ++# removed. Use the actively-maintained standalone Asio instead (matching ++# RoboStack/ros-lyrical#41's fix), which still provides io_service. ++add_compile_definitions(ASIO_STANDALONE) + + # Default to C++17 + if(NOT CMAKE_CXX_STANDARD) From f72913e88c905c464a5daa8eb27be0416bf5dcd7 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 13:24:25 +1000 Subject: [PATCH 025/180] fix: force fresh distro-mutex build, fix septentrio_gnss_driver tf2_ros::Buffer vinca.yaml's mutex_package.build_number was bumped to 26 (vtk 9.7.0.* instead of 9.6.2.*) in an earlier commit, but should_skip_mutex_package only compares against pkg_additional_info.yaml's per-package override (falling back to the top-level build_number: 25 default). Without an override entry here, it still matched the stale remote ros2-distro-mutex 0.20.0 rolling_25 build and skipped generating a fresh recipe entirely -- so every package needing pcl (which carries a soft vtk run_constraint via the mutex) resolved against the old vtk 9.6.2 constraint and failed to solve against the now-vtk-9.7.0-only pcl builds on conda-forge. Adding the distro_mutex override forces vinca to generate and build a fresh local rolling_26 mutex package instead. Verified end-to-end on osx-arm64: built the fresh mutex, then rebuilt ros2-pcl-conversions against it successfully. Also add a missing #include (and .h fallback) to septentrio_gnss_driver: geometry2's transform_listener.hpp only pulls in tf2/buffer_core.hpp, not tf2_ros/buffer.hpp, so tf2_ros::Buffer was never declared. Confirmed against ros2/geometry2's rolling branch source and verified the patch applies cleanly via rattler-build's own patcher. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-septentrio-gnss-driver.patch | 15 +++++++++++++++ pkg_additional_info.yaml | 8 ++++++++ 2 files changed, 23 insertions(+) create mode 100644 patch/ros-rolling-septentrio-gnss-driver.patch diff --git a/patch/ros-rolling-septentrio-gnss-driver.patch b/patch/ros-rolling-septentrio-gnss-driver.patch new file mode 100644 index 000000000..ef3f0e9bd --- /dev/null +++ b/patch/ros-rolling-septentrio-gnss-driver.patch @@ -0,0 +1,15 @@ +diff --git a/include/septentrio_gnss_driver/abstraction/typedefs.hpp b/include/septentrio_gnss_driver/abstraction/typedefs.hpp +index 0000000..0000000 100644 +--- a/include/septentrio_gnss_driver/abstraction/typedefs.hpp ++++ b/include/septentrio_gnss_driver/abstraction/typedefs.hpp +@@ -40,8 +40,10 @@ + // tf2 includes + #ifdef ROS2_VER_N520 + #include ++#include + #include + #else + #include ++#include + #include + #endif diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 996b48df1..b3603a60e 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -232,6 +232,14 @@ visp: override_version: '3.7.0' zenoh_cpp_vendor: additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK -DUSE_SYSTEM_ZENOH=ON" +distro_mutex: + # vinca.yaml's mutex_package.build_number was bumped to 26 to re-publish + # ros2-distro-mutex with vtk 9.7.0.* (was 9.6.2.*), but should_skip_mutex_package + # only compares against this file's per-package override (falling back to the + # top-level build_number: 25) -- without this entry it still matched the stale + # remote 0.20.0 rolling_25 build and skipped generating a fresh recipe entirely, + # so every package needing pcl/vtk resolved against the old vtk 9.6.2 constraint. + build_number: 26 pcl_conversions: # The remote build at the current build_number (25) was published against # vtk-base 9.6.2.*, which conda-forge no longer carries -- this repo's mutex From e4bd46dbc7e3bf151597d4b0f66a85e8dd2172f9 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 13:30:06 +1000 Subject: [PATCH 026/180] fix: webots_ros2_driver hardcoded Python 3.12 EXACT version match Upstream's CMakeLists.txt selects an EXACT Python version per $ENV{ROS_DISTRO}, matching whatever Python Ubuntu ships for that distro's release (3.12 for rolling). conda-forge's Python floats independently and is currently pinned to 3.14 here, so the EXACT match fails against conda's Python and CMake falls back to searching the system Python instead, finding Ubuntu's /usr/include/python3.12 headers (incomplete without python3-dev installed, missing the Debian multiarch pyconfig.h) rather than $PREFIX's actual Python 3.14. Replace the whole distro-keyed EXACT-version chain with a plain `find_package(Python 3 REQUIRED COMPONENTS Development)`, so it just resolves to whatever Python is active in the build environment. Verified via check_patches_clean_apply.py. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-webots-ros2-driver.patch | 30 ++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 patch/ros-rolling-webots-ros2-driver.patch diff --git a/patch/ros-rolling-webots-ros2-driver.patch b/patch/ros-rolling-webots-ros2-driver.patch new file mode 100644 index 000000000..8d0f7ed9e --- /dev/null +++ b/patch/ros-rolling-webots-ros2-driver.patch @@ -0,0 +1,30 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 1f913c1..52dbf3e 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -32,17 +32,14 @@ find_package(tinyxml2_vendor REQUIRED) + find_package(TinyXML2 REQUIRED) + find_package(yaml-cpp REQUIRED) + +-if($ENV{ROS_DISTRO} MATCHES "humble") +- find_package(Python 3.10 EXACT REQUIRED COMPONENTS Development) +-elseif($ENV{ROS_DISTRO} MATCHES "iron") +- find_package(Python 3.10 EXACT REQUIRED COMPONENTS Development) +-elseif($ENV{ROS_DISTRO} MATCHES "jazzy") +- find_package(Python 3.12 EXACT REQUIRED COMPONENTS Development) +-elseif($ENV{ROS_DISTRO} MATCHES "kilted") +- find_package(Python 3.12 EXACT REQUIRED COMPONENTS Development) +-elseif($ENV{ROS_DISTRO} MATCHES "rolling") +- find_package(Python 3.12 EXACT REQUIRED COMPONENTS Development) +-endif() ++# Upstream hardcodes an EXACT Python version per ROS_DISTRO matching whatever ++# Python Ubuntu ships for that distro's release. conda-forge's Python version ++# moves independently (currently 3.14 for rolling, not the 3.12 upstream ++# expects), so the EXACT match fails to find conda's Python and CMake falls ++# back to the system Python headers instead, which lack the Debian ++# multiarch pyconfig.h. Just find whatever Python 3 is active in the build ++# environment instead of hardcoding a version tied to Ubuntu's release. ++find_package(Python 3 REQUIRED COMPONENTS Development) + + add_custom_target(compile-lib-controller ALL + COMMAND ${CMAKE_COMMAND} -E env "WEBOTS_HOME=${CMAKE_CURRENT_SOURCE_DIR}/webots" make release -f Makefile > /dev/null 2>&1 From 2cf7e6e6f2a59850746b2597b39e00bbf5636b9c Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 13:32:39 +1000 Subject: [PATCH 027/180] fix: septentrio_gnss_driver forced -std=c++17 breaks class_loader C++20 concepts Second, unrelated failure in the same package after the tf2_ros::Buffer fix: the top-level CMakeLists.txt unconditionally does add_compile_options(-std=c++17), which lands after ament's own default -std=gnu++20 on the compile command line -- the last -std= flag wins, so every translation unit compiles as C++17. That breaks class_loader's interface_traits.hpp, which now uses C++20 concepts (requires/concept) and std::ranges, on rolling's current rclcpp_components. Drop the override and let ament's own C++ standard apply. Verified via check_patches_clean_apply.py. Co-Authored-By: Claude Sonnet 5 --- .../ros-rolling-septentrio-gnss-driver.patch | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/patch/ros-rolling-septentrio-gnss-driver.patch b/patch/ros-rolling-septentrio-gnss-driver.patch index ef3f0e9bd..0da08ebc9 100644 --- a/patch/ros-rolling-septentrio-gnss-driver.patch +++ b/patch/ros-rolling-septentrio-gnss-driver.patch @@ -1,8 +1,26 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 66dec47..0ad6caa 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -1,8 +1,11 @@ + cmake_minimum_required(VERSION 3.10) + project(septentrio_gnss_driver) + +-## Compile as C++17 +-add_compile_options(-std=c++17) ++# rclcpp_components' class_loader now uses C++20 concepts (requires/concept/ ++# std::ranges) on rolling. This unconditional -std=c++17 override came after ++# ament's own -std=gnu++20 default on the compile line, so being last it won, ++# breaking any translation unit that pulls in class_loader headers. Let ++# ament's default C++ standard apply instead of forcing C++17. + + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + message(STATUS "Setting build type to Release as none was specified.") diff --git a/include/septentrio_gnss_driver/abstraction/typedefs.hpp b/include/septentrio_gnss_driver/abstraction/typedefs.hpp -index 0000000..0000000 100644 +index 69f7b2c..25ec2c7 100644 --- a/include/septentrio_gnss_driver/abstraction/typedefs.hpp +++ b/include/septentrio_gnss_driver/abstraction/typedefs.hpp -@@ -40,8 +40,10 @@ +@@ -40,9 +40,11 @@ // tf2 includes #ifdef ROS2_VER_N520 #include @@ -13,3 +31,4 @@ index 0000000..0000000 100644 +#include #include #endif + #ifdef ROS2_VER_N250 From 247c5d2678d7643a63780c86dafd7504137478ed Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 13:40:52 +1000 Subject: [PATCH 028/180] fix: webots_ros2_control on_init override for hardware_interface >= 5.3 Upstream's version guard only ADDS the new HardwareComponentInterfaceParams- based on_init overload for hardware_interface >= 5.3, but never removes the old HardwareInfo-based one -- so on rolling (hardware_interface 6.9, where the base class HardwareComponentInterface::on_init only accepts HardwareComponentInterfaceParams) the old overload no longer overrides anything and fails to compile. Swap the #if into a proper #if/#else so only one on_init signature exists per hardware_interface version, matching what the base class actually declares. Verified via check_patches_clean_apply.py. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-webots-ros2-control.patch | 48 +++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 patch/ros-rolling-webots-ros2-control.patch diff --git a/patch/ros-rolling-webots-ros2-control.patch b/patch/ros-rolling-webots-ros2-control.patch new file mode 100644 index 000000000..06f6149ec --- /dev/null +++ b/patch/ros-rolling-webots-ros2-control.patch @@ -0,0 +1,48 @@ +diff --git a/include/webots_ros2_control/Ros2ControlSystem.hpp b/include/webots_ros2_control/Ros2ControlSystem.hpp +index 1a938e2..917049f 100644 +--- a/include/webots_ros2_control/Ros2ControlSystem.hpp ++++ b/include/webots_ros2_control/Ros2ControlSystem.hpp +@@ -52,11 +52,12 @@ namespace webots_ros2_control { + Ros2ControlSystem(); + void init(webots_ros2_driver::WebotsNode *node, const hardware_interface::HardwareInfo &info) override; + +- rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_init( +- const hardware_interface::HardwareInfo &info) override; + #if HARDWARE_INTERFACE_VERSION_MAJOR > 5 || (HARDWARE_INTERFACE_VERSION_MAJOR == 5 && HARDWARE_INTERFACE_VERSION_MINOR >= 3) + rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_init( + const hardware_interface::HardwareComponentInterfaceParams ¶ms) override; ++#else ++ rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_init( ++ const hardware_interface::HardwareInfo &info) override; + #endif + rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_activate( + const rclcpp_lifecycle::State & /*previous_state*/) override; +diff --git a/src/Ros2ControlSystem.cpp b/src/Ros2ControlSystem.cpp +index df6c8c1..ba4b742 100644 +--- a/src/Ros2ControlSystem.cpp ++++ b/src/Ros2ControlSystem.cpp +@@ -90,18 +90,19 @@ namespace webots_ros2_control { + } + } + ++#if HARDWARE_INTERFACE_VERSION_MAJOR > 5 || (HARDWARE_INTERFACE_VERSION_MAJOR == 5 && HARDWARE_INTERFACE_VERSION_MINOR >= 3) + rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn Ros2ControlSystem::on_init( +- const hardware_interface::HardwareInfo &info) { +- if (hardware_interface::SystemInterface::on_init(info) != ++ const hardware_interface::HardwareComponentInterfaceParams ¶ms) { ++ if (hardware_interface::SystemInterface::on_init(params) != + rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS) { + return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::ERROR; + } + return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS; + } +-#if HARDWARE_INTERFACE_VERSION_MAJOR > 5 || (HARDWARE_INTERFACE_VERSION_MAJOR == 5 && HARDWARE_INTERFACE_VERSION_MINOR >= 3) ++#else + rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn Ros2ControlSystem::on_init( +- const hardware_interface::HardwareComponentInterfaceParams ¶ms) { +- if (hardware_interface::SystemInterface::on_init(params) != ++ const hardware_interface::HardwareInfo &info) { ++ if (hardware_interface::SystemInterface::on_init(info) != + rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::SUCCESS) { + return rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn::ERROR; + } From 97cbeb7b577fe40adf211c7c1bc9a9890863769f Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 14:00:42 +1000 Subject: [PATCH 029/180] fix: mujoco_3d_lidar mjtnum.h renamed to mjtype.h upstream mujoco_vendor is built with AMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK here (using conda-forge's libmujoco instead of vendoring an old pinned MuJoCo release), so mujoco_3d_lidar compiles against whatever MuJoCo version conda-forge currently ships (3.12.0) rather than the 3.4.0 the vendored path would provide. mjtnum.h (which only defined the mjtNum typedef) no longer exists as a separate header in that version -- it was folded into mjtype.h, which mjmodel.h now includes directly. Point both includes at mjtype.h instead. Verified via check_patches_clean_apply.py. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mujoco-3d-lidar.patch | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 patch/ros-rolling-mujoco-3d-lidar.patch diff --git a/patch/ros-rolling-mujoco-3d-lidar.patch b/patch/ros-rolling-mujoco-3d-lidar.patch new file mode 100644 index 000000000..03ce96099 --- /dev/null +++ b/patch/ros-rolling-mujoco-3d-lidar.patch @@ -0,0 +1,26 @@ +diff --git a/include/mujoco_3d_lidar/3dlidar.h b/include/mujoco_3d_lidar/3dlidar.h +index e6f4810..64cceca 100644 +--- a/include/mujoco_3d_lidar/3dlidar.h ++++ b/include/mujoco_3d_lidar/3dlidar.h +@@ -29,7 +29,7 @@ + + #include + #include +-#include ++#include + #include + + namespace mujoco::plugin::lidar +diff --git a/src/3dlidar.cpp b/src/3dlidar.cpp +index c5e30d3..4a99208 100644 +--- a/src/3dlidar.cpp ++++ b/src/3dlidar.cpp +@@ -30,7 +30,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + From 9226977a76b2ee0c4aa20ece8a2b3a3ae79fdfe3 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 14:09:25 +1000 Subject: [PATCH 030/180] fix: mujoco_ros2_control_plugins missing libegl-devel host dependency CMakeLists.txt does find_package(OpenGL REQUIRED COMPONENTS EGL), but the package's only related rosdep ("opengl") maps to libopengl-devel/libgl-devel on Linux (robostack.yaml) -- neither provides the separate EGL headers/lib CMake's FindOpenGL module looks for, so configure fails with "Could NOT find OpenGL (missing: OPENGL_egl_LIBRARY OPENGL_EGL_INCLUDE_DIR EGL)". Add libegl-devel as an extra host dependency, restricted to linux since conda-forge doesn't publish it for win-64 (where this package is also selected). Verified the generated recipe picks it up on linux-aarch64 and that win-64's recipe is unaffected. Co-Authored-By: Claude Sonnet 5 --- patch/dependencies.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/patch/dependencies.yaml b/patch/dependencies.yaml index 649a3b5cf..7f67c291c 100644 --- a/patch/dependencies.yaml +++ b/patch/dependencies.yaml @@ -311,6 +311,16 @@ zstd_point_cloud_transport: add_host: ["ros-rolling-zstd-cmake-module", "zstd"] mujoco_vendor: add_host: ["libmujoco"] +mujoco_ros2_control_plugins: + # package.xml's plain "opengl" rosdep only maps to libopengl-devel/libgl-devel + # (robostack.yaml), but CMakeLists.txt does + # find_package(OpenGL REQUIRED COMPONENTS EGL), which additionally needs + # EGL's own headers/lib. conda-forge doesn't ship libegl-devel for win-64, + # so restrict the addition to linux (this package is also selected there + # per vinca.yaml's "not wasm32 and not osx" block). + add_host: + - if: linux + then: ["libegl-devel"] roboplan_ros_examples: # package.xml only declares ament_cmake_python, but CMakeLists.txt does # find_package(ament_cmake REQUIRED) and build_type is ament_cmake. From c38da89b28eb6d4521c266206662ed8f91cefb8d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 14:18:55 +1000 Subject: [PATCH 031/180] fix: force fresh libg2o build (stale mutex 0.19.* pin) ros2-libg2o's remote build was published against ros2-distro-mutex 0.19.* rolling_*, several mutex versions behind the current 0.20.0 rolling_26 -- causing rtabmap's dependency resolution to fail since that old mutex build no longer exists. Same stale-remote-build pattern as pcl_conversions/ros2cli/distro_mutex: bump the package's own build_number so skip_existing forces a fresh local build against the current mutex instead of resolving the orphaned remote one. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index b3603a60e..a5236fbad 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -240,6 +240,12 @@ distro_mutex: # remote 0.20.0 rolling_25 build and skipped generating a fresh recipe entirely, # so every package needing pcl/vtk resolved against the old vtk 9.6.2 constraint. build_number: 26 +libg2o: + # The remote build was published against ros2-distro-mutex 0.19.* rolling_*, + # which is long gone now that the mutex is at 0.20.0 rolling_26 -- same + # stale-remote-build pattern as pcl_conversions/ros2cli/distro_mutex above. + # Bump so skip_existing forces a fresh local build against the current mutex. + build_number: 26 pcl_conversions: # The remote build at the current build_number (25) was published against # vtk-base 9.6.2.*, which conda-forge no longer carries -- this repo's mutex From f53f3141c2c06a94e8fd7a5c3d2d7b6d142d5a8a Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 14:32:42 +1000 Subject: [PATCH 032/180] fix: drop unnecessary Qt5 host dep from libg2o, fixing rtabmap qt5/qt6 conflict libg2o's package.xml never declares a Qt/QGLViewer dependency, and its CMakeLists.txt only does an optional (non-REQUIRED) find_package(QGLViewer) purely for an optional viewer GUI component -- it's silently skipped when absent. The "qt" host dep added here pulled in conda_build_config.yaml's Qt5 pin for no real reason, which conflicts with vtk-base (now Qt6-only on conda-forge): anything needing both libg2o and pcl/vtk transitively (like rtabmap) failed to solve. Drop it, keeping only the OpenGL-related libglu/freeglut deps that CMakeLists.txt's find_package(OpenGL) actually uses. Verified building clean on osx-arm64 without qt present. Co-Authored-By: Claude Sonnet 5 --- patch/dependencies.yaml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/patch/dependencies.yaml b/patch/dependencies.yaml index 7f67c291c..3b2c0f438 100644 --- a/patch/dependencies.yaml +++ b/patch/dependencies.yaml @@ -89,7 +89,13 @@ tvm_vendor: libphidget22: add_host: ["libusb"] libg2o: - add_host: ["qt", "${{ 'libglu' if linux }}", "${{ 'freeglut' if not osx }}"] + # "qt" was previously added here but package.xml never declares a Qt/QGLViewer + # dependency, and CMakeLists.txt's find_package(QGLViewer) is optional (not + # REQUIRED) -- it just disables the optional viewer GUI when absent. Pulling + # in "qt" (pinned to Qt5 in conda_build_config.yaml) conflicts with vtk-base, + # which now only ships Qt6 builds, breaking anything that needs both (e.g. + # rtabmap, which also depends on pcl -> vtk-base). + add_host: ["${{ 'libglu' if linux }}", "${{ 'freeglut' if not osx }}"] fmilibrary_vendor: add_host: ["fmilib"] mrpt2: From 1ede1f670a7287aebbac764d26b696b3b82232a8 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 15:04:40 +1000 Subject: [PATCH 033/180] fix: libg2o win-64 link failure, csparse_extension exports no symbols csparse_extension builds as a DLL on win-64, but nothing in its source declares dllexport, so MSVC produces the .dll with no import .lib, and solver_csparse.vcxproj fails to link with LNK1181 (cannot open g2o_csparse_extension.lib). Same class of issue -Wmany other packages in this repo already hit; same fix: -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON, which auto-generates a .def file exporting all symbols instead of relying on explicit annotations. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index a5236fbad..8a83ae742 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -246,6 +246,11 @@ libg2o: # stale-remote-build pattern as pcl_conversions/ros2cli/distro_mutex above. # Bump so skip_existing forces a fresh local build against the current mutex. build_number: 26 + # On win-64, csparse_extension builds as a DLL that exports no symbols + # (no dllexport macro is defined for it), so MSVC produces the .dll but no + # import .lib, and solver_csparse fails to link against it. Same fix as the + # many other packages in this repo hitting this class of Windows issue. + additional_cmake_args: "-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON" pcl_conversions: # The remote build at the current build_number (25) was published against # vtk-base 9.6.2.*, which conda-forge no longer carries -- this repo's mutex From 2d6830298688869b0097fe7212374c46836ea372 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 15:15:58 +1000 Subject: [PATCH 034/180] fix: bump libg2o build_number to 27, past stale cached qt-dependent build Per ros-humble-52's finding on humble/jazzy: vinca's skip_existing check only compares build_number, not the full package hash, so the GH Actions cache already holding a successful build_26 libg2o artifact (built before the "qt" host dep was dropped) would keep matching and skip regenerating a recipe -- silently keeping the old qt5-dependent build instead of a fresh one without it. Bump to 27 to force past that cache. Verified building clean on osx-arm64. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 8a83ae742..486b14f79 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -244,8 +244,13 @@ libg2o: # The remote build was published against ros2-distro-mutex 0.19.* rolling_*, # which is long gone now that the mutex is at 0.20.0 rolling_26 -- same # stale-remote-build pattern as pcl_conversions/ros2cli/distro_mutex above. - # Bump so skip_existing forces a fresh local build against the current mutex. - build_number: 26 + # Bumped to 26 first for that fix, then to 27: a CI cache from that first + # bump already holds a build_26 artifact with the old "qt" host dep baked + # in (see the dependencies.yaml entry below), and vinca's skip_existing + # check only compares build_number, not the full package hash, so it would + # otherwise keep matching that stale cached build instead of rebuilding + # without qt (same issue independently hit on humble/jazzy's libg2o). + build_number: 27 # On win-64, csparse_extension builds as a DLL that exports no symbols # (no dllexport macro is defined for it), so MSVC produces the .dll but no # import .lib, and solver_csparse fails to link against it. Same fix as the From 10a5c124f82e34ef0ad6dfd125d8b7a0c40260e5 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 15:46:02 +1000 Subject: [PATCH 035/180] fix: mavlink hardcoded /usr/bin/env and touch break on win-64 CMakeLists.txt's message-dialect codegen custom commands hardcode /usr/bin/env (to set PYTHONPATH before invoking mavgen.py) and touch (to create a stamp file) -- neither exists on Windows, so every dialect's codegen step failed with "The system cannot find the path specified." Use the portable ${CMAKE_COMMAND} -E env / -E touch equivalents instead, which work identically on all platforms. Verified applying via check_patches_clean_apply.py and building clean on osx-arm64. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mavlink.patch | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 patch/ros-rolling-mavlink.patch diff --git a/patch/ros-rolling-mavlink.patch b/patch/ros-rolling-mavlink.patch new file mode 100644 index 000000000..30f8ca374 --- /dev/null +++ b/patch/ros-rolling-mavlink.patch @@ -0,0 +1,26 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 30c9811..abea531 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -77,7 +77,7 @@ macro(generateMavlink_v10 definitions) + message(STATUS "processing v1.0: ${definitionAbsPath}") + add_custom_command( + OUTPUT include/v1.0/${definition}/${definition}.h +- COMMAND /usr/bin/env PYTHONPATH="${CMAKE_SOURCE_DIR}:$ENV{PYTHONPATH}" ++ COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH="${CMAKE_SOURCE_DIR}:$ENV{PYTHONPATH}" + ${Python_EXECUTABLE} ${mavgen_path} --lang=C --wire-protocol=1.0 + --output=include/v1.0 ${definitionAbsPath} + DEPENDS ${definitionAbsPath} ${common_xml_path} ${mavgen_path} +@@ -96,10 +96,10 @@ macro(generateMavlink_v20 definitions) + add_custom_command( + OUTPUT ${definition}-v2.0-cxx-stamp + #OUTPUT include/v2.0/${definition}/${definition}.hpp +- COMMAND /usr/bin/env PYTHONPATH="${CMAKE_SOURCE_DIR}:$ENV{PYTHONPATH}" ++ COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH="${CMAKE_SOURCE_DIR}:$ENV{PYTHONPATH}" + ${Python_EXECUTABLE} ${mavgen_path} --lang=C++11 --wire-protocol=2.0 + --output=include/v2.0 ${definitionAbsPath} +- COMMAND touch ${definition}-v2.0-cxx-stamp ++ COMMAND ${CMAKE_COMMAND} -E touch ${definition}-v2.0-cxx-stamp + DEPENDS ${definitionAbsPath} ${common_xml_path} ${mavgen_path} + ) + add_custom_target(${definition}.xml-v2.0 From 97f5b7b2ae16fce50b49c3b846c825d8d425203c Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 15:55:19 +1000 Subject: [PATCH 036/180] fix: libmavconn unconditional -Wcomment breaks MSVC CMakeLists.txt guards -Wall/-Wextra/-Wpedantic behind a GCC/Clang check, but the -Wcomment flag right after it is unconditional -- MSVC's cl.exe doesn't understand GCC-style -W flags at all and fails immediately with "invalid numeric argument '/Wcomment'". Move it inside the same compiler-id guard. Verified applying via check_patches_clean_apply.py and building clean on osx-arm64. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-libmavconn.patch | 42 +++++++++--------------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/patch/ros-rolling-libmavconn.patch b/patch/ros-rolling-libmavconn.patch index d12008e05..43ddb8035 100644 --- a/patch/ros-rolling-libmavconn.patch +++ b/patch/ros-rolling-libmavconn.patch @@ -1,30 +1,14 @@ -diff --git a/include/mavconn/io_context_runner.hpp b/include/mavconn/io_context_runner.hpp -index 9db0b10..789f3b5 100644 ---- a/include/mavconn/io_context_runner.hpp -+++ b/include/mavconn/io_context_runner.hpp -@@ -59,7 +59,7 @@ public: - return; - } +diff --git a/CMakeLists.txt b/CMakeLists.txt +index d349d81..607b852 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -15,8 +15,8 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + # we dont use add_compile_options with pedantic in message packages + # because the Python C extensions dont comply with it + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") ++ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wcomment") + endif() +-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wcomment") -- io_thread_ = std::jthread( -+ io_thread_ = std::thread( - [this, f = std::forward(fn)]() mutable { - is_running_ = true; - f(); -@@ -73,7 +73,6 @@ public: - return; - } - -- io_thread_.request_stop(); - io_work_.reset(); - io_.stop(); - } -@@ -119,7 +118,7 @@ private: - std::unique_ptr> io_work_; - bool owns_thread_; - std::atomic is_running_; -- std::jthread io_thread_; -+ std::thread io_thread_; - }; - - } // namespace mavconn + # Allow GNU extensions (-std=gnu++20) + set(CMAKE_C_EXTENSIONS ON) From e2d227ba89a674136e9a015b95aeaba1660db495 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 16:04:14 +1000 Subject: [PATCH 037/180] fix: mavlink/libmavconn missing endian.h and pthread.h on win-64 mavlink's msgmap.hpp only guards its endian conversion header for FreeBSD/Apple, falling through to everywhere else including Windows, which doesn't have it. Add a Windows branch defining htole16/32/64 and le16toh/32/64 as plain identity functions, since every Windows target (x86/x64/ARM64) is little-endian already. libmavconn's thread_utils.hpp unconditionally includes and calls pthread_setname_np/pthread_self to name the current thread for debugging -- neither exists on Windows. Guard the include and make set_this_thread_name() a no-op there; naming a thread is a debugging convenience, not something worth failing the build over. Verified both applying via check_patches_clean_apply.py and building clean on osx-arm64. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-libmavconn.patch | 36 ++++++++++++++++++++++++++++++ patch/ros-rolling-mavlink.patch | 21 +++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/patch/ros-rolling-libmavconn.patch b/patch/ros-rolling-libmavconn.patch index 43ddb8035..a4ef1c33d 100644 --- a/patch/ros-rolling-libmavconn.patch +++ b/patch/ros-rolling-libmavconn.patch @@ -12,3 +12,39 @@ index d349d81..607b852 100644 # Allow GNU extensions (-std=gnu++20) set(CMAKE_C_EXTENSIONS ON) +diff --git a/include/mavconn/thread_utils.hpp b/include/mavconn/thread_utils.hpp +index d121768..654b8c9 100644 +--- a/include/mavconn/thread_utils.hpp ++++ b/include/mavconn/thread_utils.hpp +@@ -20,7 +20,9 @@ + #ifndef MAVCONN__THREAD_UTILS_HPP_ + #define MAVCONN__THREAD_UTILS_HPP_ + ++#ifndef _WIN32 + #include ++#endif + + #include + #include +@@ -74,14 +76,20 @@ std::string format(const std::string & fmt, Args... args) + template + bool set_this_thread_name(const std::string & name, Args && ... args) + { ++#ifdef _WIN32 ++ // No pthreads on Windows; naming the thread is a debugging convenience ++ // only, so silently no-op instead of failing to build. ++ (void)format(name, std::forward(args)...); ++ return false; ++#else + auto new_name = format(name, std::forward(args)...); +- + #ifdef __APPLE__ + return pthread_setname_np(new_name.c_str()) == 0; + #else + pthread_t pth = pthread_self(); + return pthread_setname_np(pth, new_name.c_str()) == 0; + #endif ++#endif + } + + /** diff --git a/patch/ros-rolling-mavlink.patch b/patch/ros-rolling-mavlink.patch index 30f8ca374..7504b5256 100644 --- a/patch/ros-rolling-mavlink.patch +++ b/patch/ros-rolling-mavlink.patch @@ -24,3 +24,24 @@ index 30c9811..abea531 100644 DEPENDS ${definitionAbsPath} ${common_xml_path} ${mavgen_path} ) add_custom_target(${definition}.xml-v2.0 +diff --git a/pymavlink/generator/CPP11/include_v2.0/msgmap.hpp b/pymavlink/generator/CPP11/include_v2.0/msgmap.hpp +index a3956aa..6327113 100644 +--- a/pymavlink/generator/CPP11/include_v2.0/msgmap.hpp ++++ b/pymavlink/generator/CPP11/include_v2.0/msgmap.hpp +@@ -6,6 +6,16 @@ + #include + #elif __APPLE__ + #include ++#elif defined(_WIN32) ++// Windows has no , and every Windows target (x86, x64, ARM64) is ++// little-endian, so the little-endian <-> host conversions are no-ops. ++#include ++inline uint16_t htole16(uint16_t x) { return x; } ++inline uint32_t htole32(uint32_t x) { return x; } ++inline uint64_t htole64(uint64_t x) { return x; } ++inline uint16_t le16toh(uint16_t x) { return x; } ++inline uint32_t le32toh(uint32_t x) { return x; } ++inline uint64_t le64toh(uint64_t x) { return x; } + #else + #include + #endif From dd8712aff9dad5c78d8ca3cc2641181d46722097 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 16:06:19 +1000 Subject: [PATCH 038/180] fix: force fresh cv_bridge build (stale mutex 0.19.* pin) Same stale-remote-build pattern as libg2o: ros2-cv-bridge's remote build was published against ros2-distro-mutex 0.19.* rolling_*, several mutex versions behind the current 0.20.0 rolling_27, breaking dependency resolution for anything that pulls it in. Bump build_number so skip_existing forces a fresh local build against the current mutex. Verified building clean on osx-arm64. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 486b14f79..73d1528f3 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -232,6 +232,12 @@ visp: override_version: '3.7.0' zenoh_cpp_vendor: additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK -DUSE_SYSTEM_ZENOH=ON" +cv_bridge: + # Same stale-remote-build pattern as libg2o below: the remote build was + # published against ros2-distro-mutex 0.19.* rolling_*, several versions + # behind the current 0.20.0 rolling_27. Bump so skip_existing forces a + # fresh local build against the current mutex. + build_number: 26 distro_mutex: # vinca.yaml's mutex_package.build_number was bumped to 26 to re-publish # ros2-distro-mutex with vtk 9.7.0.* (was 9.6.2.*), but should_skip_mutex_package From 9725a69f306382d7d76da07e598bf8a2034d27c1 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 16:22:58 +1000 Subject: [PATCH 039/180] fix: skip rtabmap (OpenCV5 incompatible), bump mavlink past stale win-64 cache rtabmap's corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h uses the legacy OpenCV C API (CvMat, cvMat(), cvCreateMat(), cvMatMul(), ...) via #include , which OpenCV 5 (this repo's current pin) removed entirely -- no compat header, and the CMake COMPONENTS name changed from calib3d to calib. Porting ~300 lines of legacy calibration matrix math to the modern C++ Mat API correctly is a real rewrite, not a small patch, so skip rtabmap for now rather than risk a hasty, possibly numerically-wrong port. It was a direct vinca.yaml seed (packages_select_by_deps), so the existing packages_skip_by_deps entry for libpointmatcher never actually blocked it -- same reachability gap as the sick_scan_xd case found on humble -- removed the seed directly instead. Also bump mavlink's build_number: a prior CI run already cached a successful win-64 build made before the msgmap.hpp endian.h/win32 fix landed in the patch, and skip_existing only compares build_number, not patch content, so it kept reusing that stale build. Verified mavlink and libmavconn both still build clean on osx-arm64. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 6 ++++++ vinca.yaml | 17 +++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 73d1528f3..5ac13afb2 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -262,6 +262,12 @@ libg2o: # import .lib, and solver_csparse fails to link against it. Same fix as the # many other packages in this repo hitting this class of Windows issue. additional_cmake_args: "-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON" +mavlink: + # A prior CI run already cached a successful win-64 build made before the + # msgmap.hpp endian.h/win32 fix was added to the patch -- skip_existing + # only compares build_number, not patch content, so it kept reusing that + # stale build instead of picking up the fix. Bump to force a fresh one. + build_number: 26 pcl_conversions: # The remote build at the current build_number (25) was published against # vtk-base 9.6.2.*, which conda-forge no longer carries -- this repo's mutex diff --git a/vinca.yaml b/vinca.yaml index ec08859c0..6084b0476 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -29,9 +29,23 @@ packages_skip_by_deps: - rplidar_ros - rviz_visual_tools - # libpointmatcher not yet released for rolling; skip rtabmap until it is + # libpointmatcher not yet released for rolling; skip rtabmap until it is. + # (skip_by_deps on libpointmatcher alone doesn't actually block rtabmap -- + # same reachability gap as the sick_scan_xd case -- so it's also excluded + # directly below.) - libpointmatcher + # rtabmap itself is a direct seed below (packages_select_by_deps), so this + # skip_by_deps entry alone wouldn't actually block it -- see the seed-list + # removal instead. Its corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h + # uses the legacy OpenCV C API (CvMat, cvMat(), cvCreateMat(), cvMatMul(), + # ...) via #include , which OpenCV 5 removed + # entirely (no compat header, and the CMake COMPONENTS name changed from + # calib3d to calib). Porting that file to the modern C++ Mat API is a real + # rewrite of calibration math, not a small patch -- skip until someone does + # that properly upstream or here. + - rtabmap + - if: not linux then: - pendulum_control @@ -165,7 +179,6 @@ packages_select_by_deps: - rosidl_buffer_backend - rosidl_buffer_backend_registry - rosidl_buffer_py - - rtabmap - rviz_visual_tools - sbg_driver - simulation From 6bd12beab50486791c36caad290b08a4d43d2756 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 16:33:14 +1000 Subject: [PATCH 040/180] fix: mavlink msgmap.hpp also needs ssize_t on win-64, bump build_number again MSVC has no POSIX ssize_t, which msgmap.hpp uses for a truncation check -- add a typedef alongside the endian.h Windows branch. Bumped build_number again (26->27) since a prior CI run already cached a successful build made before this second fix, hitting the same stale-cache pattern as the first endian.h fix. Verified building clean on osx-arm64. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mavlink.patch | 7 +++++-- pkg_additional_info.yaml | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/patch/ros-rolling-mavlink.patch b/patch/ros-rolling-mavlink.patch index 7504b5256..6f9fc6665 100644 --- a/patch/ros-rolling-mavlink.patch +++ b/patch/ros-rolling-mavlink.patch @@ -25,10 +25,10 @@ index 30c9811..abea531 100644 ) add_custom_target(${definition}.xml-v2.0 diff --git a/pymavlink/generator/CPP11/include_v2.0/msgmap.hpp b/pymavlink/generator/CPP11/include_v2.0/msgmap.hpp -index a3956aa..6327113 100644 +index a3956aa..91ce908 100644 --- a/pymavlink/generator/CPP11/include_v2.0/msgmap.hpp +++ b/pymavlink/generator/CPP11/include_v2.0/msgmap.hpp -@@ -6,6 +6,16 @@ +@@ -6,6 +6,19 @@ #include #elif __APPLE__ #include @@ -42,6 +42,9 @@ index a3956aa..6327113 100644 +inline uint16_t le16toh(uint16_t x) { return x; } +inline uint32_t le32toh(uint32_t x) { return x; } +inline uint64_t le64toh(uint64_t x) { return x; } ++// Also no POSIX ssize_t on MSVC. ++#include ++typedef ptrdiff_t ssize_t; #else #include #endif diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 5ac13afb2..a42c36a87 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -266,8 +266,11 @@ mavlink: # A prior CI run already cached a successful win-64 build made before the # msgmap.hpp endian.h/win32 fix was added to the patch -- skip_existing # only compares build_number, not patch content, so it kept reusing that - # stale build instead of picking up the fix. Bump to force a fresh one. - build_number: 26 + # stale build instead of picking up the fix. Bumped once already (26) for + # the endian.h fix; bumped again (27) after that same stale-cache pattern + # hit a second, separate fix (msgmap.hpp also needs a Windows ssize_t + # typedef -- POSIX-only, MSVC has no ssize_t). + build_number: 27 pcl_conversions: # The remote build at the current build_number (25) was published against # vtk-base 9.6.2.*, which conda-forge no longer carries -- this repo's mutex From 6c8532af2ce7acd03bb517b3813b09cf15496301 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 16:45:21 +1000 Subject: [PATCH 041/180] fix: mavlink windows.h ERROR macro corrupts generated dialect enums windows.h (pulled in transitively via asio/winsock, already included by the time libmavconn compiles a translation unit including a generated mavlink dialect header) #defines ERROR as a plain macro from wingdi.h. Several mavlink dialects (common, ardupilotmega, ...) use ERROR as an enum class enumerator name (e.g. UAVCAN_NODE_HEALTH::ERROR), and the preprocessor rewrites that token before the compiler ever sees the enum, producing a cascade of syntax errors. Undefine ERROR in message.hpp, included by every generated dialect header before its own enum content. Bumped build_number again (28) for the same stale-cache pattern as the last two win-64-only fixes. Verified building clean on osx-arm64. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mavlink.patch | 22 ++++++++++++++++++++++ pkg_additional_info.yaml | 10 +++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/patch/ros-rolling-mavlink.patch b/patch/ros-rolling-mavlink.patch index 6f9fc6665..e4f63ce25 100644 --- a/patch/ros-rolling-mavlink.patch +++ b/patch/ros-rolling-mavlink.patch @@ -48,3 +48,25 @@ index a3956aa..91ce908 100644 #else #include #endif +diff --git a/pymavlink/generator/CPP11/include_v2.0/message.hpp b/pymavlink/generator/CPP11/include_v2.0/message.hpp +index 4d6d424..69b3140 100644 +--- a/pymavlink/generator/CPP11/include_v2.0/message.hpp ++++ b/pymavlink/generator/CPP11/include_v2.0/message.hpp +@@ -1,6 +1,17 @@ + + #pragma once + ++#ifdef _WIN32 ++// windows.h (pulled in transitively by asio/winsock on Windows) #defines ERROR ++// as a plain macro (from wingdi.h), which corrupts every generated dialect ++// header that uses ERROR as an enumerator name (e.g. UAVCAN_NODE_HEALTH::ERROR ++// in common.hpp) -- the preprocessor rewrites it before the compiler ever sees ++// an enum. Undefine it here, before any generated header's enums are parsed. ++#ifdef ERROR ++#undef ERROR ++#endif ++#endif ++ + #include + #include + #include diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index a42c36a87..327a5a45a 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -266,11 +266,11 @@ mavlink: # A prior CI run already cached a successful win-64 build made before the # msgmap.hpp endian.h/win32 fix was added to the patch -- skip_existing # only compares build_number, not patch content, so it kept reusing that - # stale build instead of picking up the fix. Bumped once already (26) for - # the endian.h fix; bumped again (27) after that same stale-cache pattern - # hit a second, separate fix (msgmap.hpp also needs a Windows ssize_t - # typedef -- POSIX-only, MSVC has no ssize_t). - build_number: 27 + # stale build instead of picking up the fix. Bumped repeatedly (26, 27, 28) + # as the same stale-cache pattern hit each successive win-64-only fix: + # endian.h, then ssize_t, then windows.h's ERROR macro corrupting every + # generated dialect enum that uses ERROR as an enumerator name. + build_number: 28 pcl_conversions: # The remote build at the current build_number (25) was published against # vtk-base 9.6.2.*, which conda-forge no longer carries -- this repo's mutex From d4236313ab28d2f2df25d3a6363d82183ea15e4e Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 16:57:14 +1000 Subject: [PATCH 042/180] fix: mavlink windows.h NO_ERROR macro also corrupts MAV_PARAM_ERROR enum Same class of bug as the ERROR macro fix: windows.h's winerror.h also #defines NO_ERROR as a plain macro (0L), colliding with MAV_PARAM_ERROR::NO_ERROR in common.hpp. Undefine it alongside ERROR in message.hpp. Bumped build_number again (29) for the same stale-cache pattern. Verified building clean on osx-arm64. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mavlink.patch | 19 ++++++++++++------- pkg_additional_info.yaml | 10 +++++----- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/patch/ros-rolling-mavlink.patch b/patch/ros-rolling-mavlink.patch index e4f63ce25..1b8be8ca9 100644 --- a/patch/ros-rolling-mavlink.patch +++ b/patch/ros-rolling-mavlink.patch @@ -49,22 +49,27 @@ index a3956aa..91ce908 100644 #include #endif diff --git a/pymavlink/generator/CPP11/include_v2.0/message.hpp b/pymavlink/generator/CPP11/include_v2.0/message.hpp -index 4d6d424..69b3140 100644 +index 4d6d424..c095ee7 100644 --- a/pymavlink/generator/CPP11/include_v2.0/message.hpp +++ b/pymavlink/generator/CPP11/include_v2.0/message.hpp -@@ -1,6 +1,17 @@ +@@ -1,6 +1,22 @@ #pragma once +#ifdef _WIN32 -+// windows.h (pulled in transitively by asio/winsock on Windows) #defines ERROR -+// as a plain macro (from wingdi.h), which corrupts every generated dialect -+// header that uses ERROR as an enumerator name (e.g. UAVCAN_NODE_HEALTH::ERROR -+// in common.hpp) -- the preprocessor rewrites it before the compiler ever sees -+// an enum. Undefine it here, before any generated header's enums are parsed. ++// windows.h (pulled in transitively by asio/winsock on Windows) #defines ++// several plain object-like macros (ERROR from wingdi.h, NO_ERROR from ++// winerror.h, ...) that collide with enumerator names used throughout the ++// generated dialect headers (e.g. UAVCAN_NODE_HEALTH::ERROR, ++// MAV_PARAM_ERROR::NO_ERROR in common.hpp) -- the preprocessor rewrites ++// them before the compiler ever sees an enum. Undefine them here, before ++// any generated header's enums are parsed. +#ifdef ERROR +#undef ERROR +#endif ++#ifdef NO_ERROR ++#undef NO_ERROR ++#endif +#endif + #include diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 327a5a45a..8f5082715 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -266,11 +266,11 @@ mavlink: # A prior CI run already cached a successful win-64 build made before the # msgmap.hpp endian.h/win32 fix was added to the patch -- skip_existing # only compares build_number, not patch content, so it kept reusing that - # stale build instead of picking up the fix. Bumped repeatedly (26, 27, 28) - # as the same stale-cache pattern hit each successive win-64-only fix: - # endian.h, then ssize_t, then windows.h's ERROR macro corrupting every - # generated dialect enum that uses ERROR as an enumerator name. - build_number: 28 + # stale build instead of picking up the fix. Bumped repeatedly (26-29) as + # the same stale-cache pattern hit each successive win-64-only fix: + # endian.h, then ssize_t, then windows.h's ERROR macro, then NO_ERROR too + # (both collide with enumerator names used across the generated dialects). + build_number: 29 pcl_conversions: # The remote build at the current build_number (25) was published against # vtk-base 9.6.2.*, which conda-forge no longer carries -- this repo's mutex From dffc64d3da19550104a8cc345ebc69b4f0bc7b4e Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 18:13:10 +1000 Subject: [PATCH 043/180] fix: port rtabmap to OpenCV5, re-enable on rolling Un-skip rtabmap (was excluded pending a full OpenCV5 port of its legacy C-API stereo calibration code). Ports guilib/corelib/tools to OpenCV5: flatten calib3d/features2d/highgui/imgproc/photo umbrella includes, drop removed legacy C-API headers (core_c.h, imgproc_c.h/types_c.h, highgui_c.h, calib3d_c.h, videoio_c.h), rename CV_* macros to cv:: equivalents, and split stereoRectifyFisheye() (uses removed OpenCV C API) into a CV_MAJOR_VERSION-gated branch using cv::fisheye::stereoRectify() on OpenCV5 (StereoCameraModel.cpp, CalibrationDialog.cpp). Several of these issues (mismatched ifdef version-guard upper bounds, a handful of missed macro renames, a mismatched aruco/calib3d include guard) only surfaced after the prior, larger single-file port, hence the incremental fix patches on top of it. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rtabmap.1base.patch | 2066 +++++++++++++++++++++++++ patch/ros-rolling-rtabmap.2rest.patch | 677 ++++++++ patch/ros-rolling-rtabmap.3fix.patch | 60 + patch/ros-rolling-rtabmap.4fix.patch | 60 + patch/ros-rolling-rtabmap.5fix.patch | 12 + vinca.yaml | 18 +- 6 files changed, 2878 insertions(+), 15 deletions(-) create mode 100644 patch/ros-rolling-rtabmap.1base.patch create mode 100644 patch/ros-rolling-rtabmap.2rest.patch create mode 100644 patch/ros-rolling-rtabmap.3fix.patch create mode 100644 patch/ros-rolling-rtabmap.4fix.patch create mode 100644 patch/ros-rolling-rtabmap.5fix.patch diff --git a/patch/ros-rolling-rtabmap.1base.patch b/patch/ros-rolling-rtabmap.1base.patch new file mode 100644 index 000000000..904a400f9 --- /dev/null +++ b/patch/ros-rolling-rtabmap.1base.patch @@ -0,0 +1,2066 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -1,6 +1,9 @@ + # Top-Level CmakeLists.txt +-cmake_minimum_required(VERSION 3.14) ++cmake_minimum_required(VERSION 3.18) + PROJECT( RTABMap ) ++if(POLICY CMP0167) ++ cmake_policy(SET CMP0167 NEW) ++endif() + SET(PROJECT_PREFIX rtabmap) + + # Catkin doesn't support multiarch library path, +@@ -84,12 +87,12 @@ + ENDIF(MINGW) + + # GCC 4 required +-IF(UNIX OR MINGW) +- EXEC_PROGRAM( gcc ARGS "-dumpversion" OUTPUT_VARIABLE GCC_VERSION ) +- IF(GCC_VERSION VERSION_LESS "4.0.0") +- MESSAGE(FATAL_ERROR "GCC ${GCC_VERSION} found, but version 4.x.x minimum is required") +- ENDIF(GCC_VERSION VERSION_LESS "4.0.0") +-ENDIF(UNIX OR MINGW) ++# IF(UNIX OR MINGW) ++# EXEC_PROGRAM( gcc ARGS "-dumpversion" OUTPUT_VARIABLE GCC_VERSION ) ++# IF(GCC_VERSION VERSION_LESS "4.0.0") ++# MESSAGE(FATAL_ERROR "GCC ${GCC_VERSION} found, but version 4.x.x minimum is required") ++# ENDIF(GCC_VERSION VERSION_LESS "4.0.0") ++# ENDIF(UNIX OR MINGW) + + #The CDT Error Parser cannot handle error messages that span + #more than one line, which is the default gcc behavior. +@@ -234,8 +237,26 @@ + set(RTABMAP_QT_VERSION AUTO CACHE STRING "Force a specific Qt version.") + set_property(CACHE RTABMAP_QT_VERSION PROPERTY STRINGS AUTO 4 5 6) + +-FIND_PACKAGE(OpenCV REQUIRED QUIET COMPONENTS core calib3d imgproc highgui stitching photo video videoio OPTIONAL_COMPONENTS aruco objdetect xfeatures2d nonfree gpu cudafeatures2d cudaoptflow cudaimgproc) ++# OpenCV components. calib3d was split into "calib" + "geometry" in OpenCV 5. ++# These lists are reused below to generate RTABMapConfig.cmake so downstream ++# find_package(RTABMap) requests the same components this build used. ++SET(RTABMAP_OpenCV_COMPONENTS_5 core imgproc highgui stitching photo video videoio calib geometry) ++SET(RTABMAP_OpenCV_COMPONENTS_4 core imgproc highgui stitching photo video videoio calib3d) ++SET(RTABMAP_OpenCV_OPTIONAL_COMPONENTS_5 objdetect xfeatures2d nonfree gpu cudafeatures2d cudaoptflow cudaimgproc) ++SET(RTABMAP_OpenCV_OPTIONAL_COMPONENTS_4 aruco objdetect xfeatures2d nonfree gpu cudafeatures2d cudaoptflow cudaimgproc) + ++# Probe OpenCV without a version constraint first, then request the components ++# matching the detected major version. A version-constrained find that fails to ++# match (e.g. asking for 5 when only 4 is present) resets OpenCV_DIR to NOTFOUND, ++# which breaks toolchain builds that rely on a -DOpenCV_DIR hint (e.g. Android, ++# where CMAKE_FIND_ROOT_PATH restricts the search). ++FIND_PACKAGE(OpenCV REQUIRED QUIET COMPONENTS core) ++IF(OpenCV_VERSION_MAJOR GREATER 4) ++ FIND_PACKAGE(OpenCV REQUIRED QUIET COMPONENTS ${RTABMAP_OpenCV_COMPONENTS_5} OPTIONAL_COMPONENTS ${RTABMAP_OpenCV_OPTIONAL_COMPONENTS_5}) ++ELSE() ++ FIND_PACKAGE(OpenCV REQUIRED QUIET COMPONENTS ${RTABMAP_OpenCV_COMPONENTS_4} OPTIONAL_COMPONENTS ${RTABMAP_OpenCV_OPTIONAL_COMPONENTS_4}) ++ENDIF() ++ + IF(WITH_QT) + FIND_PACKAGE(PCL 1.7 REQUIRED QUIET COMPONENTS common io kdtree search surface filters registration sample_consensus segmentation visualization) + ELSE() +@@ -494,7 +515,10 @@ + ENDIF(WITH_DC1394) + + IF(WITH_G2O) ++ SET(_RTABMAP_CMAKE_FIND_PACKAGE_PREFER_CONFIG ${CMAKE_FIND_PACKAGE_PREFER_CONFIG}) ++ SET(CMAKE_FIND_PACKAGE_PREFER_CONFIG TRUE) + FIND_PACKAGE(g2o NO_MODULE) ++ SET(CMAKE_FIND_PACKAGE_PREFER_CONFIG ${_RTABMAP_CMAKE_FIND_PACKAGE_PREFER_CONFIG}) + IF(g2o_FOUND) + MESSAGE(STATUS "Found g2o (targets)") + SET(G2O_FOUND ${g2o_FOUND}) +@@ -530,8 +554,10 @@ + ENDIF(WITH_G2O) + + IF(WITH_GTSAM) +- # Force config mode to ignore PCL's findGTSAM.cmake file ++ SET(_RTABMAP_CMAKE_FIND_PACKAGE_PREFER_CONFIG ${CMAKE_FIND_PACKAGE_PREFER_CONFIG}) ++ SET(CMAKE_FIND_PACKAGE_PREFER_CONFIG TRUE) + FIND_PACKAGE(GTSAM CONFIG QUIET) ++ SET(CMAKE_FIND_PACKAGE_PREFER_CONFIG ${_RTABMAP_CMAKE_FIND_PACKAGE_PREFER_CONFIG}) + ENDIF(WITH_GTSAM) + + IF(WITH_MRPT) +@@ -576,9 +602,9 @@ + ENDIF(WITH_POINTMATCHER) + + IF(libpointmatcher_FOUND OR GTSAM_FOUND) +- find_package(Boost COMPONENTS thread filesystem system program_options date_time REQUIRED) ++ find_package(Boost COMPONENTS thread filesystem program_options date_time REQUIRED) + IF(Boost_MINOR_VERSION GREATER 47) +- find_package(Boost COMPONENTS thread filesystem system program_options date_time chrono timer serialization REQUIRED) ++ find_package(Boost COMPONENTS thread filesystem program_options date_time chrono timer serialization REQUIRED) + ENDIF(Boost_MINOR_VERSION GREATER 47) + IF(WIN32) + MESSAGE(STATUS "Boost_LIBRARY_DIRS=${Boost_LIBRARY_DIRS}") +@@ -1207,6 +1233,18 @@ + #### + # Setup RTABMapConfig.cmake + #### ++IF(OpenCV_VERSION_MAJOR GREATER 4) ++ SET(CONF_OPENCV_COMPONENTS ${RTABMAP_OpenCV_COMPONENTS_5}) ++ SET(CONF_OPENCV_OPTIONAL_COMPONENTS ${RTABMAP_OpenCV_OPTIONAL_COMPONENTS_5}) ++ELSE() ++ SET(CONF_OPENCV_COMPONENTS ${RTABMAP_OpenCV_COMPONENTS_4}) ++ SET(CONF_OPENCV_OPTIONAL_COMPONENTS ${RTABMAP_OpenCV_OPTIONAL_COMPONENTS_4}) ++ENDIF() ++STRING(REPLACE ";" " " CONF_OPENCV_COMPONENTS "${CONF_OPENCV_COMPONENTS}") ++STRING(REPLACE ";" " " CONF_OPENCV_OPTIONAL_COMPONENTS "${CONF_OPENCV_OPTIONAL_COMPONENTS}") ++# Pin the OpenCV major version so downstream projects find the same major RTAB-Map was ++# built against ++SET(CONF_OPENCV_VERSION_MAJOR ${OpenCV_VERSION_MAJOR}) + include(CMakePackageConfigHelpers) + write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" +diff --git a/RTABMapConfig.cmake.in b/RTABMapConfig.cmake.in +--- a/RTABMapConfig.cmake.in ++++ b/RTABMapConfig.cmake.in +@@ -1,7 +1,7 @@ + include(CMakeFindDependencyMacro) + + # Mandatory dependencies +-find_dependency(OpenCV COMPONENTS core calib3d imgproc highgui stitching photo video OPTIONAL_COMPONENTS aruco objdetect xfeatures2d nonfree gpu cudafeatures2d) ++find_dependency(OpenCV @CONF_OPENCV_VERSION_MAJOR@ COMPONENTS @CONF_OPENCV_COMPONENTS@ OPTIONAL_COMPONENTS @CONF_OPENCV_OPTIONAL_COMPONENTS@) + + if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/RTABMap_guiTargets.cmake") + find_dependency(PCL 1.7 COMPONENTS common io kdtree search surface filters registration sample_consensus segmentation visualization) +diff --git a/corelib/include/rtabmap/core/DBDriverSqlite3.h b/corelib/include/rtabmap/core/DBDriverSqlite3.h +--- a/corelib/include/rtabmap/core/DBDriverSqlite3.h ++++ b/corelib/include/rtabmap/core/DBDriverSqlite3.h +@@ -30,7 +30,11 @@ + + #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines + #include "rtabmap/core/DBDriver.h" ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + + typedef struct sqlite3_stmt sqlite3_stmt; + typedef struct sqlite3 sqlite3; +diff --git a/corelib/include/rtabmap/core/EpipolarGeometry.h b/corelib/include/rtabmap/core/EpipolarGeometry.h +--- a/corelib/include/rtabmap/core/EpipolarGeometry.h ++++ b/corelib/include/rtabmap/core/EpipolarGeometry.h +@@ -31,7 +31,14 @@ + #include "rtabmap/core/Parameters.h" + #include "rtabmap/utilite/UStl.h" + #include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#if CV_MAJOR_VERSION >= 5 ++#include ++#endif ++#endif + #include + #include + #include +diff --git a/corelib/include/rtabmap/core/Features2d.h b/corelib/include/rtabmap/core/Features2d.h +--- a/corelib/include/rtabmap/core/Features2d.h ++++ b/corelib/include/rtabmap/core/Features2d.h +@@ -32,7 +32,11 @@ + + #include + #include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + #include + #include + #include "rtabmap/core/Parameters.h" +@@ -70,6 +74,10 @@ + class SIFT; + #endif + class SURF; ++#if (CV_MAJOR_VERSION == 5) ++class BRISK; ++class KAZE; ++#endif + } + namespace cuda { + class FastFeatureDetector; +@@ -89,7 +97,13 @@ + typedef cv::xfeatures2d::DAISY CV_DAISY; + typedef cv::GFTTDetector CV_GFTT; + typedef cv::xfeatures2d::BriefDescriptorExtractor CV_BRIEF; ++#if (CV_MAJOR_VERSION < 5) + typedef cv::BRISK CV_BRISK; ++typedef cv::KAZE CV_KAZE; ++#else ++typedef cv::xfeatures2d::BRISK CV_BRISK; ++typedef cv::xfeatures2d::KAZE CV_KAZE; ++#endif + typedef cv::ORB CV_ORB; + typedef cv::cuda::SURF_CUDA CV_SURF_GPU; + typedef cv::cuda::ORB CV_ORB_GPU; +@@ -573,7 +587,7 @@ + int diffusivity_; + + #if CV_MAJOR_VERSION > 2 +- cv::Ptr kaze_; ++ cv::Ptr kaze_; + #endif + }; + +diff --git a/corelib/include/rtabmap/core/Memory.h b/corelib/include/rtabmap/core/Memory.h +--- a/corelib/include/rtabmap/core/Memory.h ++++ b/corelib/include/rtabmap/core/Memory.h +@@ -41,7 +41,11 @@ + #include + #include "rtabmap/utilite/UStl.h" + #include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + #include + + namespace rtabmap { +diff --git a/corelib/include/rtabmap/core/OdometryInfo.h b/corelib/include/rtabmap/core/OdometryInfo.h +--- a/corelib/include/rtabmap/core/OdometryInfo.h ++++ b/corelib/include/rtabmap/core/OdometryInfo.h +@@ -34,7 +34,11 @@ + #include "rtabmap/core/RegistrationInfo.h" + #include "rtabmap/core/CameraModel.h" + #include "rtabmap/core/LaserScan.h" ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + + namespace rtabmap { + +diff --git a/corelib/include/rtabmap/core/SensorData.h b/corelib/include/rtabmap/core/SensorData.h +--- a/corelib/include/rtabmap/core/SensorData.h ++++ b/corelib/include/rtabmap/core/SensorData.h +@@ -34,7 +34,11 @@ + #include + #include + #include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + #include + #include + #include +diff --git a/corelib/include/rtabmap/core/Signature.h b/corelib/include/rtabmap/core/Signature.h +--- a/corelib/include/rtabmap/core/Signature.h ++++ b/corelib/include/rtabmap/core/Signature.h +@@ -31,7 +31,11 @@ + + #include + #include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + #include + #include + #include +diff --git a/corelib/include/rtabmap/core/Statistics.h b/corelib/include/rtabmap/core/Statistics.h +--- a/corelib/include/rtabmap/core/Statistics.h ++++ b/corelib/include/rtabmap/core/Statistics.h +@@ -31,7 +31,11 @@ + #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines + + #include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + #include + #include + #include +diff --git a/corelib/include/rtabmap/core/VWDictionary.h b/corelib/include/rtabmap/core/VWDictionary.h +--- a/corelib/include/rtabmap/core/VWDictionary.h ++++ b/corelib/include/rtabmap/core/VWDictionary.h +@@ -31,7 +31,11 @@ + + #include + #include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + #include + #include + #include "rtabmap/core/Parameters.h" +diff --git a/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h b/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h +--- a/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h ++++ b/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h +@@ -32,12 +32,24 @@ + #ifndef CORELIB_SRC_OPENCV_STEREORECTIFYFISHEYE_H_ + #define CORELIB_SRC_OPENCV_STEREORECTIFYFISHEYE_H_ + ++// This header relies on the OpenCV C API (cvRodrigues2, cvProjectPoints2, ...) ++// which was removed in OpenCV 5. Pull in only the version macros (available in ++// all OpenCV versions) so we can fail early with a clear message rather than ++// with cryptic errors from the includes below. ++#include ++#if CV_MAJOR_VERSION >= 5 ++#error "stereoRectifyFisheye.h is not supported with OpenCV 5 or later (it uses the removed OpenCV C API). Use cv::fisheye::stereoRectify() instead, or guard your include with '#if CV_MAJOR_VERSION < 5'." ++#endif ++ + #include + #if CV_MAJOR_VERSION >= 3 + #include + + #if CV_MAJOR_VERSION >= 4 + #include ++#if CV_MAJOR_VERSION >= 5 ++#include ++#endif + + // Opencv4 doesn't expose those functions below anymore, we should recopy all of them! + int cvRodrigues2( const CvMat* src, CvMat* dst, CvMat* jacobian CV_DEFAULT(0)) +diff --git a/corelib/include/rtabmap/core/util3d_correspondences.h b/corelib/include/rtabmap/core/util3d_correspondences.h +--- a/corelib/include/rtabmap/core/util3d_correspondences.h ++++ b/corelib/include/rtabmap/core/util3d_correspondences.h +@@ -32,7 +32,12 @@ + + #include + #include ++#include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + #include + #include + #include +diff --git a/corelib/include/rtabmap/core/util3d_features.h b/corelib/include/rtabmap/core/util3d_features.h +--- a/corelib/include/rtabmap/core/util3d_features.h ++++ b/corelib/include/rtabmap/core/util3d_features.h +@@ -30,7 +30,12 @@ + + #include + ++#include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + #include + #include + #include +diff --git a/corelib/src/CameraModel.cpp b/corelib/src/CameraModel.cpp +--- a/corelib/src/CameraModel.cpp ++++ b/corelib/src/CameraModel.cpp +@@ -34,6 +34,9 @@ + #include + #include + #include ++#if CV_MAJOR_VERSION >= 5 ++#include ++#endif + + namespace rtabmap { + +diff --git a/corelib/src/EpipolarGeometry.cpp b/corelib/src/EpipolarGeometry.cpp +--- a/corelib/src/EpipolarGeometry.cpp ++++ b/corelib/src/EpipolarGeometry.cpp +@@ -33,8 +33,11 @@ + #include "rtabmap/utilite/UMath.h" + + #include +-#include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + #include + + namespace rtabmap +diff --git a/corelib/src/Features2d.cpp b/corelib/src/Features2d.cpp +--- a/corelib/src/Features2d.cpp ++++ b/corelib/src/Features2d.cpp +@@ -36,7 +36,6 @@ + #include "rtabmap/utilite/UMath.h" + #include "rtabmap/utilite/ULogger.h" + #include "rtabmap/utilite/UTimer.h" +-#include + #include + #include + +@@ -857,7 +856,7 @@ + cv::cornerSubPix( image, corners, + cv::Size( _subPixWinSize, _subPixWinSize ), + cv::Size( -1, -1 ), +- cv::TermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, _subPixIterations, _subPixEps ) ); ++ cv::TermCriteria( cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS, _subPixIterations, _subPixEps ) ); + + for(unsigned int i=0;i 4 ++#ifdef HAVE_OPENCV_XFEATURES2D ++ brisk_ = CV_BRISK::create(thresh_, octaves_, patternScale_); ++#else ++ UWARN("RTAB-Map is not built with OpenCV xfeatures2d module so BRISK cannot be used!"); ++#endif ++#elif CV_MAJOR_VERSION < 3 + brisk_ = cv::Ptr(new CV_BRISK(thresh_, octaves_, patternScale_)); + #else + brisk_ = CV_BRISK::create(thresh_, octaves_, patternScale_); +@@ -2357,6 +2361,7 @@ + { + UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U); + std::vector keypoints; ++#if CV_MAJOR_VERSION < 5 || (CV_MAJOR_VERSION > 4 && defined(HAVE_OPENCV_XFEATURES2D)) + cv::Mat imgRoi(image, roi); + cv::Mat maskRoi; + if(!mask.empty()) +@@ -2364,6 +2369,9 @@ + maskRoi = cv::Mat(mask, roi); + } + brisk_->detect(imgRoi, keypoints, maskRoi); // Opencv keypoints ++#else ++ UWARN("RTAB-Map is not built with BRISK feature support!"); ++#endif + return keypoints; + } + +@@ -2371,7 +2379,11 @@ + { + UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U); + cv::Mat descriptors; ++#if CV_MAJOR_VERSION < 5 || (CV_MAJOR_VERSION > 4 && defined(HAVE_OPENCV_XFEATURES2D)) + brisk_->compute(image, keypoints, descriptors); ++#else ++ UWARN("RTAB-Map is not built with BRISK feature support!"); ++#endif + return descriptors; + } + +@@ -2404,10 +2416,16 @@ + Parameters::parse(parameters, Parameters::kKAZENOctaveLayers(), nOctaveLayers_); + Parameters::parse(parameters, Parameters::kKAZEDiffusivity(), diffusivity_); + +-#if CV_MAJOR_VERSION > 3 +- kaze_ = cv::KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, (cv::KAZE::DiffusivityType)diffusivity_); ++#if CV_MAJOR_VERSION > 4 ++#ifdef HAVE_OPENCV_XFEATURES2D ++ kaze_ = CV_KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, (CV_KAZE::DiffusivityType)diffusivity_); ++#else ++ UWARN("RTAB-Map is not built with OpenCV xfeatures2d module so KAZE cannot be used!"); ++#endif ++#elif CV_MAJOR_VERSION > 3 ++ kaze_ = CV_KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, (CV_KAZE::DiffusivityType)diffusivity_); + #elif CV_MAJOR_VERSION > 2 +- kaze_ = cv::KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, diffusivity_); ++ kaze_ = CV_KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, diffusivity_); + #else + UWARN("RTAB-Map is not built with OpenCV3 so Kaze feature cannot be used!"); + #endif +@@ -2417,7 +2435,7 @@ + { + UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U); + std::vector keypoints; +-#if CV_MAJOR_VERSION > 2 ++#if (CV_MAJOR_VERSION > 2 && CV_MAJOR_VERSION < 5) || (CV_MAJOR_VERSION > 4 && defined(HAVE_OPENCV_XFEATURES2D)) + cv::Mat imgRoi(image, roi); + cv::Mat maskRoi; + if (!mask.empty()) +@@ -2426,7 +2444,7 @@ + } + kaze_->detect(imgRoi, keypoints, maskRoi); // Opencv keypoints + #else +- UWARN("RTAB-Map is not built with OpenCV3 so Kaze feature cannot be used!"); ++ UWARN("RTAB-Map is not built with Kaze feature support!"); + #endif + return keypoints; + } +@@ -2435,10 +2453,10 @@ + { + UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U); + cv::Mat descriptors; +-#if CV_MAJOR_VERSION > 2 ++#if (CV_MAJOR_VERSION > 2 && CV_MAJOR_VERSION < 5) || (CV_MAJOR_VERSION > 4 && defined(HAVE_OPENCV_XFEATURES2D)) + kaze_->compute(image, keypoints, descriptors); + #else +- UWARN("RTAB-Map is not built with OpenCV3 so Kaze feature cannot be used!"); ++ UWARN("RTAB-Map is not built with Kaze feature support!"); + #endif + return descriptors; + } +diff --git a/corelib/src/Memory.cpp b/corelib/src/Memory.cpp +--- a/corelib/src/Memory.cpp ++++ b/corelib/src/Memory.cpp +@@ -26,6 +26,9 @@ + */ + + #include ++#if CV_MAJOR_VERSION >= 5 ++#include ++#endif + #include + #include + #include +@@ -62,7 +65,6 @@ + #include + #include + #include +-#include + #include + + namespace rtabmap { +@@ -4930,7 +4932,7 @@ + cv::Mat imageMono; + if(decimatedData.imageRaw().channels() == 3) + { +- cv::cvtColor(decimatedData.imageRaw(), imageMono, CV_BGR2GRAY); ++ cv::cvtColor(decimatedData.imageRaw(), imageMono, cv::COLOR_BGR2GRAY); + } + else + { +@@ -5239,7 +5241,7 @@ + cv::Mat imageMono; + if(data.imageRaw().channels() == 3) + { +- cv::cvtColor(data.imageRaw(), imageMono, CV_BGR2GRAY); ++ cv::cvtColor(data.imageRaw(), imageMono, cv::COLOR_BGR2GRAY); + } + else + { +diff --git a/corelib/src/RegistrationVis.cpp b/corelib/src/RegistrationVis.cpp +--- a/corelib/src/RegistrationVis.cpp ++++ b/corelib/src/RegistrationVis.cpp +@@ -43,7 +43,9 @@ + #include + #include + #include +-#include ++#if CV_MAJOR_VERSION > 4 ++#include ++#endif + + #if defined(HAVE_OPENCV_XFEATURES2D) && (CV_MAJOR_VERSION > 3 || (CV_MAJOR_VERSION==3 && CV_MINOR_VERSION >=4 && CV_SUBMINOR_VERSION >= 1)) + #include // For GMS matcher +@@ -52,7 +54,10 @@ + #ifdef HAVE_OPENCV_CUDAOPTFLOW + #include + #include ++#if CV_MAJOR_VERSION >= 5 ++#include + #endif ++#endif + + #include + +@@ -2170,7 +2175,7 @@ + if(!transform.isNull() && !pcaData.empty()) + { + cv::Mat pcaEigenVectors, pcaEigenValues; +- cv::PCA pca_analysis(pcaData, cv::Mat(), CV_PCA_DATA_AS_ROW); ++ cv::PCA pca_analysis(pcaData, cv::Mat(), cv::PCA::DATA_AS_ROW); + // We take the second eigen value + info.inliersDistribution = pca_analysis.eigenvalues.at(0, 1); + +diff --git a/corelib/src/SensorCaptureThread.cpp b/corelib/src/SensorCaptureThread.cpp +--- a/corelib/src/SensorCaptureThread.cpp ++++ b/corelib/src/SensorCaptureThread.cpp +@@ -39,7 +39,6 @@ + #include "rtabmap/core/IMUFilter.h" + #include "rtabmap/core/Features2d.h" + #include "rtabmap/core/clams/discrete_depth_distortion_model.h" +-#include + #include + #include + #include +@@ -742,11 +741,11 @@ + else if(data.imageRaw().type() == CV_8UC3) + { + cv::Mat channels[3]; +- cv::cvtColor(data.imageRaw(), image, CV_BGR2YCrCb); ++ cv::cvtColor(data.imageRaw(), image, cv::COLOR_BGR2YCrCb); + cv::split(image, channels); + cv::equalizeHist(channels[0], channels[0]); + cv::merge(channels, 3, image); +- cv::cvtColor(image, image, CV_YCrCb2BGR); ++ cv::cvtColor(image, image, cv::COLOR_YCrCb2BGR); + } + if(!data.depthRaw().empty()) + { +@@ -762,11 +761,11 @@ + else if(data.rightRaw().type() == CV_8UC3) + { + cv::Mat channels[3]; +- cv::cvtColor(data.rightRaw(), right, CV_BGR2YCrCb); ++ cv::cvtColor(data.rightRaw(), right, cv::COLOR_BGR2YCrCb); + cv::split(right, channels); + cv::equalizeHist(channels[0], channels[0]); + cv::merge(channels, 3, right); +- cv::cvtColor(right, right, CV_YCrCb2BGR); ++ cv::cvtColor(right, right, cv::COLOR_YCrCb2BGR); + } + data.setStereoImage(image, right, data.stereoCameraModels()[0]); + } +@@ -781,11 +780,11 @@ + else if(data.imageRaw().type() == CV_8UC3) + { + cv::Mat channels[3]; +- cv::cvtColor(data.imageRaw(), image, CV_BGR2YCrCb); ++ cv::cvtColor(data.imageRaw(), image, cv::COLOR_BGR2YCrCb); + cv::split(image, channels); + clahe->apply(channels[0], channels[0]); + cv::merge(channels, 3, image); +- cv::cvtColor(image, image, CV_YCrCb2BGR); ++ cv::cvtColor(image, image, cv::COLOR_YCrCb2BGR); + } + if(!data.depthRaw().empty()) + { +@@ -801,11 +800,11 @@ + else if(data.rightRaw().type() == CV_8UC3) + { + cv::Mat channels[3]; +- cv::cvtColor(data.rightRaw(), right, CV_BGR2YCrCb); ++ cv::cvtColor(data.rightRaw(), right, cv::COLOR_BGR2YCrCb); + cv::split(right, channels); + clahe->apply(channels[0], channels[0]); + cv::merge(channels, 3, right); +- cv::cvtColor(right, right, CV_YCrCb2BGR); ++ cv::cvtColor(right, right, cv::COLOR_YCrCb2BGR); + } + data.setStereoImage(image, right, data.stereoCameraModels()[0]); + } +diff --git a/corelib/src/StereoCameraModel.cpp b/corelib/src/StereoCameraModel.cpp +--- a/corelib/src/StereoCameraModel.cpp ++++ b/corelib/src/StereoCameraModel.cpp +@@ -32,8 +32,11 @@ + #include + #include + #include ++#if CV_MAJOR_VERSION >= 5 ++#include ++#endif + +-#if CV_MAJOR_VERSION > 2 or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) ++#if (CV_MAJOR_VERSION > 2 and CV_MAJOR_VERSION < 5) or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) + #include + #endif + +@@ -179,12 +182,20 @@ + { + cv::Vec4d D_left(left_.D_raw().at(0,0), left_.D_raw().at(0,1), left_.D_raw().at(0,4), left_.D_raw().at(0,5)); + cv::Vec4d D_right(right_.D_raw().at(0,0), right_.D_raw().at(0,1), right_.D_raw().at(0,4), right_.D_raw().at(0,5)); +- ++#if CV_MAJOR_VERSION < 5 + stereoRectifyFisheye( + left_.K_raw(), D_left, + right_.K_raw(), D_right, + left_.imageSize(), R_, T_, R1, R2, P1, P2, Q, + cv::CALIB_ZERO_DISPARITY, 0, left_.imageSize()); ++#else ++ double balance = 0.0, fov_scale = 1.0; ++ cv::fisheye::stereoRectify( ++ left_.K_raw(), D_left, ++ right_.K_raw(), D_right, ++ left_.imageSize(), R_, T_, R1, R2, P1, P2, Q, ++ cv::CALIB_ZERO_DISPARITY, left_.imageSize(), balance, fov_scale); ++#endif + + // Re-zoom to original focal distance + if(P1.at(0,0) < 0) +diff --git a/corelib/src/camera/CameraDepthAI.cpp b/corelib/src/camera/CameraDepthAI.cpp +--- a/corelib/src/camera/CameraDepthAI.cpp ++++ b/corelib/src/camera/CameraDepthAI.cpp +@@ -32,7 +32,11 @@ + #include + #include + #include +- ++#if CV_MAJOR_VERSION < 5 ++#include ++#else ++#include ++#endif + + namespace rtabmap { + +diff --git a/corelib/src/camera/CameraFreenect.cpp b/corelib/src/camera/CameraFreenect.cpp +--- a/corelib/src/camera/CameraFreenect.cpp ++++ b/corelib/src/camera/CameraFreenect.cpp +@@ -28,7 +28,6 @@ + #include + #include + #include +-#include + + #ifdef RTABMAP_FREENECT + #include +@@ -183,7 +182,7 @@ + + if(color_) + { +- cv::cvtColor(rgbIrBuffer_, rgbIrLastFrame_, CV_RGB2BGR); ++ cv::cvtColor(rgbIrBuffer_, rgbIrLastFrame_, cv::COLOR_RGB2BGR); + } + else // IrDepth + { +diff --git a/corelib/src/camera/CameraFreenect2.cpp b/corelib/src/camera/CameraFreenect2.cpp +--- a/corelib/src/camera/CameraFreenect2.cpp ++++ b/corelib/src/camera/CameraFreenect2.cpp +@@ -29,7 +29,6 @@ + #include + #include + #include +-#include + + #ifdef RTABMAP_FREENECT2 + #include +@@ -430,11 +429,11 @@ + cv::Mat rgbMat; // rtabmap uses 3 channels RGB + #ifdef LIBFREENECT2_WITH_TEGRAJPEG_SUPPORT + +- cv::cvtColor(rgbMatC4, rgbMat, CV_RGBA2BGR); ++ cv::cvtColor(rgbMatC4, rgbMat, cv::COLOR_RGBA2BGR); + + #else + +- cv::cvtColor(rgbMatC4, rgbMat, CV_BGRA2BGR); ++ cv::cvtColor(rgbMatC4, rgbMat, cv::COLOR_BGRA2BGR); + + #endif + cv::flip(rgbMat, rgb, 1); +@@ -490,11 +489,11 @@ + cv::Mat rgbMat; // rtabmap uses 3 channels RGB + #ifdef LIBFREENECT2_WITH_TEGRAJPEG_SUPPORT + +- cv::cvtColor(rgbMatC4, rgbMat, CV_RGB2BGR); ++ cv::cvtColor(rgbMatC4, rgbMat, cv::COLOR_RGB2BGR); + + #else + +- cv::cvtColor(rgbMatC4, rgbMat, CV_BGRA2BGR); ++ cv::cvtColor(rgbMatC4, rgbMat, cv::COLOR_BGRA2BGR); + + #endif + cv::flip(rgbMat, rgb, 1); +@@ -607,11 +606,11 @@ + // rtabmap uses 3 channels RGB + #ifdef LIBFREENECT2_WITH_TEGRAJPEG_SUPPORT + +- cv::cvtColor(rgbMatBGRA, rgb, CV_RGBA2BGR); ++ cv::cvtColor(rgbMatBGRA, rgb, cv::COLOR_RGBA2BGR); + + #else + +- cv::cvtColor(rgbMatBGRA, rgb, CV_BGRA2BGR); ++ cv::cvtColor(rgbMatBGRA, rgb, cv::COLOR_BGRA2BGR); + + #endif + cv::flip(rgb, rgb, 1); +@@ -629,11 +628,11 @@ + // rtabmap uses 3 channels RGB + #ifdef LIBFREENECT2_WITH_TEGRAJPEG_SUPPORT + +- cv::cvtColor(rgbMatBGRA, rgb, CV_RGBA2BGR); ++ cv::cvtColor(rgbMatBGRA, rgb, cv::COLOR_RGBA2BGR); + + #else + +- cv::cvtColor(rgbMatBGRA, rgb, CV_BGRA2BGR); ++ cv::cvtColor(rgbMatBGRA, rgb, cv::COLOR_BGRA2BGR); + + #endif + cv::flip(rgb, rgb, 1); +diff --git a/corelib/src/camera/CameraImages.cpp b/corelib/src/camera/CameraImages.cpp +--- a/corelib/src/camera/CameraImages.cpp ++++ b/corelib/src/camera/CameraImages.cpp +@@ -34,7 +34,7 @@ + #include + #include + #include +-#include ++#include + #include + + namespace rtabmap +@@ -914,7 +914,7 @@ + { + UWARN("Conversion from 4 channels to 3 channels (file=%s)", imageFilePath.c_str()); + cv::Mat out; +- cv::cvtColor(img, out, CV_BGRA2BGR); ++ cv::cvtColor(img, out, cv::COLOR_BGRA2BGR); + img = out; + } + else if(!img.empty() && _bayerMode >= 0 && _bayerMode <=3) +@@ -922,7 +922,7 @@ + cv::Mat debayeredImg; + try + { +- cv::cvtColor(img, debayeredImg, CV_BayerBG2BGR + _bayerMode); ++ cv::cvtColor(img, debayeredImg, cv::COLOR_BayerBG2BGR + _bayerMode); + img = debayeredImg; + } + catch(const cv::Exception & e) +diff --git a/corelib/src/camera/CameraK4A.cpp b/corelib/src/camera/CameraK4A.cpp +--- a/corelib/src/camera/CameraK4A.cpp ++++ b/corelib/src/camera/CameraK4A.cpp +@@ -29,7 +29,6 @@ + #include + #include + #include +-#include + + #ifdef RTABMAP_K4A + #include +@@ -508,7 +507,7 @@ + CV_8UC4, + (void*)k4a_image_get_buffer(rgb_image_)); + +- cv::cvtColor(bgra, bgrCV, CV_BGRA2BGR); ++ cv::cvtColor(bgra, bgrCV, cv::COLOR_BGRA2BGR); + } + bgrCV = model_.rectifyImage(bgrCV); + +diff --git a/corelib/src/camera/CameraK4W2.cpp b/corelib/src/camera/CameraK4W2.cpp +--- a/corelib/src/camera/CameraK4W2.cpp ++++ b/corelib/src/camera/CameraK4W2.cpp +@@ -28,7 +28,6 @@ + #include + #include + #include +-#include + + #ifdef RTABMAP_K4W2 + #include +@@ -486,11 +485,11 @@ + { + cv::Mat tmp; + cv::resize(cv::Mat(nColorHeight, nColorWidth, CV_8UC4, pColorBuffer), tmp, cv::Size(), 0.5, 0.5, cv::INTER_AREA); +- cv::cvtColor(tmp, imageColor, CV_BGRA2BGR); ++ cv::cvtColor(tmp, imageColor, cv::COLOR_BGRA2BGR); + } + else + { +- cv::cvtColor(cv::Mat(nColorHeight, nColorWidth, CV_8UC4, pColorBuffer), imageColor, CV_BGRA2BGR); ++ cv::cvtColor(cv::Mat(nColorHeight, nColorWidth, CV_8UC4, pColorBuffer), imageColor, cv::COLOR_BGRA2BGR); + } + // loop over output pixels + for (int depthIndex = 0; depthIndex < (nDepthWidth*nDepthHeight); ++depthIndex) +diff --git a/corelib/src/camera/CameraOpenNI2.cpp b/corelib/src/camera/CameraOpenNI2.cpp +--- a/corelib/src/camera/CameraOpenNI2.cpp ++++ b/corelib/src/camera/CameraOpenNI2.cpp +@@ -29,7 +29,6 @@ + #include + #include + #include +-#include + + #ifdef RTABMAP_OPENNI2 + #include +@@ -514,7 +513,7 @@ + cv::Mat tmp(h, w, CV_8UC3, (void *)colorFrame.getData()); + if(_type==kTypeColorDepth) + { +- cv::cvtColor(tmp, rgb, CV_RGB2BGR); ++ cv::cvtColor(tmp, rgb, cv::COLOR_RGB2BGR); + } + else // IR + { +diff --git a/corelib/src/camera/CameraOpenNICV.cpp b/corelib/src/camera/CameraOpenNICV.cpp +--- a/corelib/src/camera/CameraOpenNICV.cpp ++++ b/corelib/src/camera/CameraOpenNICV.cpp +@@ -26,9 +26,7 @@ + + #include + #include +-#if CV_MAJOR_VERSION > 3 +-#include +-#endif ++#include + + namespace rtabmap + { +@@ -59,30 +57,34 @@ + } + + ULOGGER_DEBUG("Camera::init()"); +- _capture.open( _asus?CV_CAP_OPENNI_ASUS:CV_CAP_OPENNI ); ++#if CV_MAJOR_VERSION < 5 ++ _capture.open( _asus?cv::CAP_OPENNI_ASUS:cv::CAP_OPENNI ); ++#else ++ _capture.open( _asus?cv::CAP_OPENNI2_ASUS:cv::CAP_OPENNI2 ); ++#endif + if(_capture.isOpened()) + { +- _capture.set( CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, CV_CAP_OPENNI_VGA_30HZ ); +- _depthFocal = _capture.get( CV_CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH ); ++ _capture.set( cv::CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, cv::CAP_OPENNI_VGA_30HZ ); ++ _depthFocal = _capture.get( cv::CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH ); + // Print some avalible device settings. + UINFO("Depth generator output mode:"); +- UINFO("FRAME_WIDTH %f", _capture.get( CV_CAP_PROP_FRAME_WIDTH )); +- UINFO("FRAME_HEIGHT %f", _capture.get( CV_CAP_PROP_FRAME_HEIGHT )); +- UINFO("FRAME_MAX_DEPTH %f mm", _capture.get( CV_CAP_PROP_OPENNI_FRAME_MAX_DEPTH )); +- UINFO("BASELINE %f mm", _capture.get( CV_CAP_PROP_OPENNI_BASELINE )); +- UINFO("FPS %f", _capture.get( CV_CAP_PROP_FPS )); +- UINFO("Focal %f", _capture.get( CV_CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH )); +- UINFO("REGISTRATION %f", _capture.get( CV_CAP_PROP_OPENNI_REGISTRATION )); +- if(_capture.get( CV_CAP_PROP_OPENNI_REGISTRATION ) == 0.0) ++ UINFO("FRAME_WIDTH %f", _capture.get( cv::CAP_PROP_FRAME_WIDTH )); ++ UINFO("FRAME_HEIGHT %f", _capture.get( cv::CAP_PROP_FRAME_HEIGHT )); ++ UINFO("FRAME_MAX_DEPTH %f mm", _capture.get( cv::CAP_PROP_OPENNI_FRAME_MAX_DEPTH )); ++ UINFO("BASELINE %f mm", _capture.get( cv::CAP_PROP_OPENNI_BASELINE )); ++ UINFO("FPS %f", _capture.get( cv::CAP_PROP_FPS )); ++ UINFO("Focal %f", _capture.get( cv::CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH )); ++ UINFO("REGISTRATION %f", _capture.get( cv::CAP_PROP_OPENNI_REGISTRATION )); ++ if(_capture.get( cv::CAP_PROP_OPENNI_REGISTRATION ) == 0.0) + { + UERROR("Depth registration is not activated on this device!"); + } +- if( _capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR_PRESENT ) ) ++ if( _capture.get( cv::CAP_OPENNI_IMAGE_GENERATOR_PRESENT ) ) + { + UINFO("Image generator output mode:"); +- UINFO("FRAME_WIDTH %f", _capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR+CV_CAP_PROP_FRAME_WIDTH )); +- UINFO("FRAME_HEIGHT %f", _capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR+CV_CAP_PROP_FRAME_HEIGHT )); +- UINFO("FPS %f", _capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR+CV_CAP_PROP_FPS )); ++ UINFO("FRAME_WIDTH %f", _capture.get( cv::CAP_OPENNI_IMAGE_GENERATOR+cv::CAP_PROP_FRAME_WIDTH )); ++ UINFO("FRAME_HEIGHT %f", _capture.get( cv::CAP_OPENNI_IMAGE_GENERATOR+cv::CAP_PROP_FRAME_HEIGHT )); ++ UINFO("FPS %f", _capture.get( cv::CAP_OPENNI_IMAGE_GENERATOR+cv::CAP_PROP_FPS )); + } + else + { +@@ -112,8 +114,8 @@ + { + _capture.grab(); + cv::Mat depth, rgb; +- _capture.retrieve(depth, CV_CAP_OPENNI_DEPTH_MAP ); +- _capture.retrieve(rgb, CV_CAP_OPENNI_BGR_IMAGE ); ++ _capture.retrieve(depth, cv::CAP_OPENNI_DEPTH_MAP ); ++ _capture.retrieve(rgb, cv::CAP_OPENNI_BGR_IMAGE ); + + depth = depth.clone(); + rgb = rgb.clone(); +diff --git a/corelib/src/camera/CameraOpenni.cpp b/corelib/src/camera/CameraOpenni.cpp +--- a/corelib/src/camera/CameraOpenni.cpp ++++ b/corelib/src/camera/CameraOpenni.cpp +@@ -28,7 +28,6 @@ + #include + #include + #include +-#include + + #ifdef RTABMAP_OPENNI + #include +@@ -94,7 +93,7 @@ + + cv::Mat rgbFrame(rgb->getHeight(), rgb->getWidth(), CV_8UC3); + rgb->fillRGB(rgb->getWidth(), rgb->getHeight(), rgbFrame.data); +- cv::cvtColor(rgbFrame, rgb_, CV_RGB2BGR); ++ cv::cvtColor(rgbFrame, rgb_, cv::COLOR_RGB2BGR); + + depth_ = cv::Mat(rgb->getHeight(), rgb->getWidth(), CV_16UC1); + depth->fillDepthImageRaw(rgb->getWidth(), rgb->getHeight(), (unsigned short*)depth_.data); +diff --git a/corelib/src/camera/CameraRealSense.cpp b/corelib/src/camera/CameraRealSense.cpp +--- a/corelib/src/camera/CameraRealSense.cpp ++++ b/corelib/src/camera/CameraRealSense.cpp +@@ -29,7 +29,6 @@ + #include + #include + #include +-#include + + #ifdef RTABMAP_REALSENSE + #include +@@ -938,7 +937,7 @@ + } + else + { +- cv::cvtColor(rgb, bgr, CV_RGB2BGR); ++ cv::cvtColor(rgb, bgr, cv::COLOR_RGB2BGR); + } + + bool rectified = false; +diff --git a/corelib/src/camera/CameraRealSense2.cpp b/corelib/src/camera/CameraRealSense2.cpp +--- a/corelib/src/camera/CameraRealSense2.cpp ++++ b/corelib/src/camera/CameraRealSense2.cpp +@@ -30,7 +30,6 @@ + #include + #include + #include +-#include + + #ifdef RTABMAP_REALSENSE2 + #include +diff --git a/corelib/src/camera/CameraStereoDC1394.cpp b/corelib/src/camera/CameraStereoDC1394.cpp +--- a/corelib/src/camera/CameraStereoDC1394.cpp ++++ b/corelib/src/camera/CameraStereoDC1394.cpp +@@ -28,7 +28,6 @@ + #include + #include + #include +-#include + + #ifdef RTABMAP_DC1394 + #include +@@ -295,8 +294,8 @@ + + //DC1394_COLOR_CODING_RAW16: + //DC1394_COLOR_FILTER_BGGR +- cv::cvtColor(cv::Mat(frame->size[1], frame->size[0], CV_8UC1, capture_buffer), left, CV_BayerRG2BGR); +- cv::cvtColor(cv::Mat(frame->size[1], frame->size[0], CV_8UC1, capture_buffer+image.total()), right, CV_BayerRG2GRAY); ++ cv::cvtColor(cv::Mat(frame->size[1], frame->size[0], CV_8UC1, capture_buffer), left, cv::COLOR_BayerRG2BGR); ++ cv::cvtColor(cv::Mat(frame->size[1], frame->size[0], CV_8UC1, capture_buffer+image.total()), right, cv::COLOR_BayerRG2GRAY); + + dc1394_capture_enqueue(camera_, frame); + +diff --git a/corelib/src/camera/CameraStereoImages.cpp b/corelib/src/camera/CameraStereoImages.cpp +--- a/corelib/src/camera/CameraStereoImages.cpp ++++ b/corelib/src/camera/CameraStereoImages.cpp +@@ -27,7 +27,6 @@ + + #include + #include +-#include + + namespace rtabmap + { +@@ -184,7 +183,7 @@ + if(rightImage.type() != CV_8UC1 && rightGrayScale_) + { + cv::Mat tmp; +- cv::cvtColor(rightImage, tmp, CV_BGR2GRAY); ++ cv::cvtColor(rightImage, tmp, cv::COLOR_BGR2GRAY); + rightImage = tmp; + } + if(this->isImagesRectified() && stereoModel_.isValidForRectification()) +diff --git a/corelib/src/camera/CameraStereoTara.cpp b/corelib/src/camera/CameraStereoTara.cpp +--- a/corelib/src/camera/CameraStereoTara.cpp ++++ b/corelib/src/camera/CameraStereoTara.cpp +@@ -34,9 +34,7 @@ + #include + #include + #include +-#if CV_MAJOR_VERSION > 3 +-#include +-#endif ++#include + + namespace rtabmap + { +@@ -81,18 +79,18 @@ + + capture_.open(usbDevice_); + +- capture_.set(CV_CAP_PROP_FOURCC, CV_FOURCC('Y', '1', '6', ' ')); +- capture_.set(CV_CAP_PROP_FPS, 60); +- capture_.set(CV_CAP_PROP_FRAME_WIDTH, 752); +- capture_.set(CV_CAP_PROP_FRAME_HEIGHT, 480); +- capture_.set(CV_CAP_PROP_CONVERT_RGB,false); ++ capture_.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('Y', '1', '6', ' ')); ++ capture_.set(cv::CAP_PROP_FPS, 60); ++ capture_.set(cv::CAP_PROP_FRAME_WIDTH, 752); ++ capture_.set(cv::CAP_PROP_FRAME_HEIGHT, 480); ++ capture_.set(cv::CAP_PROP_CONVERT_RGB,false); + + ULOGGER_DEBUG("CameraStereoTara: Usb device initialization on device %d", usbDevice_); + + + if (cameraName_.empty()) + { +- unsigned int guid = (unsigned int)capture_.get(CV_CAP_PROP_GUID); ++ unsigned int guid = (unsigned int)capture_.get(cv::CAP_PROP_GUID); + if (guid != 0 && guid != 0xffffffff) + { + cameraName_ = uFormat("%08x", guid); +diff --git a/corelib/src/camera/CameraStereoVideo.cpp b/corelib/src/camera/CameraStereoVideo.cpp +--- a/corelib/src/camera/CameraStereoVideo.cpp ++++ b/corelib/src/camera/CameraStereoVideo.cpp +@@ -28,13 +28,7 @@ + #include + #include + #include +-#include +-#if CV_MAJOR_VERSION > 3 +-#include +-#if CV_MAJOR_VERSION > 4 +-#include +-#endif +-#endif ++#include + + namespace rtabmap + { +@@ -172,7 +166,7 @@ + + if (cameraName_.empty()) + { +- unsigned int guid = (unsigned int)capture_.get(CV_CAP_PROP_GUID); ++ unsigned int guid = (unsigned int)capture_.get(cv::CAP_PROP_GUID); + if (guid != 0 && guid != 0xffffffff) + { + cameraName_ = uFormat("%08x", guid); +@@ -214,17 +208,17 @@ + if(capture_.isOpened()) + { + bool resolutionSet = false; +- resolutionSet = capture_.set(CV_CAP_PROP_FRAME_WIDTH, stereoModel_.left().imageWidth()*(capture2_.isOpened()?1:2)); +- resolutionSet = resolutionSet && capture_.set(CV_CAP_PROP_FRAME_HEIGHT, stereoModel_.left().imageHeight()); ++ resolutionSet = capture_.set(cv::CAP_PROP_FRAME_WIDTH, stereoModel_.left().imageWidth()*(capture2_.isOpened()?1:2)); ++ resolutionSet = resolutionSet && capture_.set(cv::CAP_PROP_FRAME_HEIGHT, stereoModel_.left().imageHeight()); + if(capture2_.isOpened()) + { +- resolutionSet = resolutionSet && capture2_.set(CV_CAP_PROP_FRAME_WIDTH, stereoModel_.right().imageWidth()); +- resolutionSet = resolutionSet && capture2_.set(CV_CAP_PROP_FRAME_HEIGHT, stereoModel_.right().imageHeight()); ++ resolutionSet = resolutionSet && capture2_.set(cv::CAP_PROP_FRAME_WIDTH, stereoModel_.right().imageWidth()); ++ resolutionSet = resolutionSet && capture2_.set(cv::CAP_PROP_FRAME_HEIGHT, stereoModel_.right().imageHeight()); + } + + // Check if the resolution was set successfully +- int actualWidth = int(capture_.get(CV_CAP_PROP_FRAME_WIDTH)); +- int actualHeight = int(capture_.get(CV_CAP_PROP_FRAME_HEIGHT)); ++ int actualWidth = int(capture_.get(cv::CAP_PROP_FRAME_WIDTH)); ++ int actualHeight = int(capture_.get(cv::CAP_PROP_FRAME_HEIGHT)); + if(!resolutionSet || + actualWidth != stereoModel_.left().imageWidth()*(capture2_.isOpened()?1:2) || + actualHeight != stereoModel_.left().imageHeight()) +@@ -244,17 +238,17 @@ + if(capture_.isOpened()) + { + bool resolutionSet = false; +- resolutionSet = capture_.set(CV_CAP_PROP_FRAME_WIDTH, _width*(capture2_.isOpened()?1:2)); +- resolutionSet = resolutionSet && capture_.set(CV_CAP_PROP_FRAME_HEIGHT, _height); ++ resolutionSet = capture_.set(cv::CAP_PROP_FRAME_WIDTH, _width*(capture2_.isOpened()?1:2)); ++ resolutionSet = resolutionSet && capture_.set(cv::CAP_PROP_FRAME_HEIGHT, _height); + if(capture2_.isOpened()) + { +- resolutionSet = resolutionSet && capture2_.set(CV_CAP_PROP_FRAME_WIDTH, _width); +- resolutionSet = resolutionSet && capture2_.set(CV_CAP_PROP_FRAME_HEIGHT, _height); ++ resolutionSet = resolutionSet && capture2_.set(cv::CAP_PROP_FRAME_WIDTH, _width); ++ resolutionSet = resolutionSet && capture2_.set(cv::CAP_PROP_FRAME_HEIGHT, _height); + } + + // Check if the resolution was set successfully +- int actualWidth = int(capture_.get(CV_CAP_PROP_FRAME_WIDTH)); +- int actualHeight = int(capture_.get(CV_CAP_PROP_FRAME_HEIGHT)); ++ int actualWidth = int(capture_.get(cv::CAP_PROP_FRAME_WIDTH)); ++ int actualHeight = int(capture_.get(cv::CAP_PROP_FRAME_HEIGHT)); + if(!resolutionSet || + actualWidth != _width*(capture2_.isOpened()?1:2) || + actualHeight != _height) +@@ -273,10 +267,10 @@ + if (this->getFrameRate() > 0) + { + bool fpsSupported = false; +- fpsSupported = capture_.set(CV_CAP_PROP_FPS, this->getFrameRate()); ++ fpsSupported = capture_.set(cv::CAP_PROP_FPS, this->getFrameRate()); + if (capture2_.isOpened()) + { +- fpsSupported = fpsSupported && capture2_.set(CV_CAP_PROP_FPS, this->getFrameRate()); ++ fpsSupported = fpsSupported && capture2_.set(cv::CAP_PROP_FPS, this->getFrameRate()); + } + if(fpsSupported) + { +@@ -310,14 +304,14 @@ + std::string fourccUpperCase = uToUpperCase(_fourcc); + int fourcc = cv::VideoWriter::fourcc(fourccUpperCase.at(0), fourccUpperCase.at(1), fourccUpperCase.at(2), fourccUpperCase.at(3)); + bool fourccSupported = false; +- fourccSupported = capture_.set(CV_CAP_PROP_FOURCC, fourcc); ++ fourccSupported = capture_.set(cv::CAP_PROP_FOURCC, fourcc); + if (capture2_.isOpened()) + { +- fourccSupported = fourccSupported && capture2_.set(CV_CAP_PROP_FOURCC, fourcc); ++ fourccSupported = fourccSupported && capture2_.set(cv::CAP_PROP_FOURCC, fourcc); + } + + // Check if the FOURCC was set successfully +- int actualFourcc = int(capture_.get(CV_CAP_PROP_FOURCC)); ++ int actualFourcc = int(capture_.get(cv::CAP_PROP_FOURCC)); + + if(!fourccSupported || actualFourcc != fourcc) + { +@@ -386,7 +380,7 @@ + if(rightImage.type() != CV_8UC1 && rightGrayScale_) + { + cv::Mat tmp; +- cv::cvtColor(rightImage, tmp, CV_BGR2GRAY); ++ cv::cvtColor(rightImage, tmp, cv::COLOR_BGR2GRAY); + rightImage = tmp; + rightCvt = true; + } +diff --git a/corelib/src/camera/CameraStereoZedOC.cpp b/corelib/src/camera/CameraStereoZedOC.cpp +--- a/corelib/src/camera/CameraStereoZedOC.cpp ++++ b/corelib/src/camera/CameraStereoZedOC.cpp +@@ -38,6 +38,10 @@ + #include + #include "SimpleIni.h" + ++#if CV_MAJOR_VERSION >= 5 ++#include ++#endif ++ + /////////////////////////////////////////////////////////////////////////// + // + // Copyright (c) 2018, STEREOLABS. +diff --git a/corelib/src/camera/CameraVideo.cpp b/corelib/src/camera/CameraVideo.cpp +--- a/corelib/src/camera/CameraVideo.cpp ++++ b/corelib/src/camera/CameraVideo.cpp +@@ -28,12 +28,7 @@ + #include + #include + #include +-#if CV_MAJOR_VERSION > 3 +-#include +-#if CV_MAJOR_VERSION > 4 +-#include +-#endif +-#endif ++#include + + namespace rtabmap + { +@@ -105,7 +100,7 @@ + { + if (_guid.empty()) + { +- unsigned int guid = (unsigned int)_capture.get(CV_CAP_PROP_GUID); ++ unsigned int guid = (unsigned int)_capture.get(cv::CAP_PROP_GUID); + if (guid != 0 && guid != 0xffffffff) + { + _guid = uFormat("%08x", guid); +@@ -143,12 +138,12 @@ + } + + bool resolutionSet = false; +- resolutionSet = _capture.set(CV_CAP_PROP_FRAME_WIDTH, _model.imageWidth()); +- resolutionSet = resolutionSet && _capture.set(CV_CAP_PROP_FRAME_HEIGHT, _model.imageHeight()); ++ resolutionSet = _capture.set(cv::CAP_PROP_FRAME_WIDTH, _model.imageWidth()); ++ resolutionSet = resolutionSet && _capture.set(cv::CAP_PROP_FRAME_HEIGHT, _model.imageHeight()); + + // Check if the resolution was set successfully +- int actualWidth = int(_capture.get(CV_CAP_PROP_FRAME_WIDTH)); +- int actualHeight = int(_capture.get(CV_CAP_PROP_FRAME_HEIGHT)); ++ int actualWidth = int(_capture.get(cv::CAP_PROP_FRAME_WIDTH)); ++ int actualHeight = int(_capture.get(cv::CAP_PROP_FRAME_HEIGHT)); + if(!resolutionSet || + actualWidth != _model.imageWidth() || + actualHeight != _model.imageHeight()) +@@ -165,12 +160,12 @@ + else if(_width > 0 && _height > 0) + { + int resolutionSet = false; +- resolutionSet = _capture.set(CV_CAP_PROP_FRAME_WIDTH, _width); +- resolutionSet = resolutionSet && _capture.set(CV_CAP_PROP_FRAME_HEIGHT, _height); ++ resolutionSet = _capture.set(cv::CAP_PROP_FRAME_WIDTH, _width); ++ resolutionSet = resolutionSet && _capture.set(cv::CAP_PROP_FRAME_HEIGHT, _height); + + // Check if the resolution was set successfully +- int actualWidth = int(_capture.get(CV_CAP_PROP_FRAME_WIDTH)); +- int actualHeight = int(_capture.get(CV_CAP_PROP_FRAME_HEIGHT)); ++ int actualWidth = int(_capture.get(cv::CAP_PROP_FRAME_WIDTH)); ++ int actualHeight = int(_capture.get(cv::CAP_PROP_FRAME_HEIGHT)); + if(!resolutionSet || actualWidth != _width || actualHeight != _height) + { + UWARN("Desired resolution (%dx%d) cannot be set to camera driver, " +@@ -182,7 +177,7 @@ + } + + // Set FPS +- if (this->getFrameRate() > 0 && _capture.set(CV_CAP_PROP_FPS, this->getFrameRate())) ++ if (this->getFrameRate() > 0 && _capture.set(cv::CAP_PROP_FPS, this->getFrameRate())) + { + // Check if the FPS was set successfully + double actualFPS = _capture.get(cv::CAP_PROP_FPS); +@@ -213,10 +208,10 @@ + std::string fourccUpperCase = uToUpperCase(_fourcc); + int fourcc = cv::VideoWriter::fourcc(fourccUpperCase.at(0), fourccUpperCase.at(1), fourccUpperCase.at(2), fourccUpperCase.at(3)); + +- bool fourccSupported = _capture.set(CV_CAP_PROP_FOURCC, fourcc); ++ bool fourccSupported = _capture.set(cv::CAP_PROP_FOURCC, fourcc); + + // Check if the FOURCC was set successfully +- int actualFourcc = int(_capture.get(CV_CAP_PROP_FOURCC)); ++ int actualFourcc = int(_capture.get(cv::CAP_PROP_FOURCC)); + + if(!fourccSupported || actualFourcc != fourcc) + { +diff --git a/corelib/src/odometry/OdometryDVO.cpp b/corelib/src/odometry/OdometryDVO.cpp +--- a/corelib/src/odometry/OdometryDVO.cpp ++++ b/corelib/src/odometry/OdometryDVO.cpp +@@ -31,7 +31,6 @@ + #include "rtabmap/utilite/ULogger.h" + #include "rtabmap/utilite/UTimer.h" + #include "rtabmap/utilite/UStl.h" +-#include + + #ifdef RTABMAP_DVO + #include +@@ -124,7 +123,7 @@ + { + if(data.imageRaw().type() == CV_8UC3) + { +- cv::cvtColor(data.imageRaw(), grey, CV_BGR2GRAY); ++ cv::cvtColor(data.imageRaw(), grey, cv::COLOR_BGR2GRAY); + } + else + { +diff --git a/corelib/src/odometry/OdometryF2M.cpp b/corelib/src/odometry/OdometryF2M.cpp +--- a/corelib/src/odometry/OdometryF2M.cpp ++++ b/corelib/src/odometry/OdometryF2M.cpp +@@ -42,7 +42,11 @@ + #include "rtabmap/utilite/UTimer.h" + #include "rtabmap/utilite/UMath.h" + #include "rtabmap/utilite/UConversion.h" ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + #include + #include + +diff --git a/corelib/src/odometry/OdometryFovis.cpp b/corelib/src/odometry/OdometryFovis.cpp +--- a/corelib/src/odometry/OdometryFovis.cpp ++++ b/corelib/src/odometry/OdometryFovis.cpp +@@ -31,7 +31,6 @@ + #include "rtabmap/utilite/ULogger.h" + #include "rtabmap/utilite/UTimer.h" + #include "rtabmap/utilite/UStl.h" +-#include + + #ifdef RTABMAP_FOVIS + #include +@@ -137,7 +136,7 @@ + cv::Mat gray; + if(data.imageRaw().type() == CV_8UC3) + { +- cv::cvtColor(data.imageRaw(), gray, CV_BGR2GRAY); ++ cv::cvtColor(data.imageRaw(), gray, cv::COLOR_BGR2GRAY); + } + else if(data.imageRaw().type() == CV_8UC1) + { +@@ -302,7 +301,7 @@ + } + if(data.rightRaw().type() == CV_8UC3) + { +- cv::cvtColor(data.rightRaw(), right, CV_BGR2GRAY); ++ cv::cvtColor(data.rightRaw(), right, cv::COLOR_BGR2GRAY); + } + else if(data.rightRaw().type() == CV_8UC1) + { +diff --git a/corelib/src/odometry/OdometryMSCKF.cpp b/corelib/src/odometry/OdometryMSCKF.cpp +--- a/corelib/src/odometry/OdometryMSCKF.cpp ++++ b/corelib/src/odometry/OdometryMSCKF.cpp +@@ -26,13 +26,15 @@ + */ + + #include "rtabmap/core/odometry/OdometryMSCKF.h" ++#if CV_MAJOR_VERSION >= 5 ++#include ++#endif + #include "rtabmap/core/OdometryInfo.h" + #include "rtabmap/core/util3d_transforms.h" + #include "rtabmap/utilite/ULogger.h" + #include "rtabmap/utilite/UTimer.h" + #include "rtabmap/utilite/UStl.h" + #include "rtabmap/utilite/UThread.h" +-#include + + #ifdef RTABMAP_MSCKF_VIO + #include +@@ -867,7 +869,7 @@ + + if(data.imageRaw().type() == CV_8UC3) + { +- cv::cvtColor(data.imageRaw(), cam0.image, CV_BGR2GRAY); ++ cv::cvtColor(data.imageRaw(), cam0.image, cv::COLOR_BGR2GRAY); + } + else + { +@@ -875,7 +877,7 @@ + } + if(data.rightRaw().type() == CV_8UC3) + { +- cv::cvtColor(data.rightRaw(), cam1.image, CV_BGR2GRAY); ++ cv::cvtColor(data.rightRaw(), cam1.image, cv::COLOR_BGR2GRAY); + } + else + { +diff --git a/corelib/src/odometry/OdometryMono.cpp b/corelib/src/odometry/OdometryMono.cpp +--- a/corelib/src/odometry/OdometryMono.cpp ++++ b/corelib/src/odometry/OdometryMono.cpp +@@ -43,8 +43,15 @@ + #include "rtabmap/utilite/UStl.h" + #include "rtabmap/utilite/UMath.h" + #include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + #include ++#if CV_MAJOR_VERSION >= 5 ++#include ++#endif + #include + + namespace rtabmap { +diff --git a/corelib/src/odometry/OdometryORBSLAM2.cpp b/corelib/src/odometry/OdometryORBSLAM2.cpp +--- a/corelib/src/odometry/OdometryORBSLAM2.cpp ++++ b/corelib/src/odometry/OdometryORBSLAM2.cpp +@@ -33,7 +33,6 @@ + #include "rtabmap/utilite/UStl.h" + #include "rtabmap/utilite/UDirectory.h" + #include +-#include + #include + + #if defined(RTABMAP_ORB_SLAM) and RTABMAP_ORB_SLAM == 2 +@@ -426,7 +425,7 @@ + } + else + { +- cvtColor(mImGray,mImGray,CV_BGR2GRAY); ++ cvtColor(mImGray,mImGray,cv::COLOR_BGR2GRAY); + } + } + else if(mImGray.channels()==4) +@@ -437,7 +436,7 @@ + } + else + { +- cvtColor(mImGray,mImGray,CV_BGRA2GRAY); ++ cvtColor(mImGray,mImGray,cv::COLOR_BGRA2GRAY); + } + } + if(imGrayRight.channels()==3) +@@ -448,7 +447,7 @@ + } + else + { +- cvtColor(imGrayRight,imGrayRight,CV_BGR2GRAY); ++ cvtColor(imGrayRight,imGrayRight,cv::COLOR_BGR2GRAY); + } + } + else if(imGrayRight.channels()==4) +@@ -459,7 +458,7 @@ + } + else + { +- cvtColor(imGrayRight,imGrayRight,CV_BGRA2GRAY); ++ cvtColor(imGrayRight,imGrayRight,cv::COLOR_BGRA2GRAY); + } + } + +@@ -480,14 +479,14 @@ + if(mbRGB) + cvtColor(mImGray,mImGray,CV_RGB2GRAY); + else +- cvtColor(mImGray,mImGray,CV_BGR2GRAY); ++ cvtColor(mImGray,mImGray,cv::COLOR_BGR2GRAY); + } + else if(mImGray.channels()==4) + { + if(mbRGB) + cvtColor(mImGray,mImGray,CV_RGBA2GRAY); + else +- cvtColor(mImGray,mImGray,CV_BGRA2GRAY); ++ cvtColor(mImGray,mImGray,cv::COLOR_BGRA2GRAY); + } + + UASSERT(imDepth.type()==CV_32F); +diff --git a/corelib/src/odometry/OdometryORBSLAM3.cpp b/corelib/src/odometry/OdometryORBSLAM3.cpp +--- a/corelib/src/odometry/OdometryORBSLAM3.cpp ++++ b/corelib/src/odometry/OdometryORBSLAM3.cpp +@@ -33,7 +33,6 @@ + #include "rtabmap/utilite/UStl.h" + #include "rtabmap/utilite/UDirectory.h" + #include +-#include + #include + + #if defined(RTABMAP_ORB_SLAM) and RTABMAP_ORB_SLAM == 3 +@@ -450,12 +449,12 @@ + cv::Mat leftMono = data.imageRaw(); + if(data.imageRaw().channels() == 3) { + leftMono = cv::Mat(); +- cv::cvtColor(data.imageRaw(), leftMono, CV_BGR2GRAY); ++ cv::cvtColor(data.imageRaw(), leftMono, cv::COLOR_BGR2GRAY); + } + cv::Mat rightMono = data.rightRaw(); + if(data.rightRaw().channels() == 3) { + rightMono = cv::Mat(); +- cv::cvtColor(data.imageRaw(), rightMono, CV_BGR2GRAY); ++ cv::cvtColor(data.imageRaw(), rightMono, cv::COLOR_BGR2GRAY); + } + Tcw = orbslam_->TrackStereo(leftMono, rightMono, data.stamp(), orbslamImus_); + orbslamImus_.clear(); +diff --git a/corelib/src/odometry/OdometryOkvis.cpp b/corelib/src/odometry/OdometryOkvis.cpp +--- a/corelib/src/odometry/OdometryOkvis.cpp ++++ b/corelib/src/odometry/OdometryOkvis.cpp +@@ -34,7 +34,6 @@ + #include "rtabmap/utilite/UThread.h" + #include "rtabmap/utilite/UFile.h" + #include "rtabmap/utilite/UDirectory.h" +-#include + + #ifdef RTABMAP_OKVIS + #include +@@ -427,7 +426,7 @@ + cv::Mat gray; + if(images[i].type() == CV_8UC3) + { +- cv::cvtColor(images[i], gray, CV_BGR2GRAY); ++ cv::cvtColor(images[i], gray, cv::COLOR_BGR2GRAY); + } + else if(images[i].type() == CV_8UC1) + { +diff --git a/corelib/src/odometry/OdometryOpenVINS.cpp b/corelib/src/odometry/OdometryOpenVINS.cpp +--- a/corelib/src/odometry/OdometryOpenVINS.cpp ++++ b/corelib/src/odometry/OdometryOpenVINS.cpp +@@ -32,7 +32,6 @@ + #include "rtabmap/utilite/ULogger.h" + #include "rtabmap/utilite/UTimer.h" + #include +-#include + + #ifdef RTABMAP_OPENVINS + #include "core/VioManager.h" +@@ -340,7 +339,7 @@ + + cv::Mat image; + if(data.imageRaw().type() == CV_8UC3) +- cv::cvtColor(data.imageRaw(), image, CV_BGR2GRAY); ++ cv::cvtColor(data.imageRaw(), image, cv::COLOR_BGR2GRAY); + else if(data.imageRaw().type() == CV_8UC1) + image = data.imageRaw().clone(); + else +@@ -371,7 +370,7 @@ + if(!data.rightRaw().empty()) + { + if(data.rightRaw().type() == CV_8UC3) +- cv::cvtColor(data.rightRaw(), image, CV_BGR2GRAY); ++ cv::cvtColor(data.rightRaw(), image, cv::COLOR_BGR2GRAY); + else if(data.rightRaw().type() == CV_8UC1) + image = data.rightRaw().clone(); + else +diff --git a/corelib/src/odometry/OdometryVINS.cpp b/corelib/src/odometry/OdometryVINS.cpp +--- a/corelib/src/odometry/OdometryVINS.cpp ++++ b/corelib/src/odometry/OdometryVINS.cpp +@@ -26,6 +26,9 @@ + */ + + #include "rtabmap/core/odometry/OdometryVINS.h" ++#if CV_MAJOR_VERSION >= 5 ++#include ++#endif + #include "rtabmap/core/OdometryInfo.h" + #include "rtabmap/core/util3d_transforms.h" + #include "rtabmap/utilite/ULogger.h" +@@ -33,7 +36,6 @@ + #include "rtabmap/utilite/UStl.h" + #include "rtabmap/utilite/UThread.h" + #include "rtabmap/utilite/UDirectory.h" +-#include + + #ifdef RTABMAP_VINS + #include +@@ -388,7 +390,7 @@ + cv::Mat right; + if(data.imageRaw().type() == CV_8UC3) + { +- cv::cvtColor(data.imageRaw(), left, CV_BGR2GRAY); ++ cv::cvtColor(data.imageRaw(), left, cv::COLOR_BGR2GRAY); + } + else if(data.imageRaw().type() == CV_8UC1) + { +@@ -400,7 +402,7 @@ + } + if(data.rightRaw().type() == CV_8UC3) + { +- cv::cvtColor(data.rightRaw(), right, CV_BGR2GRAY); ++ cv::cvtColor(data.rightRaw(), right, cv::COLOR_BGR2GRAY); + } + else if(data.rightRaw().type() == CV_8UC1) + { +diff --git a/corelib/src/odometry/OdometryViso2.cpp b/corelib/src/odometry/OdometryViso2.cpp +--- a/corelib/src/odometry/OdometryViso2.cpp ++++ b/corelib/src/odometry/OdometryViso2.cpp +@@ -31,7 +31,6 @@ + #include "rtabmap/utilite/ULogger.h" + #include "rtabmap/utilite/UTimer.h" + #include "rtabmap/utilite/UStl.h" +-#include + + #ifdef RTABMAP_VISO2 + #include +@@ -131,7 +130,7 @@ + cv::Mat leftGray; + if(data.imageRaw().type() == CV_8UC3) + { +- cv::cvtColor(data.imageRaw(), leftGray, CV_BGR2GRAY); ++ cv::cvtColor(data.imageRaw(), leftGray, cv::COLOR_BGR2GRAY); + } + else if(data.imageRaw().type() == CV_8UC1) + { +@@ -144,7 +143,7 @@ + cv::Mat rightGray; + if(data.rightRaw().type() == CV_8UC3) + { +- cv::cvtColor(data.rightRaw(), rightGray, CV_BGR2GRAY); ++ cv::cvtColor(data.rightRaw(), rightGray, cv::COLOR_BGR2GRAY); + } + else if(data.rightRaw().type() == CV_8UC1) + { +diff --git a/corelib/src/opencv/ORBextractor.cc b/corelib/src/opencv/ORBextractor.cc +--- a/corelib/src/opencv/ORBextractor.cc ++++ b/corelib/src/opencv/ORBextractor.cc +@@ -64,7 +64,11 @@ + + #include + #include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + #include + #include + #include +diff --git a/corelib/src/opencv/ORBextractor.h b/corelib/src/opencv/ORBextractor.h +--- a/corelib/src/opencv/ORBextractor.h ++++ b/corelib/src/opencv/ORBextractor.h +@@ -31,8 +31,6 @@ + + #include + #include +-#include +- + + namespace rtabmap + { +diff --git a/corelib/src/opencv/Orb.cpp b/corelib/src/opencv/Orb.cpp +--- a/corelib/src/opencv/Orb.cpp ++++ b/corelib/src/opencv/Orb.cpp +@@ -40,7 +40,6 @@ + + #include "opencv2/features2d/features2d.hpp" + #include "opencv2/imgproc/imgproc.hpp" +-#include "opencv2/imgproc/imgproc_c.h" + #include + #include + +@@ -252,7 +251,7 @@ + } + } + else +- CV_Error( CV_StsBadSize, "Wrong WTA_K. It can be only 2, 3 or 4." ); ++ CV_Error( cv::Error::StsBadSize, "Wrong WTA_K. It can be only 2, 3 or 4." ); + + #undef GET_VALUE + } +@@ -752,7 +751,7 @@ + + Mat image = _image.getMat(), mask = _mask.getMat(); + if( image.type() != CV_8UC1 ) +- cvtColor(_image, image, CV_BGR2GRAY); ++ cvtColor(_image, image, cv::COLOR_BGR2GRAY); + + int levelsNum = this->nlevels; + +diff --git a/corelib/src/opencv/five-point.cpp b/corelib/src/opencv/five-point.cpp +--- a/corelib/src/opencv/five-point.cpp ++++ b/corelib/src/opencv/five-point.cpp +@@ -30,6 +30,9 @@ + */ + + #include "solvepnp.h" ++#if CV_MAJOR_VERSION >= 5 ++#include ++#endif + + using namespace cv; + +diff --git a/corelib/src/opencv/five-point.h b/corelib/src/opencv/five-point.h +--- a/corelib/src/opencv/five-point.h ++++ b/corelib/src/opencv/five-point.h +@@ -8,6 +8,10 @@ + #ifndef CORELIB_SRC_OPENCV_FIVE_POINT_H_ + #define CORELIB_SRC_OPENCV_FIVE_POINT_H_ + ++#if CV_MAJOR_VERSION > 4 ++#include ++#endif ++ + namespace cv3 + { + +diff --git a/corelib/src/opencv/solvepnp.cpp b/corelib/src/opencv/solvepnp.cpp +--- a/corelib/src/opencv/solvepnp.cpp ++++ b/corelib/src/opencv/solvepnp.cpp +@@ -53,7 +53,7 @@ + + public: + +- PnPRansacCallback(Mat _cameraMatrix=Mat(3,3,CV_64F), Mat _distCoeffs=Mat(4,1,CV_64F), int _flags=CV_ITERATIVE, ++ PnPRansacCallback(Mat _cameraMatrix=Mat(3,3,CV_64F), Mat _distCoeffs=Mat(4,1,CV_64F), int _flags=cv::SOLVEPNP_ITERATIVE, + bool _useExtrinsicGuess=false, Mat _rvec=Mat(), Mat _tvec=Mat() ) + : cameraMatrix(_cameraMatrix), distCoeffs(_distCoeffs), flags(_flags), useExtrinsicGuess(_useExtrinsicGuess), + rvec(_rvec), tvec(_tvec) {} +@@ -142,12 +142,12 @@ + Mat cameraMatrix = _cameraMatrix.getMat(), distCoeffs = _distCoeffs.getMat(); + + int model_points = 6; +- int ransac_kernel_method = CV_EPNP; ++ int ransac_kernel_method = cv::SOLVEPNP_EPNP; + + if( npoints == 4 ) + { + model_points = 4; +- ransac_kernel_method = CV_P3P; ++ ransac_kernel_method = cv::SOLVEPNP_P3P; + } + + Ptr cb; // pointer to callback +@@ -178,7 +178,7 @@ + opoints_inliers.resize(npoints1); + ipoints_inliers.resize(npoints1); + result = solvePnP(opoints_inliers, ipoints_inliers, cameraMatrix, +- distCoeffs, rvec, tvec, useExtrinsicGuess, flags == CV_P3P ? CV_EPNP : flags) ? 1 : -1; ++ distCoeffs, rvec, tvec, useExtrinsicGuess, flags == cv::SOLVEPNP_P3P ? cv::SOLVEPNP_EPNP : flags) ? 1 : -1; + } + + if( result <= 0 || _local_model.rows <= 0) +@@ -213,7 +213,7 @@ + int RANSACUpdateNumIters( double p, double ep, int modelPoints, int maxIters ) + { + if( modelPoints <= 0 ) +- CV_Error( 0, "the number of model points should be positive" ); ++ CV_Error( cv::Error::Code::StsBadArg, "the number of model points should be positive" ); + + p = MAX(p, 0.); + p = MIN(p, 1.); +diff --git a/corelib/src/opencv/solvepnp.h b/corelib/src/opencv/solvepnp.h +--- a/corelib/src/opencv/solvepnp.h ++++ b/corelib/src/opencv/solvepnp.h +@@ -45,9 +45,10 @@ + #define RTABMAP_CORELIB_SRC_OPENCV_SOLVEPNP_H_ + + #include ++#if CV_MAJOR_VERSION >= 5 ++#include ++#else + #include +-#if CV_MAJOR_VERSION >= 3 +-#include + #endif + + namespace cv3 { +@@ -95,7 +96,7 @@ + cv::OutputArray rvec, cv::OutputArray tvec, + bool useExtrinsicGuess = false, int iterationsCount = 100, + float reprojectionError = 8.0, double confidence = 0.99, +- cv::OutputArray inliers = cv::noArray(), int flags = CV_ITERATIVE ); ++ cv::OutputArray inliers = cv::noArray(), int flags = cv::SOLVEPNP_ITERATIVE ); + + int RANSACUpdateNumIters( double p, double ep, int modelPoints, int maxIters ); + +diff --git a/corelib/src/optimizer/OptimizerCeres.cpp b/corelib/src/optimizer/OptimizerCeres.cpp +--- a/corelib/src/optimizer/OptimizerCeres.cpp ++++ b/corelib/src/optimizer/OptimizerCeres.cpp +@@ -26,6 +26,12 @@ + */ + #include "rtabmap/core/Graph.h" + ++#if CV_MAJOR_VERSION < 5 ++#include ++#else ++#include ++#endif ++ + #include + #include + #include +diff --git a/corelib/src/stereo/StereoBM.cpp b/corelib/src/stereo/StereoBM.cpp +--- a/corelib/src/stereo/StereoBM.cpp ++++ b/corelib/src/stereo/StereoBM.cpp +@@ -27,9 +27,13 @@ + + #include + #include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#include ++#endif + #include +-#include + + namespace rtabmap { + +@@ -88,7 +92,7 @@ + cv::Mat leftMono; + if(leftImage.channels() == 3) + { +- cv::cvtColor(leftImage, leftMono, CV_BGR2GRAY); ++ cv::cvtColor(leftImage, leftMono, cv::COLOR_BGR2GRAY); + } + else + { +@@ -98,7 +102,7 @@ + cv::Mat rightMono; + if(rightImage.channels() == 3) + { +- cv::cvtColor(rightImage, rightMono, CV_BGR2GRAY); ++ cv::cvtColor(rightImage, rightMono, cv::COLOR_BGR2GRAY); + } + else + { +diff --git a/corelib/src/stereo/StereoSGBM.cpp b/corelib/src/stereo/StereoSGBM.cpp +--- a/corelib/src/stereo/StereoSGBM.cpp ++++ b/corelib/src/stereo/StereoSGBM.cpp +@@ -27,9 +27,13 @@ + + #include + #include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#include ++#endif + #include +-#include + + namespace rtabmap { + +@@ -77,7 +81,7 @@ + cv::Mat leftMono; + if(leftImage.channels() == 3) + { +- cv::cvtColor(leftImage, leftMono, CV_BGR2GRAY); ++ cv::cvtColor(leftImage, leftMono, cv::COLOR_BGR2GRAY); + } + else + { +@@ -87,7 +91,7 @@ + cv::Mat rightMono; + if(rightImage.channels() == 3) + { +- cv::cvtColor(rightImage, rightMono, CV_BGR2GRAY); ++ cv::cvtColor(rightImage, rightMono, cv::COLOR_BGR2GRAY); + } + else + { +diff --git a/corelib/src/util2d.cpp b/corelib/src/util2d.cpp +--- a/corelib/src/util2d.cpp ++++ b/corelib/src/util2d.cpp +@@ -34,11 +34,9 @@ + #include + #include + #include +-#include + #include + #include + #include +-#include + #include + #include + +@@ -46,6 +44,12 @@ + #include + #endif + ++#if CV_MAJOR_VERSION < 5 ++#include ++#else ++#include ++#endif ++ + namespace rtabmap + { + +@@ -747,7 +751,7 @@ + cv::Mat leftMono; + if(leftImage.channels() == 3) + { +- cv::cvtColor(leftImage, leftMono, CV_BGR2GRAY); ++ cv::cvtColor(leftImage, leftMono, cv::COLOR_BGR2GRAY); + } + else + { +@@ -2042,8 +2046,8 @@ + //to calculate grayscale histogram + cv::Mat gray; + if (src.type() == CV_8UC1) gray = src; +- else if (src.type() == CV_8UC3) cvtColor(src, gray, CV_BGR2GRAY); +- else if (src.type() == CV_8UC4) cvtColor(src, gray, CV_BGRA2GRAY); ++ else if (src.type() == CV_8UC3) cvtColor(src, gray, cv::COLOR_BGR2GRAY); ++ else if (src.type() == CV_8UC4) cvtColor(src, gray, cv::COLOR_BGRA2GRAY); + if (clipLowHistPercent == 0 && clipHighHistPercent == 0) + { + // keep full available range +diff --git a/corelib/src/util3d.cpp b/corelib/src/util3d.cpp +--- a/corelib/src/util3d.cpp ++++ b/corelib/src/util3d.cpp +@@ -41,7 +41,6 @@ + #include + #include + #include +-#include + + namespace rtabmap + { +@@ -892,7 +891,7 @@ + cv::Mat leftMono; + if(leftColor.channels() == 3) + { +- cv::cvtColor(leftColor, leftMono, CV_BGR2GRAY); ++ cv::cvtColor(leftColor, leftMono, cv::COLOR_BGR2GRAY); + } + else + { +@@ -902,7 +901,7 @@ + cv::Mat rightMono; + if(rightColor.channels() == 3) + { +- cv::cvtColor(rightColor, rightMono, CV_BGR2GRAY); ++ cv::cvtColor(rightColor, rightMono, cv::COLOR_BGR2GRAY); + } + else + { +@@ -1038,7 +1037,7 @@ + cv::Mat leftMono; + if(sensorData.imageRaw().channels() == 3) + { +- cv::cvtColor(sensorData.imageRaw(), leftMono, CV_BGR2GRAY); ++ cv::cvtColor(sensorData.imageRaw(), leftMono, cv::COLOR_BGR2GRAY); + } + else + { +@@ -1048,7 +1047,7 @@ + cv::Mat rightMono; + if(sensorData.rightRaw().channels() == 3) + { +- cv::cvtColor(sensorData.rightRaw(), rightMono, CV_BGR2GRAY); ++ cv::cvtColor(sensorData.rightRaw(), rightMono, cv::COLOR_BGR2GRAY); + } + else + { +diff --git a/corelib/src/util3d_correspondences.cpp b/corelib/src/util3d_correspondences.cpp +--- a/corelib/src/util3d_correspondences.cpp ++++ b/corelib/src/util3d_correspondences.cpp +@@ -30,7 +30,11 @@ + + #include + #include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + #include + #include + +diff --git a/corelib/src/util3d_motion_estimation.cpp b/corelib/src/util3d_motion_estimation.cpp +--- a/corelib/src/util3d_motion_estimation.cpp ++++ b/corelib/src/util3d_motion_estimation.cpp +@@ -26,6 +26,9 @@ + */ + + #include "rtabmap/core/util3d_motion_estimation.h" ++#if CV_MAJOR_VERSION >= 5 ++#include ++#endif + + #include "rtabmap/utilite/UStl.h" + #include "rtabmap/utilite/UMath.h" +diff --git a/corelib/src/util3d_surface.cpp b/corelib/src/util3d_surface.cpp +--- a/corelib/src/util3d_surface.cpp ++++ b/corelib/src/util3d_surface.cpp +@@ -39,8 +39,6 @@ + #include "rtabmap/utilite/UConversion.h" + #include "rtabmap/utilite/UMath.h" + #include "rtabmap/utilite/UTimer.h" +-#include +-#include + #include + #include + #include +@@ -1745,7 +1743,7 @@ + if(resizedImage.type() == CV_8UC1) + { + cv::Mat resizedImageColor; +- cv::cvtColor(resizedImage, resizedImageColor, CV_GRAY2BGR); ++ cv::cvtColor(resizedImage, resizedImageColor, cv::COLOR_GRAY2BGR); + resizedImage = resizedImageColor; + } + UASSERT(resizedImage.type() == globalTextures.type()); +@@ -2609,7 +2607,7 @@ + if(imageRoi.channels() == 1) + { + cv::Mat imageRoiColor; +- cv::cvtColor(imageRoi, imageRoiColor, CV_GRAY2BGR); ++ cv::cvtColor(imageRoi, imageRoiColor, cv::COLOR_GRAY2BGR); + imageRoi = imageRoiColor; + } + +@@ -3218,7 +3216,7 @@ + } + if(oi>1) + { +- cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), CV_PCA_DATA_AS_ROW); ++ cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), cv::PCA::DATA_AS_ROW); + + if(pcaEigenVectors) + { +@@ -3279,7 +3277,7 @@ + } + if(oi>1) + { +- cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), CV_PCA_DATA_AS_ROW); ++ cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), cv::PCA::DATA_AS_ROW); + + if(pcaEigenVectors) + { +@@ -3335,7 +3333,7 @@ + } + if(oi>1) + { +- cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), CV_PCA_DATA_AS_ROW); ++ cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), cv::PCA::DATA_AS_ROW); + + if(pcaEigenVectors) + { +@@ -3391,7 +3389,7 @@ + } + if(oi>1) + { +- cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), CV_PCA_DATA_AS_ROW); ++ cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), cv::PCA::DATA_AS_ROW); + + if(pcaEigenVectors) + { +@@ -3447,7 +3445,7 @@ + } + if(oi>1) + { +- cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), CV_PCA_DATA_AS_ROW); ++ cv::PCA pca_analysis(cv::Mat(data_normals, cv::Range(0, oi*2)), cv::Mat(), cv::PCA::DATA_AS_ROW); + + if(pcaEigenVectors) + { diff --git a/patch/ros-rolling-rtabmap.2rest.patch b/patch/ros-rolling-rtabmap.2rest.patch new file mode 100644 index 000000000..6a4ef691d --- /dev/null +++ b/patch/ros-rolling-rtabmap.2rest.patch @@ -0,0 +1,677 @@ +diff --git a/tools/Camera/main.cpp b/tools/Camera/main.cpp +index e337030..3bf320c 100644 +--- a/tools/Camera/main.cpp ++++ b/tools/Camera/main.cpp +@@ -32,7 +32,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/UDirectory.h" + #include "rtabmap/utilite/UConversion.h" + #include +-#include + #include + + void showUsage() +@@ -178,7 +177,7 @@ int main(int argc, char * argv[]) + + cv::Mat rgb; + rgb = camera->takeImage().imageRaw(); +- cv::namedWindow("Video", CV_WINDOW_AUTOSIZE); // create window ++ cv::namedWindow("Video", cv::WINDOW_AUTOSIZE); // create window + while(!rgb.empty()) + { + cv::imshow("Video", rgb); // show frame +diff --git a/tools/StereoEval/main.cpp b/tools/StereoEval/main.cpp +index bd3313f..9c15e34 100644 +--- a/tools/StereoEval/main.cpp ++++ b/tools/StereoEval/main.cpp +@@ -37,7 +37,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include + #include + #include + +@@ -222,7 +221,7 @@ int main(int argc, char * argv[]) + cv::Mat leftMono; + if(left.channels() == 3) + { +- cv::cvtColor(left, leftMono, CV_BGR2GRAY); ++ cv::cvtColor(left, leftMono, cv::COLOR_BGR2GRAY); + } + else + { +@@ -231,7 +230,7 @@ int main(int argc, char * argv[]) + cv::Mat rightMono; + if(right.channels() == 3) + { +- cv::cvtColor(right, rightMono, CV_BGR2GRAY); ++ cv::cvtColor(right, rightMono, cv::COLOR_BGR2GRAY); + } + else + { +@@ -266,7 +265,7 @@ int main(int argc, char * argv[]) + cv::cornerSubPix(leftMono, leftCorners, + cv::Size( subPixWinSize, subPixWinSize ), + cv::Size( -1, -1 ), +- cv::TermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, subPixIterations, subPixEps ) ); ++ cv::TermCriteria( cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS, subPixIterations, subPixEps ) ); + UDEBUG("cv::cornerSubPix() end"); + } + +diff --git a/app/android/jni/point_cloud_drawable.cpp b/app/android/jni/point_cloud_drawable.cpp +index ca23e31..cf38ec1 100644 +--- a/app/android/jni/point_cloud_drawable.cpp ++++ b/app/android/jni/point_cloud_drawable.cpp +@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/ULogger.h" + #include "rtabmap/utilite/UTimer.h" + #include "rtabmap/utilite/UConversion.h" +-#include ++#include + #include "util.h" + #include "pcl/common/transforms.h" + +diff --git a/corelib/include/rtabmap/core/DBDriverSqlite3.h b/corelib/include/rtabmap/core/DBDriverSqlite3.h +index 56e410c..fbcd49b 100644 +--- a/corelib/include/rtabmap/core/DBDriverSqlite3.h ++++ b/corelib/include/rtabmap/core/DBDriverSqlite3.h +@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines + #include "rtabmap/core/DBDriver.h" + #if CV_MAJOR_VERSION < 5 +-#include ++#include + #else + #include + #endif +diff --git a/corelib/include/rtabmap/core/EpipolarGeometry.h b/corelib/include/rtabmap/core/EpipolarGeometry.h +index ea490d3..cdf7c43 100644 +--- a/corelib/include/rtabmap/core/EpipolarGeometry.h ++++ b/corelib/include/rtabmap/core/EpipolarGeometry.h +@@ -32,7 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/UStl.h" + #include + #if CV_MAJOR_VERSION < 5 +-#include ++#include + #else + #include + #if CV_MAJOR_VERSION >= 5 +diff --git a/corelib/include/rtabmap/core/Features2d.h b/corelib/include/rtabmap/core/Features2d.h +index e110773..9b064c1 100644 +--- a/corelib/include/rtabmap/core/Features2d.h ++++ b/corelib/include/rtabmap/core/Features2d.h +@@ -30,10 +30,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines + +-#include ++#include + #include + #if CV_MAJOR_VERSION < 5 +-#include ++#include + #else + #include + #endif +diff --git a/corelib/include/rtabmap/core/Memory.h b/corelib/include/rtabmap/core/Memory.h +index fd8f75a..2fe3640 100644 +--- a/corelib/include/rtabmap/core/Memory.h ++++ b/corelib/include/rtabmap/core/Memory.h +@@ -42,7 +42,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/UStl.h" + #include + #if CV_MAJOR_VERSION < 5 +-#include ++#include + #else + #include + #endif +diff --git a/corelib/include/rtabmap/core/OdometryInfo.h b/corelib/include/rtabmap/core/OdometryInfo.h +index 4f96a59..a3ec914 100644 +--- a/corelib/include/rtabmap/core/OdometryInfo.h ++++ b/corelib/include/rtabmap/core/OdometryInfo.h +@@ -35,7 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/core/CameraModel.h" + #include "rtabmap/core/LaserScan.h" + #if CV_MAJOR_VERSION < 5 +-#include ++#include + #else + #include + #endif +diff --git a/corelib/include/rtabmap/core/SensorCapture.h b/corelib/include/rtabmap/core/SensorCapture.h +index 20ee01b..4188392 100644 +--- a/corelib/include/rtabmap/core/SensorCapture.h ++++ b/corelib/include/rtabmap/core/SensorCapture.h +@@ -28,7 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines + +-#include ++#include + #include + #include "rtabmap/core/SensorData.h" + #include +diff --git a/corelib/include/rtabmap/core/SensorData.h b/corelib/include/rtabmap/core/SensorData.h +index 0db8590..6688988 100644 +--- a/corelib/include/rtabmap/core/SensorData.h ++++ b/corelib/include/rtabmap/core/SensorData.h +@@ -35,7 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #if CV_MAJOR_VERSION < 5 +-#include ++#include + #else + #include + #endif +diff --git a/corelib/include/rtabmap/core/Signature.h b/corelib/include/rtabmap/core/Signature.h +index 11f6f9c..49390f9 100644 +--- a/corelib/include/rtabmap/core/Signature.h ++++ b/corelib/include/rtabmap/core/Signature.h +@@ -32,11 +32,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #if CV_MAJOR_VERSION < 5 +-#include ++#include + #else + #include + #endif +-#include ++#include + #include + #include + #include +diff --git a/corelib/include/rtabmap/core/Statistics.h b/corelib/include/rtabmap/core/Statistics.h +index 8c4cd0a..68491a8 100644 +--- a/corelib/include/rtabmap/core/Statistics.h ++++ b/corelib/include/rtabmap/core/Statistics.h +@@ -32,11 +32,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include + #if CV_MAJOR_VERSION < 5 +-#include ++#include + #else + #include + #endif +-#include ++#include + #include + #include + #include +diff --git a/corelib/include/rtabmap/core/VWDictionary.h b/corelib/include/rtabmap/core/VWDictionary.h +index bfd5394..db7d4db 100644 +--- a/corelib/include/rtabmap/core/VWDictionary.h ++++ b/corelib/include/rtabmap/core/VWDictionary.h +@@ -29,10 +29,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines + +-#include ++#include + #include + #if CV_MAJOR_VERSION < 5 +-#include ++#include + #else + #include + #endif +diff --git a/corelib/include/rtabmap/core/camera/CameraVideo.h b/corelib/include/rtabmap/core/camera/CameraVideo.h +index bdc90a1..ca65116 100644 +--- a/corelib/include/rtabmap/core/camera/CameraVideo.h ++++ b/corelib/include/rtabmap/core/camera/CameraVideo.h +@@ -27,7 +27,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #pragma once + +-#include ++#include + #include "rtabmap/core/Camera.h" + + namespace rtabmap +diff --git a/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h b/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h +index 9d07bd6..3361aab 100644 +--- a/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h ++++ b/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h +@@ -43,7 +43,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include + #if CV_MAJOR_VERSION >= 3 +-#include + + #if CV_MAJOR_VERSION >= 4 + #include +diff --git a/corelib/include/rtabmap/core/util3d_correspondences.h b/corelib/include/rtabmap/core/util3d_correspondences.h +index d53ece4..f50a98b 100644 +--- a/corelib/include/rtabmap/core/util3d_correspondences.h ++++ b/corelib/include/rtabmap/core/util3d_correspondences.h +@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #if CV_MAJOR_VERSION < 5 +-#include ++#include + #else + #include + #endif +diff --git a/corelib/src/CameraModel.cpp b/corelib/src/CameraModel.cpp +index bfcde63..bc37f40 100644 +--- a/corelib/src/CameraModel.cpp ++++ b/corelib/src/CameraModel.cpp +@@ -33,7 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include ++#include + #if CV_MAJOR_VERSION >= 5 + #include + #endif +diff --git a/corelib/src/SensorCapture.cpp b/corelib/src/SensorCapture.cpp +index 5932787..a86708d 100644 +--- a/corelib/src/SensorCapture.cpp ++++ b/corelib/src/SensorCapture.cpp +@@ -35,7 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + +-#include ++#include + + #include + #include +diff --git a/corelib/src/Signature.cpp b/corelib/src/Signature.cpp +index 32fca30..a7dc364 100644 +--- a/corelib/src/Signature.cpp ++++ b/corelib/src/Signature.cpp +@@ -29,7 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/core/EpipolarGeometry.h" + #include "rtabmap/core/Memory.h" + #include "rtabmap/core/Compression.h" +-#include ++#include + + #include + +diff --git a/corelib/src/StereoCameraModel.cpp b/corelib/src/StereoCameraModel.cpp +index 938508e..5b0e88b 100644 +--- a/corelib/src/StereoCameraModel.cpp ++++ b/corelib/src/StereoCameraModel.cpp +@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include ++#include + #if CV_MAJOR_VERSION >= 5 + #include + #endif +diff --git a/corelib/src/clams/discrete_depth_distortion_model_helpers.cpp b/corelib/src/clams/discrete_depth_distortion_model_helpers.cpp +index 06c348d..dfbdc02 100644 +--- a/corelib/src/clams/discrete_depth_distortion_model_helpers.cpp ++++ b/corelib/src/clams/discrete_depth_distortion_model_helpers.cpp +@@ -28,8 +28,8 @@ RTAB-Map integration: Mathieu Labbe + */ + + #include +-#include +-#include ++#include ++#include + #include + #include + +diff --git a/corelib/src/clams/frame_projector.cpp b/corelib/src/clams/frame_projector.cpp +index 3230fcf..2634911 100644 +--- a/corelib/src/clams/frame_projector.cpp ++++ b/corelib/src/clams/frame_projector.cpp +@@ -31,8 +31,8 @@ RTAB-Map integration: Mathieu Labbe + #include + #include + #include +-#include +-#include ++#include ++#include + #include + + using namespace std; +diff --git a/corelib/src/odometry/OdometryMono.cpp b/corelib/src/odometry/OdometryMono.cpp +index 6198c41..8cefcf7 100644 +--- a/corelib/src/odometry/OdometryMono.cpp ++++ b/corelib/src/odometry/OdometryMono.cpp +@@ -42,7 +42,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/UConversion.h" + #include "rtabmap/utilite/UStl.h" + #include "rtabmap/utilite/UMath.h" +-#include ++#include + #if CV_MAJOR_VERSION < 5 + #include + #else +diff --git a/corelib/src/opencv/ORBextractor.cc b/corelib/src/opencv/ORBextractor.cc +index 542e169..1197fb6 100644 +--- a/corelib/src/opencv/ORBextractor.cc ++++ b/corelib/src/opencv/ORBextractor.cc +@@ -63,13 +63,13 @@ + + + #include +-#include ++#include + #if CV_MAJOR_VERSION < 5 +-#include ++#include + #else + #include + #endif +-#include ++#include + #include + #include + #include +diff --git a/corelib/src/opencv/Orb.h b/corelib/src/opencv/Orb.h +index e05ad9d..464ad16 100644 +--- a/corelib/src/opencv/Orb.h ++++ b/corelib/src/opencv/Orb.h +@@ -46,7 +46,7 @@ + #ifndef CORELIB_SRC_OPENCV_ORB_H_ + #define CORELIB_SRC_OPENCV_ORB_H_ + +-#include ++#include + + namespace rtabmap { + +diff --git a/corelib/src/stereo/StereoBM.cpp b/corelib/src/stereo/StereoBM.cpp +index 57f6b7d..356266e 100644 +--- a/corelib/src/stereo/StereoBM.cpp ++++ b/corelib/src/stereo/StereoBM.cpp +@@ -33,7 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #endif +-#include ++#include + + namespace rtabmap { + +diff --git a/corelib/src/stereo/StereoSGBM.cpp b/corelib/src/stereo/StereoSGBM.cpp +index d8e651a..291ba7f 100644 +--- a/corelib/src/stereo/StereoSGBM.cpp ++++ b/corelib/src/stereo/StereoSGBM.cpp +@@ -33,7 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #endif +-#include ++#include + + namespace rtabmap { + +diff --git a/corelib/src/util2d.cpp b/corelib/src/util2d.cpp +index 55fdf67..3642e66 100644 +--- a/corelib/src/util2d.cpp ++++ b/corelib/src/util2d.cpp +@@ -34,14 +34,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include ++#include + #include +-#include ++#include + #include + #include + + #if CV_MAJOR_VERSION >= 3 +-#include ++#include + #endif + + #if CV_MAJOR_VERSION < 5 +diff --git a/corelib/src/util3d.cpp b/corelib/src/util3d.cpp +index c0aa08e..4619868 100644 +--- a/corelib/src/util3d.cpp ++++ b/corelib/src/util3d.cpp +@@ -40,7 +40,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include ++#include + + namespace rtabmap + { +diff --git a/guilib/include/rtabmap/gui/DatabaseViewer.h b/guilib/include/rtabmap/gui/DatabaseViewer.h +index a11b4c9..28fbc38 100644 +--- a/guilib/include/rtabmap/gui/DatabaseViewer.h ++++ b/guilib/include/rtabmap/gui/DatabaseViewer.h +@@ -36,7 +36,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/guilib/include/rtabmap/gui/ImageView.h b/guilib/include/rtabmap/gui/ImageView.h +index 8e8df85..eaf9134 100644 +--- a/guilib/include/rtabmap/gui/ImageView.h ++++ b/guilib/include/rtabmap/gui/ImageView.h +@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include ++#include + #include + #include "rtabmap/utilite/UCv2Qt.h" + #include +diff --git a/guilib/include/rtabmap/gui/KeypointItem.h b/guilib/include/rtabmap/gui/KeypointItem.h +index 7f4f9f6..11a896d 100644 +--- a/guilib/include/rtabmap/gui/KeypointItem.h ++++ b/guilib/include/rtabmap/gui/KeypointItem.h +@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include ++#include + + namespace rtabmap { + +diff --git a/guilib/src/CalibrationDialog.cpp b/guilib/src/CalibrationDialog.cpp +index dd4a052..9e40d6e 100644 +--- a/guilib/src/CalibrationDialog.cpp ++++ b/guilib/src/CalibrationDialog.cpp +@@ -29,13 +29,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "ui_calibrationDialog.h" + + #include +-#include +-#include ++#include + #include + #if CV_MAJOR_VERSION >= 3 +-#include + #endif +-#include ++#include + #if CV_MAJOR_VERSION > 2 or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) + #include + #endif +diff --git a/guilib/src/DatabaseViewer.cpp b/guilib/src/DatabaseViewer.cpp +index 586a386..3c328f3 100644 +--- a/guilib/src/DatabaseViewer.cpp ++++ b/guilib/src/DatabaseViewer.cpp +@@ -44,8 +44,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include +-#include ++#include + #include + #include + #include "rtabmap/utilite/UPlot.h" +diff --git a/tools/Camera/main.cpp b/tools/Camera/main.cpp +index 3bf320c..c856d7b 100644 +--- a/tools/Camera/main.cpp ++++ b/tools/Camera/main.cpp +@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/UFile.h" + #include "rtabmap/utilite/UDirectory.h" + #include "rtabmap/utilite/UConversion.h" +-#include ++#include + #include + + void showUsage() +diff --git a/tools/CameraRGBD/main.cpp b/tools/CameraRGBD/main.cpp +index 1d562d9..a6f29e4 100644 +--- a/tools/CameraRGBD/main.cpp ++++ b/tools/CameraRGBD/main.cpp +@@ -35,9 +35,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/UFile.h" + #include "rtabmap/utilite/UDirectory.h" + #include "rtabmap/utilite/UConversion.h" +-#include +-#include +-#include ++#include ++#include + #if CV_MAJOR_VERSION >= 3 + #include + #endif +diff --git a/tools/EpipolarGeometry/main.cpp b/tools/EpipolarGeometry/main.cpp +index aa309fa..d2cb81a 100644 +--- a/tools/EpipolarGeometry/main.cpp ++++ b/tools/EpipolarGeometry/main.cpp +@@ -27,8 +27,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include + #include +-#include +-#include ++#include ++#include + #include + #include + #include +diff --git a/tools/ImagesJoiner/main.cpp b/tools/ImagesJoiner/main.cpp +index ad4d3dd..3cf5264 100644 +--- a/tools/ImagesJoiner/main.cpp ++++ b/tools/ImagesJoiner/main.cpp +@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/UFile.h" + #include "rtabmap/utilite/UConversion.h" + #include +-#include ++#include + + void showUsage() + { +diff --git a/tools/VocabularyComparison/main.cpp b/tools/VocabularyComparison/main.cpp +index 410439b..cc65f02 100644 +--- a/tools/VocabularyComparison/main.cpp ++++ b/tools/VocabularyComparison/main.cpp +@@ -27,10 +27,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include + #include +-#include +-#include + #include +-#include ++#include + #include + #include + #include +diff --git a/guilib/src/DatabaseViewer.cpp b/guilib/src/DatabaseViewer.cpp +index 3c328f3..25bb8c4 100644 +--- a/guilib/src/DatabaseViewer.cpp ++++ b/guilib/src/DatabaseViewer.cpp +@@ -43,7 +43,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include + #include + #include + #include +diff --git a/guilib/src/CalibrationDialog.cpp b/guilib/src/CalibrationDialog.cpp +index 9e40d6e..0aebf10 100644 +--- a/guilib/src/CalibrationDialog.cpp ++++ b/guilib/src/CalibrationDialog.cpp +@@ -30,7 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include + #include +-#include ++#include + #if CV_MAJOR_VERSION >= 3 + #endif + #include +@@ -734,7 +734,7 @@ void CalibrationDialog::processImages(const cv::Mat & imageLeft, const cv::Mat & + cv::Size boardSize(ui_->spinBox_boardWidth->value(), ui_->spinBox_boardHeight->value()); + if(!viewGray.empty()) + { +- int flags = CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE; ++ int flags = cv::CALIB_CB_ADAPTIVE_THRESH | cv::CALIB_CB_NORMALIZE_IMAGE; + + if(!viewGray.empty()) + { +@@ -745,7 +745,7 @@ void CalibrationDialog::processImages(const cv::Mat & imageLeft, const cv::Mat & + if( scale == 1 ) + timg = viewGray; + else +- cv::resize(viewGray, timg, cv::Size(), scale, scale, CV_INTER_CUBIC); ++ cv::resize(viewGray, timg, cv::Size(), scale, scale, cv::INTER_CUBIC); + + #ifdef HAVE_CHARUCO + if(ui_->comboBox_board_type->currentIndex() >= 1 ) +@@ -830,7 +830,7 @@ void CalibrationDialog::processImages(const cv::Mat & imageLeft, const cv::Mat & + float ratio = ui_->comboBox_board_type->currentIndex() >= 1 ?6.0f:2.0f; + float radius = minSquareDistance==-1.0f?5.0f:(minSquareDistance/ratio); + cv::cornerSubPix( viewGray, pointBuf[id], cv::Size(radius, radius), cv::Size(-1,-1), +- cv::TermCriteria( CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1 )); ++ cv::TermCriteria( cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 30, 0.1 )); + + // Filter points that drifted to far (caused by reflection or bad subpixel gradient) + float threshold = ui_->doubleSpinBox_subpixel_error->value(); +@@ -1119,7 +1119,7 @@ void CalibrationDialog::processImages(const cv::Mat & imageLeft, const cv::Mat & + int step = imageSize_[id].height/16; + for(int i=step; i + #endif ++#include + + #define LOG_FILE_NAME "LogRtabmap.txt" diff --git a/patch/ros-rolling-rtabmap.3fix.patch b/patch/ros-rolling-rtabmap.3fix.patch new file mode 100644 index 000000000..d33c3458b --- /dev/null +++ b/patch/ros-rolling-rtabmap.3fix.patch @@ -0,0 +1,60 @@ +diff --git a/guilib/src/DatabaseViewer.cpp b/guilib/src/DatabaseViewer.cpp +--- a/guilib/src/DatabaseViewer.cpp ++++ b/guilib/src/DatabaseViewer.cpp +@@ -5880,7 +5880,7 @@ void DatabaseViewer::updateStereo(const SensorData * data) + cv::Mat leftMono; + if(data->imageRaw().channels() == 3) + { +- cv::cvtColor(data->imageRaw(), leftMono, CV_BGR2GRAY); ++ cv::cvtColor(data->imageRaw(), leftMono, cv::COLOR_BGR2GRAY); + } + else + { +@@ -5889,7 +5889,7 @@ void DatabaseViewer::updateStereo(const SensorData * data) + cv::Mat rightMono; + if(data->rightRaw().channels() == 3) + { +- cv::cvtColor(data->rightRaw(), rightMono, CV_BGR2GRAY); ++ cv::cvtColor(data->rightRaw(), rightMono, cv::COLOR_BGR2GRAY); + } + else + { +diff --git a/guilib/src/CalibrationDialog.cpp b/guilib/src/CalibrationDialog.cpp +--- a/guilib/src/CalibrationDialog.cpp ++++ b/guilib/src/CalibrationDialog.cpp +@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #if CV_MAJOR_VERSION >= 3 + #endif + #include +-#if CV_MAJOR_VERSION > 2 or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) ++#if (CV_MAJOR_VERSION > 2 and CV_MAJOR_VERSION < 5) or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) + #include + #endif + +@@ -1747,19 +1747,22 @@ StereoCameraModel CalibrationDialog::stereoCalibration(const CameraModel & left, + UINFO("Compute stereo rectification"); + + cv::Mat R1, R2, P1, P2, Q; ++#if CV_MAJOR_VERSION < 5 + stereoRectifyFisheye( + left.K_raw(), D_left, + right.K_raw(), D_right, + imageSize, R, Tvec, R1, R2, P1, P2, Q, + cv::CALIB_ZERO_DISPARITY, 0, imageSize); +- +- // Very hard to get good results with this one: +- /*double balance = 0.0, fov_scale = 1.0; ++#else ++ // Very hard to get good results with this one, but stereoRectifyFisheye() ++ // (above) relies on the removed OpenCV C API and is not available on OpenCV 5+: ++ double balance = 0.0, fov_scale = 1.0; + cv::fisheye::stereoRectify( + left.K_raw(), D_left, + right.K_raw(), D_right, + imageSize, R, Tvec, R1, R2, P1, P2, Q, +- cv::CALIB_ZERO_DISPARITY, imageSize, balance, fov_scale);*/ ++ cv::CALIB_ZERO_DISPARITY, imageSize, balance, fov_scale); ++#endif + + std::cout << "R1 = " << R1 << std::endl; + std::cout << "R2 = " << R2 << std::endl; diff --git a/patch/ros-rolling-rtabmap.4fix.patch b/patch/ros-rolling-rtabmap.4fix.patch new file mode 100644 index 000000000..17a7da045 --- /dev/null +++ b/patch/ros-rolling-rtabmap.4fix.patch @@ -0,0 +1,60 @@ +diff --git a/tools/EpipolarGeometry/main.cpp b/tools/EpipolarGeometry/main.cpp +--- a/tools/EpipolarGeometry/main.cpp ++++ b/tools/EpipolarGeometry/main.cpp +@@ -26,7 +26,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + #include +-#include + #include + #include + #include +diff --git a/tools/CameraRGBD/main.cpp b/tools/CameraRGBD/main.cpp +--- a/tools/CameraRGBD/main.cpp ++++ b/tools/CameraRGBD/main.cpp +@@ -37,9 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/UConversion.h" + #include + #include +-#if CV_MAJOR_VERSION >= 3 +-#include +-#endif ++#include + #include + #include + #include +@@ -398,7 +396,7 @@ int main(int argc, char * argv[]) + UASSERT(fourcc.size() == 4); + videoWriter.open( + stereoSavePath, +- CV_FOURCC(fourcc.at(0), fourcc.at(1), fourcc.at(2), fourcc.at(3)), ++ cv::VideoWriter::fourcc(fourcc.at(0), fourcc.at(1), fourcc.at(2), fourcc.at(3)), + rate, + targetSize, + data.imageRaw().channels() == 3); +@@ -479,7 +477,7 @@ int main(int argc, char * argv[]) + { + if(right.channels() == 3) + { +- cv::cvtColor(right, right, CV_BGR2GRAY); ++ cv::cvtColor(right, right, cv::COLOR_BGR2GRAY); + } + pcl::PointCloud::Ptr cloud = rtabmap::util3d::cloudFromStereoImages( + rgb, right, +@@ -506,14 +504,14 @@ int main(int argc, char * argv[]) + if(right.type() != left.type()) + { + cv::Mat tmp; +- cv::cvtColor(right, tmp, left.channels()==3?CV_GRAY2BGR:CV_BGR2GRAY); ++ cv::cvtColor(right, tmp, left.channels()==3?cv::COLOR_GRAY2BGR:cv::COLOR_BGR2GRAY); + right = tmp; + } + UASSERT(left.type() == right.type()); + + cv::Mat roiA(targetImage, cv::Rect( 0, 0, left.size().width, left.size().height )); + left.copyTo(roiA); +- cv::Mat roiB( targetImage, cvRect( left.size().width, 0, left.size().width, left.size().height ) ); ++ cv::Mat roiB( targetImage, cv::Rect( left.size().width, 0, left.size().width, left.size().height ) ); + right.copyTo(roiB); + + videoWriter.write(targetImage); diff --git a/patch/ros-rolling-rtabmap.5fix.patch b/patch/ros-rolling-rtabmap.5fix.patch new file mode 100644 index 000000000..0220d4d86 --- /dev/null +++ b/patch/ros-rolling-rtabmap.5fix.patch @@ -0,0 +1,12 @@ +diff --git a/tools/EpipolarGeometry/main.cpp b/tools/EpipolarGeometry/main.cpp +--- a/tools/EpipolarGeometry/main.cpp ++++ b/tools/EpipolarGeometry/main.cpp +@@ -35,7 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include ++#include + #include "rtabmap/core/Features2d.h" + #include "rtabmap/core/EpipolarGeometry.h" + #include "rtabmap/core/VWDictionary.h" diff --git a/vinca.yaml b/vinca.yaml index 6084b0476..3f59c1b09 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -29,23 +29,10 @@ packages_skip_by_deps: - rplidar_ros - rviz_visual_tools - # libpointmatcher not yet released for rolling; skip rtabmap until it is. - # (skip_by_deps on libpointmatcher alone doesn't actually block rtabmap -- - # same reachability gap as the sick_scan_xd case -- so it's also excluded - # directly below.) + # libpointmatcher not yet released for rolling; rtabmap builds fine without + # it (WITH_POINTMATCHER just disables the optional dependent feature). - libpointmatcher - # rtabmap itself is a direct seed below (packages_select_by_deps), so this - # skip_by_deps entry alone wouldn't actually block it -- see the seed-list - # removal instead. Its corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h - # uses the legacy OpenCV C API (CvMat, cvMat(), cvCreateMat(), cvMatMul(), - # ...) via #include , which OpenCV 5 removed - # entirely (no compat header, and the CMake COMPONENTS name changed from - # calib3d to calib). Porting that file to the modern C++ Mat API is a real - # rewrite of calibration math, not a small patch -- skip until someone does - # that properly upstream or here. - - rtabmap - - if: not linux then: - pendulum_control @@ -179,6 +166,7 @@ packages_select_by_deps: - rosidl_buffer_backend - rosidl_buffer_backend_registry - rosidl_buffer_py + - rtabmap - rviz_visual_tools - sbg_driver - simulation From 3c29603a98520e9056845aebdc21c5f32a1521eb Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 18:24:23 +1000 Subject: [PATCH 044/180] fix: libmavconn Windows import-library export for downstream mavros The mavconn SHARED library has no __declspec(dllexport)-annotated symbols, so MSVC produced the .dll but no import .lib, causing downstream ros2-mavros's find_package(libmavconn) to fail at CMake configure time ("Package 'libmavconn' exports the library 'mavconn' which couldn't be found"). Same CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS fix already used for several other packages in this repo (pal_statistics, backward_ros, filters, etc). Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-libmavconn.win.patch | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 patch/ros-rolling-libmavconn.win.patch diff --git a/patch/ros-rolling-libmavconn.win.patch b/patch/ros-rolling-libmavconn.win.patch new file mode 100644 index 000000000..52fa8a383 --- /dev/null +++ b/patch/ros-rolling-libmavconn.win.patch @@ -0,0 +1,13 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index d349d81f..ac383dae 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -1,6 +1,8 @@ + cmake_minimum_required(VERSION 3.10) + project(libmavconn) + ++set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) ++ + # Default to C11 + if(NOT CMAKE_C_STANDARD) + set(CMAKE_C_STANDARD 11) From 5ba53880d454744fe0fa59677d9cd7fd2bc2666c Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 18:31:14 +1000 Subject: [PATCH 045/180] fix: bump libmavconn build_number to bust stale win-64 CI cache The win-64 CI job cached a libmavconn build made before the CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS win.patch was added, and skip_existing only compares build_number (not patch content), so it kept reusing that stale, unfixed artifact -- same pattern already hit by mavlink/cv_bridge/libg2o/pcl_conversions/distro_mutex above. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 8f5082715..07c5244d1 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -262,6 +262,16 @@ libg2o: # import .lib, and solver_csparse fails to link against it. Same fix as the # many other packages in this repo hitting this class of Windows issue. additional_cmake_args: "-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON" +libmavconn: + # Same win-64 dllexport pattern as libg2o's csparse_extension above: the + # mavconn SHARED library exports no dllexport-annotated symbols, so MSVC + # built the .dll but no import .lib, breaking downstream mavros's + # find_package(libmavconn). Fixed via a new .win.patch + # (CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON), but a prior CI run already cached + # a successful win-64 build made before that patch existed -- skip_existing + # only compares build_number, not patch content, so it kept reusing that + # stale build. Bump to force a fresh one. + build_number: 26 mavlink: # A prior CI run already cached a successful win-64 build made before the # msgmap.hpp endian.h/win32 fix was added to the patch -- skip_existing From 606250214aa307afb9fd71ff3f7ac6639cf4a197 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 18:42:53 +1000 Subject: [PATCH 046/180] fix: mavros/mavros_extras -Wcomment flag rejected by MSVC on win-64 Same issue as libmavconn (same mavros-release.git monorepo, same boilerplate CMakeLists.txt template): -Wcomment is a GCC/Clang-only flag, set unconditionally after (not inside) the CMAKE_COMPILER_IS_GNUCXX/Clang guard, so MSVC's cl.exe rejects it outright ("invalid numeric argument '/Wcomment'"). Move it inside the guard, as already done for libmavconn. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mavros-extras.patch | 10 ++++++++++ patch/ros-rolling-mavros.patch | 14 ++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 patch/ros-rolling-mavros.patch diff --git a/patch/ros-rolling-mavros-extras.patch b/patch/ros-rolling-mavros-extras.patch index ddf7492c2..7adb10e15 100644 --- a/patch/ros-rolling-mavros-extras.patch +++ b/patch/ros-rolling-mavros-extras.patch @@ -2,6 +2,16 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt index 8832292..dbee63e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt +@@ -10,8 +10,8 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + # we dont use add_compile_options with pedantic in message packages + # because the Python C extensions dont comply with it + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") ++ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wcomment") + endif() +-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wcomment") + + # Allow GNU extensions (-std=gnu++20) + set(CMAKE_C_EXTENSIONS ON) @@ -168,6 +168,7 @@ target_link_libraries(mavros_extras_plugins PUBLIC tf2_ros::static_transform_broadcaster_node tf2_ros::tf2_ros diff --git a/patch/ros-rolling-mavros.patch b/patch/ros-rolling-mavros.patch new file mode 100644 index 000000000..c4d5dc9de --- /dev/null +++ b/patch/ros-rolling-mavros.patch @@ -0,0 +1,14 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 8e69fa09..c6b3041a 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -10,8 +10,8 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + # we dont use add_compile_options with pedantic in message packages + # because the Python C extensions dont comply with it + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") ++ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wcomment") + endif() +-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wcomment") + + # Allow GNU extensions (-std=gnu++20) + set(CMAKE_C_EXTENSIONS ON) From 43346225f6407ad793b21e81192f06677656da7d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 18:57:11 +1000 Subject: [PATCH 047/180] fix: undef Windows PASSTHROUGH macro before mavros's timesync_mode enum MSVC error pattern (enum body syntax errors cascading from a numeric "'constant'" exactly at the PASSTHROUGH enumerator, then every downstream to_string(timesync_mode) overload misparsed as a "redefinition" of a data variable) matches a macro substituting PASSTHROUGH with a numeric value before the enum is even parsed. Windows SDK headers define PASSTHROUGH for some print-related APIs. Undef it (guarded by _WIN32) right before the enum declaration. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mavros.patch | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/patch/ros-rolling-mavros.patch b/patch/ros-rolling-mavros.patch index c4d5dc9de..b6219be10 100644 --- a/patch/ros-rolling-mavros.patch +++ b/patch/ros-rolling-mavros.patch @@ -9,6 +9,26 @@ index 8e69fa09..c6b3041a 100644 + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wcomment") endif() -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wcomment") - + # Allow GNU extensions (-std=gnu++20) set(CMAKE_C_EXTENSIONS ON) +diff --git a/include/mavros/utils.hpp b/include/mavros/utils.hpp +index 1f3dc092..ca8d5149 100644 +--- a/include/mavros/utils.hpp ++++ b/include/mavros/utils.hpp +@@ -35,6 +35,15 @@ + #define EBADSLT 55 /* Invalid slot */ + #endif + ++// Windows SDK headers define PASSTHROUGH as a numeric macro (used by some ++// print-related APIs), which corrupts the timesync_mode enum below if not ++// undefined first. ++#ifdef _WIN32 ++#ifdef PASSTHROUGH ++#undef PASSTHROUGH ++#endif ++#endif ++ + namespace mavros + { + namespace utils From e893708f3cfd5feeaadd30540fcb437ee904a102 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 19:09:14 +1000 Subject: [PATCH 048/180] fix: mavros win-64 M_PI and fnmatch.h portability - M_PI/M_PI_2/DEG_TO_RAD undeclared in ftf_frame_conversions.cpp and ftf_quaternion_utils.cpp: MSVC's only defines M_PI when _USE_MATH_DEFINES is set before the first include. Add it globally via add_compile_definitions(_USE_MATH_DEFINES) guarded by if(MSVC), same pattern used elsewhere in this repo (slam_toolbox, angles, robot_localization, etc). - fnmatch.h doesn't exist on Windows (POSIX-only), needed by mavros_uas.cpp's plugin blacklist/whitelist pattern matching. Add a minimal case-insensitive glob-matching shim (supports '*'/'?') for _WIN32, matching the single fnmatch(pattern, name, FNM_CASEFOLD) call site's actual needs. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mavros.patch | 73 +++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/patch/ros-rolling-mavros.patch b/patch/ros-rolling-mavros.patch index b6219be10..0ce146530 100644 --- a/patch/ros-rolling-mavros.patch +++ b/patch/ros-rolling-mavros.patch @@ -1,8 +1,8 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 8e69fa09..c6b3041a 100644 +index 8e69fa09..2aea30a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -10,8 +10,8 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") +@@ -10,13 +10,17 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") # we dont use add_compile_options with pedantic in message packages # because the Python C extensions dont comply with it set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") @@ -12,6 +12,16 @@ index 8e69fa09..c6b3041a 100644 # Allow GNU extensions (-std=gnu++20) set(CMAKE_C_EXTENSIONS ON) + set(CMAKE_CXX_EXTENSIONS ON) + ++if(MSVC) ++ add_compile_definitions(_USE_MATH_DEFINES) ++endif() ++ + find_package(ament_cmake REQUIRED) + find_package(ament_cmake_python REQUIRED) + + diff --git a/include/mavros/utils.hpp b/include/mavros/utils.hpp index 1f3dc092..ca8d5149 100644 --- a/include/mavros/utils.hpp @@ -32,3 +42,62 @@ index 1f3dc092..ca8d5149 100644 namespace mavros { namespace utils + +diff --git a/src/lib/mavros_uas.cpp b/src/lib/mavros_uas.cpp +index 9a00f720..b6005641 100644 +--- a/src/lib/mavros_uas.cpp ++++ b/src/lib/mavros_uas.cpp +@@ -11,7 +11,52 @@ + * @author Vladimir Ermakov + */ + ++#ifdef _WIN32 ++// Windows has no ; provide a minimal case-insensitive glob ++// matcher supporting '*' and '?', sufficient for the plugin ++// blacklist/whitelist patterns matched below. ++#include ++#define FNM_NOMATCH 1 ++#define FNM_CASEFOLD 0 ++static int fnmatch(const char * pattern, const char * str, int) ++{ ++ while (*pattern) { ++ if (*pattern == '*') { ++ while (*pattern == '*') { ++ ++pattern; ++ } ++ if (!*pattern) { ++ return 0; ++ } ++ while (*str) { ++ if (fnmatch(pattern, str, 0) == 0) { ++ return 0; ++ } ++ ++str; ++ } ++ return FNM_NOMATCH; ++ } else if (*pattern == '?') { ++ if (!*str) { ++ return FNM_NOMATCH; ++ } ++ ++pattern; ++ ++str; ++ } else { ++ if (!*str || ++ std::tolower(static_cast(*pattern)) != ++ std::tolower(static_cast(*str))) ++ { ++ return FNM_NOMATCH; ++ } ++ ++pattern; ++ ++str; ++ } ++ } ++ return *str ? FNM_NOMATCH : 0; ++} ++#else + #include ++#endif + #include + #include + #include + From 07a61d2f10c20278883f973d9beebe328eda3a00 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 19:31:06 +1000 Subject: [PATCH 049/180] fix: mavros_plugins win-64 errno constants and clock_gettime - ftp.cpp uses Linux-specific errno codes (EBADE/EBADFD/EBADRQC/ EBADSLT) for MAVLink-FTP error mapping. utils.hpp already defines these for __APPLE__ (also missing them) but not _WIN32 -- extend the existing guard to cover both. - sys_time.cpp's get_monotonic_now() used POSIX clock_gettime( CLOCK_MONOTONIC, ...), unavailable on Windows. Replaced with std::chrono::steady_clock, which is portable across all three platforms and gives the same nanosecond-resolution monotonic count. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mavros.patch | 44 ++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/patch/ros-rolling-mavros.patch b/patch/ros-rolling-mavros.patch index 0ce146530..bd7a884f1 100644 --- a/patch/ros-rolling-mavros.patch +++ b/patch/ros-rolling-mavros.patch @@ -23,10 +23,21 @@ index 8e69fa09..2aea30a5 100644 diff --git a/include/mavros/utils.hpp b/include/mavros/utils.hpp -index 1f3dc092..ca8d5149 100644 +index 1f3dc092..bef93350 100644 --- a/include/mavros/utils.hpp +++ b/include/mavros/utils.hpp -@@ -35,6 +35,15 @@ +@@ -27,14 +27,24 @@ + #include "mavros_msgs/mavlink_convert.hpp" + #include "mavconn/mavlink_dialect.hpp" + +-// OS X compat: missing error codes +-#ifdef __APPLE__ ++// OS X / Windows compat: missing error codes (Linux-specific errno values ++// used by the FTP plugin's MAVLink-FTP error mapping) ++#if defined(__APPLE__) || defined(_WIN32) + #define EBADE 50 /* Invalid exchange */ + #define EBADFD 81 /* File descriptor in bad state */ + #define EBADRQC 54 /* Invalid request code */ #define EBADSLT 55 /* Invalid slot */ #endif @@ -101,3 +112,32 @@ index 9a00f720..b6005641 100644 #include #include +diff --git a/src/plugins/sys_time.cpp b/src/plugins/sys_time.cpp +index 42bd903e..7a015e5e 100644 +--- a/src/plugins/sys_time.cpp ++++ b/src/plugins/sys_time.cpp +@@ -14,6 +14,7 @@ + * https://github.com/mavlink/mavros/tree/master/LICENSE.md + */ + ++#include + #include + #include + +@@ -546,10 +547,11 @@ private: + + uint64_t get_monotonic_now(void) + { +- struct timespec spec; +- clock_gettime(CLOCK_MONOTONIC, &spec); +- +- return spec.tv_sec * 1000000000ULL + spec.tv_nsec; ++ // std::chrono::steady_clock is a portable monotonic clock available on ++ // all platforms, unlike POSIX clock_gettime()/CLOCK_MONOTONIC (not ++ // available on Windows). ++ auto now = std::chrono::steady_clock::now().time_since_epoch(); ++ return std::chrono::duration_cast(now).count(); + } + }; + + From c480dbb5a18bc20eb4f2874b7f87fec48c3d0103 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 19:51:08 +1000 Subject: [PATCH 050/180] fix: mavros win-64 missing mavros.lib import library Same class of bug as libmavconn: the mavros SHARED library has no dllexport-annotated symbols, so MSVC produced mavros.dll but no mavros.lib, and downstream mavros_node/mavros_plugins targets failed to link ("LNK1181: cannot open input file 'Release\mavros.lib'"). CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS is a directory-scoped cache variable, so setting it once (alongside the existing MSVC _USE_MATH_DEFINES block) before both add_library(mavros SHARED ...) and add_library(mavros_plugins SHARED ...) fixes both targets. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mavros.patch | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/patch/ros-rolling-mavros.patch b/patch/ros-rolling-mavros.patch index bd7a884f1..282ba4434 100644 --- a/patch/ros-rolling-mavros.patch +++ b/patch/ros-rolling-mavros.patch @@ -1,8 +1,8 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 8e69fa09..2aea30a5 100644 +index 8e69fa09..264b3108 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -10,13 +10,17 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") +@@ -10,13 +10,18 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") # we dont use add_compile_options with pedantic in message packages # because the Python C extensions dont comply with it set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") @@ -16,6 +16,7 @@ index 8e69fa09..2aea30a5 100644 +if(MSVC) + add_compile_definitions(_USE_MATH_DEFINES) ++ set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +endif() + find_package(ament_cmake REQUIRED) From 375bcff029e3e23120d85deea778c3fcae62099d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 20:11:26 +1000 Subject: [PATCH 051/180] fix: scope mavros's win-64 WINDOWS_EXPORT_ALL_SYMBOLS to the mavros target only The previous fix set CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS directory-wide, which also applied to mavros_plugins -- a much larger target (every plugin's translation units) that blew past MSVC's linker limit exporting them all ("LNK1189: library limit of 65535 objects exceeded"). mavros_plugins is loaded dynamically via pluginlib/class_loader and never linked against directly by any other CMake target here, so it needs no import library at all. Scope the fix to a per-target property on mavros only (linked by mavros_node and the unit tests), which is the only target that actually needs one. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mavros.patch | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/patch/ros-rolling-mavros.patch b/patch/ros-rolling-mavros.patch index 282ba4434..584c5425b 100644 --- a/patch/ros-rolling-mavros.patch +++ b/patch/ros-rolling-mavros.patch @@ -1,8 +1,8 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 8e69fa09..264b3108 100644 +index 8e69fa09..ee3bc340 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -10,13 +10,18 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") +@@ -10,13 +10,17 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") # we dont use add_compile_options with pedantic in message packages # because the Python C extensions dont comply with it set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") @@ -16,12 +16,25 @@ index 8e69fa09..264b3108 100644 +if(MSVC) + add_compile_definitions(_USE_MATH_DEFINES) -+ set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +endif() + find_package(ament_cmake REQUIRED) find_package(ament_cmake_python REQUIRED) +@@ -125,6 +129,13 @@ add_library(mavros SHARED + src/lib/uas_timesync.cpp + # [[[end]]] (sum: MjnRb8h5gp) + ) ++# mavros_plugins (below) has far too many symbols for MSVC's linker to ++# auto-export all of them (LNK1189: library limit of 65535 objects ++# exceeded) -- it's loaded dynamically via pluginlib/class_loader and ++# never linked against directly, so it doesn't need an import library at ++# all. Only the core mavros library (linked by mavros_node and the unit ++# tests below) needs WINDOWS_EXPORT_ALL_SYMBOLS. ++set_target_properties(mavros PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) + target_link_libraries(mavros PUBLIC + ${mavros_msgs_TARGETS} + ${sensor_msgs_TARGETS} diff --git a/include/mavros/utils.hpp b/include/mavros/utils.hpp index 1f3dc092..bef93350 100644 From 6f8af19ed86c3d5bfee601f1d49e09611cce5aef Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 20:32:40 +1000 Subject: [PATCH 052/180] fix: explicitly export mavros's egm96_5 static data member on win-64 CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS only auto-exports function symbols, not data -- Data::egm96_5 (a static shared_ptr member defined in uas_data.cpp, referenced by mavros_plugins' global_position.cpp and home_position.cpp) never made it into mavros.lib's export table, failing with LNK2019/LNK2001 unresolved external symbol. Add an explicit dllexport/dllimport toggle (MAVROS_UAS_DATA_EXPORT, gated on a MAVROS_BUILDING_DLL define set only for the mavros target itself). Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mavros.patch | 40 ++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/patch/ros-rolling-mavros.patch b/patch/ros-rolling-mavros.patch index 584c5425b..f7e811c73 100644 --- a/patch/ros-rolling-mavros.patch +++ b/patch/ros-rolling-mavros.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 8e69fa09..ee3bc340 100644 +index 8e69fa09..24148d30 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,13 +10,17 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -21,7 +21,7 @@ index 8e69fa09..ee3bc340 100644 find_package(ament_cmake REQUIRED) find_package(ament_cmake_python REQUIRED) -@@ -125,6 +129,13 @@ add_library(mavros SHARED +@@ -125,6 +129,14 @@ add_library(mavros SHARED src/lib/uas_timesync.cpp # [[[end]]] (sum: MjnRb8h5gp) ) @@ -32,6 +32,7 @@ index 8e69fa09..ee3bc340 100644 +# all. Only the core mavros library (linked by mavros_node and the unit +# tests below) needs WINDOWS_EXPORT_ALL_SYMBOLS. +set_target_properties(mavros PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) ++target_compile_definitions(mavros PRIVATE MAVROS_BUILDING_DLL) target_link_libraries(mavros PUBLIC ${mavros_msgs_TARGETS} ${sensor_msgs_TARGETS} @@ -68,6 +69,41 @@ index 1f3dc092..bef93350 100644 { namespace utils +diff --git a/include/mavros/mavros_uas.hpp b/include/mavros/mavros_uas.hpp +index c1d10b1e..15d50971 100644 +--- a/include/mavros/mavros_uas.hpp ++++ b/include/mavros/mavros_uas.hpp +@@ -53,6 +53,20 @@ + #include "mavros/frame_tf.hpp" + #include "mavros/uas_executor.hpp" + ++// egm96_5 is a static data member shared across the mavros DLL boundary ++// (defined in uas_data.cpp, used by mavros_plugins) -- MSVC's ++// WINDOWS_EXPORT_ALL_SYMBOLS only auto-exports functions, not data, so ++// this needs an explicit dllexport/dllimport toggle on Windows. ++#ifdef _WIN32 ++#ifdef MAVROS_BUILDING_DLL ++#define MAVROS_UAS_DATA_EXPORT __declspec(dllexport) ++#else ++#define MAVROS_UAS_DATA_EXPORT __declspec(dllimport) ++#endif ++#else ++#define MAVROS_UAS_DATA_EXPORT ++#endif ++ + namespace mavros + { + namespace uas +@@ -158,7 +172,7 @@ public: + * + * That class loads egm96_5 dataset to RAM, it is about 24 MiB. + */ +- static std::shared_ptr egm96_5; ++ static MAVROS_UAS_DATA_EXPORT std::shared_ptr egm96_5; + + /** + * @brief Conversion from height above geoid (AMSL) + diff --git a/src/lib/mavros_uas.cpp b/src/lib/mavros_uas.cpp index 9a00f720..b6005641 100644 --- a/src/lib/mavros_uas.cpp From 23f00376d8bf381e035c88da1d220101b613881d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 21:03:37 +1000 Subject: [PATCH 053/180] fix: mavros_extras win-64 M_PI undeclared identifier servo_state_publisher.hpp uses bare M_PI, undeclared on MSVC without _USE_MATH_DEFINES. Same fix already applied to mavros itself. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mavros-extras.patch | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/patch/ros-rolling-mavros-extras.patch b/patch/ros-rolling-mavros-extras.patch index 7adb10e15..61c8fc91c 100644 --- a/patch/ros-rolling-mavros-extras.patch +++ b/patch/ros-rolling-mavros-extras.patch @@ -2,17 +2,24 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt index 8832292..dbee63e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -10,8 +10,8 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") +@@ -10,11 +10,15 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") # we dont use add_compile_options with pedantic in message packages # because the Python C extensions dont comply with it set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wcomment") endif() -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wcomment") - + # Allow GNU extensions (-std=gnu++20) set(CMAKE_C_EXTENSIONS ON) -@@ -168,6 +168,7 @@ target_link_libraries(mavros_extras_plugins PUBLIC + set(CMAKE_CXX_EXTENSIONS ON) + ++if(MSVC) ++ add_compile_definitions(_USE_MATH_DEFINES) ++endif() ++ + find_package(ament_cmake REQUIRED) +@@ -168,6 +172,7 @@ target_link_libraries(mavros_extras_plugins PUBLIC tf2_ros::static_transform_broadcaster_node tf2_ros::tf2_ros ${mavros_LIBRARIES} From fd269789a03925bbfa346ead27b2f0c7fcf4a043 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 21:32:28 +1000 Subject: [PATCH 054/180] fix: microstrain_inertial_driver win-64 min/max macro collision pulled in transitively by the MIP SDK's serial-port code defines min/max as function-like macros unless NOMINMAX is set first, which corrupts std::chrono::nanoseconds::max()/min() calls in rcpputils/time.hpp (included via rclcpp) into cryptic syntax errors ("'(' illegal token on right side of '::'", "unexpected token ')'"). Classic Windows min/max macro collision -- add NOMINMAX for WIN32. Co-Authored-By: Claude Sonnet 5 --- .../ros-rolling-microstrain-inertial-driver.patch | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/patch/ros-rolling-microstrain-inertial-driver.patch b/patch/ros-rolling-microstrain-inertial-driver.patch index 60fda440c..a0045f588 100644 --- a/patch/ros-rolling-microstrain-inertial-driver.patch +++ b/patch/ros-rolling-microstrain-inertial-driver.patch @@ -2,6 +2,21 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt index 35e036f..4ae5e4d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt +@@ -1,6 +1,14 @@ + cmake_minimum_required(VERSION 3.5) + project(microstrain_inertial_driver) + ++# Windows headers pulled in transitively by the MIP SDK's serial-port code ++# define min/max as function-like macros unless NOMINMAX is set first, ++# which corrupts any std::chrono::duration::max()/min() call downstream ++# (rcpputils/time.hpp, included via rclcpp) with cryptic syntax errors. ++if(WIN32) ++ add_compile_definitions(NOMINMAX) ++endif() ++ + # C++ 14 required + set(CMAKE_CXX_STANDARD 14) + set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -187,6 +187,14 @@ set(COMMON_INC_FILES ) set(COMMON_FILES ${COMMON_SRC_FILES} ${COMMON_INC_FILES}) From 3830abff06abd517d2a2a2c24fef48f845341479 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 21:45:26 +1000 Subject: [PATCH 055/180] fix: microstrain_inertial_driver win-64 unistd.h and localtime_r - microstrain_inertial_driver{,_lifecycle}.h include unconditionally but use nothing from it (verified: neither header nor its .cpp consumer reference any POSIX symbol it provides) -- guard behind #ifndef _WIN32. - ros_connection.cpp calls localtime_r(&raw_time, &curr_time), no Windows equivalent. localtime_s() is the closest match but takes arguments in the opposite order and returns errno_t instead of struct tm* (not checked at this call site) -- shim it with a macro. Co-Authored-By: Claude Sonnet 5 --- ...-rolling-microstrain-inertial-driver.patch | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/patch/ros-rolling-microstrain-inertial-driver.patch b/patch/ros-rolling-microstrain-inertial-driver.patch index a0045f588..b07658634 100644 --- a/patch/ros-rolling-microstrain-inertial-driver.patch +++ b/patch/ros-rolling-microstrain-inertial-driver.patch @@ -102,3 +102,53 @@ index 1e2a6757..f77bb1d9 100644 #include "lifecycle_msgs/msg/transition.hpp" +diff --git a/include/microstrain_inertial_driver/microstrain_inertial_driver.h b/include/microstrain_inertial_driver/microstrain_inertial_driver.h +index 8e9c2f0e..63edec08 100644 +--- a/include/microstrain_inertial_driver/microstrain_inertial_driver.h ++++ b/include/microstrain_inertial_driver/microstrain_inertial_driver.h +@@ -14,7 +14,9 @@ + #define _MICROSTRAIN_INERTIAL_DRIVER_MICROSTRAIN_INERTIAL_DRIVER_H + + #include ++#ifndef _WIN32 + #include ++#endif + #include + #include + #include + +diff --git a/include/microstrain_inertial_driver/microstrain_inertial_driver_lifecycle.h b/include/microstrain_inertial_driver/microstrain_inertial_driver_lifecycle.h +index c8ef84e9..931163c2 100644 +--- a/include/microstrain_inertial_driver/microstrain_inertial_driver_lifecycle.h ++++ b/include/microstrain_inertial_driver/microstrain_inertial_driver_lifecycle.h +@@ -14,7 +14,9 @@ + #define _MICROSTRAIN_INERTIAL_DRIVER_MICROSTRAIN_INERTIAL_DRIVER_LIFECYCLE_H + + #include ++#ifndef _WIN32 + #include ++#endif + #include + #include + #include + +diff --git a/microstrain_inertial_driver_common/src/utils/mip/ros_connection.cpp b/microstrain_inertial_driver_common/src/utils/mip/ros_connection.cpp +index e2eae441..826b8c24 100644 +--- a/microstrain_inertial_driver_common/src/utils/mip/ros_connection.cpp ++++ b/microstrain_inertial_driver_common/src/utils/mip/ros_connection.cpp +@@ -10,6 +10,14 @@ + + #include + ++#ifdef _WIN32 ++// POSIX localtime_r() has no Windows equivalent; localtime_s() is the ++// closest match, but takes its arguments in the opposite order (struct tm* ++// destination first, time_t* source second) and returns errno_t instead of ++// struct tm*, which the single call site below doesn't check anyway. ++#define localtime_r(timep, result) localtime_s(result, timep) ++#endif ++ + #include + #include + #include + From 49877ed72aa3639a506ba4ecabc7f3f5d3c70be5 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 21:59:36 +1000 Subject: [PATCH 056/180] fix: microstrain_inertial_driver win-64 -Wno-narrowing rejected by MSVC -Wno-narrowing is a GCC/Clang-only flag; MSVC's cl.exe rejects it outright ("invalid numeric argument '/Wno-narrowing'"). Guard it behind the same CMAKE_COMPILER_IS_GNUCXX/Clang check already used elsewhere in this file -- narrowing conversions are warnings, not errors, on MSVC by default, so nothing needs to replace it there. Co-Authored-By: Claude Sonnet 5 --- ...s-rolling-microstrain-inertial-driver.patch | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/patch/ros-rolling-microstrain-inertial-driver.patch b/patch/ros-rolling-microstrain-inertial-driver.patch index b07658634..cb5214c3c 100644 --- a/patch/ros-rolling-microstrain-inertial-driver.patch +++ b/patch/ros-rolling-microstrain-inertial-driver.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 35e036f..4ae5e4d 100644 +index 35e036fa..db513f68 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,14 @@ @@ -17,7 +17,7 @@ index 35e036f..4ae5e4d 100644 # C++ 14 required set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) -@@ -187,6 +187,14 @@ set(COMMON_INC_FILES +@@ -187,6 +195,14 @@ set(COMMON_INC_FILES ) set(COMMON_FILES ${COMMON_SRC_FILES} ${COMMON_INC_FILES}) @@ -32,7 +32,7 @@ index 35e036f..4ae5e4d 100644 set(AMENT_COMMON_DEPENDENCIES rclcpp rclcpp_lifecycle -@@ -215,9 +223,7 @@ set(NODE_INC_FILES +@@ -215,9 +231,7 @@ set(NODE_INC_FILES ) set(NODE_FILES ${NODE_SRC_FILES} ${NODE_INC_FILES}) add_executable(${NODE_NAME} ${NODE_FILES} ${COMMON_FILES}) @@ -43,7 +43,7 @@ index 35e036f..4ae5e4d 100644 # Lifecycle node set(LIFECYCLE_NAME ${PROJECT_NAME}_lifecycle_node) -@@ -231,9 +237,7 @@ set(LIFECYCLE_INC_FILES +@@ -231,12 +245,13 @@ set(LIFECYCLE_INC_FILES set(LIFECYCLE_FILES ${LIFECYCLE_SRC_FILES} ${LIFECYCLE_INC_FILES}) add_executable(${LIFECYCLE_NAME} ${LIFECYCLE_FILES} ${COMMON_FILES}) target_compile_definitions(${LIFECYCLE_NAME} PUBLIC MICROSTRAIN_LIFECYCLE) @@ -53,7 +53,15 @@ index 35e036f..4ae5e4d 100644 +link_ament_dependencies(${LIFECYCLE_NAME} ${AMENT_COMMON_DEPENDENCIES}) # Annoying, but the ROS types don't match up with the MIP types for floats and doubles, so ignore those warnings for now - set_source_files_properties(${COMMON_SRC_DIR}/services.cpp PROPERTIES COMPILE_OPTIONS "-Wno-narrowing") +-set_source_files_properties(${COMMON_SRC_DIR}/services.cpp PROPERTIES COMPILE_OPTIONS "-Wno-narrowing") ++# (GCC/Clang-only flag; MSVC doesn't error on narrowing conversions by default anyway) ++if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") ++ set_source_files_properties(${COMMON_SRC_DIR}/services.cpp PROPERTIES COMPILE_OPTIONS "-Wno-narrowing") ++endif() + + # Tell the code the version of the driver that is being build + add_definitions(-DMICROSTRAIN_DRIVER_VERSION="${DRIVER_GIT_VERSION}") + diff --git a/microstrain_inertial_driver_common/include/microstrain_inertial_driver_common/utils/ros_compat.h b/microstrain_inertial_driver_common/include/microstrain_inertial_driver_common/utils/ros_compat.h index f1fe0879..5b866134 100644 --- a/microstrain_inertial_driver_common/include/microstrain_inertial_driver_common/utils/ros_compat.h From 63aa0286ea2173050c80ed255bb3a5d43dcbf72a Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 22:25:34 +1000 Subject: [PATCH 057/180] fix: mocap4r2_control win-64 missing import library Same class of bug as libmavconn/mavros: the mocap4r2_control SHARED library has no dllexport-annotated symbols, so MSVC produced the .dll but no .lib, and auxiliar_main (which links against it directly) failed with LNK1181: cannot open input file 'Release\mocap4r2_control.lib'. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mocap4r2-control.patch | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/patch/ros-rolling-mocap4r2-control.patch b/patch/ros-rolling-mocap4r2-control.patch index 4f32c987d..d9d16c849 100644 --- a/patch/ros-rolling-mocap4r2-control.patch +++ b/patch/ros-rolling-mocap4r2-control.patch @@ -1,5 +1,5 @@ diff --git a/mocap4r2_control/mocap4r2_control/CMakeLists.txt b/mocap4r2_control/mocap4r2_control/CMakeLists.txt -index 394d5e5..180975b 100644 +index 394d5e56..77b13d01 100644 --- a/mocap4r2_control/mocap4r2_control/CMakeLists.txt +++ b/mocap4r2_control/mocap4r2_control/CMakeLists.txt @@ -27,6 +27,12 @@ set(dependencies @@ -15,11 +15,16 @@ index 394d5e5..180975b 100644 include_directories(include) add_library(${PROJECT_NAME} SHARED -@@ -34,10 +40,10 @@ add_library(${PROJECT_NAME} SHARED +@@ -34,10 +40,15 @@ add_library(${PROJECT_NAME} SHARED src/mocap4r2_control/ControllerNode.cpp src/mocap4r2_control/AuxiliarNode.cpp ) -ament_target_dependencies(${PROJECT_NAME} ${dependencies}) ++# auxiliar_main (below) links against this library directly, so it needs ++# an import .lib on Windows -- this SHARED library has no ++# dllexport-annotated symbols, so without this MSVC produces the .dll but ++# no .lib (LNK1181: cannot open input file). ++set_target_properties(${PROJECT_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) +target_link_libraries(${PROJECT_NAME} ${target_dependencies}) add_executable(auxiliar_main src/auxiliar_main.cpp) @@ -28,3 +33,4 @@ index 394d5e5..180975b 100644 target_link_libraries(auxiliar_main ${PROJECT_NAME}) install(DIRECTORY include/ + From 132cd9495203c278fdaacd59ced7d31512186e98 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 22:40:05 +1000 Subject: [PATCH 058/180] fix: mocap4r2_dummy_driver win-64 missing import library Same bug as mocap4r2_control: mocap4r2_dummy_driver's own SHARED library has no dllexport-annotated symbols, so mocap4r2_dummy_driver_main (which links against it directly) failed with LNK1181: cannot open input file 'Release\mocap4r2_dummy_driver.lib'. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mocap4r2-dummy-driver.patch | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/patch/ros-rolling-mocap4r2-dummy-driver.patch b/patch/ros-rolling-mocap4r2-dummy-driver.patch index a25f033c7..9c9adf1af 100644 --- a/patch/ros-rolling-mocap4r2-dummy-driver.patch +++ b/patch/ros-rolling-mocap4r2-dummy-driver.patch @@ -1,8 +1,8 @@ diff --git a/mocap4r2_dummy_driver/CMakeLists.txt b/mocap4r2_dummy_driver/CMakeLists.txt -index 8e8a863..b1569d7 100644 +index 8e8a8635..f48c10b2 100644 --- a/mocap4r2_dummy_driver/CMakeLists.txt +++ b/mocap4r2_dummy_driver/CMakeLists.txt -@@ -24,18 +24,25 @@ set(dependencies +@@ -24,18 +24,29 @@ set(dependencies mocap4r2_control ) @@ -20,6 +20,10 @@ index 8e8a863..b1569d7 100644 add_library(${PROJECT_NAME} src/mocap4r2_dummy_driver/mocap4r2_dummy_driver.cpp) -ament_target_dependencies(${PROJECT_NAME} ${dependencies}) ++# mocap4r2_dummy_driver_main (below) links against this library directly, ++# so it needs an import .lib on Windows -- same missing-dllexport-symbols ++# issue already fixed for mocap4r2_control. ++set_target_properties(${PROJECT_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) +target_link_libraries(${PROJECT_NAME} ${target_dependencies}) add_executable(mocap4r2_dummy_driver_main @@ -30,3 +34,4 @@ index 8e8a863..b1569d7 100644 target_link_libraries(mocap4r2_dummy_driver_main ${PROJECT_NAME}) install(DIRECTORY + From aaf5540efbd86c332e25b0d39f7da4f771fc799d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 22:43:02 +1000 Subject: [PATCH 059/180] fix: proactively export mocap4r2_marker_viz/mocap4r2_robot_gt libraries on win-64 Same missing-dllexport-symbols pattern just confirmed for mocap4r2_control and mocap4r2_dummy_driver: every mocap4r2_* package in this monorepo that declares its own SHARED library linked directly by another target in the same CMakeLists.txt needs WINDOWS_EXPORT_ALL_SYMBOLS, or MSVC produces the .dll but no import .lib and the consuming target fails to link (LNK1181). Applied proactively here (mocap4r2_marker_viz_NODE <- mocap4r2_marker_viz; gt_component <- gt_program, set_gt_component <- set_gt_cli) rather than waiting for CI to hit each one in turn, since the pattern is now confirmed 2-for-2 across sibling packages in the same repo. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mocap4r2-marker-viz.patch | 15 +++++++++++++-- patch/ros-rolling-mocap4r2-robot-gt.patch | 12 ++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/patch/ros-rolling-mocap4r2-marker-viz.patch b/patch/ros-rolling-mocap4r2-marker-viz.patch index 169d2a000..5aa073728 100644 --- a/patch/ros-rolling-mocap4r2-marker-viz.patch +++ b/patch/ros-rolling-mocap4r2-marker-viz.patch @@ -1,8 +1,18 @@ diff --git a/mocap4r2_marker_viz/mocap4r2_marker_viz/CMakeLists.txt b/mocap4r2_marker_viz/mocap4r2_marker_viz/CMakeLists.txt -index ce11de5..2ad03ac 100644 +index ce11de53..03b817f4 100644 --- a/mocap4r2_marker_viz/mocap4r2_marker_viz/CMakeLists.txt +++ b/mocap4r2_marker_viz/mocap4r2_marker_viz/CMakeLists.txt -@@ -34,7 +34,13 @@ target_include_directories(${PROJECT_NAME}_NODE +@@ -28,13 +28,23 @@ find_package(geometry_msgs REQUIRED) + add_executable(mocap4r2_marker_viz src/mocap4r2_marker_viz_main.cpp) + + add_library(${PROJECT_NAME}_NODE src/mocap4r2_marker_viz_node.cpp) ++# mocap4r2_marker_viz (below) links against this library directly, so it ++# needs an import .lib on Windows -- same missing-dllexport-symbols issue ++# already fixed for mocap4r2_control/mocap4r2_dummy_driver. ++set_target_properties(${PROJECT_NAME}_NODE PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) + + target_include_directories(${PROJECT_NAME}_NODE + PUBLIC $ $) @@ -17,3 +27,4 @@ index ce11de5..2ad03ac 100644 target_link_libraries(mocap4r2_marker_viz ${PROJECT_NAME}_NODE) + diff --git a/patch/ros-rolling-mocap4r2-robot-gt.patch b/patch/ros-rolling-mocap4r2-robot-gt.patch index 3671948a8..96dcb5a73 100644 --- a/patch/ros-rolling-mocap4r2-robot-gt.patch +++ b/patch/ros-rolling-mocap4r2-robot-gt.patch @@ -1,5 +1,5 @@ diff --git a/mocap4r2_robot_gt/mocap4r2_robot_gt/CMakeLists.txt b/mocap4r2_robot_gt/mocap4r2_robot_gt/CMakeLists.txt -index 7c14e7e..8365d74 100644 +index 7c14e7e4..8e097dba 100644 --- a/mocap4r2_robot_gt/mocap4r2_robot_gt/CMakeLists.txt +++ b/mocap4r2_robot_gt/mocap4r2_robot_gt/CMakeLists.txt @@ -16,13 +16,13 @@ find_package(geometry_msgs REQUIRED) @@ -23,11 +23,15 @@ index 7c14e7e..8365d74 100644 ) include_directories( -@@ -30,19 +30,19 @@ include_directories( +@@ -30,19 +30,26 @@ include_directories( ) add_library(gt_component SHARED src/mocap4r2_robot_gt/gt_component.cpp) -ament_target_dependencies(gt_component ${dependencies}) ++# gt_program (below) links against this library directly, so it needs an ++# import .lib on Windows -- same missing-dllexport-symbols issue already ++# fixed for mocap4r2_control/mocap4r2_dummy_driver/mocap4r2_marker_viz. ++set_target_properties(gt_component PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) +target_link_libraries(gt_component ${dependencies}) rclcpp_components_register_nodes(gt_component "mocap4r2_robot_gt::GTNode") @@ -38,6 +42,9 @@ index 7c14e7e..8365d74 100644 add_library(set_gt_component SHARED src/mocap4r2_robot_gt/set_gt_component.cpp) -ament_target_dependencies(set_gt_component ${dependencies}) ++# set_gt_cli (below) links against this library directly, so it needs the ++# same import-library fix. ++set_target_properties(set_gt_component PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) +target_link_libraries(set_gt_component ${dependencies}) rclcpp_components_register_nodes(set_gt_component "mocap4r2_robot_gt::SetGTNode") @@ -47,3 +54,4 @@ index 7c14e7e..8365d74 100644 target_link_libraries(set_gt_cli set_gt_component) install(TARGETS + From a1b875349f08730c7bb987307e0ec28a15f734a3 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 23:04:47 +1000 Subject: [PATCH 060/180] fix: motion_capture_tracking win-64 missing quat.lib import library Same class of bug as libmavconn/mavros/mocap4r2_*: the vendored VRPN dependency's "quat" SHARED library (deps/libmotioncapture/deps/vrpn/quat) has no dllexport-annotated symbols, so MSVC produced quat.dll but no quat.lib, and the sibling vrpn library (which links against it directly) failed with LNK1181: cannot open input file 'quat\Release\quat.lib'. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-motion-capture-tracking.patch | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/patch/ros-rolling-motion-capture-tracking.patch b/patch/ros-rolling-motion-capture-tracking.patch index 97206168a..d49c8cad4 100644 --- a/patch/ros-rolling-motion-capture-tracking.patch +++ b/patch/ros-rolling-motion-capture-tracking.patch @@ -11,3 +11,20 @@ index ace9626..5d99a63 100644 std::vector transforms; pcl::PointCloud::Ptr markers(new pcl::PointCloud); +diff --git a/deps/libmotioncapture/deps/vrpn/quat/CMakeLists.txt b/deps/libmotioncapture/deps/vrpn/quat/CMakeLists.txt +index e6009d9d..037befcc 100644 +--- a/deps/libmotioncapture/deps/vrpn/quat/CMakeLists.txt ++++ b/deps/libmotioncapture/deps/vrpn/quat/CMakeLists.txt +@@ -13,6 +13,11 @@ set(QUATLIB_HEADER quat.h) + + # Build the library itself and declare what bits need to be installed + add_library(quat ${QUATLIB_SOURCES} ${QUATLIB_HEADER}) ++# vrpn (the sibling library one level up) links against this library ++# directly, so it needs an import .lib on Windows -- this SHARED library ++# has no dllexport-annotated symbols, so without this MSVC produces the ++# .dll but no .lib (LNK1181: cannot open input file). ++set_target_properties(quat PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) + if(UNIX) + target_link_libraries(quat -lm) + endif() + From f6cabe45e5876bccb6fdea95f340de8fcb35df36 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 23:07:44 +1000 Subject: [PATCH 061/180] fix: proactively export vrpn/libmotioncapture/librigidbodytracker on win-64 Same missing-dllexport-symbols pattern as quat, traced one level up the link chain: vrpn links quat and is itself linked by libmotioncapture, which is linked (along with librigidbodytracker) directly by motion_capture_tracking_node -- all three are SHARED libraries with no dllexport-annotated symbols, so each would fail with the same LNK1181 once the previous one in the chain got fixed. Applied proactively rather than waiting for three more CI round-trips. Co-Authored-By: Claude Sonnet 5 --- .../ros-rolling-motion-capture-tracking.patch | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/patch/ros-rolling-motion-capture-tracking.patch b/patch/ros-rolling-motion-capture-tracking.patch index d49c8cad4..6d69e484a 100644 --- a/patch/ros-rolling-motion-capture-tracking.patch +++ b/patch/ros-rolling-motion-capture-tracking.patch @@ -28,3 +28,51 @@ index e6009d9d..037befcc 100644 target_link_libraries(quat -lm) endif() +diff --git a/deps/libmotioncapture/deps/vrpn/CMakeLists.txt b/deps/libmotioncapture/deps/vrpn/CMakeLists.txt +index 41ce8558..31f6d711 100644 +--- a/deps/libmotioncapture/deps/vrpn/CMakeLists.txt ++++ b/deps/libmotioncapture/deps/vrpn/CMakeLists.txt +@@ -1353,6 +1353,10 @@ endif() + + if(VRPN_BUILD_CLIENT_LIBRARY) + add_library(vrpn ${VRPN_CLIENT_SOURCES} ${VRPN_CLIENT_PUBLIC_HEADERS}) ++ # libmotioncapture (one level up) links against this library directly, ++ # so it needs an import .lib on Windows -- same missing-dllexport-symbols ++ # issue already fixed for the sibling quat library. ++ set_target_properties(vrpn PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) + target_link_libraries(vrpn ${EXTRA_LIBS}) + set(VRPN_CLIENT_LIBRARY vrpn) + + +diff --git a/deps/libmotioncapture/CMakeLists.txt b/deps/libmotioncapture/CMakeLists.txt +index 61a4af9f..0f41148d 100644 +--- a/deps/libmotioncapture/CMakeLists.txt ++++ b/deps/libmotioncapture/CMakeLists.txt +@@ -234,6 +234,10 @@ include_directories( + add_library(libmotioncapture + ${my_files} + ) ++# motion_capture_tracking_node (the top-level ROS node) links against this ++# library directly, so it needs an import .lib on Windows -- same ++# missing-dllexport-symbols issue already fixed for quat/vrpn. ++set_target_properties(libmotioncapture PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) + + ## Specify libraries to link a library or executable target against + target_link_directories(libmotioncapture PUBLIC + +diff --git a/deps/librigidbodytracker/CMakeLists.txt b/deps/librigidbodytracker/CMakeLists.txt +index c23b4ee3..4a4b5981 100644 +--- a/deps/librigidbodytracker/CMakeLists.txt ++++ b/deps/librigidbodytracker/CMakeLists.txt +@@ -24,6 +24,10 @@ include_directories( + add_library(librigidbodytracker + src/rigid_body_tracker.cpp + ) ++# motion_capture_tracking_node (the top-level ROS node) links against this ++# library directly, so it needs an import .lib on Windows -- same ++# missing-dllexport-symbols issue already fixed for quat/vrpn/libmotioncapture. ++set_target_properties(librigidbodytracker PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) + target_link_libraries(librigidbodytracker + ${PCL_LIBRARIES} + ) + From 6c2c4acef4b447092c409844ceb28b95ccce1b62 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 23:19:25 +1000 Subject: [PATCH 062/180] fix: qualisys_cpp_sdk win-64 missing import library Same pattern, one more vendored SDK in the same optional-backend chain (vicon/optitrack/qualisys/vrpn/fzmotion, all confirmed active for this build via the "including X" CMake log messages): libmotioncapture links directly against qualisys_cpp_sdk, which had no dllexport symbols either. vicon-datastream-sdk's own library is STATIC (no export table needed) and optitrack/fzmotion add source files directly rather than declaring their own libraries, so neither needs this fix. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-motion-capture-tracking.patch | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/patch/ros-rolling-motion-capture-tracking.patch b/patch/ros-rolling-motion-capture-tracking.patch index 6d69e484a..904ca3586 100644 --- a/patch/ros-rolling-motion-capture-tracking.patch +++ b/patch/ros-rolling-motion-capture-tracking.patch @@ -76,3 +76,19 @@ index c23b4ee3..4a4b5981 100644 ${PCL_LIBRARIES} ) +diff --git a/deps/libmotioncapture/deps/qualisys_cpp_sdk/CMakeLists.txt b/deps/libmotioncapture/deps/qualisys_cpp_sdk/CMakeLists.txt +index ea440917..97b65b28 100644 +--- a/deps/libmotioncapture/deps/qualisys_cpp_sdk/CMakeLists.txt ++++ b/deps/libmotioncapture/deps/qualisys_cpp_sdk/CMakeLists.txt +@@ -9,6 +9,10 @@ add_library(${PROJECT_NAME} + RTPacket.cpp + RTProtocol.cpp + ) ++# libmotioncapture (one level up) links against this library directly, so ++# it needs an import .lib on Windows -- same missing-dllexport-symbols ++# issue already fixed for quat/vrpn/libmotioncapture/librigidbodytracker. ++set_target_properties(${PROJECT_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) + target_include_directories(${PROJECT_NAME} PUBLIC + $ + $ + From 83f1ea7cbddd5a9287db601969c450142aead769 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 23:33:19 +1000 Subject: [PATCH 063/180] fix: libmotioncapture win-64 missing boost_filesystem.lib vicon-datastream-sdk's Boost::thread pulls in an unqualified "boost_filesystem" reference on Windows that only resolves once Boost::filesystem's own imported target (carrying the correct library search directory) is also linked into libmotioncapture, which statically links vicon-datastream-sdk. Without it: LNK1104 cannot open file 'boost_filesystem.lib'. Co-Authored-By: Claude Sonnet 5 --- .../ros-rolling-motion-capture-tracking.patch | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/patch/ros-rolling-motion-capture-tracking.patch b/patch/ros-rolling-motion-capture-tracking.patch index 904ca3586..b69fc0927 100644 --- a/patch/ros-rolling-motion-capture-tracking.patch +++ b/patch/ros-rolling-motion-capture-tracking.patch @@ -45,9 +45,18 @@ index 41ce8558..31f6d711 100644 diff --git a/deps/libmotioncapture/CMakeLists.txt b/deps/libmotioncapture/CMakeLists.txt -index 61a4af9f..0f41148d 100644 +index 61a4af9f..215732db 100644 --- a/deps/libmotioncapture/CMakeLists.txt +++ b/deps/libmotioncapture/CMakeLists.txt +@@ -19,7 +19,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) + set(CMAKE_CXX_EXTENSIONS OFF) + + find_package(Threads REQUIRED) +-find_package(Boost) # for optitrack ++find_package(Boost COMPONENTS filesystem) # filesystem needed for a transitive Windows link; also for optitrack + add_definitions( + -DBOOST_DATE_TIME_NO_LIB + -DBOOST_REGEX_NO_LIB @@ -234,6 +234,10 @@ include_directories( add_library(libmotioncapture ${my_files} @@ -59,6 +68,20 @@ index 61a4af9f..0f41148d 100644 ## Specify libraries to link a library or executable target against target_link_directories(libmotioncapture PUBLIC +@@ -243,6 +247,13 @@ target_link_libraries(libmotioncapture + Eigen3::Eigen + ${my_libraries} + ) ++# vicon-datastream-sdk's Boost::thread pulls in an unqualified ++# "boost_filesystem" reference on Windows that only resolves correctly ++# once Boost::filesystem's own imported target (with its library search ++# directory) is also linked here. ++if(Boost_FILESYSTEM_FOUND) ++ target_link_libraries(libmotioncapture Boost::filesystem) ++endif() + set_property(TARGET libmotioncapture PROPERTY POSITION_INDEPENDENT_CODE ON) + + if (LIBMOTIONCAPTURE_BUILD_PYTHON_BINDINGS) diff --git a/deps/librigidbodytracker/CMakeLists.txt b/deps/librigidbodytracker/CMakeLists.txt index c23b4ee3..4a4b5981 100644 From e486b17b3b2b6ce46baf9b313e6f93b6e4674f9d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sat, 5 Sep 2026 23:57:49 +1000 Subject: [PATCH 064/180] fix: moveit_hybrid_planning win-64 __builtin_unreachable undeclared __builtin_unreachable() is a GCC/Clang builtin; MSVC's cl.exe has no such identifier. Use the MSVC equivalent (__assume(0)) instead. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-moveit-hybrid-planning.patch | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 patch/ros-rolling-moveit-hybrid-planning.patch diff --git a/patch/ros-rolling-moveit-hybrid-planning.patch b/patch/ros-rolling-moveit-hybrid-planning.patch new file mode 100644 index 000000000..d1b0818a5 --- /dev/null +++ b/patch/ros-rolling-moveit-hybrid-planning.patch @@ -0,0 +1,17 @@ +diff --git a/local_planner/local_planner_component/include/moveit/local_planner/feedback_types.hpp b/local_planner/local_planner_component/include/moveit/local_planner/feedback_types.hpp +index aa732a4b..5efec687 100644 +--- a/local_planner/local_planner_component/include/moveit/local_planner/feedback_types.hpp ++++ b/local_planner/local_planner_component/include/moveit/local_planner/feedback_types.hpp +@@ -63,7 +63,11 @@ enum LocalFeedbackEnum + case LOCAL_PLANNER_STUCK: + return "Local planner is stuck"; + default: ++#if defined(_MSC_VER) ++ __assume(0); ++#else + __builtin_unreachable(); ++#endif + } + } + } // namespace moveit::hybrid_planning + From 3421f836a85f8779c12f42805511b0726418d04d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 00:23:48 +1000 Subject: [PATCH 065/180] fix: moveit_ros_perception win-64 __cplusplus and OpenCV5 pointPolygonTest - lazy_free_space_updater.hpp guards its OcTreeKeyCountMap typedef with #elif __cplusplus >= 201103L, falling back to std::tr1::unordered_map (removed from modern STL) otherwise. MSVC reports the pre-C++11 __cplusplus value (199711L) by default regardless of the actual /std: flag unless /Zc:__cplusplus is passed, so this guard silently took the wrong branch, cascading into "undeclared identifier" errors throughout lazy_free_space_updater.cpp. Add the flag globally for this package's MSVC builds. - semantic_world.cpp's cv::pointPolygonTest moved to the geometry module in OpenCV 5; add the corresponding include (same pattern as other OpenCV5 relocations fixed elsewhere this session). Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-moveit-ros-perception.patch | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/patch/ros-rolling-moveit-ros-perception.patch b/patch/ros-rolling-moveit-ros-perception.patch index 22973d5b0..8a26756a6 100644 --- a/patch/ros-rolling-moveit-ros-perception.patch +++ b/patch/ros-rolling-moveit-ros-perception.patch @@ -11,3 +11,40 @@ index 7ab437a75a..0f28d369a0 100644 tf_buffer_->setCreateTimerInterface(create_timer_interface); tf_listener_ = std::make_shared(*tf_buffer_); shape_mask_ = std::make_unique(); +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 761d53c8..0467358e 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -5,6 +5,15 @@ project(moveit_ros_perception LANGUAGES CXX) + find_package(moveit_common REQUIRED) + moveit_package() + ++# MSVC reports the pre-C++11 __cplusplus value (199711L) by default ++# regardless of the actual /std: flag, unless this is set -- several ++# files here (e.g. lazy_free_space_updater.hpp) branch on ++# __cplusplus >= 201103L and fall through to removed std::tr1 types ++# without it. ++if(MSVC) ++ add_compile_options(/Zc:__cplusplus) ++endif() ++ + option(WITH_OPENGL "Build the parts that depend on OpenGL" ON) + + if(WITH_OPENGL) + +diff --git a/semantic_world/src/semantic_world.cpp b/semantic_world/src/semantic_world.cpp +index fb9b659b..cdddabf4 100644 +--- a/semantic_world/src/semantic_world.cpp ++++ b/semantic_world/src/semantic_world.cpp +@@ -43,6 +43,10 @@ + #include + // OpenCV + #include ++#if CV_MAJOR_VERSION >= 5 ++// pointPolygonTest moved to the geometry module in OpenCV 5. ++#include ++#endif + #include + #include + #include + From 962b3980b66075cd2a1fbf4cb577e1111352a5bb Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 00:51:13 +1000 Subject: [PATCH 066/180] fix: py_binding_tools win-64 missing import library Same missing-dllexport-symbols pattern as several other packages this session: the py_binding_tools SHARED library has no dllexport annotations on its plain namespace functions (init/add_node/shutdown), so the sibling "rclcpp" pybind11 module (which links against it directly) failed with LNK2001 unresolved external symbol for exactly those three functions -- py_binding_tools.lib itself did get created (pybind11-related symbols elsewhere in the same library are exported some other way), just missing these specific ones. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-py-binding-tools.patch | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 patch/ros-rolling-py-binding-tools.patch diff --git a/patch/ros-rolling-py-binding-tools.patch b/patch/ros-rolling-py-binding-tools.patch new file mode 100644 index 000000000..4c7b7022e --- /dev/null +++ b/patch/ros-rolling-py-binding-tools.patch @@ -0,0 +1,18 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index aee2f26a..eb358c39 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -12,6 +12,12 @@ add_library(${PROJECT_NAME} SHARED + src/ros_msg_typecasters.cpp + src/initializer.cpp + ) ++# The rclcpp pybind11 module (below) links against this library directly, ++# so it needs an import .lib on Windows for the plain py_binding_tools:: ++# namespace functions (init/add_node/shutdown) -- this SHARED library has ++# no dllexport annotations on them, so without this MSVC's .lib ends up ++# missing those specific symbols. ++set_target_properties(${PROJECT_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + From b3790fc03836cca86cc0ece414d73a223ec3c8dd Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 01:10:24 +1000 Subject: [PATCH 067/180] fix: moveit_task_constructor_core win-64 non-standard uint typedef uint is a non-standard typedef available on Linux/macOS (via glibc/BSD headers pulled in transitively) but not on Windows/MSVC. properties.h's "using SourceFlags = uint;" failed to parse, cascading into every downstream use of SourceFlags in the same header (undeclared identifier / syntax errors throughout). Swept the whole checked-out tree for every real (non-test, non-vendored-pybind11) occurrence and replaced uint with unsigned int throughout: properties.h, introspection.h/.cpp, generate_place_pose.cpp, pipeline_planner.cpp, and the python bindings (solvers.cpp) which are unconditionally built via add_subdirectory(python). Co-Authored-By: Claude Sonnet 5 --- ...rolling-moveit-task-constructor-core.patch | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 patch/ros-rolling-moveit-task-constructor-core.patch diff --git a/patch/ros-rolling-moveit-task-constructor-core.patch b/patch/ros-rolling-moveit-task-constructor-core.patch new file mode 100644 index 000000000..188621264 --- /dev/null +++ b/patch/ros-rolling-moveit-task-constructor-core.patch @@ -0,0 +1,108 @@ +diff --git a/include/moveit/task_constructor/properties.h b/include/moveit/task_constructor/properties.h +index e217ad60..d6e332f6 100644 +--- a/include/moveit/task_constructor/properties.h ++++ b/include/moveit/task_constructor/properties.h +@@ -90,7 +90,7 @@ public: + /// exception thrown when trying to set a value not matching the declared type + class type_error; + +- using SourceFlags = uint; ++ using SourceFlags = unsigned int; + /// function callback used to initialize property value from another PropertyMap + using InitializerFunction = std::function; + + +diff --git a/include/moveit/task_constructor/introspection.h b/include/moveit/task_constructor/introspection.h +index cf4dfb76..ae396128 100644 +--- a/include/moveit/task_constructor/introspection.h ++++ b/include/moveit/task_constructor/introspection.h +@@ -111,7 +111,7 @@ private: + /// retrieve or set id of given stage + uint32_t stageId(const moveit::task_constructor::Stage* const s); + /// retrieve solution with given id +- const SolutionBase* solutionFromId(uint id) const; ++ const SolutionBase* solutionFromId(unsigned int id) const; + }; + } // namespace task_constructor + } // namespace moveit + +diff --git a/src/introspection.cpp b/src/introspection.cpp +index 5dfed5d9..134588ea 100644 +--- a/src/introspection.cpp ++++ b/src/introspection.cpp +@@ -218,7 +218,7 @@ void Introspection::publishAllSolutions(bool wait) { + }; + } + +-const SolutionBase* Introspection::solutionFromId(uint id) const { ++const SolutionBase* Introspection::solutionFromId(unsigned int id) const { + auto it = impl->id_solution_bimap_.left.find(id); + if (it == impl->id_solution_bimap_.left.end()) + return nullptr; + +diff --git a/src/stages/generate_place_pose.cpp b/src/stages/generate_place_pose.cpp +index 76b9559f..04e2a8cc 100644 +--- a/src/stages/generate_place_pose.cpp ++++ b/src/stages/generate_place_pose.cpp +@@ -109,11 +109,11 @@ void GeneratePlacePose::compute() { + scene->getTransforms().transformPose(pose_msg.header.frame_id, target_pose, target_pose); + + // spawn the nominal target object pose, considering flip about z and rotations about z-axis +- auto spawner = [&s, &scene, &ik_frame, this](const Eigen::Isometry3d& nominal, uint z_flips, uint z_rotations = 10) { +- for (uint flip = 0; flip <= z_flips; ++flip) { ++ auto spawner = [&s, &scene, &ik_frame, this](const Eigen::Isometry3d& nominal, unsigned int z_flips, unsigned int z_rotations = 10) { ++ for (unsigned int flip = 0; flip <= z_flips; ++flip) { + // flip about object's x-axis + Eigen::Isometry3d object = nominal * Eigen::AngleAxisd(flip * M_PI, Eigen::Vector3d::UnitX()); +- for (uint i = 0; i < z_rotations; ++i) { ++ for (unsigned int i = 0; i < z_rotations; ++i) { + // rotate object at target pose about world's z-axis + Eigen::Vector3d pos = object.translation(); + object.pretranslate(-pos) +@@ -139,7 +139,7 @@ void GeneratePlacePose::compute() { + } + }; + +- uint z_flips = props.get("allow_z_flip") ? 1 : 0; ++ unsigned int z_flips = props.get("allow_z_flip") ? 1 : 0; + if (object && object->getShapes().size() == 1) { + switch (object->getShapes()[0]->type) { + case shapes::CYLINDER: + +diff --git a/src/solvers/pipeline_planner.cpp b/src/solvers/pipeline_planner.cpp +index 9e30131a..bad168ee 100644 +--- a/src/solvers/pipeline_planner.cpp ++++ b/src/solvers/pipeline_planner.cpp +@@ -59,7 +59,7 @@ PipelinePlanner::PipelinePlanner( + , stopping_criterion_callback_(stopping_criterion_callback) + , solution_selection_function_(solution_selection_function) { + // Declare properties of the MotionPlanRequest +- properties().declare("num_planning_attempts", 1u, "number of planning attempts"); ++ properties().declare("num_planning_attempts", 1u, "number of planning attempts"); + properties().declare( + "workspace_parameters", moveit_msgs::msg::WorkspaceParameters(), "allowed workspace of mobile base?"); + +@@ -182,7 +182,7 @@ PlannerInterface::Result PipelinePlanner::plan(const planning_scene::PlanningSce + request.planner_id = planner_id; + request.allowed_planning_time = timeout; + request.start_state.is_diff = true; // we don't specify an extra start state +- request.num_planning_attempts = properties().get("num_planning_attempts"); ++ request.num_planning_attempts = properties().get("num_planning_attempts"); + request.max_velocity_scaling_factor = properties().get("max_velocity_scaling_factor"); + request.max_acceleration_scaling_factor = properties().get("max_acceleration_scaling_factor"); + request.workspace_parameters = properties().get("workspace_parameters"); + +diff --git a/python/bindings/src/solvers.cpp b/python/bindings/src/solvers.cpp +index 7c6a12f4..f1d60b31 100644 +--- a/python/bindings/src/solvers.cpp ++++ b/python/bindings/src/solvers.cpp +@@ -73,7 +73,7 @@ void export_solvers(py::module& m) { + pipelinePlanner = core.PipelinePlanner(node, 'ompl', 'PRMkConfigDefault') + pipelinePlanner.num_planning_attempts = 10 + )") +- .property("num_planning_attempts", "int: Number of planning attempts") ++ .property("num_planning_attempts", "int: Number of planning attempts") + .property( + "workspace_parameters", + ":moveit_msgs:`WorkspaceParameters`: Specifies workspace box to be used for Cartesian sampling") + From 8d871800d2bd9fda8453e7bacab71d478c0fda0d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 01:25:59 +1000 Subject: [PATCH 068/180] fix: moveit_task_constructor_core win-64 GCC-only __attribute__ usages MSVC has no __attribute__ keyword at all (GCC/Clang extension), causing genuine parse errors, not just ignored/unrecognized attributes: - container.cpp's __attribute__((unused)) on a debug-only static function -> portable C++17 [[maybe_unused]] instead. - python bindings' properties.cpp __attribute__((visibility("default"))) (relevant only for -fvisibility=hidden builds on Linux/macOS) -> guarded behind #if defined(__GNUC__) || defined(__clang__), a no-op on MSVC where cross-TU symbol visibility within the same target doesn't need it. Found proactively via the same __attribute__ grep sweep, before CI could hit the second one on a later round-trip. Co-Authored-By: Claude Sonnet 5 --- ...rolling-moveit-task-constructor-core.patch | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/patch/ros-rolling-moveit-task-constructor-core.patch b/patch/ros-rolling-moveit-task-constructor-core.patch index 188621264..93bd90539 100644 --- a/patch/ros-rolling-moveit-task-constructor-core.patch +++ b/patch/ros-rolling-moveit-task-constructor-core.patch @@ -106,3 +106,32 @@ index 7c6a12f4..f1d60b31 100644 "workspace_parameters", ":moveit_msgs:`WorkspaceParameters`: Specifies workspace box to be used for Cartesian sampling") +diff --git a/src/container.cpp b/src/container.cpp +index 797a6fb6..d92a5a40 100644 +--- a/src/container.cpp ++++ b/src/container.cpp +@@ -57,7 +57,7 @@ namespace moveit { + namespace task_constructor { + + // for debugging of how children interfaces evolve over time +-__attribute__((unused)) // silent unused-function warning ++[[maybe_unused]] // silent unused-function warning + static void printChildrenInterfaces(const ContainerBasePrivate& container, bool success, const Stage& creator, + std::ostream& os = std::cerr) { + static unsigned int id = 0; + +diff --git a/python/bindings/src/properties.cpp b/python/bindings/src/properties.cpp +index a96b292e..10461494 100644 +--- a/python/bindings/src/properties.cpp ++++ b/python/bindings/src/properties.cpp +@@ -158,7 +158,9 @@ bool PropertyConverterBase::insert(const std::type_index& type_index, const std: + return REGISTRY_SINGLETON.insert(type_index, ros_msg_name, to, from); + } + ++#if defined(__GNUC__) || defined(__clang__) + __attribute__((visibility("default"))) // export this symbol as visible in the shared library ++#endif + void export_properties(py::module& m) { + // clang-format off + py::classh(m, "Property", "Holds an arbitrarily typed value and a default value") + From 691849bc98cbabd39e9a7bc3c6634032a8c57248 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 01:57:19 +1000 Subject: [PATCH 069/180] fix: moveit_task_constructor_core win-64 missing fmt.lib target_link_libraries used the bare, un-namespaced "fmt" instead of the modern fmt::fmt imported target exported by find_package(fmt). The bare name doesn't resolve to the actual installed .lib file on Windows: LNK1181 cannot open input file 'fmt.lib'. Co-Authored-By: Claude Sonnet 5 --- .../ros-rolling-moveit-task-constructor-core.patch | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/patch/ros-rolling-moveit-task-constructor-core.patch b/patch/ros-rolling-moveit-task-constructor-core.patch index 93bd90539..f87329b52 100644 --- a/patch/ros-rolling-moveit-task-constructor-core.patch +++ b/patch/ros-rolling-moveit-task-constructor-core.patch @@ -135,3 +135,17 @@ index a96b292e..10461494 100644 // clang-format off py::classh(m, "Property", "Holds an arbitrarily typed value and a default value") +diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt +index 82e98756..147aa7bd 100644 +--- a/src/CMakeLists.txt ++++ b/src/CMakeLists.txt +@@ -38,7 +38,7 @@ add_library(${PROJECT_NAME} SHARED + solvers/multi_planner.cpp + ) + target_link_libraries(${PROJECT_NAME} +- fmt ++ fmt::fmt + ${moveit_core_TARGETS} + ${moveit_ros_planning_TARGETS} + ${moveit_ros_planning_interface_TARGETS} + From 70e18fb59d885c7cab1ba100dedc67ffd581c803 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 02:13:44 +1000 Subject: [PATCH 070/180] fix: moveit_task_constructor_core win-64 missing ws2_32 for gethostname introspection.cpp already correctly guards #include behind #ifdef _WIN32 for gethostname(), but the declaration alone isn't enough -- the implementation lives in ws2_32.lib, which isn't linked by default on Windows: LNK2019 unresolved external symbol gethostname. Co-Authored-By: Claude Sonnet 5 --- .../ros-rolling-moveit-task-constructor-core.patch | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/patch/ros-rolling-moveit-task-constructor-core.patch b/patch/ros-rolling-moveit-task-constructor-core.patch index f87329b52..7b7cb4c06 100644 --- a/patch/ros-rolling-moveit-task-constructor-core.patch +++ b/patch/ros-rolling-moveit-task-constructor-core.patch @@ -136,7 +136,7 @@ index a96b292e..10461494 100644 py::classh(m, "Property", "Holds an arbitrarily typed value and a default value") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt -index 82e98756..147aa7bd 100644 +index 82e98756..18ccfc27 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -38,7 +38,7 @@ add_library(${PROJECT_NAME} SHARED @@ -148,4 +148,16 @@ index 82e98756..147aa7bd 100644 ${moveit_core_TARGETS} ${moveit_ros_planning_TARGETS} ${moveit_ros_planning_interface_TARGETS} +@@ -47,6 +47,11 @@ target_link_libraries(${PROJECT_NAME} + ${moveit_task_constructor_msgs_TARGETS} + ${visualization_msgs_TARGETS} + ) ++if(WIN32) ++ # introspection.cpp's gethostname() call is declared via ++ # but implemented in ws2_32.lib, which isn't linked by default. ++ target_link_libraries(${PROJECT_NAME} ws2_32) ++endif() + target_include_directories(${PROJECT_NAME} + PUBLIC $ + $ From 453146f07f39b2467d5191adfe18ae1ffda2f477 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 02:38:55 +1000 Subject: [PATCH 071/180] fix: moveit_task_constructor_core win-64 pybind11 header collision This project vendors a smart_holder fork of pybind11 as a git submodule, but py_binding_tools::py_binding_tools (linked alongside it) transitively carries conda's own separately-versioned system pybind11 include directory. Angle-bracket includes like (e.g. py_binding_tools/ros_msg_typecasters.h) resolve via the compiler's global include search order, not "next to the including file" -- on Windows conda's copy came first, so both pybind11 copies' headers got processed in the same translation unit (properties.cpp), producing a cascade of "already defined"/"redefinition" errors in pybind11/detail/common.h. Force the vendored copy's include directory first for the affected target. Co-Authored-By: Claude Sonnet 5 --- ...rolling-moveit-task-constructor-core.patch | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/patch/ros-rolling-moveit-task-constructor-core.patch b/patch/ros-rolling-moveit-task-constructor-core.patch index 7b7cb4c06..09b1c421c 100644 --- a/patch/ros-rolling-moveit-task-constructor-core.patch +++ b/patch/ros-rolling-moveit-task-constructor-core.patch @@ -161,3 +161,29 @@ index 82e98756..18ccfc27 100644 PUBLIC $ $ +diff --git a/python/bindings/CMakeLists.txt b/python/bindings/CMakeLists.txt +index 26c86ac6..3d8eeb60 100644 +--- a/python/bindings/CMakeLists.txt ++++ b/python/bindings/CMakeLists.txt +@@ -7,6 +7,20 @@ target_link_libraries(${PROJECT_NAME}_python_tools PUBLIC ${PROJECT_NAME} + pybind11::pybind11 py_binding_tools::py_binding_tools) + # Use minimum-size optimization for pybind11 bindings + target_link_libraries(${PROJECT_NAME}_python_tools PUBLIC pybind11::opt_size) ++if(WIN32) ++ # py_binding_tools::py_binding_tools transitively pulls in conda's own ++ # (differently-versioned) system pybind11 include directory alongside ++ # this project's vendored smart_holder pybind11 fork. Angle-bracket ++ # includes like (e.g. from ++ # py_binding_tools/ros_msg_typecasters.h) resolve via the compiler's ++ # global include search order rather than "next to the including ++ # file", so whichever copy's directory comes first wins -- on Windows ++ # that ends up being conda's, causing both copies' headers to be ++ # processed in the same translation unit (ODR violations / "already ++ # defined" cascades). Force the vendored copy first. ++ target_include_directories(${PROJECT_NAME}_python_tools BEFORE PUBLIC ++ $) ++endif() + + # moveit.task_constructor + pybind11_add_module(pymoveit_mtc + From bcddef3003327c90430529b609c0c6891ae41a26 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 03:04:56 +1000 Subject: [PATCH 072/180] fix: moveit_task_constructor_capabilities win-64 missing fmt.lib Same bare "fmt" library name issue already fixed in moveit_task_constructor_core -- use the fmt::fmt imported target from find_package(fmt) instead. Checked all other sibling packages in the same monorepo (demo, visualization, rviz_marker_tools) for the same pattern; none of them have it. Co-Authored-By: Claude Sonnet 5 --- ...ling-moveit-task-constructor-capabilities.patch | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 patch/ros-rolling-moveit-task-constructor-capabilities.patch diff --git a/patch/ros-rolling-moveit-task-constructor-capabilities.patch b/patch/ros-rolling-moveit-task-constructor-capabilities.patch new file mode 100644 index 000000000..988022485 --- /dev/null +++ b/patch/ros-rolling-moveit-task-constructor-capabilities.patch @@ -0,0 +1,14 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 76003192..c8d7adfe 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -20,7 +20,7 @@ add_library(${PROJECT_NAME} SHARED + src/execute_task_solution_capability.cpp + ) + target_link_libraries(${PROJECT_NAME} PUBLIC +- fmt ++ fmt::fmt + ${rclcpp_action_TARGETS} + ${moveit_core_TARGETS} + ${moveit_ros_move_group_TARGETS} + From b7e6642a71713396dcc64380189a692ffa98f280 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 03:30:50 +1000 Subject: [PATCH 073/180] fix: moveit_task_constructor_visualization win-64 missing import libs Same missing-dllexport-symbols pattern as elsewhere this session, this time compounded by Qt: motion_planning_tasks_utils, its sibling motion_planning_tasks_properties, and moveit_task_visualization_tools are all SHARED libraries linked directly by motion_planning_tasks_rviz_plugin, with no dllexport annotations. WINDOWS_EXPORT_ALL_SYMBOLS alone isn't enough for the two libraries with Q_OBJECT classes (FlatMergeProxyModel, TreeMergeProxyModel, MarkerVisualizationProperty, TaskSolutionPanel, TaskSolutionVisualization) -- it only auto-exports plain functions, not Qt's MOC-generated staticMetaObject static data member (same class of gap as the earlier mavros egm96_5 fix). Added explicit dllexport/dllimport macros on each Q_OBJECT class in addition to WINDOWS_EXPORT_ALL_SYMBOLS for their other member functions. Co-Authored-By: Claude Sonnet 5 --- ...oveit-task-constructor-visualization.patch | 221 ++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 patch/ros-rolling-moveit-task-constructor-visualization.patch diff --git a/patch/ros-rolling-moveit-task-constructor-visualization.patch b/patch/ros-rolling-moveit-task-constructor-visualization.patch new file mode 100644 index 000000000..936d64ff2 --- /dev/null +++ b/patch/ros-rolling-moveit-task-constructor-visualization.patch @@ -0,0 +1,221 @@ +diff --git a/motion_planning_tasks/utils/CMakeLists.txt b/motion_planning_tasks/utils/CMakeLists.txt +index 436145dc..82ad0bfd 100644 +--- a/motion_planning_tasks/utils/CMakeLists.txt ++++ b/motion_planning_tasks/utils/CMakeLists.txt +@@ -6,6 +6,16 @@ set(SOURCES + icon.cpp + ) + add_library(${MOVEIT_LIB_NAME} SHARED ${SOURCES}) ++if(WIN32) ++ # FlatMergeProxyModel/TreeMergeProxyModel are linked directly by ++ # motion_planning_tasks_rviz_plugin, so they need an import .lib on ++ # Windows. WINDOWS_EXPORT_ALL_SYMBOLS covers their plain member ++ # functions; the classes are also explicitly annotated with ++ # MOTION_PLANNING_TASKS_UTILS_EXPORT to cover the MOC-generated ++ # staticMetaObject static data member, which auto-export doesn't reach. ++ set_target_properties(${MOVEIT_LIB_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) ++ target_compile_definitions(${MOVEIT_LIB_NAME} PRIVATE MOTION_PLANNING_TASKS_UTILS_BUILDING_DLL) ++endif() + + target_link_libraries(${MOVEIT_LIB_NAME} + ${QT_LIBRARIES} + +diff --git a/motion_planning_tasks/utils/flat_merge_proxy_model.h b/motion_planning_tasks/utils/flat_merge_proxy_model.h +index feced7e4..ba7a0e19 100644 +--- a/motion_planning_tasks/utils/flat_merge_proxy_model.h ++++ b/motion_planning_tasks/utils/flat_merge_proxy_model.h +@@ -39,6 +39,21 @@ + #include + #include + ++// Qt's MOC-generated staticMetaObject is a static data member, which ++// CMake's WINDOWS_EXPORT_ALL_SYMBOLS (used for this library's plain ++// functions) does not auto-export -- an explicit dllexport/dllimport ++// is needed on the whole class to also cover its vtable and Qt ++// metaobject machinery. ++#ifdef _WIN32 ++#ifdef MOTION_PLANNING_TASKS_UTILS_BUILDING_DLL ++#define MOTION_PLANNING_TASKS_UTILS_EXPORT __declspec(dllexport) ++#else ++#define MOTION_PLANNING_TASKS_UTILS_EXPORT __declspec(dllimport) ++#endif ++#else ++#define MOTION_PLANNING_TASKS_UTILS_EXPORT ++#endif ++ + namespace moveit_rviz_plugin { + namespace utils { + +@@ -49,7 +64,7 @@ class FlatMergeProxyModelPrivate; + * Removing top-level items will remove the whole embedded model if all top-level items from + * this model are to be removed. Otherwise, removal is forwarded to the embedded model. + */ +-class FlatMergeProxyModel : public QAbstractItemModel ++class MOTION_PLANNING_TASKS_UTILS_EXPORT FlatMergeProxyModel : public QAbstractItemModel + { + Q_OBJECT + Q_DECLARE_PRIVATE(FlatMergeProxyModel) + +diff --git a/motion_planning_tasks/utils/tree_merge_proxy_model.h b/motion_planning_tasks/utils/tree_merge_proxy_model.h +index df43128b..72087ea0 100644 +--- a/motion_planning_tasks/utils/tree_merge_proxy_model.h ++++ b/motion_planning_tasks/utils/tree_merge_proxy_model.h +@@ -39,6 +39,21 @@ + #include + #include + ++// Qt's MOC-generated staticMetaObject is a static data member, which ++// CMake's WINDOWS_EXPORT_ALL_SYMBOLS (used for this library's plain ++// functions) does not auto-export -- an explicit dllexport/dllimport ++// is needed on the whole class to also cover its vtable and Qt ++// metaobject machinery. ++#ifdef _WIN32 ++#ifdef MOTION_PLANNING_TASKS_UTILS_BUILDING_DLL ++#define MOTION_PLANNING_TASKS_UTILS_EXPORT __declspec(dllexport) ++#else ++#define MOTION_PLANNING_TASKS_UTILS_EXPORT __declspec(dllimport) ++#endif ++#else ++#define MOTION_PLANNING_TASKS_UTILS_EXPORT ++#endif ++ + namespace moveit_rviz_plugin { + namespace utils { + +@@ -48,7 +63,7 @@ class TreeMergeProxyModelPrivate; + * Each embedded model becomes a top-level item (with a given name) + * and all the model's top-level items will appear as its children. + */ +-class TreeMergeProxyModel : public QAbstractItemModel ++class MOTION_PLANNING_TASKS_UTILS_EXPORT TreeMergeProxyModel : public QAbstractItemModel + { + Q_OBJECT + Q_DECLARE_PRIVATE(TreeMergeProxyModel) + +diff --git a/motion_planning_tasks/properties/CMakeLists.txt b/motion_planning_tasks/properties/CMakeLists.txt +index 8296b9ea..98c81c39 100644 +--- a/motion_planning_tasks/properties/CMakeLists.txt ++++ b/motion_planning_tasks/properties/CMakeLists.txt +@@ -9,6 +9,12 @@ find_package(libyaml_vendor REQUIRED) + find_package(yaml REQUIRED) + + add_library(${MOVEIT_LIB_NAME} SHARED ${SOURCES}) ++if(WIN32) ++ # Linked directly by motion_planning_tasks_rviz_plugin, so it needs ++ # an import .lib on Windows -- same missing-dllexport-symbols issue ++ # already fixed for motion_planning_tasks_utils. ++ set_target_properties(${MOVEIT_LIB_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) ++endif() + + target_link_libraries(${MOVEIT_LIB_NAME} + ${QT_LIBRARIES} yaml + +diff --git a/visualization_tools/CMakeLists.txt b/visualization_tools/CMakeLists.txt +index bde4d614..a1971ed4 100644 +--- a/visualization_tools/CMakeLists.txt ++++ b/visualization_tools/CMakeLists.txt +@@ -18,6 +18,16 @@ add_library(${MOVEIT_LIB_NAME} SHARED + src/task_solution_visualization.cpp + ) + set_target_properties(${MOVEIT_LIB_NAME} PROPERTIES VERSION "${${PROJECT_NAME}_VERSION}") ++if(WIN32) ++ # Linked directly by motion_planning_tasks_rviz_plugin, so it needs ++ # an import .lib on Windows -- same missing-dllexport-symbols issue ++ # already fixed for motion_planning_tasks_utils/_properties. The ++ # MOVEIT_TASK_VISUALIZATION_TOOLS_EXPORT annotations on its Q_OBJECT ++ # classes cover their MOC-generated staticMetaObject data members, ++ # which WINDOWS_EXPORT_ALL_SYMBOLS's function-only auto-export misses. ++ set_target_properties(${MOVEIT_LIB_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) ++ target_compile_definitions(${MOVEIT_LIB_NAME} PRIVATE MOVEIT_TASK_VISUALIZATION_TOOLS_BUILDING_DLL) ++endif() + target_link_libraries(${MOVEIT_LIB_NAME} + ${QT_LIBRARIES} + rviz_ogre_vendor::OgreMain + +diff --git a/visualization_tools/include/moveit/visualization_tools/marker_visualization.h b/visualization_tools/include/moveit/visualization_tools/marker_visualization.h +index 1b3fcebe..e2da81f1 100644 +--- a/visualization_tools/include/moveit/visualization_tools/marker_visualization.h ++++ b/visualization_tools/include/moveit/visualization_tools/marker_visualization.h +@@ -95,7 +95,22 @@ private: + * The class remembers which MarkerVisualization instances are currently hosted + * and provides the user interaction to toggle marker visibility by namespace. + */ +-class MarkerVisualizationProperty : public rviz_common::properties::BoolProperty ++// Qt's MOC-generated staticMetaObject is a static data member, which ++// CMake's WINDOWS_EXPORT_ALL_SYMBOLS (used for this library's plain ++// functions) does not auto-export -- an explicit dllexport/dllimport ++// is needed on the whole class to also cover its vtable and Qt ++// metaobject machinery. ++#ifdef _WIN32 ++#ifdef MOVEIT_TASK_VISUALIZATION_TOOLS_BUILDING_DLL ++#define MOVEIT_TASK_VISUALIZATION_TOOLS_EXPORT __declspec(dllexport) ++#else ++#define MOVEIT_TASK_VISUALIZATION_TOOLS_EXPORT __declspec(dllimport) ++#endif ++#else ++#define MOVEIT_TASK_VISUALIZATION_TOOLS_EXPORT ++#endif ++ ++class MOVEIT_TASK_VISUALIZATION_TOOLS_EXPORT MarkerVisualizationProperty : public rviz_common::properties::BoolProperty + { + Q_OBJECT + + +diff --git a/visualization_tools/include/moveit/visualization_tools/task_solution_panel.h b/visualization_tools/include/moveit/visualization_tools/task_solution_panel.h +index 4e6e31ee..db7b77a5 100644 +--- a/visualization_tools/include/moveit/visualization_tools/task_solution_panel.h ++++ b/visualization_tools/include/moveit/visualization_tools/task_solution_panel.h +@@ -47,7 +47,22 @@ + #include + + namespace moveit_rviz_plugin { +-class TaskSolutionPanel : public rviz_common::Panel ++// Qt's MOC-generated staticMetaObject is a static data member, which ++// CMake's WINDOWS_EXPORT_ALL_SYMBOLS (used for this library's plain ++// functions) does not auto-export -- an explicit dllexport/dllimport ++// is needed on the whole class to also cover its vtable and Qt ++// metaobject machinery. ++#ifdef _WIN32 ++#ifdef MOVEIT_TASK_VISUALIZATION_TOOLS_BUILDING_DLL ++#define MOVEIT_TASK_VISUALIZATION_TOOLS_EXPORT __declspec(dllexport) ++#else ++#define MOVEIT_TASK_VISUALIZATION_TOOLS_EXPORT __declspec(dllimport) ++#endif ++#else ++#define MOVEIT_TASK_VISUALIZATION_TOOLS_EXPORT ++#endif ++ ++class MOVEIT_TASK_VISUALIZATION_TOOLS_EXPORT TaskSolutionPanel : public rviz_common::Panel + { + Q_OBJECT + + +diff --git a/visualization_tools/include/moveit/visualization_tools/task_solution_visualization.h b/visualization_tools/include/moveit/visualization_tools/task_solution_visualization.h +index c1a666b7..5265f27f 100644 +--- a/visualization_tools/include/moveit/visualization_tools/task_solution_visualization.h ++++ b/visualization_tools/include/moveit/visualization_tools/task_solution_visualization.h +@@ -90,7 +90,22 @@ MOVEIT_CLASS_FORWARD(DisplaySolution); + + class TaskSolutionPanel; + class MarkerVisualizationProperty; +-class TaskSolutionVisualization : public QObject ++// Qt's MOC-generated staticMetaObject is a static data member, which ++// CMake's WINDOWS_EXPORT_ALL_SYMBOLS (used for this library's plain ++// functions) does not auto-export -- an explicit dllexport/dllimport ++// is needed on the whole class to also cover its vtable and Qt ++// metaobject machinery. ++#ifdef _WIN32 ++#ifdef MOVEIT_TASK_VISUALIZATION_TOOLS_BUILDING_DLL ++#define MOVEIT_TASK_VISUALIZATION_TOOLS_EXPORT __declspec(dllexport) ++#else ++#define MOVEIT_TASK_VISUALIZATION_TOOLS_EXPORT __declspec(dllimport) ++#endif ++#else ++#define MOVEIT_TASK_VISUALIZATION_TOOLS_EXPORT ++#endif ++ ++class MOVEIT_TASK_VISUALIZATION_TOOLS_EXPORT TaskSolutionVisualization : public QObject + { + Q_OBJECT + + From 5881651759aab3fb11e3971310afbcd87168cc13 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 03:53:56 +1000 Subject: [PATCH 074/180] fix: mujoco_3d_lidar win-64 missing C++17 standard and M_PI CMakeLists.txt never set CMAKE_CXX_STANDARD at all -- MSVC's default doesn't enable nested-namespace-definition syntax or std::byte (used by mujoco_vendor's own mjspec.h), unlike GCC/Clang's more modern implicit defaults. Also add _USE_MATH_DEFINES for 3dlidar.cpp's bare M_PI usage, same fix already applied to several other packages this session. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-mujoco-3d-lidar.patch | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/patch/ros-rolling-mujoco-3d-lidar.patch b/patch/ros-rolling-mujoco-3d-lidar.patch index 03ce96099..90473fe04 100644 --- a/patch/ros-rolling-mujoco-3d-lidar.patch +++ b/patch/ros-rolling-mujoco-3d-lidar.patch @@ -24,3 +24,27 @@ index c5e30d3..4a99208 100644 #include #include +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 1fe40b85..86d04647 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -1,6 +1,18 @@ + cmake_minimum_required(VERSION 3.22) + project(mujoco_3d_lidar) + ++# mjspec.h uses std::byte and nested-namespace-definition syntax, both ++# C++17 features; without an explicit standard, MSVC doesn't enable ++# them by default (error C2429/C2039/C2065/C2923/C2976). ++if(NOT CMAKE_CXX_STANDARD) ++ set(CMAKE_CXX_STANDARD 17) ++ set(CMAKE_CXX_STANDARD_REQUIRED ON) ++endif() ++if(MSVC) ++ # 3dlidar.cpp uses bare M_PI, only defined by when this is set. ++ add_compile_definitions(_USE_MATH_DEFINES) ++endif() ++ + find_package(ament_cmake QUIET) + # Link MuJoCo via the vendor package + find_package(mujoco_vendor REQUIRED) + From 5d09fccc5f4d3f81da1a1aecbe0abc063f6cfbc6 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 04:06:08 +1000 Subject: [PATCH 075/180] fix: exclude mujoco_ros2_control_plugins (and dependents) from win-64 mujoco_ros2_control_plugins unconditionally requires find_package(OpenGL REQUIRED COMPONENTS EGL). EGL is a Linux/embedded graphics API with no Windows equivalent (Windows uses WGL) -- this is a genuine platform incompatibility, not something patchable. Extends the existing macOS-only skip (no prebuilt MuJoCo binary there) to also cover win-64, and correspondingly narrows mujoco_ros2_control/_demos's selection (which hard-depend on the plugins package) to linux-only. mujoco_3d_lidar itself is unaffected -- it doesn't need EGL and continues building on win-64. Co-Authored-By: Claude Sonnet 5 --- vinca.yaml | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/vinca.yaml b/vinca.yaml index 3f59c1b09..5678f8a54 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -41,11 +41,17 @@ packages_skip_by_deps: - tlsf_cpp # mujoco_vendor has no prebuilt MuJoCo binary for macOS, so mujoco_3d_lidar (which - # calls real MuJoCo API functions, unlike mujoco_ros2_control) can't build there; - # mujoco_ros2_control_plugins pulls it in transitively. + # calls real MuJoCo API functions, unlike mujoco_ros2_control) can't build there. - if: osx then: - mujoco_3d_lidar + + # mujoco_ros2_control_plugins unconditionally requires + # find_package(OpenGL REQUIRED COMPONENTS EGL) -- EGL doesn't exist on + # Windows (or macOS, covered by the mujoco_vendor gap above) at all, + # this is a genuine platform incompatibility, not a portability bug. + - if: osx or win + then: - mujoco_ros2_control_plugins packages_remove_from_deps: @@ -406,11 +412,11 @@ packages_select_by_deps: - rtcm_msgs - rviz2 - # mujoco_vendor has no prebuilt MuJoCo binary for macOS (see the - # packages_skip_by_deps mujoco_3d_lidar/mujoco_ros2_control_plugins entry - # above); mujoco_ros2_control hard-depends on mujoco_ros2_control_plugins, - # so it can't build there either. - - if: not wasm32 and not osx + # mujoco_ros2_control hard-depends on mujoco_ros2_control_plugins, which + # is skipped on osx (no prebuilt MuJoCo binary) and win (unconditional + # EGL requirement -- see the packages_skip_by_deps entries above), so + # it can't build on either platform either. + - if: not wasm32 and not osx and not win then: - mujoco_ros2_control - mujoco_ros2_control_demos From 80383d0451906eff9b49e618b631051b7fafb968 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 04:14:14 +1000 Subject: [PATCH 076/180] fix: nlohmann_json_schema_validator_vendor win-64 git clone path length The vendored ExternalProject_Add's git clone target directory (nested under rattler-build's own already-deep work directory, further nested under an ExternalProject-generated "-prefix/src/" path where itself embeds the full 40-char commit hash) exceeds Windows' MAX_PATH once .git's own internal object paths are appended, causing "Filename too long" and "Had to git clone more than once" until it gives up. Add core.longpaths=true to the existing GIT_CONFIG list. Co-Authored-By: Claude Sonnet 5 --- ...ng-nlohmann-json-schema-validator-vendor.patch | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch b/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch index a2a503cde..8c3cb9c80 100644 --- a/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch +++ b/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 2115dd4..5d0ea5f 100644 +index 2115dd4f..94700497 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ find_package(ament_cmake REQUIRED) @@ -11,3 +11,16 @@ index 2115dd4..5d0ea5f 100644 if(WIN32) if(DEFINED CMAKE_GENERATOR) +@@ -62,7 +62,10 @@ macro(build_nlohmann_json_schema_validator) + externalproject_add(nlohmann_json_schema_validator-${nlohmann_json_schema_validator_version} + GIT_REPOSITORY https://github.com/pboettch/json-schema-validator.git + GIT_TAG ${nlohmann_json_schema_validator_version} +- GIT_CONFIG advice.detachedHead=false ++ # core.longpaths avoids "Filename too long" git clone failures on ++ # Windows once the (already-deep) rattler-build work directory plus ++ # this ExternalProject's own nested clone path exceeds MAX_PATH. ++ GIT_CONFIG advice.detachedHead=false core.longpaths=true + # Suppress git update due to https://gitlab.kitware.com/cmake/cmake/-/issues/16419 + UPDATE_COMMAND "" + TIMEOUT 6000 + From 10cb6368526430631a4f8943daf9e2156ea2631d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 04:21:55 +1000 Subject: [PATCH 077/180] fix: shorten nlohmann_json_schema_validator_vendor's ExternalProject path core.longpaths=true alone didn't resolve the win-64 "Filename too long" git clone failure -- the same error persisted identically. Rename the ExternalProject target from one embedding the full 40-char commit hash (repeated in both the default "-prefix" and "src/" path components) to a short fixed name, and set an explicit short PREFIX, directly shortening the resulting clone path rather than relying on git/Windows long-path support actually being honored in this environment. Co-Authored-By: Claude Sonnet 5 --- ...lohmann-json-schema-validator-vendor.patch | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch b/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch index 8c3cb9c80..ec7405579 100644 --- a/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch +++ b/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 2115dd4f..94700497 100644 +index 2115dd4f..e259dd4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ find_package(ament_cmake REQUIRED) @@ -11,14 +11,23 @@ index 2115dd4f..94700497 100644 if(WIN32) if(DEFINED CMAKE_GENERATOR) -@@ -62,7 +62,10 @@ macro(build_nlohmann_json_schema_validator) - externalproject_add(nlohmann_json_schema_validator-${nlohmann_json_schema_validator_version} +@@ -59,10 +59,18 @@ macro(build_nlohmann_json_schema_validator) + include(ExternalProject) + # HEAD of `main` branch on 2022-10-07 + set(nlohmann_json_schema_validator_version "5ef4f903af055550e06955973a193e17efded896") +- externalproject_add(nlohmann_json_schema_validator-${nlohmann_json_schema_validator_version} ++ # Use a short, fixed ExternalProject name/PREFIX rather than one ++ # embedding the full 40-char commit hash (repeated in both the ++ # "-prefix" and "src/" path components by CMake's default ++ # layout) -- combined with rattler-build's own already-deep Windows ++ # work directory, the resulting git clone target path exceeded ++ # Windows' MAX_PATH ("Filename too long"), and core.longpaths alone ++ # did not resolve it. ++ externalproject_add(nlohmann_json_schema_validator_ext ++ PREFIX ${CMAKE_CURRENT_BINARY_DIR}/ext GIT_REPOSITORY https://github.com/pboettch/json-schema-validator.git GIT_TAG ${nlohmann_json_schema_validator_version} - GIT_CONFIG advice.detachedHead=false -+ # core.longpaths avoids "Filename too long" git clone failures on -+ # Windows once the (already-deep) rattler-build work directory plus -+ # this ExternalProject's own nested clone path exceeds MAX_PATH. + GIT_CONFIG advice.detachedHead=false core.longpaths=true # Suppress git update due to https://gitlab.kitware.com/cmake/cmake/-/issues/16419 UPDATE_COMMAND "" From f687773b61992e404c3a4769294d6660f20011a6 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 04:30:17 +1000 Subject: [PATCH 078/180] fix: nlohmann_json_schema_validator_vendor win-64 PATCH_COMMAND redirect The clone-path shortening fix worked (no more "Filename too long"), surfacing a second, previously-hidden issue: PATCH_COMMAND used shell redirection ("patch -p1 < file"), which ExternalProject's Windows custom-build-step execution doesn't reliably honor -- the argument got corrupted with the win-only "BUILD_COMMAND ..." entry appended right after via ${cmake_commands}, so patch tried to read that string as its input file instead of patch_cmakelist. Use patch's own -i/--input flag instead, parsed directly with no shell redirection involved. Co-Authored-By: Claude Sonnet 5 --- ...-nlohmann-json-schema-validator-vendor.patch | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch b/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch index ec7405579..ada308ee2 100644 --- a/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch +++ b/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 2115dd4f..e259dd4c 100644 +index 2115dd4f..2e81b60d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ find_package(ament_cmake REQUIRED) @@ -11,7 +11,7 @@ index 2115dd4f..e259dd4c 100644 if(WIN32) if(DEFINED CMAKE_GENERATOR) -@@ -59,10 +59,18 @@ macro(build_nlohmann_json_schema_validator) +@@ -59,14 +59,30 @@ macro(build_nlohmann_json_schema_validator) include(ExternalProject) # HEAD of `main` branch on 2022-10-07 set(nlohmann_json_schema_validator_version "5ef4f903af055550e06955973a193e17efded896") @@ -32,4 +32,17 @@ index 2115dd4f..e259dd4c 100644 # Suppress git update due to https://gitlab.kitware.com/cmake/cmake/-/issues/16419 UPDATE_COMMAND "" TIMEOUT 6000 +- PATCH_COMMAND patch -p1 < ${CMAKE_CURRENT_LIST_DIR}/patch_cmakelist ++ # Avoid shell redirection ("patch -p1 < file") in PATCH_COMMAND -- ++ # ExternalProject's Windows custom-build-step execution doesn't ++ # reliably honor "<" the way Unix's does, corrupting the argument ++ # list ("patching file 'BUILD_COMMAND ...'", i.e. the win-only ++ # BUILD_COMMAND entry appended to cmake_commands below got ++ # concatenated into what patch treated as its input file). Use ++ # patch's own -i/--input flag instead, parsed directly by patch ++ # itself with no shell redirection involved. ++ PATCH_COMMAND patch -p1 -i ${CMAKE_CURRENT_LIST_DIR}/patch_cmakelist + ${cmake_commands} + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX=${json_external_project_dir}/install/ From 50981f2a620eb927c2234593b32f5a161fbd7d15 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 04:39:13 +1000 Subject: [PATCH 079/180] fix: nlohmann_json_schema_validator_vendor win-64 BUILD_COMMAND keyword merge The previous -i fix treated the wrong root cause. The real bug is upstream: list(APPEND cmake_commands "BUILD_COMMAND ${_build_command}") quotes BUILD_COMMAND and the command together as ONE list element, so when spliced into externalproject_add() via ${cmake_commands}, cmake_parse_arguments never sees a standalone BUILD_COMMAND keyword to split on -- the whole blob gets swallowed as trailing arguments of the preceding PATCH_COMMAND instead, corrupting what patch.exe receives ("patching file 'BUILD_COMMAND ...'"). Fixed by appending BUILD_COMMAND and the command as separate list elements. Co-Authored-By: Claude Sonnet 5 --- ...lohmann-json-schema-validator-vendor.patch | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch b/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch index ada308ee2..10d1c41e0 100644 --- a/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch +++ b/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 2115dd4f..2e81b60d 100644 +index 2115dd4..86bd3da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ find_package(ament_cmake REQUIRED) @@ -11,7 +11,25 @@ index 2115dd4f..2e81b60d 100644 if(WIN32) if(DEFINED CMAKE_GENERATOR) -@@ -59,14 +59,30 @@ macro(build_nlohmann_json_schema_validator) +@@ -21,7 +21,16 @@ macro(build_nlohmann_json_schema_validator) + if(DEFINED CMAKE_BUILD_TYPE) + if(WIN32) + build_command(_build_command CONFIGURATION ${CMAKE_BUILD_TYPE}) +- list(APPEND cmake_commands "BUILD_COMMAND ${_build_command}") ++ # Must NOT be a single quoted string ("BUILD_COMMAND ${_build_command}") -- ++ # that merges the BUILD_COMMAND keyword and the command text into ONE ++ # list element. Spliced into externalproject_add() below via ++ # ${cmake_commands}, cmake_parse_arguments then never sees a standalone ++ # "BUILD_COMMAND" keyword to split on, so the whole blob gets swallowed ++ # as trailing arguments of the preceding PATCH_COMMAND instead -- ++ # corrupting what patch.exe is invoked with ("patching file ++ # 'BUILD_COMMAND ...'"). Appending as separate list elements lets ++ # BUILD_COMMAND be recognized as its own keyword. ++ list(APPEND cmake_commands BUILD_COMMAND ${_build_command}) + else() + list(APPEND cmake_configure_args -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}) + endif() +@@ -59,14 +68,22 @@ macro(build_nlohmann_json_schema_validator) include(ExternalProject) # HEAD of `main` branch on 2022-10-07 set(nlohmann_json_schema_validator_version "5ef4f903af055550e06955973a193e17efded896") @@ -33,16 +51,7 @@ index 2115dd4f..2e81b60d 100644 UPDATE_COMMAND "" TIMEOUT 6000 - PATCH_COMMAND patch -p1 < ${CMAKE_CURRENT_LIST_DIR}/patch_cmakelist -+ # Avoid shell redirection ("patch -p1 < file") in PATCH_COMMAND -- -+ # ExternalProject's Windows custom-build-step execution doesn't -+ # reliably honor "<" the way Unix's does, corrupting the argument -+ # list ("patching file 'BUILD_COMMAND ...'", i.e. the win-only -+ # BUILD_COMMAND entry appended to cmake_commands below got -+ # concatenated into what patch treated as its input file). Use -+ # patch's own -i/--input flag instead, parsed directly by patch -+ # itself with no shell redirection involved. + PATCH_COMMAND patch -p1 -i ${CMAKE_CURRENT_LIST_DIR}/patch_cmakelist ${cmake_commands} CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${json_external_project_dir}/install/ - From 452aa0a6ec1dff3f8250f2bc3f2fd583c44a7a4a Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 04:46:40 +1000 Subject: [PATCH 080/180] fix: nlohmann_json_schema_validator_vendor win-64 BUILD_COMMAND double-quoting Patch step now targets CMakeLists.txt correctly (previous commit's fix), surfacing the next issue: build_command() returns one pre-quoted command-line string meant for shell/execute_process use, not a token list. Appending that whole string as a single BUILD_COMMAND argument makes the VS generator wrap it in an extra layer of quotes, so cmd.exe treats the entire quoted blob (including the cmake.exe path) as one program name (exit 9009, "is not recognized as an internal or external command"). Build BUILD_COMMAND from separate tokens using ${CMAKE_COMMAND} directly instead, matching normal ExternalProject_Add usage. Co-Authored-By: Claude Sonnet 5 --- ...lohmann-json-schema-validator-vendor.patch | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch b/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch index 10d1c41e0..34b261427 100644 --- a/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch +++ b/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 2115dd4..86bd3da 100644 +index 2115dd4..7ffba64 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ find_package(ament_cmake REQUIRED) @@ -11,25 +11,25 @@ index 2115dd4..86bd3da 100644 if(WIN32) if(DEFINED CMAKE_GENERATOR) -@@ -21,7 +21,16 @@ macro(build_nlohmann_json_schema_validator) +@@ -20,8 +20,15 @@ macro(build_nlohmann_json_schema_validator) + if(DEFINED CMAKE_BUILD_TYPE) if(WIN32) - build_command(_build_command CONFIGURATION ${CMAKE_BUILD_TYPE}) +- build_command(_build_command CONFIGURATION ${CMAKE_BUILD_TYPE}) - list(APPEND cmake_commands "BUILD_COMMAND ${_build_command}") -+ # Must NOT be a single quoted string ("BUILD_COMMAND ${_build_command}") -- -+ # that merges the BUILD_COMMAND keyword and the command text into ONE -+ # list element. Spliced into externalproject_add() below via -+ # ${cmake_commands}, cmake_parse_arguments then never sees a standalone -+ # "BUILD_COMMAND" keyword to split on, so the whole blob gets swallowed -+ # as trailing arguments of the preceding PATCH_COMMAND instead -- -+ # corrupting what patch.exe is invoked with ("patching file -+ # 'BUILD_COMMAND ...'"). Appending as separate list elements lets -+ # BUILD_COMMAND be recognized as its own keyword. -+ list(APPEND cmake_commands BUILD_COMMAND ${_build_command}) ++ # build_command() returns ONE pre-quoted command-line string (meant ++ # for shell/execute_process use), not a token list. Appending it as ++ # a single BUILD_COMMAND argument makes the VS generator wrap that ++ # whole string in an extra layer of quotes, so cmd.exe then treats ++ # the entire quoted blob (cmake.exe path and all) as one program ++ # name ("... is not recognized as an internal or external command"). ++ # Build BUILD_COMMAND from separate tokens using ${CMAKE_COMMAND} ++ # directly instead, matching normal ExternalProject_Add usage. ++ list(APPEND cmake_commands BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}) else() list(APPEND cmake_configure_args -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}) endif() -@@ -59,14 +68,22 @@ macro(build_nlohmann_json_schema_validator) +@@ -59,14 +66,22 @@ macro(build_nlohmann_json_schema_validator) include(ExternalProject) # HEAD of `main` branch on 2022-10-07 set(nlohmann_json_schema_validator_version "5ef4f903af055550e06955973a193e17efded896") From 694edd17a6dcb05b610c1af7a48f1dce714c26b2 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 04:54:32 +1000 Subject: [PATCH 081/180] fix: nlohmann_json_schema_validator_vendor win-64 BUILD_TESTS option name The recipe passes -DJSON_VALIDATOR_BUILD_TESTS/EXAMPLES:BOOL=OFF, but this pinned vendor commit's actual options are BUILD_TESTS/BUILD_EXAMPLES (no JSON_VALIDATOR_ prefix) -- confirmed via the pinned commit's own CMakeLists.txt. The wrong names were silently ignored ("Manually- specified variables were not used by the project"), so tests/examples built ON by default. Harmless on Unix, but the vendored shared library doesn't export symbols for Windows, so building its test executables then fails to link against it (LNK2019 on nlohmann::json_patch symbols). Pass the real option names to actually disable them. Co-Authored-By: Claude Sonnet 5 --- ...lohmann-json-schema-validator-vendor.patch | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch b/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch index 34b261427..0a0098a94 100644 --- a/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch +++ b/patch/ros-rolling-nlohmann-json-schema-validator-vendor.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 2115dd4..7ffba64 100644 +index 2115dd4..5021d26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ find_package(ament_cmake REQUIRED) @@ -29,7 +29,7 @@ index 2115dd4..7ffba64 100644 else() list(APPEND cmake_configure_args -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}) endif() -@@ -59,14 +66,22 @@ macro(build_nlohmann_json_schema_validator) +@@ -59,20 +66,35 @@ macro(build_nlohmann_json_schema_validator) include(ExternalProject) # HEAD of `main` branch on 2022-10-07 set(nlohmann_json_schema_validator_version "5ef4f903af055550e06955973a193e17efded896") @@ -55,3 +55,18 @@ index 2115dd4..7ffba64 100644 ${cmake_commands} CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${json_external_project_dir}/install/ + -DBUILD_SHARED_LIBS:BOOL=ON +- -DJSON_VALIDATOR_BUILD_TESTS:BOOL=OFF +- -DJSON_VALIDATOR_BUILD_EXAMPLES:BOOL=OFF ++ # This pinned commit's actual option names are BUILD_TESTS/ ++ # BUILD_EXAMPLES (no JSON_VALIDATOR_ prefix) -- the old names were ++ # silently ignored ("Manually-specified variables were not used by ++ # the project"), so tests/examples built ON by default. Harmless on ++ # Unix, but the vendored shared library doesn't export symbols for ++ # Windows, so the test executables then fail to link against it ++ # (LNK2019). ++ -DBUILD_TESTS:BOOL=OFF ++ -DBUILD_EXAMPLES:BOOL=OFF + ${cmake_configure_args} + ) + From be78cdbbd9c847b4dd755348f77076d486ec6b8d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 05:13:23 +1000 Subject: [PATCH 082/180] fix: ouster_ros win-64 libzip detection ouster-sdk's Findlibzip.cmake only searches find_library() for Unix-style names (libzip, libzip.so, libzip.dylib), explicitly marked "Linux/macos only". conda-forge's libzip ships the Windows import lib as "zip.lib" (no "lib" prefix, matching MSVC convention), so CMake configure fails with "Could NOT find libzip (missing: libzip_LIBRARIES)" despite find_package(libzip CONFIG) already having found the right version. Add "zip" to the search names. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-ouster-ros.patch | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/patch/ros-rolling-ouster-ros.patch b/patch/ros-rolling-ouster-ros.patch index 7947fd7e0..5ad988561 100644 --- a/patch/ros-rolling-ouster-ros.patch +++ b/patch/ros-rolling-ouster-ros.patch @@ -120,3 +120,21 @@ index 94d50eb..b1e05ce 100644 void declare_parameters() { node->declare_parameter("sensor_frame", "os_sensor"); +diff --git a/ouster-sdk/cmake/Findlibzip.cmake b/ouster-sdk/cmake/Findlibzip.cmake +index 0de2ad5..266cf93 100644 +--- a/ouster-sdk/cmake/Findlibzip.cmake ++++ b/ouster-sdk/cmake/Findlibzip.cmake +@@ -37,9 +37,11 @@ find_path(libzip_INCLUDE_DIRS + HINTS ${pkg_libzip_INCLUDE_DIRS}) + mark_as_advanced(libzip_INCLUDE_DIRS) + +-# Linux/macos only ++# conda-forge's libzip ships the Windows import lib as "zip.lib" (no ++# "lib" prefix, matching MSVC convention), so it's never found by the ++# Unix-only names below -- add it too. + find_library(libzip_LIBRARIES NAMES +- libzip libzip.so libzip.dylib ++ libzip libzip.so libzip.dylib zip + HINTS ${pkg_libzip_LIBRARY_DIRS}) + mark_as_advanced(libzip_LIBRARIES) + From 7cbe7424c9231345cf89ab026f7939a72c042d35 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 05:33:02 +1000 Subject: [PATCH 083/180] fix: ouster_ros win-64 spdlog bundled/external fmt collision Compile of ouster_client/src/logging.cpp failed with a cascade of MSVC errors (C2990, C2955, C2011, ...) all rooted in fmt::v10 template declarations being processed twice. Root cause: some ROS dependency's exported CMake config leaves SPDLOG_FMT_EXTERNAL defined at directory scope when ouster-sdk is add_subdirectory()'d from the ouster_ros wrapper, so spdlog's own headers (spdlog.h -> fmt.h) resolve to the external/conda system fmt. But logging.cpp unconditionally includes spdlog's *bundled* fmt copy directly (, upstream spdlog's own design, not gated on SPDLOG_FMT_EXTERNAL) -- both copies' fmt::v10 declarations then collide in the same translation unit. Force this subtree back to spdlog's bundled fmt consistently via remove_definitions(), matching what logging.cpp already assumes. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-ouster-ros.patch | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/patch/ros-rolling-ouster-ros.patch b/patch/ros-rolling-ouster-ros.patch index 5ad988561..bf1554bc9 100644 --- a/patch/ros-rolling-ouster-ros.patch +++ b/patch/ros-rolling-ouster-ros.patch @@ -138,3 +138,28 @@ index 0de2ad5..266cf93 100644 HINTS ${pkg_libzip_LIBRARY_DIRS}) mark_as_advanced(libzip_LIBRARIES) +diff --git a/ouster-sdk/CMakeLists.txt b/ouster-sdk/CMakeLists.txt +index 4c6e3ac..0937a63 100644 +--- a/ouster-sdk/CMakeLists.txt ++++ b/ouster-sdk/CMakeLists.txt +@@ -13,6 +13,20 @@ endif() + list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + include(DefaultBuildType) + ++# When built as part of the ouster_ros ROS wrapper (add_subdirectory()'d ++# from its CMakeLists.txt, not as a standalone project), some ROS ++# dependency's exported CMake config leaves SPDLOG_FMT_EXTERNAL defined ++# at directory scope, which cascades down into this subtree. That makes ++# spdlog's own headers (spdlog.h -> fmt.h) pull in the external/system ++# fmt, while ouster_client/src/logging.cpp unconditionally includes ++# spdlog's *bundled* fmt copy (, upstream ++# spdlog design, not conditional on SPDLOG_FMT_EXTERNAL) -- both then ++# get processed in the same translation unit and their fmt::v10 ++# template declarations collide (MSVC C2990/C2955/... "already ++# declared"/"already has a body"). Force this subtree back to spdlog's ++# bundled fmt consistently, matching what logging.cpp already assumes. ++remove_definitions(-DSPDLOG_FMT_EXTERNAL) ++ + # configure vcpkg from environment variables, if present + include(VcpkgEnv) + From 36b27f618c95cdd49bd71dca542bb182941d927c Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 05:49:41 +1000 Subject: [PATCH 084/180] fix: ouster_ros win-64 spdlog fmt collision via #undef, not CMake The previous remove_definitions(-DSPDLOG_FMT_EXTERNAL) fix in ouster-sdk/CMakeLists.txt had no effect -- identical fmt::v10 collision recurred on the next CI run, proving the macro isn't coming from a directory-scoped add_definitions()/add_compile_definitions() that remove_definitions() can undo. It's most likely baked into this build's compiler flags directly (e.g. CMAKE_CXX_FLAGS from a ROS/ament toolchain), which is invisible to CMake's directory-property removal. Fix at the only level that reliably wins over a compiler-flag-level -D: #undef SPDLOG_FMT_EXTERNAL (and SPDLOG_USE_STD_FORMAT) directly in spdlog's own tweakme.h, which every spdlog/fmt/*.h shim includes first before branching on it. This makes spdlog consistently resolve to its own bundled fmt copy, matching what logging.cpp's hardcoded include already assumes -- regardless of how or where the build tries to set that macro. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-ouster-ros.patch | 44 ++++++++++++++---------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/patch/ros-rolling-ouster-ros.patch b/patch/ros-rolling-ouster-ros.patch index bf1554bc9..658a9f371 100644 --- a/patch/ros-rolling-ouster-ros.patch +++ b/patch/ros-rolling-ouster-ros.patch @@ -138,28 +138,26 @@ index 0de2ad5..266cf93 100644 HINTS ${pkg_libzip_LIBRARY_DIRS}) mark_as_advanced(libzip_LIBRARIES) -diff --git a/ouster-sdk/CMakeLists.txt b/ouster-sdk/CMakeLists.txt -index 4c6e3ac..0937a63 100644 ---- a/ouster-sdk/CMakeLists.txt -+++ b/ouster-sdk/CMakeLists.txt -@@ -13,6 +13,20 @@ endif() - list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) - include(DefaultBuildType) +diff --git a/ouster-sdk/thirdparty/spdlog/tweakme.h b/ouster-sdk/thirdparty/spdlog/tweakme.h +index a47a907..73db884 100644 +--- a/ouster-sdk/thirdparty/spdlog/tweakme.h ++++ b/ouster-sdk/thirdparty/spdlog/tweakme.h +@@ -81,6 +81,18 @@ + // #define SPDLOG_FMT_EXTERNAL + /////////////////////////////////////////////////////////////////////////////// -+# When built as part of the ouster_ros ROS wrapper (add_subdirectory()'d -+# from its CMakeLists.txt, not as a standalone project), some ROS -+# dependency's exported CMake config leaves SPDLOG_FMT_EXTERNAL defined -+# at directory scope, which cascades down into this subtree. That makes -+# spdlog's own headers (spdlog.h -> fmt.h) pull in the external/system -+# fmt, while ouster_client/src/logging.cpp unconditionally includes -+# spdlog's *bundled* fmt copy (, upstream -+# spdlog design, not conditional on SPDLOG_FMT_EXTERNAL) -- both then -+# get processed in the same translation unit and their fmt::v10 -+# template declarations collide (MSVC C2990/C2955/... "already -+# declared"/"already has a body"). Force this subtree back to spdlog's -+# bundled fmt consistently, matching what logging.cpp already assumes. -+remove_definitions(-DSPDLOG_FMT_EXTERNAL) ++// Force spdlog's bundled fmt copy regardless of any SPDLOG_FMT_EXTERNAL ++// baked into this build's compiler flags (e.g. by a ROS/ament toolchain ++// setting): ouster_client/src/logging.cpp unconditionally includes ++// spdlog's *bundled* fmt headers directly (, ++// upstream spdlog's own design, not gated on SPDLOG_FMT_EXTERNAL). If the ++// rest of spdlog's headers resolve to the *external* system fmt instead, ++// both copies' fmt::v10 template declarations collide in the same ++// translation unit (MSVC C2990/C2955/C2011/...). #undef here -- not a ++// CMake-level fix -- so it wins even over a compiler-flag-level define. ++#undef SPDLOG_FMT_EXTERNAL ++#undef SPDLOG_USE_STD_FORMAT + - # configure vcpkg from environment variables, if present - include(VcpkgEnv) - + /////////////////////////////////////////////////////////////////////////////// + // Uncomment to use C++20 std::format instead of fmt. + // From fcc99dd94fc568f1507b0ec26aa33806d2f8e5da Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 06:04:14 +1000 Subject: [PATCH 085/180] fix: ouster_ros win-64 spdlog include-path priority, not macro Both previous attempts at the fmt::v10 collision (remove_definitions() in CMakeLists.txt, then #undef in the vendored tweakme.h) had zero effect -- identical error, identical line numbers, on both retries. That rules out any macro-based explanation: the vendored tweakme.h being patched clearly isn't even the file getting included for this translation unit. Real cause: some other found/linked dependency's include dirs put a conda-forge system spdlog package ahead of ouster_client's own vendored thirdparty/spdlog in the search order, so resolves to that external copy (built assuming external fmt) while logging.cpp's own (upstream spdlog's own design, always included directly) can only resolve to the vendored copy, since the system package doesn't ship fmt/bundled/*. Both then declare fmt::v10 in the same translation unit and collide. Fix: add BEFORE to ouster_client's own target_include_directories() calls so its vendored thirdparty dirs are searched first, ahead of anything pulled in transitively -- the same pattern already used for the pybind11 vendored-vs-conda collision in moveit_task_constructor_core earlier this session. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-ouster-ros.patch | 54 ++++++++++++++++++------------ 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/patch/ros-rolling-ouster-ros.patch b/patch/ros-rolling-ouster-ros.patch index 658a9f371..96cf04c0e 100644 --- a/patch/ros-rolling-ouster-ros.patch +++ b/patch/ros-rolling-ouster-ros.patch @@ -138,26 +138,36 @@ index 0de2ad5..266cf93 100644 HINTS ${pkg_libzip_LIBRARY_DIRS}) mark_as_advanced(libzip_LIBRARIES) -diff --git a/ouster-sdk/thirdparty/spdlog/tweakme.h b/ouster-sdk/thirdparty/spdlog/tweakme.h -index a47a907..73db884 100644 ---- a/ouster-sdk/thirdparty/spdlog/tweakme.h -+++ b/ouster-sdk/thirdparty/spdlog/tweakme.h -@@ -81,6 +81,18 @@ - // #define SPDLOG_FMT_EXTERNAL - /////////////////////////////////////////////////////////////////////////////// +diff --git a/ouster-sdk/ouster_client/CMakeLists.txt b/ouster-sdk/ouster_client/CMakeLists.txt +index f17eeb4..1cb5d2f 100644 +--- a/ouster-sdk/ouster_client/CMakeLists.txt ++++ b/ouster-sdk/ouster_client/CMakeLists.txt +@@ -64,7 +64,18 @@ if(WIN32) + target_link_libraries(ouster_client PUBLIC ws2_32) + endif() -+// Force spdlog's bundled fmt copy regardless of any SPDLOG_FMT_EXTERNAL -+// baked into this build's compiler flags (e.g. by a ROS/ament toolchain -+// setting): ouster_client/src/logging.cpp unconditionally includes -+// spdlog's *bundled* fmt headers directly (, -+// upstream spdlog's own design, not gated on SPDLOG_FMT_EXTERNAL). If the -+// rest of spdlog's headers resolve to the *external* system fmt instead, -+// both copies' fmt::v10 template declarations collide in the same -+// translation unit (MSVC C2990/C2955/C2011/...). #undef here -- not a -+// CMake-level fix -- so it wins even over a compiler-flag-level define. -+#undef SPDLOG_FMT_EXTERNAL -+#undef SPDLOG_USE_STD_FORMAT -+ - /////////////////////////////////////////////////////////////////////////////// - // Uncomment to use C++20 std::format instead of fmt. - // +-target_include_directories(ouster_client ++# BEFORE: a conda-forge spdlog package (pulled in transitively by some ++# other linked/found dependency) can end up ahead of our own explicit ++# include dirs, so resolves to that *external* system ++# copy (built assuming external fmt) instead of our vendored one, while ++# logging.cpp's own (upstream spdlog's own ++# design, always included directly) can only ever resolve to our ++# vendored copy (the system package doesn't ship fmt/bundled/*). Mixing ++# those two in one translation unit collides on fmt::v10's template ++# declarations (MSVC C2990/C2955/C2011/...). Force our vendored ++# thirdparty dirs to the front of the search order so every ++# include resolves consistently to the vendored copy. ++target_include_directories(ouster_client BEFORE + PUBLIC + $ + $ +@@ -73,7 +84,7 @@ target_include_directories(ouster_client + $ + ) + +-target_include_directories(ouster_client SYSTEM ++target_include_directories(ouster_client SYSTEM BEFORE + PUBLIC + $ + $ From 6c2655c4a2534a5b72cd5ef2e2eb573abbccc861 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 06:21:21 +1000 Subject: [PATCH 086/180] fix: exclude ouster_ros from win-64 (pcl_io.lib not found) After resolving the fmt/spdlog collision (fcc99dd), the build reached linking and hit LNK1181: cannot open input file 'pcl_io.lib'. The wrapper's CMakeLists.txt only does find_package(PCL REQUIRED COMPONENTS common), but something links against a bare "pcl_io" name regardless (likely via pcl_conversions' own exported PCL_LIBRARIES, which lists component libs by bare name even when not explicitly requested/found). conda-forge's Windows PCL package apparently doesn't expose pcl_io.lib under that plain name. This is exactly what the pre-existing inline TODO on this line anticipated ("TODO on windows: cannot open pcl_io.lib") -- already a known, unresolved Windows blocker before this session started, and distinct in kind from the earlier fixes on this package (a genuine PCL packaging/naming mismatch rather than an ODR/include-order bug this session could safely fix at the patch level). Move ouster_ros to the existing "not wasm32 and not win" selection block instead of continuing to chase it, matching the exclusion precedent already used this session for mujoco_ros2_control_plugins (EGL). Co-Authored-By: Claude Sonnet 5 --- vinca.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vinca.yaml b/vinca.yaml index 5678f8a54..9d7ec28bf 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -365,7 +365,6 @@ packages_select_by_deps: - moveit_task_constructor_demo - nmea_msgs - odom_to_tf_ros2 - - ouster_ros # TODO on windows: cannot open pcl_io.lib - pal_statistics - pilz_industrial_motion_planner - pinocchio @@ -438,6 +437,7 @@ packages_select_by_deps: # pool their then-items together and reshuffle across the boundary. - if: not wasm32 and not win then: + - ouster_ros # conda-forge's Windows PCL package doesn't expose pcl_io.lib by the plain name ouster_ros's CMake links against (LNK1181) - rosgraph_monitor - rviz_2d_overlay_plugins - sick_safetyscanners_base From 8a6f7ac9eeff931571b299cef9e1fce4074d2f58 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 06:58:57 +1000 Subject: [PATCH 087/180] fix: plotjuggler win-64 missing Qt5::Xml link (QDomDocument) LNK2019 unresolved external symbol for QDomDocument::~QDomDocument in plotjuggler_base (transform_function.obj) -- transform_function.h uses QDomDocument (Qt XML) in its public interface (std::map default_params_), but neither plotjuggler_base nor its PUBLIC dependency plotjuggler_qwt ever links Qt5::Xml. Linux/macOS tolerate the missing link (lazy/looser symbol resolution); Windows requires every symbol resolved at link time. macOS already carries the identical fix in ros-rolling-plotjuggler.osx.patch (adds Qt5::Xml to plotjuggler_qwt's target_link_libraries) -- port the same proven hunk to the win-64 patch. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-plotjuggler.win.patch | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/patch/ros-rolling-plotjuggler.win.patch b/patch/ros-rolling-plotjuggler.win.patch index 03f724921..4ed3b08a4 100644 --- a/patch/ros-rolling-plotjuggler.win.patch +++ b/patch/ros-rolling-plotjuggler.win.patch @@ -29,3 +29,15 @@ index 385b7899..b1d6f2ab 100644 Qt5::WebSockets ) +diff --git a/3rdparty/qwt/src/CMakeLists.txt b/3rdparty/qwt/src/CMakeLists.txt +index 51e6f088..8971ecab 100644 +--- a/3rdparty/qwt/src/CMakeLists.txt ++++ b/3rdparty/qwt/src/CMakeLists.txt +@@ -201,6 +201,7 @@ target_link_libraries(plotjuggler_qwt + Qt5::Widgets + Qt5::Concurrent + Qt5::Svg ++ Qt5::Xml + ) + + target_compile_definitions(plotjuggler_qwt PUBLIC QWT_MOC_INCLUDE) From abd2268c0341ebc700555e4517dfc1bbffa58ae3 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 07:20:23 +1000 Subject: [PATCH 088/180] fix: plotjuggler win-64 missing plotjuggler_base import lib After the Qt5::Xml fix, every consumer of plotjuggler_base (the app, every plotjuggler_plugins/* plugin) failed with LNK1181 "cannot open input file ...plotjuggler_base.lib" even though plotjuggler_base.dll itself built successfully. plotjuggler_base has no dllexport annotations at all, and a Windows shared library with nothing explicitly exported doesn't get an import .lib generated by link.exe. Add WINDOWS_EXPORT_ALL_SYMBOLS, the same fix already used for every other Windows shared-library target this session (mavros, the mocap4r2 family, motion_capture_tracking's vendored libs, moveit_task_constructor_visualization, ...). Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-plotjuggler.win.patch | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/patch/ros-rolling-plotjuggler.win.patch b/patch/ros-rolling-plotjuggler.win.patch index 4ed3b08a4..26bd4f8b9 100644 --- a/patch/ros-rolling-plotjuggler.win.patch +++ b/patch/ros-rolling-plotjuggler.win.patch @@ -29,6 +29,25 @@ index 385b7899..b1d6f2ab 100644 Qt5::WebSockets ) +@@ -243,6 +241,17 @@ else() + ${PLOTJUGGLER_BASE_MOCS}) + endif() + ++if(WIN32) ++ # plotjuggler_base has no dllexport annotations at all. As a shared ++ # library on Windows with nothing explicitly exported, link.exe does ++ # not produce an import .lib, so every consumer (plotjuggler_app, every ++ # plotjuggler_plugins/* plugin) fails with LNK1181 "cannot open input ++ # file ...plotjuggler_base.lib" even though plotjuggler_base.dll itself ++ # built fine. Auto-export everything, same as every other Windows ++ # shared-library target fixed this session. ++ set_target_properties(plotjuggler_base PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) ++endif() ++ + set(PJ_PLUGIN_INSTALL_DIRECTORY "${CMAKE_INSTALL_PREFIX}/${PJ_PLUGINS_DIRECTORY}") + + target_include_directories( + diff --git a/3rdparty/qwt/src/CMakeLists.txt b/3rdparty/qwt/src/CMakeLists.txt index 51e6f088..8971ecab 100644 --- a/3rdparty/qwt/src/CMakeLists.txt From 44a95ade8c3e884c24bd807320258b92c7bb61c1 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 07:45:51 +1000 Subject: [PATCH 089/180] fix: plotjuggler win-64 missing staticMetaObject exports WINDOWS_EXPORT_ALL_SYMBOLS only auto-exports functions, not the static data members Qt's MOC generates (staticMetaObject) for every Q_OBJECT class -- same root cause class already hit for mavros' egm96_5 and moveit_task_constructor_visualization's Qt widgets earlier this session. Every Q_OBJECT class in plotjuggler_base (DataStreamer, PlotWidgetBase, RangeSlider, StatePublisher, ToolboxPlugin, TransformFunction, TransformFunction_SISO) failed to link with "unresolved external symbol ...staticMetaObject" in plotjuggler_app and every plotjuggler_plugins/* plugin. Add a small PJ_BASE_EXPORT dllexport/dllimport macro (plotjuggler_base/include/PlotJuggler/pj_export.h) and apply it to each class's whole declaration (covers vtable + staticMetaObject together), paired with PJ_BASE_BUILDING_DLL only on plotjuggler_base itself. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-plotjuggler.win.patch | 166 +++++++++++++++++++++++- 1 file changed, 165 insertions(+), 1 deletion(-) diff --git a/patch/ros-rolling-plotjuggler.win.patch b/patch/ros-rolling-plotjuggler.win.patch index 26bd4f8b9..f175d09a2 100644 --- a/patch/ros-rolling-plotjuggler.win.patch +++ b/patch/ros-rolling-plotjuggler.win.patch @@ -29,7 +29,7 @@ index 385b7899..b1d6f2ab 100644 Qt5::WebSockets ) -@@ -243,6 +241,17 @@ else() +@@ -243,6 +241,22 @@ else() ${PLOTJUGGLER_BASE_MOCS}) endif() @@ -42,6 +42,11 @@ index 385b7899..b1d6f2ab 100644 + # built fine. Auto-export everything, same as every other Windows + # shared-library target fixed this session. + set_target_properties(plotjuggler_base PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) ++ # WINDOWS_EXPORT_ALL_SYMBOLS only auto-exports functions, not the ++ # static data members (like Qt MOC's staticMetaObject) that every ++ # Q_OBJECT class here needs -- see PJ_BASE_EXPORT usage in ++ # plotjuggler_base/include/PlotJuggler/pj_export.h and friends. ++ target_compile_definitions(plotjuggler_base PRIVATE PJ_BASE_BUILDING_DLL) +endif() + set(PJ_PLUGIN_INSTALL_DIRECTORY "${CMAKE_INSTALL_PREFIX}/${PJ_PLUGINS_DIRECTORY}") @@ -60,3 +65,162 @@ index 51e6f088..8971ecab 100644 ) target_compile_definitions(plotjuggler_qwt PUBLIC QWT_MOC_INCLUDE) +diff --git a/plotjuggler_base/include/PlotJuggler/statepublisher_base.h b/plotjuggler_base/include/PlotJuggler/statepublisher_base.h +index 6b4bb61..b5e0e47 100644 +--- a/plotjuggler_base/include/PlotJuggler/statepublisher_base.h ++++ b/plotjuggler_base/include/PlotJuggler/statepublisher_base.h +@@ -14,10 +14,11 @@ + #include + #include "PlotJuggler/plotdata.h" + #include "PlotJuggler/pj_plugin.h" ++#include "PlotJuggler/pj_export.h" + + namespace PJ + { +-class StatePublisher : public PlotJugglerPlugin ++class PJ_BASE_EXPORT StatePublisher : public PlotJugglerPlugin + { + Q_OBJECT + + +diff --git a/plotjuggler_base/include/PlotJuggler/datastreamer_base.h b/plotjuggler_base/include/PlotJuggler/datastreamer_base.h +index 04f70f5..0c3f28f 100644 +--- a/plotjuggler_base/include/PlotJuggler/datastreamer_base.h ++++ b/plotjuggler_base/include/PlotJuggler/datastreamer_base.h +@@ -12,6 +12,7 @@ + #include "PlotJuggler/plotdata.h" + #include "PlotJuggler/pj_plugin.h" + #include "PlotJuggler/messageparser_base.h" ++#include "PlotJuggler/pj_export.h" + + namespace PJ + { +@@ -22,7 +23,7 @@ namespace PJ + * dataMap(), which share its elements with the main application, must be protected + * using the mutex(). + */ +-class DataStreamer : public PlotJugglerPlugin ++class PJ_BASE_EXPORT DataStreamer : public PlotJugglerPlugin + { + Q_OBJECT + public: + +diff --git a/plotjuggler_base/include/PlotJuggler/transform_function.h b/plotjuggler_base/include/PlotJuggler/transform_function.h +index a04de1d..0059b90 100644 +--- a/plotjuggler_base/include/PlotJuggler/transform_function.h ++++ b/plotjuggler_base/include/PlotJuggler/transform_function.h +@@ -12,6 +12,7 @@ + #include + #include "PlotJuggler/plotdata.h" + #include "PlotJuggler/pj_plugin.h" ++#include "PlotJuggler/pj_export.h" + + namespace PJ + { +@@ -19,7 +20,7 @@ namespace PJ + * Contrariwise to other plugins, multiple instances of the this class might be created. + * For this reason, a TransformFactory is also defined + */ +-class TransformFunction : public PlotJugglerPlugin ++class PJ_BASE_EXPORT TransformFunction : public PlotJugglerPlugin + { + Q_OBJECT + +@@ -85,7 +86,7 @@ protected: + using TransformsMap = std::unordered_map>; + + /// Simplified version with Single input and Single output +-class TransformFunction_SISO : public TransformFunction ++class PJ_BASE_EXPORT TransformFunction_SISO : public TransformFunction + { + Q_OBJECT + public: + +diff --git a/plotjuggler_base/include/PlotJuggler/plotwidget_base.h b/plotjuggler_base/include/PlotJuggler/plotwidget_base.h +index 5591fa1..95342b3 100644 +--- a/plotjuggler_base/include/PlotJuggler/plotwidget_base.h ++++ b/plotjuggler_base/include/PlotJuggler/plotwidget_base.h +@@ -11,6 +11,7 @@ + #include + #include "plotdata.h" + #include "timeseries_qwt.h" ++#include "PlotJuggler/pj_export.h" + + class QwtPlot; + class QwtPlotCurve; +@@ -43,7 +44,7 @@ inline double dotWidthValue(LineWidth line_width) + return (lineWidthValue(line_width) * 1.5) + 2.0; + } + +-class PlotWidgetBase : public QWidget ++class PJ_BASE_EXPORT PlotWidgetBase : public QWidget + { + Q_OBJECT + + +diff --git a/plotjuggler_base/include/PlotJuggler/range_slider.h b/plotjuggler_base/include/PlotJuggler/range_slider.h +index 38e6766..a2682ec 100644 +--- a/plotjuggler_base/include/PlotJuggler/range_slider.h ++++ b/plotjuggler_base/include/PlotJuggler/range_slider.h +@@ -7,7 +7,9 @@ + + #include + +-class RangeSlider : public QWidget ++#include "PlotJuggler/pj_export.h" ++ ++class PJ_BASE_EXPORT RangeSlider : public QWidget + { + Q_OBJECT + Q_ENUMS(RangeSliderTypes) + +diff --git a/plotjuggler_base/include/PlotJuggler/toolbox_base.h b/plotjuggler_base/include/PlotJuggler/toolbox_base.h +index bc7b3d6..4ce5f51 100644 +--- a/plotjuggler_base/include/PlotJuggler/toolbox_base.h ++++ b/plotjuggler_base/include/PlotJuggler/toolbox_base.h +@@ -14,10 +14,11 @@ + #include "PlotJuggler/pj_plugin.h" + #include "PlotJuggler/transform_function.h" + #include "PlotJuggler/messageparser_base.h" ++#include "PlotJuggler/pj_export.h" + + namespace PJ + { +-class ToolboxPlugin : public PlotJugglerPlugin ++class PJ_BASE_EXPORT ToolboxPlugin : public PlotJugglerPlugin + { + Q_OBJECT + + +diff --git a/plotjuggler_base/include/PlotJuggler/pj_export.h b/plotjuggler_base/include/PlotJuggler/pj_export.h +new file mode 100644 +index 0000000..35cd616 +--- /dev/null ++++ b/plotjuggler_base/include/PlotJuggler/pj_export.h +@@ -0,0 +1,25 @@ ++/* ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at https://mozilla.org/MPL/2.0/. ++ */ ++ ++#ifndef PJ_EXPORT_H ++#define PJ_EXPORT_H ++ ++// WINDOWS_EXPORT_ALL_SYMBOLS only auto-exports functions, not the static ++// data members (like Qt MOC's staticMetaObject) that every Q_OBJECT class ++// in plotjuggler_base needs. Apply this macro to the whole class ++// declaration of each Q_OBJECT class so both the vtable and the ++// MOC-generated staticMetaObject get exported/imported together. ++#if defined(_WIN32) ++#if defined(PJ_BASE_BUILDING_DLL) ++#define PJ_BASE_EXPORT __declspec(dllexport) ++#else ++#define PJ_BASE_EXPORT __declspec(dllimport) ++#endif ++#else ++#define PJ_BASE_EXPORT ++#endif ++ ++#endif // PJ_EXPORT_H + From 85f9b95593dc8dd1b54537d1839fef4a4a9199d6 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 08:08:11 +1000 Subject: [PATCH 090/180] fix: plotjuggler_ros win-64 fmt /utf-8 requirement commonROS.vcxproj failed with a static_assert from fmt/base.h: "Unicode support requires compiling with /utf-8" (fmt pulled in transitively via rclcpp/rcpputils). Add /utf-8 for MSVC, matching the standard fix for this well-known fmt/MSVC requirement. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-plotjuggler-ros.win.patch | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 patch/ros-rolling-plotjuggler-ros.win.patch diff --git a/patch/ros-rolling-plotjuggler-ros.win.patch b/patch/ros-rolling-plotjuggler-ros.win.patch new file mode 100644 index 000000000..6a3621422 --- /dev/null +++ b/patch/ros-rolling-plotjuggler-ros.win.patch @@ -0,0 +1,17 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 506bbf9..b75e00d 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -26,6 +26,12 @@ if (NOT WIN32) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fno-omit-frame-pointer") + endif() + ++if(MSVC) ++ # fmt (pulled in transitively via rclcpp/rcpputils) statically asserts ++ # that Unicode support requires compiling with /utf-8 on MSVC. ++ add_compile_options(/utf-8) ++endif() ++ + if(APPLE AND EXISTS /usr/local/opt/qt5) + # Homebrew installs Qt5 (up to at least 5.9.1) in + # /usr/local/qt5, ensure it can be found by CMake since From 5469438a16ac248caaabcf566096d415ab861e72 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 08:21:12 +1000 Subject: [PATCH 091/180] fix: pointcloud_to_laserscan win-64 M_PI undeclared pointcloud_to_laserscan_node.cpp uses M_PI unconditionally; MSVC only defines it when _USE_MATH_DEFINES is set before including . Same fix pattern used for several other packages this session. Co-Authored-By: Claude Sonnet 5 --- ...os-rolling-pointcloud-to-laserscan.win.patch | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 patch/ros-rolling-pointcloud-to-laserscan.win.patch diff --git a/patch/ros-rolling-pointcloud-to-laserscan.win.patch b/patch/ros-rolling-pointcloud-to-laserscan.win.patch new file mode 100644 index 000000000..fd003fb8f --- /dev/null +++ b/patch/ros-rolling-pointcloud-to-laserscan.win.patch @@ -0,0 +1,17 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index d13488c..ea62844 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -3,6 +3,12 @@ project(pointcloud_to_laserscan) + + find_package(ament_cmake REQUIRED) + ++if(MSVC) ++ # M_PI et al. are non-standard extensions MSVC only defines when this ++ # is set (pointcloud_to_laserscan_node.cpp uses M_PI unconditionally). ++ add_compile_definitions(_USE_MATH_DEFINES) ++endif() ++ + find_package(laser_geometry REQUIRED) + find_package(message_filters REQUIRED) + find_package(rclcpp REQUIRED) From ad5798439b99ca5ce4a2f94ea82c4bae8a41b90e Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 08:41:28 +1000 Subject: [PATCH 092/180] fix: rclc_examples win-64 rcl_timer_t undeclared Every failing example (example_executor_only_rcl.c, example_executor_trigger.c, example_executor.c, example_short_timer_long_subscription.c, example_parameter_server.c) hit the same MSVC C2055 ("expected formal parameter list, not a type list") on a callback signature (rcl_timer_t * timer, int64_t last_call_time) -- rcl_timer_t isn't recognized as a type in this compile, likely because it's only reaching these files transitively via / and that chain doesn't carry it through identically on Windows. Explicitly include (its actual home) in each file rather than relying on transitive inclusion. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rclc-examples.win.patch | 65 +++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 patch/ros-rolling-rclc-examples.win.patch diff --git a/patch/ros-rolling-rclc-examples.win.patch b/patch/ros-rolling-rclc-examples.win.patch new file mode 100644 index 000000000..d0e05c0d2 --- /dev/null +++ b/patch/ros-rolling-rclc-examples.win.patch @@ -0,0 +1,65 @@ +diff --git a/src/example_executor_only_rcl.c b/src/example_executor_only_rcl.c +index a72202d..392892a 100644 +--- a/src/example_executor_only_rcl.c ++++ b/src/example_executor_only_rcl.c +@@ -15,6 +15,8 @@ + + #include + ++#include ++ + #include + #include + +diff --git a/src/example_executor_trigger.c b/src/example_executor_trigger.c +index 400260e..624898c 100644 +--- a/src/example_executor_trigger.c ++++ b/src/example_executor_trigger.c +@@ -14,6 +14,8 @@ + // limitations under the License. + #include + ++#include ++ + #include + #include + +diff --git a/src/example_executor.c b/src/example_executor.c +index cf40fda..3c574a2 100644 +--- a/src/example_executor.c ++++ b/src/example_executor.c +@@ -14,6 +14,8 @@ + // limitations under the License. + + #include ++ ++#include + #include + #include + #include +diff --git a/src/example_short_timer_long_subscription.c b/src/example_short_timer_long_subscription.c +index 746b037..f3b0300 100644 +--- a/src/example_short_timer_long_subscription.c ++++ b/src/example_short_timer_long_subscription.c +@@ -14,6 +14,8 @@ + // limitations under the License. + + #include ++ ++#include + #include + #include + #include +diff --git a/src/example_parameter_server.c b/src/example_parameter_server.c +index 94fd8db..6f6cbd9 100644 +--- a/src/example_parameter_server.c ++++ b/src/example_parameter_server.c +@@ -15,6 +15,8 @@ + + #include + ++#include ++ + #include + #include + #include From 93965703fc4876ab82871ae35b2adafd41d26c4f Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 08:55:43 +1000 Subject: [PATCH 093/180] fix: exclude rclc_examples from win-64 (unresolved rcl_timer_t C2055) Two independent fix attempts failed identically: adding #include (rcl_timer_t's actual home) to each example .c file, then also #include , neither changed the MSVC C2055 ("expected formal parameter list, not a type list") on every callback signature shaped like (rcl_timer_t * timer, int64_t last_call_time). Notably, the rclc library itself (which also uses rcl_timer_t constantly, e.g. in rclc/executor.h's own prototypes) builds fine in the same environment, so this isn't a general "type unavailable" problem -- something more specific to how the examples target resolves it, that two rounds of header-include fixes didn't touch. Confirmed via ros-humble-52 that this is a known, previously unresolved blocker: humble already excludes rclc_examples from win-64 (via packages_remove_from_deps, not a source-level fix) and jazzy doesn't build it at all. Given it was never actually solved elsewhere either, stop chasing it here and exclude via vinca.yaml, matching the same precedent used for mujoco_ros2_control_plugins (EGL) and ouster_ros (pcl_io.lib) earlier this session. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rclc-examples.win.patch | 65 ----------------------- vinca.yaml | 2 +- 2 files changed, 1 insertion(+), 66 deletions(-) delete mode 100644 patch/ros-rolling-rclc-examples.win.patch diff --git a/patch/ros-rolling-rclc-examples.win.patch b/patch/ros-rolling-rclc-examples.win.patch deleted file mode 100644 index d0e05c0d2..000000000 --- a/patch/ros-rolling-rclc-examples.win.patch +++ /dev/null @@ -1,65 +0,0 @@ -diff --git a/src/example_executor_only_rcl.c b/src/example_executor_only_rcl.c -index a72202d..392892a 100644 ---- a/src/example_executor_only_rcl.c -+++ b/src/example_executor_only_rcl.c -@@ -15,6 +15,8 @@ - - #include - -+#include -+ - #include - #include - -diff --git a/src/example_executor_trigger.c b/src/example_executor_trigger.c -index 400260e..624898c 100644 ---- a/src/example_executor_trigger.c -+++ b/src/example_executor_trigger.c -@@ -14,6 +14,8 @@ - // limitations under the License. - #include - -+#include -+ - #include - #include - -diff --git a/src/example_executor.c b/src/example_executor.c -index cf40fda..3c574a2 100644 ---- a/src/example_executor.c -+++ b/src/example_executor.c -@@ -14,6 +14,8 @@ - // limitations under the License. - - #include -+ -+#include - #include - #include - #include -diff --git a/src/example_short_timer_long_subscription.c b/src/example_short_timer_long_subscription.c -index 746b037..f3b0300 100644 ---- a/src/example_short_timer_long_subscription.c -+++ b/src/example_short_timer_long_subscription.c -@@ -14,6 +14,8 @@ - // limitations under the License. - - #include -+ -+#include - #include - #include - #include -diff --git a/src/example_parameter_server.c b/src/example_parameter_server.c -index 94fd8db..6f6cbd9 100644 ---- a/src/example_parameter_server.c -+++ b/src/example_parameter_server.c -@@ -15,6 +15,8 @@ - - #include - -+#include -+ - #include - #include - #include diff --git a/vinca.yaml b/vinca.yaml index 9d7ec28bf..37c71f612 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -377,7 +377,6 @@ packages_select_by_deps: - py_trees_ros_tutorials - radar_msgs - random_numbers - - rclc_examples - rclc_lifecycle - rclc_parameter - rclcpp_cascade_lifecycle @@ -438,6 +437,7 @@ packages_select_by_deps: - if: not wasm32 and not win then: - ouster_ros # conda-forge's Windows PCL package doesn't expose pcl_io.lib by the plain name ouster_ros's CMake links against (LNK1181) + - rclc_examples # MSVC C2055 on rcl_timer_t in callback signatures; root cause unresolved, already excluded on humble too - rosgraph_monitor - rviz_2d_overlay_plugins - sick_safetyscanners_base From e2547ed02ea8bddc93088a60fb27b1fed7779772 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 09:17:36 +1000 Subject: [PATCH 094/180] fix: realsense2_camera win-64 ambiguous stream_profile == MSVC C2666 ("overloaded functions have similar conversions") on (rs2::stream_profile)a==(rs2::stream_profile)b in both rs_node_setup.cpp and ros_sensor.cpp's profiles_equal(). librealsense2's rs2::stream_profile::operator== is a non-const member (the explicit casts exist only to produce non-const temporaries to call it on), and something else in the SDK gives MSVC an equally-viable overload candidate here that GCC/Clang don't consider ambiguous. Replace both call sites with the equivalent explicit field comparison the operator itself performs internally (stream_index/stream_type/format/fps, all const accessors), sidestepping overload resolution entirely. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-realsense2-camera.win.patch | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 patch/ros-rolling-realsense2-camera.win.patch diff --git a/patch/ros-rolling-realsense2-camera.win.patch b/patch/ros-rolling-realsense2-camera.win.patch new file mode 100644 index 000000000..626ad3235 --- /dev/null +++ b/patch/ros-rolling-realsense2-camera.win.patch @@ -0,0 +1,42 @@ +diff --git a/src/rs_node_setup.cpp b/src/rs_node_setup.cpp +index 2103ad9..b11f8b1 100755 +--- a/src/rs_node_setup.cpp ++++ b/src/rs_node_setup.cpp +@@ -366,7 +366,15 @@ void BaseRealSenseNode::startPublishers(const std::vector& profi + _metadata_publishers[sip] = _node.create_publisher(topic_metadata, + rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(info_qos), info_qos)); + +- if (!((rs2::stream_profile)profile==(rs2::stream_profile)_base_profile)) ++ // rs2::stream_profile::operator== is a non-const member and MSVC ++ // reports it as ambiguous against another candidate here (C2666, ++ // "overloaded functions have similar conversions") even though ++ // GCC/Clang accept it. Compare the same fields the operator itself ++ // checks (all const accessors), sidestepping overload resolution. ++ if (!(profile.stream_index() == _base_profile.stream_index() && ++ profile.stream_type() == _base_profile.stream_type() && ++ profile.format() == _base_profile.format() && ++ profile.fps() == _base_profile.fps())) + { + + // intra-process do not support latched QoS, so we need to disable intra-process for this topic +diff --git a/src/ros_sensor.cpp b/src/ros_sensor.cpp +index fd95c72..b591a88 100644 +--- a/src/ros_sensor.cpp ++++ b/src/ros_sensor.cpp +@@ -332,7 +332,15 @@ bool profiles_equal(const rs2::stream_profile& a, const rs2::stream_profile& b) + auto vb = b.as(); + return (va == vb && va.width() == vb.width() && va.height() == vb.height()); + } +- return ((rs2::stream_profile)a==(rs2::stream_profile)b); ++ // rs2::stream_profile::operator== is a non-const member and MSVC ++ // reports it as ambiguous against another candidate here (C2666, ++ // "overloaded functions have similar conversions") even though ++ // GCC/Clang accept it. Compare the same fields the operator itself ++ // checks (all const accessors), sidestepping overload resolution. ++ return (a.stream_index() == b.stream_index() && ++ a.stream_type() == b.stream_type() && ++ a.format() == b.format() && ++ a.fps() == b.fps()); + } + + bool is_profiles_in_profiles(const std::vector& sub_profiles, const std::vector& all_profiles) From 4e6906359b2bba01404f653e30eccd929222f80a Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 09:34:41 +1000 Subject: [PATCH 095/180] fix: rmf_api_msgs win-64 eval not a Windows command Custom build steps used COMMAND eval "..." with backslash line continuations to construct a shell command string -- "eval" is a POSIX shell builtin with no Windows equivalent (MSB8066 exit 9009, "'eval' is not recognized"). Rewrite both custom targets (py_schemas_gen, py_models_gen) as plain CMake COMMAND argument lists instead of a quoted shell string; portable on every platform, no shell needed. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-api-msgs.win.patch | 39 ++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 patch/ros-rolling-rmf-api-msgs.win.patch diff --git a/patch/ros-rolling-rmf-api-msgs.win.patch b/patch/ros-rolling-rmf-api-msgs.win.patch new file mode 100644 index 000000000..0035c32ed --- /dev/null +++ b/patch/ros-rolling-rmf-api-msgs.win.patch @@ -0,0 +1,39 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 27156a0..5546763 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -83,11 +83,14 @@ install( + + # Generate python schemas mode whenever colcon is triggered + message(" Generating schema as py mods") ++# "eval" is a POSIX shell builtin, not a real command -- fails on Windows ++# with "'eval' is not recognized". Pass the command as plain CMake ++# arguments instead of a quoted shell string; portable everywhere. + ADD_CUSTOM_TARGET( + py_schemas_gen ALL +- COMMAND eval "python3 generate_py_schemas.py \ +- --schemas_dir ${CMAKE_CURRENT_LIST_DIR}/schemas \ +- --output_file ${CMAKE_CURRENT_LIST_DIR}/rmf_api_msgs/schemas.py" ++ COMMAND python3 generate_py_schemas.py ++ --schemas_dir ${CMAKE_CURRENT_LIST_DIR}/schemas ++ --output_file ${CMAKE_CURRENT_LIST_DIR}/rmf_api_msgs/schemas.py + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/scripts) + + # Generate pydantic models according to schemas +@@ -97,11 +100,11 @@ if(PY_MODELGEN_AVAIL) + message(" Generating py models with 'datamodel-codegen'") + ADD_CUSTOM_TARGET( + py_models_gen ALL +- COMMAND eval "datamodel-codegen \ +- --disable-timestamp \ +- --input-file-type jsonschema \ +- --input ${CMAKE_CURRENT_LIST_DIR}/schemas \ +- --output ${CMAKE_CURRENT_LIST_DIR}/rmf_api_msgs/models" ++ COMMAND datamodel-codegen ++ --disable-timestamp ++ --input-file-type jsonschema ++ --input ${CMAKE_CURRENT_LIST_DIR}/schemas ++ --output ${CMAKE_CURRENT_LIST_DIR}/rmf_api_msgs/models + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/scripts) + else() + message( From 47cb8a0eaa1488eb58bb3f3c5a494366b0a50ad0 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 09:40:49 +1000 Subject: [PATCH 096/180] fix: rmf_api_msgs win-64 python3 not found After the eval fix, the custom target still failed: "'python3' is not recognized" -- conda-forge's Windows Python interpreter is python.exe, not python3.exe. Select the executable name conditionally on WIN32. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-api-msgs.win.patch | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/patch/ros-rolling-rmf-api-msgs.win.patch b/patch/ros-rolling-rmf-api-msgs.win.patch index 0035c32ed..dbe16fdd3 100644 --- a/patch/ros-rolling-rmf-api-msgs.win.patch +++ b/patch/ros-rolling-rmf-api-msgs.win.patch @@ -1,26 +1,32 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 27156a0..5546763 100644 +index 27156a0..44d4528 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -83,11 +83,14 @@ install( +@@ -83,11 +83,20 @@ install( # Generate python schemas mode whenever colcon is triggered message(" Generating schema as py mods") +# "eval" is a POSIX shell builtin, not a real command -- fails on Windows +# with "'eval' is not recognized". Pass the command as plain CMake +# arguments instead of a quoted shell string; portable everywhere. ++# conda-forge's Windows Python is "python.exe", not "python3.exe". ++if(WIN32) ++ set(PY_EXECUTABLE_NAME python) ++else() ++ set(PY_EXECUTABLE_NAME python3) ++endif() ADD_CUSTOM_TARGET( py_schemas_gen ALL - COMMAND eval "python3 generate_py_schemas.py \ - --schemas_dir ${CMAKE_CURRENT_LIST_DIR}/schemas \ - --output_file ${CMAKE_CURRENT_LIST_DIR}/rmf_api_msgs/schemas.py" -+ COMMAND python3 generate_py_schemas.py ++ COMMAND ${PY_EXECUTABLE_NAME} generate_py_schemas.py + --schemas_dir ${CMAKE_CURRENT_LIST_DIR}/schemas + --output_file ${CMAKE_CURRENT_LIST_DIR}/rmf_api_msgs/schemas.py WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/scripts) # Generate pydantic models according to schemas -@@ -97,11 +100,11 @@ if(PY_MODELGEN_AVAIL) +@@ -97,11 +106,11 @@ if(PY_MODELGEN_AVAIL) message(" Generating py models with 'datamodel-codegen'") ADD_CUSTOM_TARGET( py_models_gen ALL From 576207a8144699aaab7f4b153b8b58526f7ab35f Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 09:49:51 +1000 Subject: [PATCH 097/180] fix: rmf_utils win-64 stale cached build missing CMake config rmf-traffic's find_package(rmf_utils) failed to find any config file (rmf_utilsConfig.cmake etc.) at all -- the win-64 job skipped rebuilding rmf_utils entirely (skip_existing matched a remote cached build_number 25 artifact from robostack-rolling). rmf_utils' own CMakeLists.txt export logic (configure_package_config_file, install(EXPORT ...), etc.) looks completely standard and portable, so this looks like a broken or incomplete published win-64 artifact -- nothing appears to have actually consumed rmf_utils' CMake config on Windows until rmf-traffic reached it this session. Bump build_number so skip_existing forces a fresh win-64 build instead of reusing it, same pattern used for libmavconn/pcl_conversions/ros2cli/rosidl_cli earlier. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 07c5244d1..2b0517434 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -288,6 +288,16 @@ pcl_conversions: # doesn't match that stale remote build, forcing a fresh local build against # the current pins instead. build_number: 26 +rmf_utils: + # The remote win-64 build (build_number 25) never actually got its + # rmf_utils-config.cmake consumed by anything until rmf-traffic reached + # it this session -- find_package(rmf_utils) then failed to find any + # config file at all. rmf_utils' own CMakeLists.txt export logic looks + # completely standard/portable, so this is likely just a broken/stale + # published win-64 artifact rather than a real source issue. Bump the + # build number so skip_existing doesn't reuse it, forcing a fresh + # win-64 build against the current toolchain instead. + build_number: 26 ros2cli: build_number: 26 rosidl_cli: From 52c4f63893aec76066e8ecf7cc3857e0021295f5 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 09:58:49 +1000 Subject: [PATCH 098/180] fix: rmf_utils win-64 missing import lib (WINDOWS_EXPORT_ALL_SYMBOLS) Forcing a fresh win-64 build (576207a) surfaced the real bug the stale cached artifact had been hiding: LNK1181 "cannot open input file 'rmf_utils.lib'" for rmf-traffic. rmf_utils' shared library has zero dllexport annotations anywhere in its own headers, so link.exe never produces an import .lib. Add WINDOWS_EXPORT_ALL_SYMBOLS, same fix used for every other Windows shared-library target this session. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-utils.win.patch | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 patch/ros-rolling-rmf-utils.win.patch diff --git a/patch/ros-rolling-rmf-utils.win.patch b/patch/ros-rolling-rmf-utils.win.patch new file mode 100644 index 000000000..9c79859cc --- /dev/null +++ b/patch/ros-rolling-rmf-utils.win.patch @@ -0,0 +1,21 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index a93554f..3ec361d 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -15,6 +15,16 @@ include(GNUInstallDirs) + file(GLOB_RECURSE lib_srcs "src/rmf_utils/*.cpp") + add_library(rmf_utils SHARED ${lib_srcs}) + ++if(WIN32) ++ # rmf_utils has no dllexport annotations at all. As a shared library on ++ # Windows with nothing explicitly exported, link.exe does not produce ++ # an import .lib, so every consumer (rmf-traffic here) fails with ++ # LNK1181 "cannot open input file 'rmf_utils.lib'" even though ++ # rmf_utils.dll itself builds fine. Auto-export everything, same fix ++ # used for every other Windows shared-library target this session. ++ set_target_properties(rmf_utils PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) ++endif() ++ + target_include_directories(rmf_utils + PUBLIC + $ From b1592f1c42adbf97b3736714939a37c8ed121e34 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 10:08:27 +1000 Subject: [PATCH 099/180] fix: rmf_utils win-64 re-bump build_number, prior fix never ran The build_number 26 bump (576207a) forced a fresh build, but that fresh build_26 was published BEFORE the WINDOWS_EXPORT_ALL_SYMBOLS patch (52c4f63) existed. The next CI run added the patch without another build_number bump, so skip_existing matched the already- published (unpatched) build_26 again and skipped rebuilding entirely -- the fix has never actually been exercised. Bump to 27 so the patched source actually gets built this time. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 2b0517434..48b59921a 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -297,7 +297,12 @@ rmf_utils: # published win-64 artifact rather than a real source issue. Bump the # build number so skip_existing doesn't reuse it, forcing a fresh # win-64 build against the current toolchain instead. - build_number: 26 + # + # build_number 26 (this same bump, no code change) still hit + # skip_existing against a build_26 published from a run BEFORE the + # WINDOWS_EXPORT_ALL_SYMBOLS patch was added -- the patch was never + # actually exercised. Bump again so the patched build actually runs. + build_number: 27 ros2cli: build_number: 26 rosidl_cli: From 470c3d4253c81331879c75045ecaadbc8b4b22f8 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 10:21:04 +1000 Subject: [PATCH 100/180] fix: rmf_traffic win-64 M_PI undeclared Once rmf_utils' find_package finally succeeded (fresh build_27 with WINDOWS_EXPORT_ALL_SYMBOLS), the build reached actual compilation and hit the familiar M_PI/_USE_MATH_DEFINES gap: Spline.cpp uses M_PI unconditionally, which MSVC only defines when _USE_MATH_DEFINES is set before including . Same fix pattern used for several other packages this session. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic.win.patch | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 patch/ros-rolling-rmf-traffic.win.patch diff --git a/patch/ros-rolling-rmf-traffic.win.patch b/patch/ros-rolling-rmf-traffic.win.patch new file mode 100644 index 000000000..0d7219028 --- /dev/null +++ b/patch/ros-rolling-rmf-traffic.win.patch @@ -0,0 +1,17 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index ad05ac1..45af2de 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -13,6 +13,12 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) + endif() + ++if(MSVC) ++ # M_PI et al. are non-standard extensions MSVC only defines when this ++ # is set (Spline.cpp uses M_PI unconditionally). ++ add_compile_definitions(_USE_MATH_DEFINES) ++endif() ++ + if(NOT CMAKE_BUILD_TYPE) + # Use the Release build type by default if the user has not specified one + set(CMAKE_BUILD_TYPE Release) From 1e584ca9d0eb8bb45dadf3403e1c0dc55d8950e5 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 10:32:17 +1000 Subject: [PATCH 101/180] fix: rmf_traffic win-64 out-of-line conversion operator lookup (C2833) Trajectory.cpp defines base_iterator::operator const_iterator() out-of-line. const_iterator is a member alias of the ENCLOSING Trajectory class (using const_iterator = base_iterator), not of base_iterator itself. GCC/Clang resolve it fine via enclosing-scope lookup; MSVC fails to (C2833 "'operator const_iterator' is not a recognized operator or type", cascading into several syntax errors on the following lines). Explicitly qualify the conversion target as Trajectory::const_iterator -- same type either way, just makes the qualification explicit instead of relying on implicit scope resolution. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic.win.patch | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/patch/ros-rolling-rmf-traffic.win.patch b/patch/ros-rolling-rmf-traffic.win.patch index 0d7219028..ab09d14fb 100644 --- a/patch/ros-rolling-rmf-traffic.win.patch +++ b/patch/ros-rolling-rmf-traffic.win.patch @@ -15,3 +15,21 @@ index ad05ac1..45af2de 100644 if(NOT CMAKE_BUILD_TYPE) # Use the Release build type by default if the user has not specified one set(CMAKE_BUILD_TYPE Release) +diff --git a/src/rmf_traffic/Trajectory.cpp b/src/rmf_traffic/Trajectory.cpp +index 3f29c7d..be98311 100644 +--- a/src/rmf_traffic/Trajectory.cpp ++++ b/src/rmf_traffic/Trajectory.cpp +@@ -798,7 +798,12 @@ bool Trajectory::base_iterator::operator>=( + + //============================================================================== + template +-Trajectory::base_iterator::operator const_iterator() const ++// MSVC fails to resolve the unqualified "const_iterator" here (a member ++// alias of the enclosing Trajectory class, not of base_iterator itself) ++// in this out-of-line nested-class-template conversion operator (C2833). ++// GCC/Clang already resolve it via the enclosing scope; qualifying it ++// explicitly is equivalent and portable everywhere. ++Trajectory::base_iterator::operator Trajectory::const_iterator() const + { + return _pimpl->make_iterator(_pimpl->raw_iterator); + } From a078e87e4d372c35d354dab2a793f01a699fd225 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 10:44:38 +1000 Subject: [PATCH 102/180] fix: rmf_traffic win-64 redundant static constexpr out-of-class defs MSVC C2734 ("'const' object must be initialized if not 'extern'") on two out-of-class definitions: SimpleNegotiator::Options:: DefaultMaxCostLeeway and Planner::Options::DefaultMinHoldingTime. Both are declared `static constexpr` (with their initializer) in their headers; these separate `const Class::Member;` lines in the .cpp files were the pre-C++17 idiom for providing an out-of-class definition so the member can be ODR-used. This project already targets C++17, where static constexpr members are implicitly inline, making these definitions redundant -- GCC/Clang silently tolerate the redundant redeclaration, MSVC rejects it. Just remove both lines. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic.win.patch | 38 +++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/patch/ros-rolling-rmf-traffic.win.patch b/patch/ros-rolling-rmf-traffic.win.patch index ab09d14fb..aec49c2f1 100644 --- a/patch/ros-rolling-rmf-traffic.win.patch +++ b/patch/ros-rolling-rmf-traffic.win.patch @@ -33,3 +33,41 @@ index 3f29c7d..be98311 100644 { return _pimpl->make_iterator(_pimpl->raw_iterator); } +diff --git a/src/rmf_traffic/agv/SimpleNegotiator.cpp b/src/rmf_traffic/agv/SimpleNegotiator.cpp +index 7657152..7aee6d8 100644 +--- a/src/rmf_traffic/agv/SimpleNegotiator.cpp ++++ b/src/rmf_traffic/agv/SimpleNegotiator.cpp +@@ -26,9 +26,11 @@ namespace rmf_traffic { + namespace agv { + + //============================================================================== +-// This line tells the linker to take care of defining the value of this field +-// inside of this translation unit. +-const double SimpleNegotiator::Options::DefaultMaxCostLeeway; ++// C++17's static constexpr members are implicitly inline, so this ++// out-of-class definition (needed pre-C++17 for ODR-use) is redundant ++// now that this project targets C++17 -- and MSVC rejects it outright ++// (C2734: "'const' object must be initialized if not 'extern'"), even ++// though GCC/Clang tolerate the redundant redeclaration. Just remove it. + + //============================================================================== + class SimpleNegotiator::Options::Implementation +diff --git a/src/rmf_traffic/agv/Planner.cpp b/src/rmf_traffic/agv/Planner.cpp +index 983f0c2..d9925b2 100644 +--- a/src/rmf_traffic/agv/Planner.cpp ++++ b/src/rmf_traffic/agv/Planner.cpp +@@ -25,9 +25,11 @@ namespace rmf_traffic { + namespace agv { + + //============================================================================== +-// This line tells the linker to take care of defining the value of this field +-// inside of this translation unit. +-const Duration Planner::Options::DefaultMinHoldingTime; ++// C++17's static constexpr members are implicitly inline, so this ++// out-of-class definition (needed pre-C++17 for ODR-use) is redundant ++// now that this project targets C++17 -- and MSVC rejects it outright ++// (C2734: "'const' object must be initialized if not 'extern'"), even ++// though GCC/Clang tolerate the redundant redeclaration. Just remove it. + + //============================================================================== + class Planner::Configuration::Implementation From 4c9ecf55357ee3d1aa845c5b1b5c4f11498095c6 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 11:10:27 +1000 Subject: [PATCH 103/180] fix: rmf_traffic win-64 dependent type in default-arg lambda (C3861) CacheManager's and CacheManagerMap's constructors both default their storage_initializer parameter to []() { return Storage(); } -- Storage is a dependent member alias of the enclosing class template. MSVC fails to resolve the unqualified name inside this lambda-as-default-argument (C3861 "identifier not found"), cascading into std::_Is_invocable_r_/std::conjunction instantiation failures when the constructor's default is evaluated at a call site. GCC/Clang resolve it fine via the enclosing template scope. Explicitly qualify the type in both lambdas (CacheManager::Storage, CacheManagerMap ::Storage) -- same type either way, portable everywhere. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic.win.patch | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/patch/ros-rolling-rmf-traffic.win.patch b/patch/ros-rolling-rmf-traffic.win.patch index aec49c2f1..9968edbcd 100644 --- a/patch/ros-rolling-rmf-traffic.win.patch +++ b/patch/ros-rolling-rmf-traffic.win.patch @@ -71,3 +71,34 @@ index 983f0c2..d9925b2 100644 //============================================================================== class Planner::Configuration::Implementation +diff --git a/src/rmf_traffic/agv/planning/CacheManager.hpp b/src/rmf_traffic/agv/planning/CacheManager.hpp +index 2bdce0e..4c6b13c 100644 +--- a/src/rmf_traffic/agv/planning/CacheManager.hpp ++++ b/src/rmf_traffic/agv/planning/CacheManager.hpp +@@ -188,7 +188,13 @@ private: + + CacheManager( + std::shared_ptr generator, +- std::function storage_initializer = []() { return Storage(); }); ++ // MSVC fails to resolve the unqualified "Storage" (a dependent ++ // member alias of this class template) inside a lambda used as a ++ // default argument here (C3861 + cascading std::_Is_invocable_r_/ ++ // conjunction failures). GCC/Clang resolve it fine; qualifying it ++ // explicitly is equivalent and portable everywhere. ++ std::function storage_initializer = ++ []() { return typename CacheManager::Storage(); }); + + template friend class Cache; + std::shared_ptr _upstream; +@@ -214,7 +220,10 @@ public: + + CacheManagerMap( + std::shared_ptr factory, +- std::function storage_initializer = []() { return Storage(); }); ++ // Same MSVC dependent-name-in-default-argument-lambda issue as ++ // CacheManager's constructor above -- qualify explicitly. ++ std::function storage_initializer = ++ []() { return typename CacheManagerMap::Storage(); }); + + CacheManagerPtr get(std::size_t goal_index) const; + From 61465f77985573d731e6a9644f853a121ec1a293 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 11:12:42 +1000 Subject: [PATCH 104/180] ci: add build log summary/artifact and flaky git-cache retry Port two generic CI improvements from ros-lyrical PR #41 (not Windows/moveit-specific, pure tooling): - .github/scripts/summarize_rattler_build.py: extracts a compact "final diagnostics" excerpt from the build log and posts it to the GitHub Actions job summary, so a failing win-64 (or any platform) run's likely cause is visible without downloading the full log. Wired into testpr.yml's "Build recipes" step (now tee'd to rattler-build.log, exit code captured explicitly) plus a new "Summarize build result" step and a "Upload build log" artifact (7-day retention). - check_patches_clean_apply.py: retry rattler-build once from a clean Git source cache when it fails with "Git error: Git fetch failed" -- a known flaky rattler-build git-cache failure mode, not a real patch problem. Co-Authored-By: Claude Sonnet 5 --- .github/scripts/summarize_rattler_build.py | 98 ++++++++++++++++++++++ .github/workflows/testpr.yml | 25 +++++- check_patches_clean_apply.py | 6 ++ 3 files changed, 128 insertions(+), 1 deletion(-) create mode 100755 .github/scripts/summarize_rattler_build.py diff --git a/.github/scripts/summarize_rattler_build.py b/.github/scripts/summarize_rattler_build.py new file mode 100755 index 000000000..008ca3c4f --- /dev/null +++ b/.github/scripts/summarize_rattler_build.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 +"""Write a compact rattler-build diagnostic for the GitHub job summary.""" + +from __future__ import annotations + +import argparse +import os +import re +from pathlib import Path + + +ANSI_ESCAPE = re.compile(r"\x1b(?:[@-_][0-?]*[ -/]*[@-~]|\][^\x07]*(?:\x07|\x1b\\))") +TIMESTAMP = re.compile(r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z\s*") +DIAGNOSTIC = re.compile( + r"(?:Error:\s+×|fatal error(?:\s+[A-Z]+\d+)?:|\berror(?:\s+[A-Z]+\d+)?:|" + r"CMake Error(?::|\s+at\b)|FAILED:|Patch application error|" + r"Failed to resolve dependencies|Cannot solve the request)", + re.IGNORECASE, +) +RECIPE_START = re.compile(r"Running build for recipe:|Build variant:") + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser() + parser.add_argument("--log", type=Path, required=True) + parser.add_argument("--platform", required=True) + parser.add_argument("--outcome", required=True) + return parser.parse_args() + + +def clean(line: str) -> str: + cleaned = TIMESTAMP.sub("", ANSI_ESCAPE.sub("", line)).rstrip() + if len(cleaned) > 1_000: + return cleaned[:1_000] + " … [line truncated]" + return cleaned + + +def diagnostic_excerpt(lines: list[str]) -> list[str]: + matches = [index for index, line in enumerate(lines) if DIAGNOSTIC.search(line)] + if not matches: + return [] + + # Keep context around the last diagnostics. This includes multiline solver + # explanations without flooding the GitHub summary with the complete log. + selected: set[int] = set() + for index in matches[-20:]: + selected.update(range(max(0, index - 2), min(len(lines), index + 14))) + + # Name the recipe that produced the final diagnostic even when dependency + # solver output has pushed its heading far outside the context window. + first_diagnostic = matches[max(0, len(matches) - 20)] + for index in range(first_diagnostic, -1, -1): + if RECIPE_START.search(lines[index]): + selected.add(index) + break + + excerpt: list[str] = [] + previous = -2 + for index in sorted(selected): + if previous >= 0 and index > previous + 1: + excerpt.append("...") + excerpt.append(lines[index]) + previous = index + return excerpt[-160:] + + +def main() -> None: + args = parse_args() + run_url = ( + f"{os.environ.get('GITHUB_SERVER_URL', 'https://github.com')}/" + f"{os.environ.get('GITHUB_REPOSITORY', '')}/actions/runs/" + f"{os.environ.get('GITHUB_RUN_ID', '')}" + ) + symbol = "✅" if args.outcome == "success" else "❌" + + print(f"## {symbol} rattler-build: `{args.platform}`") + print() + print(f"Outcome: **{args.outcome}** · [Open workflow run]({run_url})") + + if not args.log.is_file(): + print("\nNo build log was produced.") + return + + lines = [clean(line) for line in args.log.read_text(encoding="utf-8", errors="replace").splitlines()] + excerpt = diagnostic_excerpt(lines) + if not excerpt: + print("\nNo error diagnostics were found in the build log.") + return + + print("\n### Final diagnostics\n") + print("```text") + print("\n".join(excerpt)) + print("```") + print("\nThe complete `rattler-build.log` is available in this run's artifacts.") + + +if __name__ == "__main__": + main() diff --git a/.github/workflows/testpr.yml b/.github/workflows/testpr.yml index 91e43abc2..a66693f1f 100644 --- a/.github/workflows/testpr.yml +++ b/.github/workflows/testpr.yml @@ -143,7 +143,30 @@ jobs: id: build-recipes shell: bash -l {0} run: | - pixi run rattler-build build --recipe-dir recipes --target-platform ${{ matrix.platform }} -m ./conda_build_config.yaml -c https://prefix.dev/conda-forge -c https://prefix.dev/robostack-rolling --skip-existing --channel-priority disabled + set +e + pixi run rattler-build build --recipe-dir recipes --target-platform ${{ matrix.platform }} -m ./conda_build_config.yaml -c https://prefix.dev/conda-forge -c https://prefix.dev/robostack-rolling --skip-existing --channel-priority disabled 2>&1 | tee rattler-build.log + build_status=${PIPESTATUS[0]} + echo "exit-code=${build_status}" >> "$GITHUB_OUTPUT" + exit "$build_status" + + - name: Summarize build result + if: always() + shell: bash -l {0} + run: | + pixi run python .github/scripts/summarize_rattler_build.py \ + --log rattler-build.log \ + --platform "${{ matrix.platform }}" \ + --outcome "${{ steps.build-recipes.outcome }}" \ + >> "$GITHUB_STEP_SUMMARY" + + - name: Upload build log + if: always() + uses: actions/upload-artifact@v6 + with: + name: build-log-${{ matrix.platform }}-${{ github.run_id }}-${{ github.run_attempt }} + path: rattler-build.log + if-no-files-found: warn + retention-days: 7 - name: See packages that will be saved in cache shell: bash -l {0} diff --git a/check_patches_clean_apply.py b/check_patches_clean_apply.py index b5fe8e906..eb38b1b6f 100644 --- a/check_patches_clean_apply.py +++ b/check_patches_clean_apply.py @@ -189,6 +189,12 @@ def run_rattler_build_individually(recipes: List[Path]) -> None: print("\n Running:", " ".join(cmd), "\n", flush=True) try: proc = subprocess.run(cmd, text=True, capture_output=True, errors="replace", encoding="utf-8") + # rattler-build's shared Git source cache can occasionally retain + # tag refs whose objects were not fetched. Retry from a clean Git + # cache rather than reporting a spurious patch failure. + if proc.returncode != 0 and "Git error: Git fetch failed" in proc.stderr: + shutil.rmtree(ROOT_DIR / "output" / "src_cache" / "git", ignore_errors=True) + proc = subprocess.run(cmd, text=True, capture_output=True, errors="replace", encoding="utf-8") success = proc.returncode == 0 results.append( { From 28ebfe81ea0d09433a2e6c8f03931dcc83af8548 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 11:26:02 +1000 Subject: [PATCH 105/180] fix: rmf_traffic win-64 use injected-class-name, not explicit template args The previous attempt (4c9ecf5) fully-qualified the dependent Storage type as CacheManager::Storage / CacheManagerMap< GeneratorFactoryArg>::Storage inside the default-argument lambdas, but that made things worse: MSVC then failed to find CacheArg/ GeneratorFactoryArg themselves in that context (C2065 "undeclared identifier"), meaning it can't resolve explicitly-named template arguments at all inside a default-argument lambda in this position. Use the injected-class-name instead (bare CacheManager / CacheManagerMap, referring to the current instantiation without repeating the template argument) -- this is the standard way to refer to "the class currently being defined" from within its own body, and doesn't require MSVC to look up the template parameter by name at all. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic.win.patch | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic.win.patch b/patch/ros-rolling-rmf-traffic.win.patch index 9968edbcd..b61aa0f81 100644 --- a/patch/ros-rolling-rmf-traffic.win.patch +++ b/patch/ros-rolling-rmf-traffic.win.patch @@ -72,10 +72,10 @@ index 983f0c2..d9925b2 100644 //============================================================================== class Planner::Configuration::Implementation diff --git a/src/rmf_traffic/agv/planning/CacheManager.hpp b/src/rmf_traffic/agv/planning/CacheManager.hpp -index 2bdce0e..4c6b13c 100644 +index 2bdce0e..2e45db2 100644 --- a/src/rmf_traffic/agv/planning/CacheManager.hpp +++ b/src/rmf_traffic/agv/planning/CacheManager.hpp -@@ -188,7 +188,13 @@ private: +@@ -188,7 +188,17 @@ private: CacheManager( std::shared_ptr generator, @@ -83,22 +83,27 @@ index 2bdce0e..4c6b13c 100644 + // MSVC fails to resolve the unqualified "Storage" (a dependent + // member alias of this class template) inside a lambda used as a + // default argument here (C3861 + cascading std::_Is_invocable_r_/ -+ // conjunction failures). GCC/Clang resolve it fine; qualifying it -+ // explicitly is equivalent and portable everywhere. ++ // conjunction failures). Explicitly naming the current ++ // specialization (CacheManager) doesn't help either -- ++ // MSVC then fails to find CacheArg itself in this context. Use the ++ // injected-class-name (bare CacheManager, referring to the current ++ // instantiation without repeating the template argument) instead; ++ // GCC/Clang already resolve the original unqualified form fine. + std::function storage_initializer = -+ []() { return typename CacheManager::Storage(); }); ++ []() { return typename CacheManager::Storage(); }); template friend class Cache; std::shared_ptr _upstream; -@@ -214,7 +220,10 @@ public: +@@ -214,7 +224,11 @@ public: CacheManagerMap( std::shared_ptr factory, - std::function storage_initializer = []() { return Storage(); }); + // Same MSVC dependent-name-in-default-argument-lambda issue as -+ // CacheManager's constructor above -- qualify explicitly. ++ // CacheManager's constructor above -- use the injected-class-name ++ // instead of explicitly naming the current specialization. + std::function storage_initializer = -+ []() { return typename CacheManagerMap::Storage(); }); ++ []() { return typename CacheManagerMap::Storage(); }); CacheManagerPtr get(std::size_t goal_index) const; From 26581c8fd968c32a596d17cf13e1d4b7a5cc4c56 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 11:38:15 +1000 Subject: [PATCH 106/180] fix: rmf_traffic win-64 move default lambda out of default argument Both prior attempts at CacheManager/CacheManagerMap's constructor default (fully-qualified CacheManager::Storage, then the injected-class-name CacheManager::Storage) failed differently: the first because MSVC can't find CacheArg itself in a default-argument lambda's context, the second because MSVC rejects the injected name there outright ("requires template argument list", C2955) -- and for CacheManagerMap specifically, MSVC hit a full internal compiler error (C1001). No spelling of the dependent Storage type works inside a default-argument lambda in this position for either class template. Give up on fixing the lambda in place and remove the problem instead: default the parameter to nullptr (a keyword, no name lookup needed at all) and add a private static default_storage_initializer() helper that substitutes the real default (a lambda constructing Storage()) when the passed-in function is empty. The helper's body is a normal function body, not a default-argument-evaluation context, so none of MSVC's restrictions apply there. Both out-of-line constructors now route storage_initializer through this helper before storing it, preserving the exact same observable default-construction behavior. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic.win.patch | 77 +++++++++++++++++++------ 1 file changed, 58 insertions(+), 19 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic.win.patch b/patch/ros-rolling-rmf-traffic.win.patch index b61aa0f81..222564f6f 100644 --- a/patch/ros-rolling-rmf-traffic.win.patch +++ b/patch/ros-rolling-rmf-traffic.win.patch @@ -72,38 +72,77 @@ index 983f0c2..d9925b2 100644 //============================================================================== class Planner::Configuration::Implementation diff --git a/src/rmf_traffic/agv/planning/CacheManager.hpp b/src/rmf_traffic/agv/planning/CacheManager.hpp -index 2bdce0e..2e45db2 100644 +index 2bdce0e..879269d 100644 --- a/src/rmf_traffic/agv/planning/CacheManager.hpp +++ b/src/rmf_traffic/agv/planning/CacheManager.hpp -@@ -188,7 +188,17 @@ private: +@@ -188,7 +188,26 @@ private: CacheManager( std::shared_ptr generator, - std::function storage_initializer = []() { return Storage(); }); -+ // MSVC fails to resolve the unqualified "Storage" (a dependent -+ // member alias of this class template) inside a lambda used as a -+ // default argument here (C3861 + cascading std::_Is_invocable_r_/ -+ // conjunction failures). Explicitly naming the current -+ // specialization (CacheManager) doesn't help either -- -+ // MSVC then fails to find CacheArg itself in this context. Use the -+ // injected-class-name (bare CacheManager, referring to the current -+ // instantiation without repeating the template argument) instead; -+ // GCC/Clang already resolve the original unqualified form fine. -+ std::function storage_initializer = -+ []() { return typename CacheManager::Storage(); }); ++ // MSVC cannot compile a lambda used as a default argument value ++ // here when the lambda references this class template's dependent ++ // Storage member alias: unqualified "Storage" fails to resolve ++ // (C3861), fully qualifying as CacheManager::Storage ++ // fails because CacheArg itself isn't found in that context ++ // (C2065), and the injected-class-name form CacheManager::Storage ++ // is rejected outright ("requires template argument list", C2955). ++ // Default to nullptr (no name lookup needed at all) and resolve ++ // the real default inside default_storage_initializer()'s body ++ // instead, where normal class/template scoping applies with none ++ // of these restrictions. ++ std::function storage_initializer = nullptr); ++ ++ static std::function default_storage_initializer( ++ std::function storage_initializer) ++ { ++ if (storage_initializer) ++ return storage_initializer; ++ return []() { return Storage(); }; ++ } template friend class Cache; std::shared_ptr _upstream; -@@ -214,7 +224,11 @@ public: +@@ -214,7 +233,18 @@ public: CacheManagerMap( std::shared_ptr factory, - std::function storage_initializer = []() { return Storage(); }); -+ // Same MSVC dependent-name-in-default-argument-lambda issue as -+ // CacheManager's constructor above -- use the injected-class-name -+ // instead of explicitly naming the current specialization. -+ std::function storage_initializer = -+ []() { return typename CacheManagerMap::Storage(); }); ++ // Same MSVC default-argument-lambda restriction as CacheManager's ++ // constructor above -- default to nullptr and resolve the real ++ // default inside default_storage_initializer()'s body instead. ++ std::function storage_initializer = nullptr); ++ ++ static std::function default_storage_initializer( ++ std::function storage_initializer) ++ { ++ if (storage_initializer) ++ return storage_initializer; ++ return []() { return Storage(); }; ++ } CacheManagerPtr get(std::size_t goal_index) const; +@@ -329,8 +359,10 @@ CacheManager::CacheManager( + std::shared_ptr generator, + std::function storage_initializer) + : _upstream( +- std::make_shared(storage_initializer, std::move(generator))), +- _storage_initializer(std::move(storage_initializer)) ++ std::make_shared( ++ default_storage_initializer(storage_initializer), std::move(generator))), ++ _storage_initializer( ++ default_storage_initializer(std::move(storage_initializer))) + { + // Do nothing + } +@@ -356,7 +388,8 @@ CacheManagerMap::CacheManagerMap( + std::shared_ptr factory, + std::function storage_initializer) + : _generator_factory(std::move(factory)), +- _storage_initializer(std::move(storage_initializer)) ++ _storage_initializer( ++ default_storage_initializer(std::move(storage_initializer))) + { + // Do nothing + } From 147f6c5eeb75eec92ff70efe04b9bfce2bb0e56a Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 11:50:17 +1000 Subject: [PATCH 107/180] fix: rmf_traffic win-64 KeyHash/EntryHash need default constructor MSVC's / implementation instantiates code paths requiring the hasher type to be default-constructible (C2512), even though real usage always constructs KeyHash/EntryHash with an explicit N_lanes argument. GCC/Clang's libstdc++/libc++ don't require this. Add `= default` default constructors to both -- never actually invoked in practice, so leaving their members uninitialized is safe. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic.win.patch | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/patch/ros-rolling-rmf-traffic.win.patch b/patch/ros-rolling-rmf-traffic.win.patch index 222564f6f..fcc2c3a53 100644 --- a/patch/ros-rolling-rmf-traffic.win.patch +++ b/patch/ros-rolling-rmf-traffic.win.patch @@ -146,3 +146,32 @@ index 2bdce0e..879269d 100644 { // Do nothing } +diff --git a/src/rmf_traffic/agv/planning/DifferentialDriveMap.hpp b/src/rmf_traffic/agv/planning/DifferentialDriveMap.hpp +index 27e3df8..bca545d 100644 +--- a/src/rmf_traffic/agv/planning/DifferentialDriveMap.hpp ++++ b/src/rmf_traffic/agv/planning/DifferentialDriveMap.hpp +@@ -213,6 +213,14 @@ struct DifferentialDriveMapTypes + + struct KeyHash + { ++ // MSVC's / implementation instantiates ++ // code paths requiring the hasher to be default-constructible even ++ // though real usage always passes N_lanes explicitly (GCC/Clang's ++ // libstdc++/libc++ don't need this). The members are left ++ // uninitialized here since this constructor is never actually ++ // invoked in practice. ++ KeyHash() = default; ++ + KeyHash(std::size_t N_lanes) + { + const std::size_t lane_shift = std::ceil(std::log2(N_lanes)); +@@ -245,6 +253,9 @@ struct DifferentialDriveMapTypes + + struct EntryHash + { ++ // Same MSVC default-constructibility requirement as KeyHash above. ++ EntryHash() = default; ++ + EntryHash(std::size_t N_lanes) + { + _orientation_shift = std::ceil(std::log2(N_lanes)); From fa19df278a6f96a05d3c92671697a87e87f1b4fe Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 12:04:48 +1000 Subject: [PATCH 108/180] fix: rmf_traffic win-64 missing import lib (WINDOWS_EXPORT_ALL_SYMBOLS) rmf_traffic.dll built fine but every consumer failed with LNK1181 "cannot open input file 'rmf_traffic.lib'" -- rmf_traffic has no dllexport annotations at all. Same fix as rmf_utils earlier in this package family: WINDOWS_EXPORT_ALL_SYMBOLS on the shared library target. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic.win.patch | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/patch/ros-rolling-rmf-traffic.win.patch b/patch/ros-rolling-rmf-traffic.win.patch index fcc2c3a53..d04eeee7f 100644 --- a/patch/ros-rolling-rmf-traffic.win.patch +++ b/patch/ros-rolling-rmf-traffic.win.patch @@ -15,6 +15,24 @@ index ad05ac1..45af2de 100644 if(NOT CMAKE_BUILD_TYPE) # Use the Release build type by default if the user has not specified one set(CMAKE_BUILD_TYPE Release) +@@ -50,6 +56,17 @@ add_library(rmf_traffic SHARED + ${core_lib_srcs} + ) + ++if(WIN32) ++ # rmf_traffic has no dllexport annotations at all. As a shared library ++ # on Windows with nothing explicitly exported, link.exe does not ++ # produce an import .lib, so every consumer fails with LNK1181 ++ # "cannot open input file 'rmf_traffic.lib'" even though ++ # rmf_traffic.dll itself builds fine. Auto-export everything, same ++ # fix used for every other Windows shared-library target this ++ # session (including rmf_utils earlier in this same package family). ++ set_target_properties(rmf_traffic PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) ++endif() ++ + find_package(ament_cmake_catch2 QUIET) + find_package(ament_cmake_uncrustify QUIET) + if(BUILD_TESTING AND ament_cmake_catch2_FOUND AND ament_cmake_uncrustify_FOUND) diff --git a/src/rmf_traffic/Trajectory.cpp b/src/rmf_traffic/Trajectory.cpp index 3f29c7d..be98311 100644 --- a/src/rmf_traffic/Trajectory.cpp From 367278a4cf0159a44559ef7bb16032fcf453c90c Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 12:12:30 +1000 Subject: [PATCH 109/180] fix: rmf_traffic win-64 bump build_number, export fix never ran A win-64 build_25 of rmf_traffic was published successfully from a run BEFORE the WINDOWS_EXPORT_ALL_SYMBOLS patch (fa19df2) was added -- compiles fine, produces rmf_traffic.dll, but that .dll has no import .lib since nothing was exported. skip_existing kept matching that unpatched build_25 on the next run, so the fix has never actually been exercised (same pitfall already hit for rmf_utils earlier this session). Bump build_number so skip_existing is forced to rebuild fresh with the fix included. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 48b59921a..e2b7a41fe 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -288,6 +288,17 @@ pcl_conversions: # doesn't match that stale remote build, forcing a fresh local build against # the current pins instead. build_number: 26 +rmf_traffic: + # A win-64 build_number 25 got published successfully (compiles fine, + # produces rmf_traffic.dll) from a run BEFORE the WINDOWS_EXPORT_ALL_ + # SYMBOLS patch was added -- rmf_traffic has no dllexport annotations, + # so that build's .dll has no matching import .lib, breaking every + # downstream consumer (LNK1181). skip_existing then kept reusing that + # unpatched build_25 on every subsequent run, so the export fix has + # never actually been exercised. Bump so skip_existing doesn't reuse + # it, forcing a fresh win-64 build with the fix included. Same + # skip_existing pitfall already hit for rmf_utils below. + build_number: 26 rmf_utils: # The remote win-64 build (build_number 25) never actually got its # rmf_utils-config.cmake consumed by anything until rmf-traffic reached From 687011d1879b425df10f072dda13f5282870dd7d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 12:25:54 +1000 Subject: [PATCH 110/180] fix: rmf_battery win-64 M_PI undeclared Same fix pattern as several other packages this session: M_PI is used unconditionally both in rmf_traffic's installed Interpolate.hpp (transitively consumed here) and in this package's own test_battery_drain.cpp; MSVC only defines it when _USE_MATH_DEFINES is set before including . Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-battery.win.patch | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 patch/ros-rolling-rmf-battery.win.patch diff --git a/patch/ros-rolling-rmf-battery.win.patch b/patch/ros-rolling-rmf-battery.win.patch new file mode 100644 index 000000000..fd6aae933 --- /dev/null +++ b/patch/ros-rolling-rmf-battery.win.patch @@ -0,0 +1,18 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index b00fb4c..c2c608e 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -12,6 +12,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) + endif() + ++if(MSVC) ++ # M_PI et al. are non-standard extensions MSVC only defines when this ++ # is set. Used both in rmf_traffic's installed Interpolate.hpp ++ # (consumed here) and in this package's own test_battery_drain.cpp. ++ add_compile_definitions(_USE_MATH_DEFINES) ++endif() ++ + if(NOT CMAKE_BUILD_TYPE) + # Use the Release build type by default if the user has not specified one + set(CMAKE_BUILD_TYPE Release) From 887a656d607a0acb25743ce77d7b9720edced2a2 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 12:49:52 +1000 Subject: [PATCH 111/180] fix: rmf_battery win-64 missing import lib (WINDOWS_EXPORT_ALL_SYMBOLS) rmf_battery.dll built fine but every consumer failed with LNK1181 "cannot open input file 'rmf_battery.lib'" -- rmf_battery has no dllexport annotations at all. Same fix as rmf_utils/rmf_traffic earlier in this package family. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-battery.win.patch | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/patch/ros-rolling-rmf-battery.win.patch b/patch/ros-rolling-rmf-battery.win.patch index fd6aae933..23919f7b1 100644 --- a/patch/ros-rolling-rmf-battery.win.patch +++ b/patch/ros-rolling-rmf-battery.win.patch @@ -16,3 +16,22 @@ index b00fb4c..c2c608e 100644 if(NOT CMAKE_BUILD_TYPE) # Use the Release build type by default if the user has not specified one set(CMAKE_BUILD_TYPE Release) +@@ -36,6 +43,16 @@ add_library(rmf_battery SHARED + ${core_lib_srcs} + ) + ++if(WIN32) ++ # rmf_battery has no dllexport annotations at all. As a shared library ++ # on Windows with nothing explicitly exported, link.exe does not ++ # produce an import .lib, so every consumer fails with LNK1181 ++ # "cannot open input file 'rmf_battery.lib'" even though ++ # rmf_battery.dll itself builds fine. Auto-export everything, same ++ # fix used for rmf_utils/rmf_traffic earlier in this package family. ++ set_target_properties(rmf_battery PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) ++endif() ++ + target_link_libraries(rmf_battery + PUBLIC + rmf_utils::rmf_utils + rmf_traffic::rmf_traffic + ) From 38df27bec525e80ea3f3cfab82c1fcac7ee6eb35 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 12:50:35 +1000 Subject: [PATCH 112/180] fix: rmf_battery win-64 preemptive build_number bump Same skip_existing pitfall already hit twice this session (rmf_utils, rmf_traffic): a win-64 build_25 of rmf_battery was published successfully (compiles fine, produces the .dll) from the run that tested the M_PI fix, BEFORE the WINDOWS_EXPORT_ALL_SYMBOLS patch (887a656) was added. Bump preemptively rather than waiting to discover the stale-cache skip on the next run. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index e2b7a41fe..b017f9ec6 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -288,6 +288,13 @@ pcl_conversions: # doesn't match that stale remote build, forcing a fresh local build against # the current pins instead. build_number: 26 +rmf_battery: + # Same skip_existing pitfall as rmf_utils/rmf_traffic below: a win-64 + # build_number 25 got published successfully (compiles fine, produces + # rmf_battery.dll) from a run BEFORE the WINDOWS_EXPORT_ALL_SYMBOLS + # patch was added. Bump preemptively so the next run doesn't reuse + # that unpatched build and skip exercising the fix. + build_number: 26 rmf_traffic: # A win-64 build_number 25 got published successfully (compiles fine, # produces rmf_traffic.dll) from a run BEFORE the WINDOWS_EXPORT_ALL_ From 6ea0b3f5bbfc40927b8a7f8597f18d49d42f50ed Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 13:00:15 +1000 Subject: [PATCH 113/180] fix: rmf_task win-64 M_PI and path-to-string conversion Two issues: the familiar M_PI/_USE_MATH_DEFINES gap (via rmf_traffic's installed Interpolate.hpp), and BackupFileManager.cpp constructing std::string directly from a std::filesystem::path (robot_directory / name) with no .string() call -- path has no implicit conversion to string; GCC/libstdc++ tolerates this construct but MSVC's STL correctly rejects it (C2665). Add .string() explicitly at both call sites; portable everywhere, no behavior change. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-task.win.patch | 39 ++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 patch/ros-rolling-rmf-task.win.patch diff --git a/patch/ros-rolling-rmf-task.win.patch b/patch/ros-rolling-rmf-task.win.patch new file mode 100644 index 000000000..2a9e02c27 --- /dev/null +++ b/patch/ros-rolling-rmf-task.win.patch @@ -0,0 +1,39 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index d4d1647..42ab1ee 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -13,6 +13,12 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) + endif() + ++if(MSVC) ++ # M_PI et al. are non-standard extensions MSVC only defines when this ++ # is set (used via rmf_traffic's installed Interpolate.hpp). ++ add_compile_definitions(_USE_MATH_DEFINES) ++endif() ++ + if(NOT CMAKE_BUILD_TYPE) + # Use the Release build type by default if the user has not specified one + set(CMAKE_BUILD_TYPE Release) +diff --git a/src/rmf_task/BackupFileManager.cpp b/src/rmf_task/BackupFileManager.cpp +index 7afa25d..15bd7ad 100644 +--- a/src/rmf_task/BackupFileManager.cpp ++++ b/src/rmf_task/BackupFileManager.cpp +@@ -127,9 +127,14 @@ public: + std::optional last_seq; + const std::string backup_file_name = "backup"; + const std::string pre_backup_file_name = ".backup"; +- const std::string pre_backup_file_path = robot_directory / +- pre_backup_file_name; +- const std::string backup_file_path = robot_directory / backup_file_name; ++ // std::filesystem::path has no implicit conversion to std::string (only ++ // the explicit .string() member) -- GCC/libstdc++ tolerates constructing ++ // a string directly from a path here, but MSVC's STL correctly rejects ++ // it (C2665). Call .string() explicitly; portable everywhere. ++ const std::string pre_backup_file_path = (robot_directory / ++ pre_backup_file_name).string(); ++ const std::string backup_file_path = ++ (robot_directory / backup_file_name).string(); + + void write_if_new(const Task::Active::Backup& backup) + { From a507858f159168c9069f8fd5752a53326999bb75 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 13:08:49 +1000 Subject: [PATCH 114/180] fix: rmf_task win-64 test_Log.cpp uint -> unsigned int Non-standard glibc/BSD uint typedef, unavailable on MSVC. The cascading parse errors (empty attribute block, "local function definitions are illegal", undeclared sync/test_finished/tier_dist) are all downstream of this single unresolved type deep inside a lambda passed to std::thread's constructor -- same uint sweep pattern already applied to moveit_task_constructor_core earlier this session. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-task.win.patch | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/patch/ros-rolling-rmf-task.win.patch b/patch/ros-rolling-rmf-task.win.patch index 2a9e02c27..edc1d5683 100644 --- a/patch/ros-rolling-rmf-task.win.patch +++ b/patch/ros-rolling-rmf-task.win.patch @@ -37,3 +37,33 @@ index 7afa25d..15bd7ad 100644 void write_if_new(const Task::Active::Backup& backup) { +diff --git a/test/unit/test_Log.cpp b/test/unit/test_Log.cpp +index f15e519..0c3c69d 100644 +--- a/test/unit/test_Log.cpp ++++ b/test/unit/test_Log.cpp +@@ -95,9 +95,9 @@ SCENARIO("Multi-threaded read/write with synced view") + std::random_device r; + std::default_random_engine eng(r()); + std::uniform_real_distribution entry_dist(0, 1); +- std::uniform_int_distribution tier_dist( +- static_cast(rmf_task::Log::Tier::Info), +- static_cast(rmf_task::Log::Tier::Error)); ++ std::uniform_int_distribution tier_dist( ++ static_cast(rmf_task::Log::Tier::Info), ++ static_cast(rmf_task::Log::Tier::Error)); + + std::size_t counter = 0; + while (!test_finished->load()) +@@ -196,9 +196,9 @@ SCENARIO("Multi-threaded read/write without syncing") + std::random_device r; + std::default_random_engine eng(r()); + std::uniform_real_distribution entry_dist(0, 1); +- std::uniform_int_distribution tier_dist( +- static_cast(rmf_task::Log::Tier::Info), +- static_cast(rmf_task::Log::Tier::Error)); ++ std::uniform_int_distribution tier_dist( ++ static_cast(rmf_task::Log::Tier::Info), ++ static_cast(rmf_task::Log::Tier::Error)); + + std::size_t counter = 0; + while (!test_finished->load()) From 521b6affd5049d04d1245c4718981bff74234150 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 13:32:22 +1000 Subject: [PATCH 115/180] fix: rmf_task win-64 missing import lib + preemptive build_number bump rmf_task.dll built fine but every consumer failed with LNK1181 "cannot open input file 'rmf_task.lib'" -- rmf_task has no dllexport annotations at all. Same fix as rmf_utils/rmf_traffic/rmf_battery earlier in this package family. Also bump build_number preemptively: a win-64 build_25 of rmf_task already published successfully (without this fix) from the run that tested the uint fix, so skip_existing would otherwise reuse it unpatched on the next run. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-task.win.patch | 17 +++++++++++++++++ pkg_additional_info.yaml | 9 +++++++++ 2 files changed, 26 insertions(+) diff --git a/patch/ros-rolling-rmf-task.win.patch b/patch/ros-rolling-rmf-task.win.patch index edc1d5683..64218cd81 100644 --- a/patch/ros-rolling-rmf-task.win.patch +++ b/patch/ros-rolling-rmf-task.win.patch @@ -15,6 +15,23 @@ index d4d1647..42ab1ee 100644 if(NOT CMAKE_BUILD_TYPE) # Use the Release build type by default if the user has not specified one set(CMAKE_BUILD_TYPE Release) +@@ -39,6 +45,16 @@ add_library(rmf_task SHARED + ${lib_srcs} + ) + ++if(WIN32) ++ # rmf_task has no dllexport annotations at all. As a shared library on ++ # Windows with nothing explicitly exported, link.exe does not produce ++ # an import .lib, so every consumer fails with LNK1181 "cannot open ++ # input file 'rmf_task.lib'" even though rmf_task.dll itself builds ++ # fine. Auto-export everything, same fix as rmf_utils/rmf_traffic/ ++ # rmf_battery earlier in this package family. ++ set_target_properties(rmf_task PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) ++endif() ++ + target_link_libraries(rmf_task + PUBLIC + rmf_battery::rmf_battery diff --git a/src/rmf_task/BackupFileManager.cpp b/src/rmf_task/BackupFileManager.cpp index 7afa25d..15bd7ad 100644 --- a/src/rmf_task/BackupFileManager.cpp diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index b017f9ec6..3c8033555 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -295,6 +295,15 @@ rmf_battery: # patch was added. Bump preemptively so the next run doesn't reuse # that unpatched build and skip exercising the fix. build_number: 26 +rmf_task: + # Same skip_existing pitfall already hit repeatedly this session + # (rmf_utils/rmf_traffic/rmf_battery): a win-64 build_25 of rmf_task + # was published successfully (compiles fine, produces the .dll) from + # the run that tested the uint fix, BEFORE the + # WINDOWS_EXPORT_ALL_SYMBOLS patch was added. Bump preemptively + # rather than waiting to discover the stale-cache skip on the next + # run. + build_number: 26 rmf_traffic: # A win-64 build_number 25 got published successfully (compiles fine, # produces rmf_traffic.dll) from a run BEFORE the WINDOWS_EXPORT_ALL_ From 787ffd8b9b937ffc14ceec5f5d8cbb0e00d0df03 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 13:47:25 +1000 Subject: [PATCH 116/180] fix: rmf_traffic_ros2 win-64 libuuid is Linux/macOS-only find_package(LibUUID REQUIRED) fails on Windows ("Could NOT find LibUUID: missing LibUUID_INCLUDE_DIR") -- libuuid is a genuine Linux/macOS-only library, not available on Windows at all. The only usage is a single isolated UUID-generation function (schedule/Node.cpp's generate_node_id()), so fix rather than exclude: use Windows' own native RPC UUID API (UuidCreate/UuidToStringA/ RpcStringFreeA from , linked against rpcrt4) instead of libuuid on that platform, guarding both the CMake find_package/link and the C++ implementation with WIN32/_WIN32. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 86 ++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 patch/ros-rolling-rmf-traffic-ros2.win.patch diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch new file mode 100644 index 000000000..e94261b2a --- /dev/null +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -0,0 +1,86 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index a05ec3e..aee8c0c 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -27,7 +27,12 @@ find_package(rclcpp REQUIRED) + find_package(yaml-cpp REQUIRED) + find_package(nlohmann_json REQUIRED) + find_package(ZLIB REQUIRED) +-find_package(LibUUID REQUIRED) ++if(NOT WIN32) ++ # libuuid is a Linux/macOS-only library (Windows has its own native ++ # UUID API, RPC's UuidCreate/UuidToStringA, used directly in ++ # schedule/Node.cpp instead). ++ find_package(LibUUID REQUIRED) ++endif() + find_package(rmf_reservation_msgs REQUIRED) + + +@@ -190,10 +195,16 @@ target_link_libraries(rmf_traffic_ros2 + yaml-cpp + ZLIB::ZLIB + PkgConfig::PROJ +- PRIVATE +- LibUUID::LibUUID + ) + ++if(NOT WIN32) ++ target_link_libraries(rmf_traffic_ros2 PRIVATE LibUUID::LibUUID) ++else() ++ # Windows' native UUID API (used directly in schedule/Node.cpp ++ # instead of libuuid) lives in rpcrt4. ++ target_link_libraries(rmf_traffic_ros2 PRIVATE rpcrt4) ++endif() ++ + target_include_directories(rmf_traffic_ros2 + PUBLIC + $ +diff --git a/src/rmf_traffic_ros2/schedule/Node.cpp b/src/rmf_traffic_ros2/schedule/Node.cpp +index 7b2902d..a80cdfb 100644 +--- a/src/rmf_traffic_ros2/schedule/Node.cpp ++++ b/src/rmf_traffic_ros2/schedule/Node.cpp +@@ -37,7 +37,13 @@ + #include + + #include ++#ifdef _WIN32 ++// libuuid (uuid/uuid.h) is Linux/macOS-only; use Windows' native RPC ++// UUID API instead (linked against rpcrt4 in CMakeLists.txt). ++#include ++#else + #include ++#endif + + namespace rmf_traffic_ros2 { + namespace schedule { +@@ -46,17 +52,27 @@ namespace { + //============================================================================== + ScheduleNode::ScheduleId generate_node_id() + { ++#ifdef _WIN32 ++ UUID raw_uuid; ++ UuidCreate(&raw_uuid); ++ RPC_CSTR uuid_cstr = nullptr; ++ UuidToStringA(&raw_uuid, &uuid_cstr); ++ const std::string uuid(reinterpret_cast(uuid_cstr)); ++ RpcStringFreeA(&uuid_cstr); ++#else + uuid_t raw_uuid; + uuid_generate(raw_uuid); + // According to these docs, the size of the uuid string will be + // 36 bytes + '\n' so we make a buffer of 37. +- char uuid[37]; +- uuid_unparse(raw_uuid, uuid); ++ char uuid_buf[37]; ++ uuid_unparse(raw_uuid, uuid_buf); ++ const std::string uuid(uuid_buf); ++#endif + const rclcpp::Time time( + std::chrono::system_clock::now().time_since_epoch().count()); + + return rmf_traffic_msgs::build() +- .node_uuid(std::string(uuid)) ++ .node_uuid(uuid) + .timestamp(time); + } + From 98b133fcfb9f6c32c68c4a368e5958b5652abdba Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 13:57:58 +1000 Subject: [PATCH 117/180] fix: rmf_traffic_ros2 win-64 M_PI undeclared Same fix pattern as several other packages this session: M_PI used unconditionally both via rmf_traffic's installed Moderator.hpp and this package's own blockade/Node.cpp; MSVC only defines it when _USE_MATH_DEFINES is set before including . Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index e94261b2a..125620d39 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -1,8 +1,22 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index a05ec3e..aee8c0c 100644 +index a05ec3e..fbce72a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -27,7 +27,12 @@ find_package(rclcpp REQUIRED) +@@ -11,6 +11,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") + endif() + ++if(MSVC) ++ # M_PI et al. are non-standard extensions MSVC only defines when this ++ # is set (used via rmf_traffic's installed Moderator.hpp and this ++ # package's own blockade/Node.cpp). ++ add_compile_definitions(_USE_MATH_DEFINES) ++endif() ++ + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_LIST_DIR}/cmake) + + include(GNUInstallDirs) +@@ -27,7 +34,12 @@ find_package(rclcpp REQUIRED) find_package(yaml-cpp REQUIRED) find_package(nlohmann_json REQUIRED) find_package(ZLIB REQUIRED) @@ -16,7 +30,7 @@ index a05ec3e..aee8c0c 100644 find_package(rmf_reservation_msgs REQUIRED) -@@ -190,10 +195,16 @@ target_link_libraries(rmf_traffic_ros2 +@@ -190,10 +202,16 @@ target_link_libraries(rmf_traffic_ros2 yaml-cpp ZLIB::ZLIB PkgConfig::PROJ From d6875d05cde2cca4da668e121530029fc7b82b42 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 14:13:10 +1000 Subject: [PATCH 118/180] fix: rmf_traffic_ros2 uint typedef not standard on MSVC (Negotiation) set_retained_history_count's uint parameter/field is a glibc/BSD-only typedef, unavailable on MSVC and causing cascading parse errors (undeclared identifier, illegal function definitions) at every use site in Negotiation.hpp/.cpp. Replaced with unsigned int. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 44 ++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index 125620d39..a9c0f8487 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -98,3 +98,47 @@ index 7b2902d..a80cdfb 100644 .timestamp(time); } +diff --git a/include/rmf_traffic_ros2/schedule/Negotiation.hpp b/include/rmf_traffic_ros2/schedule/Negotiation.hpp +index 318939e..1e6a61f 100644 +--- a/include/rmf_traffic_ros2/schedule/Negotiation.hpp ++++ b/include/rmf_traffic_ros2/schedule/Negotiation.hpp +@@ -109,7 +109,7 @@ public: + /// + /// \param[in] count + /// The number of negotiations to retain +- void set_retained_history_count(uint count); ++ void set_retained_history_count(unsigned int count); + + /// Register a negotiator with this Negotiation manager. + /// +diff --git a/src/rmf_traffic_ros2/schedule/Negotiation.cpp b/src/rmf_traffic_ros2/schedule/Negotiation.cpp +index 62f9307..1baa196 100644 +--- a/src/rmf_traffic_ros2/schedule/Negotiation.cpp ++++ b/src/rmf_traffic_ros2/schedule/Negotiation.cpp +@@ -303,7 +303,7 @@ public: + std::function; + StatusConclusionCallback conclusion_callback; + +- uint retained_history_count = 0; ++ unsigned int retained_history_count = 0; + std::map history; + + Implementation( +@@ -1031,7 +1031,7 @@ public: + for_participant, negotiators, failure_callbacks); + } + +- void set_retained_history_count(uint count) ++ void set_retained_history_count(unsigned int count) + { + retained_history_count = count; + } +@@ -1130,7 +1130,7 @@ Negotiation::TableViewPtr Negotiation::table_view( + } + + //============================================================================== +-void Negotiation::set_retained_history_count(uint count) ++void Negotiation::set_retained_history_count(unsigned int count) + { + return _pimpl->set_retained_history_count(count); + } From b1f4d2e445696fd8e9008bc229f36b5d0a01aacb Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 14:25:52 +1000 Subject: [PATCH 119/180] fix: rmf_traffic_ros2 windows.h min/max/ERROR macro collision in Node.cpp The earlier libuuid->RPC UUID API fix added #include under _WIN32, which transitively pulls in windows.h without NOMINMAX or WIN32_LEAN_AND_MEAN. That let windows.h's min/max macros mangle std::numeric_limits::max() into invalid syntax, and its ERROR macro (from wingdi.h) mangle RequestChanges::Response::ERROR, both later in this same translation unit (C2589/C2059/C2062). Guard the rpc.h include with NOMINMAX + WIN32_LEAN_AND_MEAN, which also excludes wingdi.h. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index a9c0f8487..befa994a5 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -50,16 +50,25 @@ index a05ec3e..fbce72a 100644 PUBLIC $ diff --git a/src/rmf_traffic_ros2/schedule/Node.cpp b/src/rmf_traffic_ros2/schedule/Node.cpp -index 7b2902d..a80cdfb 100644 +index 7b2902d4..9648fce3 100644 --- a/src/rmf_traffic_ros2/schedule/Node.cpp +++ b/src/rmf_traffic_ros2/schedule/Node.cpp -@@ -37,7 +37,13 @@ +@@ -37,7 +37,22 @@ #include #include +#ifdef _WIN32 +// libuuid (uuid/uuid.h) is Linux/macOS-only; use Windows' native RPC +// UUID API instead (linked against rpcrt4 in CMakeLists.txt). ++// NOMINMAX/WIN32_LEAN_AND_MEAN keep windows.h (pulled in by rpc.h) from ++// defining min/max/ERROR macros that collide with std::numeric_limits::max ++// and RequestChanges::Response::ERROR used later in this file. ++#ifndef NOMINMAX ++#define NOMINMAX ++#endif ++#ifndef WIN32_LEAN_AND_MEAN ++#define WIN32_LEAN_AND_MEAN ++#endif +#include +#else #include @@ -67,7 +76,7 @@ index 7b2902d..a80cdfb 100644 namespace rmf_traffic_ros2 { namespace schedule { -@@ -46,17 +52,27 @@ namespace { +@@ -46,17 +61,27 @@ namespace { //============================================================================== ScheduleNode::ScheduleId generate_node_id() { From 917b5fea77548c75a36c1e310af9b46c424f1b8e Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 14:37:31 +1000 Subject: [PATCH 120/180] fix: rmf_traffic_ros2 NOGDI needed too, ERROR macro still collided WIN32_LEAN_AND_MEAN does not exclude wingdi.h on its own (GDI is not in its "rarely used" exclusion list) -- the ERROR macro survived and still mangled RequestChanges::Response::ERROR (C2589/C2062). Adding NOGDI explicitly excludes wingdi.h. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index befa994a5..fcc47a59f 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -50,25 +50,29 @@ index a05ec3e..fbce72a 100644 PUBLIC $ diff --git a/src/rmf_traffic_ros2/schedule/Node.cpp b/src/rmf_traffic_ros2/schedule/Node.cpp -index 7b2902d4..9648fce3 100644 +index 7b2902d4..34119bb9 100644 --- a/src/rmf_traffic_ros2/schedule/Node.cpp +++ b/src/rmf_traffic_ros2/schedule/Node.cpp -@@ -37,7 +37,22 @@ +@@ -37,7 +37,26 @@ #include #include +#ifdef _WIN32 +// libuuid (uuid/uuid.h) is Linux/macOS-only; use Windows' native RPC +// UUID API instead (linked against rpcrt4 in CMakeLists.txt). -+// NOMINMAX/WIN32_LEAN_AND_MEAN keep windows.h (pulled in by rpc.h) from -+// defining min/max/ERROR macros that collide with std::numeric_limits::max -+// and RequestChanges::Response::ERROR used later in this file. ++// NOMINMAX/WIN32_LEAN_AND_MEAN/NOGDI keep windows.h (pulled in by rpc.h) ++// from defining min/max (collides with std::numeric_limits::max) and, ++// via wingdi.h, an ERROR macro (collides with ++// RequestChanges::Response::ERROR used later in this file). +#ifndef NOMINMAX +#define NOMINMAX +#endif +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif ++#ifndef NOGDI ++#define NOGDI ++#endif +#include +#else #include @@ -76,7 +80,7 @@ index 7b2902d4..9648fce3 100644 namespace rmf_traffic_ros2 { namespace schedule { -@@ -46,17 +61,27 @@ namespace { +@@ -46,17 +65,27 @@ namespace { //============================================================================== ScheduleNode::ScheduleId generate_node_id() { From ea3c1ed9f3637b401123d514c9c6e9dd870f0c40 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 14:52:25 +1000 Subject: [PATCH 121/180] fix: rmf_traffic_ros2 /bigobj for Node.cpp object section limit schedule/Node.cpp exceeds MSVC's default object file section count (C1128), same class of issue hit repeatedly on jazzy's win-64 builds (cartographer_ros, robot_localization, clearpath_diagnostics). Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index fcc47a59f..116d04d64 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index a05ec3e..fbce72a 100644 +index a05ec3e2..6cba009c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -30,7 +30,19 @@ index a05ec3e..fbce72a 100644 find_package(rmf_reservation_msgs REQUIRED) -@@ -190,10 +202,16 @@ target_link_libraries(rmf_traffic_ros2 +@@ -177,6 +189,11 @@ endif() + file(GLOB_RECURSE core_lib_srcs "src/rmf_traffic_ros2/*.cpp") + add_library(rmf_traffic_ros2 SHARED ${core_lib_srcs}) + ++if(MSVC) ++ # schedule/Node.cpp exceeds the default object file section limit. ++ target_compile_options(rmf_traffic_ros2 PRIVATE /bigobj) ++endif() ++ + target_link_libraries(rmf_traffic_ros2 + PUBLIC + rmf_traffic::rmf_traffic +@@ -190,10 +207,16 @@ target_link_libraries(rmf_traffic_ros2 yaml-cpp ZLIB::ZLIB PkgConfig::PROJ From 043f2ae1967c7bdf7bd9f9f411bec8455c0f5aae Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 15:09:22 +1000 Subject: [PATCH 122/180] fix: rmf_traffic_ros2 win-64 LNK1170 from oversized rclcpp link line \${rclcpp_LIBRARIES} expands to dozens of full absolute paths; on Windows CI the concatenated link.exe response-file line exceeded its ~131071-character limit (LNK1170), failing only now that the earlier compile-time fixes let the build reach the link step. Switching to the rclcpp::rclcpp imported target (WIN32-only, to avoid touching the already-passing platforms) lets CMake's target-based link graph dedupe transitively-repeated libraries instead of relinking every path verbatim. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index 116d04d64..28c8bdce2 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index a05ec3e2..6cba009c 100644 +index a05ec3e2..73aef4dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -42,7 +42,11 @@ index a05ec3e2..6cba009c 100644 target_link_libraries(rmf_traffic_ros2 PUBLIC rmf_traffic::rmf_traffic -@@ -190,10 +207,16 @@ target_link_libraries(rmf_traffic_ros2 +@@ -186,14 +203,29 @@ target_link_libraries(rmf_traffic_ros2 + ${rmf_site_map_msgs_LIBRARIES} + ${rmf_building_map_msgs_LIBRARIES} + ${rmf_reservation_msgs_LIBRARIES} +- ${rclcpp_LIBRARIES} yaml-cpp ZLIB::ZLIB PkgConfig::PROJ @@ -50,6 +54,16 @@ index a05ec3e2..6cba009c 100644 - LibUUID::LibUUID ) ++if(WIN32) ++ # ${rclcpp_LIBRARIES} expands to dozens of full paths and pushes the ++ # link.exe response file past its ~131071-character line limit ++ # (LNK1170). The rclcpp::rclcpp imported target lets CMake dedupe the ++ # transitive link graph instead of relinking every path verbatim. ++ target_link_libraries(rmf_traffic_ros2 PUBLIC rclcpp::rclcpp) ++else() ++ target_link_libraries(rmf_traffic_ros2 PUBLIC ${rclcpp_LIBRARIES}) ++endif() ++ +if(NOT WIN32) + target_link_libraries(rmf_traffic_ros2 PRIVATE LibUUID::LibUUID) +else() From ff4fb754a4000c9f153e6c86f29dfabc8565ffd2 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 15:24:33 +1000 Subject: [PATCH 123/180] fix: rmf_traffic_ros2 LNK1170 persisted, msg-package _LIBRARIES too Switching only rclcpp_LIBRARIES wasn't enough -- the four rosidl message packages' _LIBRARIES variables (ament_cmake_export_libraries) each recursively re-append their own dependencies' _LIBRARIES as plain strings with zero deduplication, so linking four overlapping message packages plus rclcpp this way stacked up a lot of duplicated full paths. Confirmed via locally-built host env CMake configs that rosidl exports a rmf_*_msgs::rmf_*_msgs aggregate INTERFACE IMPORTED target per package specifically to replace the legacy _LIBRARIES variable. Switching all four (Windows-only) to their aggregate targets so CMake's target graph dedupes instead. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 45 ++++++++++++++------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index 28c8bdce2..026284cbf 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index a05ec3e2..73aef4dc 100644 +index a05ec3e2..688b1809 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -30,7 +30,7 @@ index a05ec3e2..73aef4dc 100644 find_package(rmf_reservation_msgs REQUIRED) -@@ -177,6 +189,11 @@ endif() +@@ -177,23 +189,58 @@ endif() file(GLOB_RECURSE core_lib_srcs "src/rmf_traffic_ros2/*.cpp") add_library(rmf_traffic_ros2 SHARED ${core_lib_srcs}) @@ -42,10 +42,12 @@ index a05ec3e2..73aef4dc 100644 target_link_libraries(rmf_traffic_ros2 PUBLIC rmf_traffic::rmf_traffic -@@ -186,14 +203,29 @@ target_link_libraries(rmf_traffic_ros2 - ${rmf_site_map_msgs_LIBRARIES} - ${rmf_building_map_msgs_LIBRARIES} - ${rmf_reservation_msgs_LIBRARIES} + Eigen3::Eigen + nlohmann_json::nlohmann_json +- ${rmf_traffic_msgs_LIBRARIES} +- ${rmf_site_map_msgs_LIBRARIES} +- ${rmf_building_map_msgs_LIBRARIES} +- ${rmf_reservation_msgs_LIBRARIES} - ${rclcpp_LIBRARIES} yaml-cpp ZLIB::ZLIB @@ -55,13 +57,32 @@ index a05ec3e2..73aef4dc 100644 ) +if(WIN32) -+ # ${rclcpp_LIBRARIES} expands to dozens of full paths and pushes the -+ # link.exe response file past its ~131071-character line limit -+ # (LNK1170). The rclcpp::rclcpp imported target lets CMake dedupe the -+ # transitive link graph instead of relinking every path verbatim. -+ target_link_libraries(rmf_traffic_ros2 PUBLIC rclcpp::rclcpp) ++ # The raw ${..._LIBRARIES} variables below each recursively re-append ++ # their own dependencies' _LIBRARIES as plain strings with no ++ # deduplication, so linking four message packages plus rclcpp this ++ # way stacks up a lot of repeated full paths. On Windows CI the ++ # concatenated link.exe response-file line exceeded its ++ # ~131071-character limit (LNK1170). The :: aggregate ++ # imported targets (exported by rosidl/rclcpp specifically to ++ # replace the legacy _LIBRARIES variables) let CMake's target-based ++ # link graph dedupe the transitive closure instead. ++ target_link_libraries(rmf_traffic_ros2 ++ PUBLIC ++ rmf_traffic_msgs::rmf_traffic_msgs ++ rmf_site_map_msgs::rmf_site_map_msgs ++ rmf_building_map_msgs::rmf_building_map_msgs ++ rmf_reservation_msgs::rmf_reservation_msgs ++ rclcpp::rclcpp ++ ) +else() -+ target_link_libraries(rmf_traffic_ros2 PUBLIC ${rclcpp_LIBRARIES}) ++ target_link_libraries(rmf_traffic_ros2 ++ PUBLIC ++ ${rmf_traffic_msgs_LIBRARIES} ++ ${rmf_site_map_msgs_LIBRARIES} ++ ${rmf_building_map_msgs_LIBRARIES} ++ ${rmf_reservation_msgs_LIBRARIES} ++ ${rclcpp_LIBRARIES} ++ ) +endif() + +if(NOT WIN32) From 0fd874bccda06473b397e40f25a5a32a0bb52cab Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 15:42:23 +1000 Subject: [PATCH 124/180] fix: rmf_traffic_ros2 bare yaml-cpp name unresolvable by MSVC (LNK1181) The bare "yaml-cpp" string in target_link_libraries only resolves on Unix linkers (implicit lib.so/.dylib convention); MSVC looks for a literal yaml-cpp.lib and fails to find it. Pre-existing in the package, just never reached until the earlier link-line-length fix got the build this far. Use the yaml-cpp::yaml-cpp imported target on Windows instead. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index 026284cbf..de178a42f 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index a05ec3e2..688b1809 100644 +index a05ec3e2..17c4d15b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -30,7 +30,7 @@ index a05ec3e2..688b1809 100644 find_package(rmf_reservation_msgs REQUIRED) -@@ -177,23 +189,58 @@ endif() +@@ -177,23 +189,67 @@ endif() file(GLOB_RECURSE core_lib_srcs "src/rmf_traffic_ros2/*.cpp") add_library(rmf_traffic_ros2 SHARED ${core_lib_srcs}) @@ -49,13 +49,23 @@ index a05ec3e2..688b1809 100644 - ${rmf_building_map_msgs_LIBRARIES} - ${rmf_reservation_msgs_LIBRARIES} - ${rclcpp_LIBRARIES} - yaml-cpp +- yaml-cpp ZLIB::ZLIB PkgConfig::PROJ - PRIVATE - LibUUID::LibUUID ) ++if(WIN32) ++ # The bare "yaml-cpp" name only resolves for Unix linkers, which apply ++ # the implicit lib. convention; MSVC looks for a ++ # literal yaml-cpp.lib and fails with LNK1181. Use the actual ++ # imported target instead. ++ target_link_libraries(rmf_traffic_ros2 PUBLIC yaml-cpp::yaml-cpp) ++else() ++ target_link_libraries(rmf_traffic_ros2 PUBLIC yaml-cpp) ++endif() ++ +if(WIN32) + # The raw ${..._LIBRARIES} variables below each recursively re-append + # their own dependencies' _LIBRARIES as plain strings with no From 71e7c449c43a16d9e3f57a836f2afab9577224e0 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 15:54:59 +1000 Subject: [PATCH 125/180] fix: rmf_traffic_ros2 PkgConfig::PROJ bare name unresolvable by MSVC pkg_check_modules(PROJ ... IMPORTED_TARGET proj)'s PkgConfig::PROJ target carries the .pc file's raw "proj_9" library name, which MSVC's linker can't locate (LNK1181) -- same class of bug as the yaml-cpp fix. conda-forge's Windows proj package ships a proper CMake config with a PROJ::proj imported target (correct absolute import-lib path), so use find_package(PROJ CONFIG REQUIRED) on Windows instead of the pkg-config route (which the original NOTE comment says was needed only because Debian's libproj-dev lacked a cmake config -- conda's package isn't under that constraint). Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 36 +++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index de178a42f..ad4e44220 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index a05ec3e2..17c4d15b 100644 +index a05ec3e2..98d5fa60 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -16,7 +16,7 @@ index a05ec3e2..17c4d15b 100644 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_LIST_DIR}/cmake) include(GNUInstallDirs) -@@ -27,7 +34,12 @@ find_package(rclcpp REQUIRED) +@@ -27,15 +34,29 @@ find_package(rclcpp REQUIRED) find_package(yaml-cpp REQUIRED) find_package(nlohmann_json REQUIRED) find_package(ZLIB REQUIRED) @@ -30,7 +30,29 @@ index a05ec3e2..17c4d15b 100644 find_package(rmf_reservation_msgs REQUIRED) -@@ -177,23 +189,67 @@ endif() +-# NOTE(MXG): libproj-dev does not currently distribute its cmake config-files +-# in Debian, so we can't use find_package and need to rely on pkg-config. +-# find_package(PROJ REQUIRED) +-find_package(PkgConfig REQUIRED) +-pkg_check_modules(PROJ REQUIRED IMPORTED_TARGET proj) ++if(WIN32) ++ # conda-forge's Windows proj package exports a proper CMake config ++ # with a PROJ::proj imported target using the correct absolute ++ # import-lib path; the pkg-config route below resolves to a bare ++ # "proj_9" name that MSVC's linker can't find (LNK1181). ++ find_package(PROJ CONFIG REQUIRED) ++else() ++ # NOTE(MXG): libproj-dev does not currently distribute its cmake ++ # config-files in Debian, so we can't use find_package and need to ++ # rely on pkg-config. ++ # find_package(PROJ REQUIRED) ++ find_package(PkgConfig REQUIRED) ++ pkg_check_modules(PROJ REQUIRED IMPORTED_TARGET proj) ++endif() + + if (rmf_traffic_FOUND) + message(STATUS "found rmf_traffic") +@@ -177,23 +198,72 @@ endif() file(GLOB_RECURSE core_lib_srcs "src/rmf_traffic_ros2/*.cpp") add_library(rmf_traffic_ros2 SHARED ${core_lib_srcs}) @@ -51,11 +73,17 @@ index a05ec3e2..17c4d15b 100644 - ${rclcpp_LIBRARIES} - yaml-cpp ZLIB::ZLIB - PkgConfig::PROJ +- PkgConfig::PROJ - PRIVATE - LibUUID::LibUUID ) ++if(WIN32) ++ target_link_libraries(rmf_traffic_ros2 PUBLIC PROJ::proj) ++else() ++ target_link_libraries(rmf_traffic_ros2 PUBLIC PkgConfig::PROJ) ++endif() ++ +if(WIN32) + # The bare "yaml-cpp" name only resolves for Unix linkers, which apply + # the implicit lib. convention; MSVC looks for a From ed9da78c40adcb8d4e7ad16a306e347c7d073f36 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 16:07:14 +1000 Subject: [PATCH 126/180] fix: rmf_traffic_ros2 missing out-of-class definition for tag statics ScheduleNode::no_automatic_setup and MonitorNode::no_automatic_setup are declared as in-class static data members with no out-of-class definition anywhere -- a genuine ODR violation that GCC/Clang happen to tolerate but MSVC's linker correctly rejects (LNK2019/LNK1120) once these are actually referenced across translation units. Marking them `inline` (C++17, already relied on elsewhere in this package) gives them a definition at the declaration site, portable and correct on every platform. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 26 ++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index ad4e44220..cc619534f 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -240,3 +240,29 @@ index 62f9307..1baa196 100644 { return _pimpl->set_retained_history_count(count); } +diff --git a/src/rmf_traffic_ros2/schedule/internal_MonitorNode.hpp b/src/rmf_traffic_ros2/schedule/internal_MonitorNode.hpp +index 8d666fed..807aa974 100644 +--- a/src/rmf_traffic_ros2/schedule/internal_MonitorNode.hpp ++++ b/src/rmf_traffic_ros2/schedule/internal_MonitorNode.hpp +@@ -42,7 +42,7 @@ using namespace std::chrono_literals; + class MonitorNode : public rclcpp::Node + { + public: +- static struct NoAutomaticSetup{} no_automatic_setup; ++ inline static struct NoAutomaticSetup{} no_automatic_setup; + + MonitorNode( + std::function)> callback, +diff --git a/src/rmf_traffic_ros2/schedule/internal_Node.hpp b/src/rmf_traffic_ros2/schedule/internal_Node.hpp +index c5c7a7ac..f8351722 100644 +--- a/src/rmf_traffic_ros2/schedule/internal_Node.hpp ++++ b/src/rmf_traffic_ros2/schedule/internal_Node.hpp +@@ -83,7 +83,7 @@ public: + using ScheduleId = rmf_traffic_msgs::msg::ScheduleIdentity; + ScheduleId node_id; + +- static struct NoAutomaticSetup{} no_automatic_setup; ++ inline static struct NoAutomaticSetup{} no_automatic_setup; + + ScheduleNode( + ScheduleId id, From 7634a40b9cceb002a19de6728ddeaceaa35b8d76 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 16:17:43 +1000 Subject: [PATCH 127/180] fix: rmf_traffic_ros2 WINDOWS_EXPORT_ALL_SYMBOLS for missing import lib The rmf_traffic_ros2.dll built fine but produced no companion .lib (no explicit dllexport annotations anywhere in the target), so every downstream executable in this same package (participant_node, rmf_traffic_schedule, rmf_traffic_blockade, rmf_traffic_schedule_monitor, update_participant) failed with LNK1181. Same pattern as rmf_traffic, rmf_battery, and rmf_task earlier this session. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index cc619534f..c5ea6b860 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index a05ec3e2..98d5fa60 100644 +index a05ec3e2..4a7046ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -52,13 +52,20 @@ index a05ec3e2..98d5fa60 100644 if (rmf_traffic_FOUND) message(STATUS "found rmf_traffic") -@@ -177,23 +198,72 @@ endif() +@@ -177,23 +198,79 @@ endif() file(GLOB_RECURSE core_lib_srcs "src/rmf_traffic_ros2/*.cpp") add_library(rmf_traffic_ros2 SHARED ${core_lib_srcs}) +if(MSVC) + # schedule/Node.cpp exceeds the default object file section limit. + target_compile_options(rmf_traffic_ros2 PRIVATE /bigobj) ++ ++ # No explicit dllexport annotations anywhere in this target, so ++ # without this MSVC produces the .dll but no companion .lib, and ++ # every downstream executable (rmf_traffic_schedule, ++ # rmf_traffic_blockade, etc.) fails with LNK1181. ++ set_target_properties(rmf_traffic_ros2 PROPERTIES ++ WINDOWS_EXPORT_ALL_SYMBOLS ON) +endif() + target_link_libraries(rmf_traffic_ros2 From a945f0ccfd4ca6748f1a9f9f179d6d8ba0a8199c Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 16:35:12 +1000 Subject: [PATCH 128/180] fix: rmf_traffic_ros2 LNK1189, replace blanket export with selective WINDOWS_EXPORT_ALL_SYMBOLS auto-exports every symbol from every translation unit, including the enormous number of Eigen/nlohmann_json template instantiations across this library's 26 source files -- overflowing MSVC's import-library 65535-object limit (LNK1189, seen right after "Auto build dll exports"). Replaced with explicit RMF_TRAFFIC_ROS2_EXPORT annotations (new detail/export.hpp, dllexport/dllimport on Windows, no-op elsewhere) on just the symbols this package's own executables actually need: schedule::Writer, schedule::make_node, schedule::make_monitor_node, blockade::make_node (both overloads), schedule::participant_description, and the ParticipantDescription -> message convert() overload used by update_participant. A downstream RMF package needing a symbol not covered here will surface a clear, specific LNK2019 when it's built, same as any other missing-export case this session. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 181 ++++++++++++++++++- 1 file changed, 173 insertions(+), 8 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index c5ea6b860..8ae9ed9bc 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index a05ec3e2..4a7046ca 100644 +index a05ec3e2..8d9f4ff4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -52,7 +52,7 @@ index a05ec3e2..4a7046ca 100644 if (rmf_traffic_FOUND) message(STATUS "found rmf_traffic") -@@ -177,23 +198,79 @@ endif() +@@ -177,23 +198,78 @@ endif() file(GLOB_RECURSE core_lib_srcs "src/rmf_traffic_ros2/*.cpp") add_library(rmf_traffic_ros2 SHARED ${core_lib_srcs}) @@ -60,12 +60,11 @@ index a05ec3e2..4a7046ca 100644 + # schedule/Node.cpp exceeds the default object file section limit. + target_compile_options(rmf_traffic_ros2 PRIVATE /bigobj) + -+ # No explicit dllexport annotations anywhere in this target, so -+ # without this MSVC produces the .dll but no companion .lib, and -+ # every downstream executable (rmf_traffic_schedule, -+ # rmf_traffic_blockade, etc.) fails with LNK1181. -+ set_target_properties(rmf_traffic_ros2 PROPERTIES -+ WINDOWS_EXPORT_ALL_SYMBOLS ON) ++ # WINDOWS_EXPORT_ALL_SYMBOLS overflows MSVC's import-lib 65535-object ++ # limit (LNK1189) on this heavily Eigen/nlohmann-templated library. ++ # Use explicit RMF_TRAFFIC_ROS2_EXPORT annotations (detail/export.hpp) ++ # on just the symbols this package's own executables need instead. ++ target_compile_definitions(rmf_traffic_ros2 PRIVATE RMF_TRAFFIC_ROS2_BUILDING_DLL) +endif() + target_link_libraries(rmf_traffic_ros2 @@ -273,3 +272,169 @@ index c5c7a7ac..f8351722 100644 ScheduleNode( ScheduleId id, +diff --git a/include/rmf_traffic_ros2/schedule/Node.hpp b/include/rmf_traffic_ros2/schedule/Node.hpp +index 0ae4ccbc..8bf6d98e 100644 +--- a/include/rmf_traffic_ros2/schedule/Node.hpp ++++ b/include/rmf_traffic_ros2/schedule/Node.hpp +@@ -20,10 +20,13 @@ + + #include + ++#include ++ + namespace rmf_traffic_ros2 { + namespace schedule { + + /// Make a ScheduleNode instance ++RMF_TRAFFIC_ROS2_EXPORT + std::shared_ptr make_node( + const rclcpp::NodeOptions& options = rclcpp::NodeOptions()); + +diff --git a/include/rmf_traffic_ros2/schedule/MonitorNode.hpp b/include/rmf_traffic_ros2/schedule/MonitorNode.hpp +index 18da3ca7..83174457 100644 +--- a/include/rmf_traffic_ros2/schedule/MonitorNode.hpp ++++ b/include/rmf_traffic_ros2/schedule/MonitorNode.hpp +@@ -23,6 +23,8 @@ + #include + #include + ++#include ++ + using namespace std::chrono_literals; + + namespace rmf_traffic_ros2 { +@@ -30,6 +32,7 @@ namespace schedule { + + /// Make a monitor node to monitor a heartbeat and restart a node when + /// the heartbeat is lost ++RMF_TRAFFIC_ROS2_EXPORT + std::shared_ptr make_monitor_node( + std::function)> callback, + const rclcpp::NodeOptions& options = rclcpp::NodeOptions(), +diff --git a/include/rmf_traffic_ros2/blockade/Node.hpp b/include/rmf_traffic_ros2/blockade/Node.hpp +index dd6379ab..0075c6d8 100644 +--- a/include/rmf_traffic_ros2/blockade/Node.hpp ++++ b/include/rmf_traffic_ros2/blockade/Node.hpp +@@ -20,14 +20,18 @@ + + #include + ++#include ++ + namespace rmf_traffic_ros2 { + namespace blockade { + + /// Make a blockade node instance ++RMF_TRAFFIC_ROS2_EXPORT + std::shared_ptr make_node( + const rclcpp::NodeOptions& options = rclcpp::NodeOptions()); + + /// Make a blockade node instance, specifying a node name ++RMF_TRAFFIC_ROS2_EXPORT + std::shared_ptr make_node( + const std::string& node_name, + const rclcpp::NodeOptions& options = rclcpp::NodeOptions()); +diff --git a/include/rmf_traffic_ros2/schedule/Writer.hpp b/include/rmf_traffic_ros2/schedule/Writer.hpp +index cf0cf625..13e17779 100644 +--- a/include/rmf_traffic_ros2/schedule/Writer.hpp ++++ b/include/rmf_traffic_ros2/schedule/Writer.hpp +@@ -23,13 +23,15 @@ + + #include + ++#include ++ + namespace rmf_traffic_ros2 { + namespace schedule { + + //============================================================================== + /// The Writer class provides an API that allows a Node to create schedule + /// Participants. +-class Writer : public std::enable_shared_from_this ++class RMF_TRAFFIC_ROS2_EXPORT Writer : public std::enable_shared_from_this + { + public: + +diff --git a/src/rmf_traffic_ros2/schedule/internal_YamlSerialization.hpp b/src/rmf_traffic_ros2/schedule/internal_YamlSerialization.hpp +index 028d6dc0..dc7cdc22 100644 +--- a/src/rmf_traffic_ros2/schedule/internal_YamlSerialization.hpp ++++ b/src/rmf_traffic_ros2/schedule/internal_YamlSerialization.hpp +@@ -25,6 +25,8 @@ + + #include + ++#include ++ + namespace rmf_traffic_ros2 { + namespace schedule { + +@@ -41,6 +43,7 @@ rmf_traffic_msgs::msg::ConvexShapeContext shape_context(YAML::Node node); + rmf_traffic::Profile profile(YAML::Node node); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + ParticipantDescription participant_description(YAML::Node node); + + //============================================================================== +diff --git a/include/rmf_traffic_ros2/schedule/ParticipantDescription.hpp b/include/rmf_traffic_ros2/schedule/ParticipantDescription.hpp +index 6536cc22..4f50b37d 100644 +--- a/include/rmf_traffic_ros2/schedule/ParticipantDescription.hpp ++++ b/include/rmf_traffic_ros2/schedule/ParticipantDescription.hpp +@@ -23,6 +23,8 @@ + #include + #include + ++#include ++ + namespace rmf_traffic_ros2 { + + //============================================================================== +@@ -30,6 +32,7 @@ rmf_traffic::schedule::ParticipantDescription convert( + const rmf_traffic_msgs::msg::ParticipantDescription& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::ParticipantDescription convert( + const rmf_traffic::schedule::ParticipantDescription& from); + +diff --git a/include/rmf_traffic_ros2/detail/export.hpp b/include/rmf_traffic_ros2/detail/export.hpp +new file mode 100644 +index 00000000..a8117028 +--- /dev/null ++++ b/include/rmf_traffic_ros2/detail/export.hpp +@@ -0,0 +1,35 @@ ++/* ++ * Copyright (C) 2026 Open Source Robotics Foundation ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ * ++*/ ++ ++#ifndef RMF_TRAFFIC_ROS2__DETAIL__EXPORT_HPP ++#define RMF_TRAFFIC_ROS2__DETAIL__EXPORT_HPP ++ ++// Blanket WINDOWS_EXPORT_ALL_SYMBOLS overflows MSVC's import-lib ++// 65535-object limit for this heavily Eigen/nlohmann-templated library ++// (LNK1189), so the small set of symbols actually needed by this ++// package's own executables are exported explicitly instead. ++#if defined(_WIN32) ++ #if defined(RMF_TRAFFIC_ROS2_BUILDING_DLL) ++ #define RMF_TRAFFIC_ROS2_EXPORT __declspec(dllexport) ++ #else ++ #define RMF_TRAFFIC_ROS2_EXPORT __declspec(dllimport) ++ #endif ++#else ++ #define RMF_TRAFFIC_ROS2_EXPORT ++#endif ++ ++#endif // RMF_TRAFFIC_ROS2__DETAIL__EXPORT_HPP From 12f5b911652e76915fbabb52dc16705ab8430d25 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 16:58:25 +1000 Subject: [PATCH 129/180] fix: rmf_traffic_ros2 make_node/make_monitor_node never dllexported Node.cpp and MonitorNode.cpp define these functions out-of-line but never included their own public headers (Node.hpp/MonitorNode.hpp) -- only the internal_*.hpp headers. Since the RMF_TRAFFIC_ROS2_EXPORT annotation lives on the public declaration, the library's own compilation never saw it and produced a plain, non-exported symbol, while consumers (which DO include the public header) correctly expected dllimport -- LNK2019 unresolved external symbol for both functions. Added the missing includes. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 27 +++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index 8ae9ed9bc..5bfeb958d 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -141,10 +141,19 @@ index a05ec3e2..8d9f4ff4 100644 PUBLIC $ diff --git a/src/rmf_traffic_ros2/schedule/Node.cpp b/src/rmf_traffic_ros2/schedule/Node.cpp -index 7b2902d4..34119bb9 100644 +index 7b2902d4..ef950ef0 100644 --- a/src/rmf_traffic_ros2/schedule/Node.cpp +++ b/src/rmf_traffic_ros2/schedule/Node.cpp -@@ -37,7 +37,26 @@ +@@ -17,6 +17,8 @@ + + #include "internal_Node.hpp" + ++#include ++ + #include + + #include +@@ -37,7 +39,26 @@ #include #include @@ -171,7 +180,7 @@ index 7b2902d4..34119bb9 100644 namespace rmf_traffic_ros2 { namespace schedule { -@@ -46,17 +65,27 @@ namespace { +@@ -46,17 +67,27 @@ namespace { //============================================================================== ScheduleNode::ScheduleId generate_node_id() { @@ -438,3 +447,15 @@ index 00000000..a8117028 +#endif + +#endif // RMF_TRAFFIC_ROS2__DETAIL__EXPORT_HPP +diff --git a/src/rmf_traffic_ros2/schedule/MonitorNode.cpp b/src/rmf_traffic_ros2/schedule/MonitorNode.cpp +index daf4e1dd..8bde4caf 100644 +--- a/src/rmf_traffic_ros2/schedule/MonitorNode.cpp ++++ b/src/rmf_traffic_ros2/schedule/MonitorNode.cpp +@@ -19,6 +19,7 @@ + + #include "internal_Node.hpp" + ++#include + #include + #include + From d6ba67a601a88999590cf45591522fa5eaa0ba9c Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 17:16:54 +1000 Subject: [PATCH 130/180] fix: rmf_websocket websocketpp boost::is_same removed on Windows MSVC doesn't update the __cplusplus macro to reflect the actual C++ standard in use unless /Zc:__cplusplus is passed, so websocketpp's common/cpp11.hpp __cplusplus >= 201103L feature-detection always fails there, falling back to boost::is_same/boost::aligned_storage -- which recent Boost versions no longer provide (C2039/C2873 in websocketpp/common/type_traits.hpp). Adding the flag lets websocketpp correctly detect C++11 and use std:: type traits instead. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-websocket.win.patch | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 patch/ros-rolling-rmf-websocket.win.patch diff --git a/patch/ros-rolling-rmf-websocket.win.patch b/patch/ros-rolling-rmf-websocket.win.patch new file mode 100644 index 000000000..2c5a0a30a --- /dev/null +++ b/patch/ros-rolling-rmf-websocket.win.patch @@ -0,0 +1,20 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 38a92790..152aaffb 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -7,6 +7,15 @@ project(rmf_websocket) + # RoboStack/ros-lyrical#41's fix), which still provides io_service. + add_compile_definitions(ASIO_STANDALONE) + ++if(MSVC) ++ # MSVC doesn't update __cplusplus to reflect the actual C++ standard ++ # in use unless told to, so websocketpp's __cplusplus >= 201103L ++ # feature-detection in common/cpp11.hpp always fails, falling back ++ # to boost::is_same -- which recent Boost versions no longer provide ++ # (C2039/C2873 in websocketpp/common/type_traits.hpp). ++ add_compile_options(/Zc:__cplusplus) ++endif() ++ + if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 17) + endif() From 44fadaa8c99a39796b5e84cc18121cecd6669c6e Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 17:26:27 +1000 Subject: [PATCH 131/180] fix: rmf_websocket WINDOWS_EXPORT_ALL_SYMBOLS for missing import lib rmf_websocket.dll built fine but produced no companion .lib (no explicit dllexport annotations, and only 3 source files so the 65535-object import-lib limit that bit rmf_traffic_ros2 isn't a concern here), so example_client failed with LNK1181. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-websocket.win.patch | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/patch/ros-rolling-rmf-websocket.win.patch b/patch/ros-rolling-rmf-websocket.win.patch index 2c5a0a30a..aaacbb548 100644 --- a/patch/ros-rolling-rmf-websocket.win.patch +++ b/patch/ros-rolling-rmf-websocket.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 38a92790..152aaffb 100644 +index 38a92790..9db1d821 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,15 @@ project(rmf_websocket) @@ -18,3 +18,18 @@ index 38a92790..152aaffb 100644 if(NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 17) endif() +@@ -35,6 +44,14 @@ add_library(rmf_websocket SHARED + src/rmf_websocket/BroadcastServer.cpp + ) + ++if(MSVC) ++ # No explicit dllexport annotations anywhere in this small target, so ++ # without this MSVC produces the .dll but no companion .lib, and ++ # example_client fails with LNK1181. ++ set_target_properties(rmf_websocket PROPERTIES ++ WINDOWS_EXPORT_ALL_SYMBOLS ON) ++endif() ++ + target_link_libraries(rmf_websocket + PUBLIC + ${rclcpp_LIBRARIES} From 602cbf8e6a828dc8ea1d8da66ef3563b34cadaa3 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 17:39:36 +1000 Subject: [PATCH 132/180] fix: rmf_traffic_ros2 downstream consumers missing PROJ::proj on win-64 Switching rmf_traffic_ros2's PROJ link from PkgConfig::PROJ to PROJ::proj (71e7c44) made it a PUBLIC dependency that CMake now propagates into rmf_traffic_ros2's exported Config.cmake -- but PROJ was never added to ament_export_dependencies(), so the generated config never calls find_dependency(PROJ). Any downstream consumer (rmf_task_ros2 is the first to hit it) then fails to configure with "target PROJ::proj ... was not found". Added a WIN32-only ament_export_dependencies(PROJ) call. Also bumps rmf_traffic_ros2's build_number: build_25 was already published (compiles and packages cleanly) from before this fix existed, so skip_existing would otherwise keep serving that stale config to every downstream package. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 19 ++++++++++++++++++- pkg_additional_info.yaml | 10 ++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index 5bfeb958d..023c2c79b 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index a05ec3e2..8d9f4ff4 100644 +index a05ec3e2..74d9a4bd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -140,6 +140,23 @@ index a05ec3e2..8d9f4ff4 100644 target_include_directories(rmf_traffic_ros2 PUBLIC $ +@@ -219,6 +295,16 @@ ament_export_dependencies( + ZLIB + ) + ++if(WIN32) ++ # rmf_traffic_ros2 links PROJ::proj (from find_package(PROJ CONFIG)) ++ # PUBLICly on Windows, so any downstream consumer of ++ # rmf_traffic_ros2::rmf_traffic_ros2 needs that target to exist too -- ++ # without this, CMake's generated Config.cmake never calls ++ # find_dependency(PROJ) and consumers fail with "target ... was not ++ # found" (e.g. rmf_task_ros2). ++ ament_export_dependencies(PROJ) ++endif() ++ + # TODO(MXG): Change these executables into shared libraries that can act as + # ROS2 node components + diff --git a/src/rmf_traffic_ros2/schedule/Node.cpp b/src/rmf_traffic_ros2/schedule/Node.cpp index 7b2902d4..ef950ef0 100644 --- a/src/rmf_traffic_ros2/schedule/Node.cpp diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 3c8033555..7c4f04dd9 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -315,6 +315,16 @@ rmf_traffic: # it, forcing a fresh win-64 build with the fix included. Same # skip_existing pitfall already hit for rmf_utils below. build_number: 26 +rmf_traffic_ros2: + # A win-64 build_number 25 got published successfully (compiles fine, + # produces rmf_traffic_ros2.dll and packages cleanly) from a run + # BEFORE the ament_export_dependencies(PROJ) fix was added -- that + # build's exported Config.cmake never calls find_dependency(PROJ), so + # downstream consumers (e.g. rmf_task_ros2) fail with "target + # PROJ::proj ... was not found". skip_existing would otherwise keep + # reusing that unpatched build_25. Bump so the fix actually gets + # exercised. + build_number: 26 rmf_utils: # The remote win-64 build (build_number 25) never actually got its # rmf_utils-config.cmake consumed by anything until rmf-traffic reached From 4097934416d2f72fb4686f2f67bc4d18633a1bc9 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 17:55:30 +1000 Subject: [PATCH 133/180] fix: rmf_traffic_ros2 make PROJ a PRIVATE dependency, not PUBLIC ament_export_dependencies(PROJ) didn't actually fix the downstream consumer breakage: rmf_task_ros2's own pkg_check_modules(PROJ ...) call sets PROJ_FOUND=TRUE as a side effect before find_package( rmf_traffic_ros2) runs, so the auto-generated find_dependency(PROJ) guard silently no-ops and PROJ::proj never actually gets created in that scope. PROJ is only used in one internal .cpp file (convert_Graph.cpp), never in any installed public header, so there's no reason for it to be part of rmf_traffic_ros2's public link interface at all -- made it PRIVATE instead (matching the existing PRIVATE pattern already used for LibUUID/rpcrt4 in this same file), which sidesteps the whole propagation problem: consumers no longer need to know PROJ exists. Bumps build_number again since build_26 (the ament_export_dependencies attempt) was already published and didn't fix the issue. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 21 ++------------------ pkg_additional_info.yaml | 12 ++++++++++- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index 023c2c79b..12b173628 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index a05ec3e2..74d9a4bd 100644 +index a05ec3e2..8d05df03 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -85,7 +85,7 @@ index a05ec3e2..74d9a4bd 100644 ) +if(WIN32) -+ target_link_libraries(rmf_traffic_ros2 PUBLIC PROJ::proj) ++ target_link_libraries(rmf_traffic_ros2 PRIVATE PROJ::proj) +else() + target_link_libraries(rmf_traffic_ros2 PUBLIC PkgConfig::PROJ) +endif() @@ -140,23 +140,6 @@ index a05ec3e2..74d9a4bd 100644 target_include_directories(rmf_traffic_ros2 PUBLIC $ -@@ -219,6 +295,16 @@ ament_export_dependencies( - ZLIB - ) - -+if(WIN32) -+ # rmf_traffic_ros2 links PROJ::proj (from find_package(PROJ CONFIG)) -+ # PUBLICly on Windows, so any downstream consumer of -+ # rmf_traffic_ros2::rmf_traffic_ros2 needs that target to exist too -- -+ # without this, CMake's generated Config.cmake never calls -+ # find_dependency(PROJ) and consumers fail with "target ... was not -+ # found" (e.g. rmf_task_ros2). -+ ament_export_dependencies(PROJ) -+endif() -+ - # TODO(MXG): Change these executables into shared libraries that can act as - # ROS2 node components - diff --git a/src/rmf_traffic_ros2/schedule/Node.cpp b/src/rmf_traffic_ros2/schedule/Node.cpp index 7b2902d4..ef950ef0 100644 --- a/src/rmf_traffic_ros2/schedule/Node.cpp diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 7c4f04dd9..6a2a6d6f2 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -324,7 +324,17 @@ rmf_traffic_ros2: # PROJ::proj ... was not found". skip_existing would otherwise keep # reusing that unpatched build_25. Bump so the fix actually gets # exercised. - build_number: 26 + # + # build_26 (the ament_export_dependencies(PROJ) fix) still hit the + # same consumer-side error -- rmf_task_ros2's own pkg_check_modules( + # PROJ ...) call sets PROJ_FOUND=TRUE as a side effect before + # find_package(rmf_traffic_ros2) runs, so the auto-generated + # find_dependency(PROJ) guard silently no-ops and PROJ::proj never + # gets created. Switched PROJ to a PRIVATE link dependency instead + # (it's only used in one internal .cpp, never in public headers, so + # consumers never needed to know about it) and bump again so this + # build actually gets exercised. + build_number: 27 rmf_utils: # The remote win-64 build (build_number 25) never actually got its # rmf_utils-config.cmake consumed by anything until rmf-traffic reached From 82741db143578a9cbe27b713f7699a90353c6981 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 18:12:37 +1000 Subject: [PATCH 134/180] fix: rmf_traffic_ros2 export rmf_building_map_msgs/rmf_reservation_msgs Same class of bug as the PROJ propagation issue, but for two of the message-package aggregate targets used on Windows (LNK1170 fix, ff4fb75): they're PUBLIC in rmf_traffic_ros2's link interface but were never in ament_export_dependencies() (missing even in the original upstream list, harmless there since non-Windows links via raw _LIBRARIES path lists that don't need find_dependency). Any downstream consumer's own find_package(rmf_traffic_ros2) now needs these targets to exist -- rmf_task_ros2 is the first to hit "target rmf_building_map_msgs::rmf_building_map_msgs ... was not found". Added both to a WIN32-only ament_export_dependencies() call. Unlike the PROJ case, no known variable-collision risk here since rmf_task_ros2 doesn't independently probe for these packages itself. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 23 +++++++++++++++++++- pkg_additional_info.yaml | 10 ++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index 12b173628..dce35d02d 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index a05ec3e2..8d05df03 100644 +index a05ec3e2..409ae76f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -140,6 +140,27 @@ index a05ec3e2..8d05df03 100644 target_include_directories(rmf_traffic_ros2 PUBLIC $ +@@ -219,6 +295,20 @@ ament_export_dependencies( + ZLIB + ) + ++if(WIN32) ++ # rmf_building_map_msgs::rmf_building_map_msgs and ++ # rmf_reservation_msgs::rmf_reservation_msgs (the aggregate targets ++ # used on Windows instead of the raw _LIBRARIES variables, see the ++ # LNK1170 fix above) are part of this package's PUBLIC link ++ # interface, but were never in ament_export_dependencies() -- on ++ # non-Windows this was harmless (raw path lists don't need ++ # find_dependency), but on Windows any downstream consumer's own ++ # find_package(rmf_traffic_ros2) needs these targets to already ++ # exist, or CMake's generate step fails with "target ... was not ++ # found" (first hit by rmf_task_ros2). ++ ament_export_dependencies(rmf_building_map_msgs rmf_reservation_msgs) ++endif() ++ + # TODO(MXG): Change these executables into shared libraries that can act as + # ROS2 node components + diff --git a/src/rmf_traffic_ros2/schedule/Node.cpp b/src/rmf_traffic_ros2/schedule/Node.cpp index 7b2902d4..ef950ef0 100644 --- a/src/rmf_traffic_ros2/schedule/Node.cpp diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 6a2a6d6f2..fc6e3564e 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -334,7 +334,15 @@ rmf_traffic_ros2: # (it's only used in one internal .cpp, never in public headers, so # consumers never needed to know about it) and bump again so this # build actually gets exercised. - build_number: 27 + # + # build_27 (the PROJ PRIVATE fix) cleared the PROJ error but hit the + # identical class of bug for rmf_building_map_msgs/rmf_reservation_msgs + # -- the aggregate targets used on Windows for the LNK1170 fix are + # PUBLIC but were never in ament_export_dependencies(), so any + # consumer's own find_package(rmf_traffic_ros2) needs them to already + # exist. Added the missing ament_export_dependencies() entries + # (WIN32-only) and bump again. + build_number: 28 rmf_utils: # The remote win-64 build (build_number 25) never actually got its # rmf_utils-config.cmake consumed by anything until rmf-traffic reached From d08a1d8891110f817e03e8cbc51b35b9beeae1ec Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 18:27:42 +1000 Subject: [PATCH 135/180] fix: rmf_task_ros2 LNK1170 from oversized rmf_task_msgs/rclcpp link line Same issue and fix as rmf_traffic_ros2 hit earlier: \${rmf_task_msgs_LIBRARIES} and \${rclcpp_LIBRARIES} each recursively re-append their own dependencies' _LIBRARIES as plain strings with no deduplication, overflowing link.exe's response-file line limit. Switched to the rmf_task_msgs::rmf_task_msgs / rclcpp::rclcpp targets (WIN32-only). Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-task-ros2.win.patch | 39 +++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 patch/ros-rolling-rmf-task-ros2.win.patch diff --git a/patch/ros-rolling-rmf-task-ros2.win.patch b/patch/ros-rolling-rmf-task-ros2.win.patch new file mode 100644 index 000000000..3fa544fb1 --- /dev/null +++ b/patch/ros-rolling-rmf-task-ros2.win.patch @@ -0,0 +1,39 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 9dc2b82c..e1c0e7f4 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -37,12 +37,32 @@ target_link_libraries(rmf_task_ros2 + rmf_traffic::rmf_traffic + rmf_traffic_ros2::rmf_traffic_ros2 + rmf_websocket::rmf_websocket +- ${rmf_task_msgs_LIBRARIES} +- ${rclcpp_LIBRARIES} + nlohmann_json::nlohmann_json + nlohmann_json_schema_validator + ) + ++if(WIN32) ++ # The raw ${..._LIBRARIES} variables below each recursively re-append ++ # their own dependencies' _LIBRARIES as plain strings with no ++ # deduplication, stacking up a lot of repeated full paths. On Windows ++ # CI the concatenated link.exe response-file line exceeded its ++ # ~131071-character limit (LNK1170) -- same issue and same fix as ++ # rmf_traffic_ros2 hit earlier. The aggregate/imported targets let ++ # CMake's target-based link graph dedupe the transitive closure ++ # instead of relinking every path verbatim. ++ target_link_libraries(rmf_task_ros2 ++ PUBLIC ++ rmf_task_msgs::rmf_task_msgs ++ rclcpp::rclcpp ++ ) ++else() ++ target_link_libraries(rmf_task_ros2 ++ PUBLIC ++ ${rmf_task_msgs_LIBRARIES} ++ ${rclcpp_LIBRARIES} ++ ) ++endif() ++ + target_include_directories(rmf_task_ros2 + PUBLIC + $ From 6a8f481ba6d6fc37e156ae7bfca2c5eaba656bb5 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 18:39:01 +1000 Subject: [PATCH 136/180] fix: rmf_traffic_ros2 export Time.hpp convert()/to_ros2() overloads Predictable gap in the selective-export scheme from the LNK1189 fix: only symbols needed by rmf_traffic_ros2's own executables were annotated. rmf_task_ros2 needs several of Time.hpp's convert()/ to_ros2() overloads (LNK2019 on rmf_traffic_ros2::convert for builtin_interfaces::msg::Time / rclcpp::Duration conversions). Exported the whole header (6 small conversion functions) rather than chasing individual overloads one at a time across future consumers. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 37 ++++++++++++++++++++ pkg_additional_info.yaml | 10 +++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index dce35d02d..c8b88f18a 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -480,3 +480,40 @@ index daf4e1dd..8bde4caf 100644 #include #include +diff --git a/include/rmf_traffic_ros2/Time.hpp b/include/rmf_traffic_ros2/Time.hpp +index 34675318..963bc6d6 100644 +--- a/include/rmf_traffic_ros2/Time.hpp ++++ b/include/rmf_traffic_ros2/Time.hpp +@@ -23,24 +23,32 @@ + #include + #include + ++#include ++ + namespace rmf_traffic_ros2 { + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + builtin_interfaces::msg::Time convert(rmf_traffic::Time time); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::Time convert(builtin_interfaces::msg::Time time); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rclcpp::Time to_ros2(rmf_traffic::Time time); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::Time convert(rclcpp::Time time); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rclcpp::Duration convert(rmf_traffic::Duration duration); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::Duration convert(rclcpp::Duration duration); + + } // namespace rmf_traffic_ros2 diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index fc6e3564e..73e31d2ea 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -342,7 +342,15 @@ rmf_traffic_ros2: # consumer's own find_package(rmf_traffic_ros2) needs them to already # exist. Added the missing ament_export_dependencies() entries # (WIN32-only) and bump again. - build_number: 28 + # + # build_28 (the export-dependencies fix) cleared configure but hit a + # predictable gap in the selective-export scheme (LNK1189 fix): only + # symbols needed by THIS package's own executables were annotated + # with RMF_TRAFFIC_ROS2_EXPORT. rmf_task_ros2 needs several + # Time.hpp convert()/to_ros2() overloads that were never exported. + # Exported the whole (small) header rather than chasing individual + # overloads one at a time. Bump again. + build_number: 29 rmf_utils: # The remote win-64 build (build_number 25) never actually got its # rmf_utils-config.cmake consumed by anything until rmf-traffic reached From 015cbeed1ba272e324dc973c845c35c29a70085a Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 18:40:26 +1000 Subject: [PATCH 137/180] ci: add orphaned-platform-patch check (ported from humble/jazzy) vinca's add_package_name_variants() (vinca/utils.py) cross-links patch-file name-prefix variants (X <-> ros-X <-> ros2-X <-> ros--X) via dict.setdefault(), a no-op once a prefix already has its own entry. If a package has a plain patch under one prefix and a platform-specific patch under a different prefix, the platform-specific one is silently never wired into any recipe -- no error, no warning. This exact bug orphaned jazzy's ros-jazzy-sick-scan-xd.osx.patch for months. Ported check_orphaned_platform_patches.py verbatim from RoboStack/ros-humble@765bf707 (identical script across distros, only needs ros_distro: from vinca.yaml) and wired it into `pixi run check-patches` as a new check-orphaned-patches task dependency, so it runs on every PR. Currently clean: no orphaned patches found on rolling. Co-Authored-By: Claude Sonnet 5 --- check_orphaned_platform_patches.py | 159 +++++++++++++++++++++++++++++ pixi.toml | 3 +- 2 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 check_orphaned_platform_patches.py diff --git a/check_orphaned_platform_patches.py b/check_orphaned_platform_patches.py new file mode 100644 index 000000000..3f3ff0de7 --- /dev/null +++ b/check_orphaned_platform_patches.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 +""" +check_orphaned_platform_patches.py +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Detect patch files in ``patch/`` that vinca will silently never wire +into any recipe's ``patches:`` list. + +Background +---------- +vinca (see ``vinca/main.py`` around the ``patch_dir`` glob, and +``vinca/utils.py::add_package_name_variants``) builds a dict keyed by +the patch filename's prefix (everything before an optional +``.osx``/``.win``/``.linux``/``.unix``/``.emscripten`` suffix), then +cross-links name-prefix variants of the *same* logical package +(``X`` <-> ``ros-X`` <-> ``ros2-X`` <-> ``ros--X``) via +``dict.setdefault()``. + +``setdefault`` only fills in a key that is still *absent*. If a +package has a plain patch under one prefix (say ``ros2-foo.patch``) +and a platform-specific patch under a *different* prefix (say +``ros-jazzy-foo.osx.patch``), both prefixes already exist as their own +dict entries by the time the cross-link step runs, so the two never +merge. Whichever prefix vinca does *not* resolve as the package's +final conda name for a given recipe simply never appears in that +recipe's ``patches:`` list -- with no error and no warning. This +exact bug orphaned ``ros-jazzy-sick-scan-xd.osx.patch`` for months +before it was renamed to ``ros2-sick-scan-xd.osx.patch`` (matching the +prefix jazzy actually resolves sick_scan_xd's own patch under). + +``check_patches_clean_apply.py`` does not catch this: it verifies that +every patch file on disk applies cleanly to source, but never checks +whether vinca's real name-resolution would actually attach that file +to any package's generated recipe at all. + +What this script does +---------------------- +Replicates vinca's exact patch-dict-construction and +``add_package_name_variants`` shortname-stripping logic (kept in sync +with whatever revision this repo's ``pixi.toml`` pins vinca to -- if +that mechanism ever changes upstream, re-check this script). It groups +patch-file prefixes by their computed "shortname" and flags any group +where more than one *distinct* literal prefix was actually used by a +file on disk: only one of those prefixes can ever be the resolved +package name for a given recipe, so content under the others is dead. + +Exit code is non-zero (and the offending groups are printed) if any +such collision is found. +""" + +from __future__ import annotations + +import glob +import os +import re +import sys +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parent +PATCH_DIR = REPO_ROOT / "patch" + +_ROS_DISTRO_RE = re.compile(r"^ros_distro:\s*(\S+)\s*$", re.MULTILINE) + + +def get_ros_distro() -> str: + vinca_yaml = (REPO_ROOT / "vinca.yaml").read_text() + match = _ROS_DISTRO_RE.search(vinca_yaml) + if not match: + print("Could not find 'ros_distro:' in vinca.yaml", file=sys.stderr) + sys.exit(2) + return match.group(1) + + +def build_patches_dict(patch_dir: Path) -> dict[str, dict[str, list[str]]]: + """Mirrors the glob loop in vinca/main.py that builds vinca_conf['_patches'].""" + patches: dict[str, dict[str, list[str]]] = {} + for x in sorted(glob.glob(os.path.join(str(patch_dir), "*.patch"))): + splitted = os.path.basename(x).split(".") + if splitted[0] not in patches: + patches[splitted[0]] = { + "any": [], + "osx": [], + "linux": [], + "win": [], + "emscripten": [], + } + if len(splitted) == 3: + if splitted[1] in ("osx", "linux", "win", "emscripten"): + patches[splitted[0]][splitted[1]].append(x) + continue + if splitted[1] == "unix": + patches[splitted[0]]["linux"].append(x) + patches[splitted[0]]["osx"].append(x) + continue + patches[splitted[0]]["any"].append(x) + return patches + + +def shortname_of(name: str, ros_distro: str) -> str: + """Mirrors the prefix-stripping in vinca/utils.py::add_package_name_variants.""" + legacy_prefix = f"ros-{ros_distro}-" + if name.startswith(legacy_prefix): + return name[len(legacy_prefix):] + elif name.startswith("ros2-"): + return name[len("ros2-"):] + elif name.startswith("ros-"): + return name[len("ros-"):] + else: + return name + + +def main() -> int: + ros_distro = get_ros_distro() + patches = build_patches_dict(PATCH_DIR) + + groups: dict[str, list[str]] = {} + for prefix in patches: + groups.setdefault(shortname_of(prefix, ros_distro), []).append(prefix) + + collisions = { + shortname: prefixes + for shortname, prefixes in groups.items() + if len(prefixes) > 1 + } + + if not collisions: + print(f"OK: no orphaned platform-specific patches ({len(patches)} patch-file prefixes scanned).") + return 0 + + print( + "ORPHANED PLATFORM PATCH RISK: the following packages have patch files " + "spread across more than one name-prefix variant. vinca's " + "add_package_name_variants() cross-links prefix variants via " + "dict.setdefault(), which is a no-op once a variant already exists as its " + "own entry -- so only ONE of the prefixes below will end up attached to " + "the package's real generated recipe; any platform-specific patch under " + "the others is silently never applied.\n", + file=sys.stderr, + ) + for shortname, prefixes in sorted(collisions.items()): + print(f" {shortname}:", file=sys.stderr) + for prefix in sorted(prefixes): + files = [ + os.path.basename(f) + for platform_files in patches[prefix].values() + for f in platform_files + ] + print(f" {prefix}: {', '.join(sorted(files))}", file=sys.stderr) + print( + "\nFix: rename the patch file(s) so every file for a given package shares " + "the SAME name prefix (matching whichever prefix that package's own " + "recipe.yaml actually resolves to -- check recipes//*/recipe.yaml's " + "source.patches entries, or regenerate recipes locally and inspect).", + file=sys.stderr, + ) + return 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/pixi.toml b/pixi.toml index 85874cc65..ae7ba432e 100644 --- a/pixi.toml +++ b/pixi.toml @@ -37,7 +37,8 @@ vinca = { git = "https://github.com/RoboStack/vinca.git", rev = "34316c7f195b359 [tasks] generate-recipes = { cmd = "vinca -m", depends-on = ["remove-recipes"] } generate-gha-workflows = { cmd = "vinca-gha --trigger-branch dummy_build_branch_as_it_is_unused -d ./recipes", depends-on = ["generate-recipes"] } -check-patches = { cmd = "python check_patches_clean_apply.py", depends-on = ["generate-recipes"] } +check-orphaned-patches = { cmd = "python check_orphaned_platform_patches.py", description = "Detect patch/ files vinca's add_package_name_variants() will never wire into any recipe because a same-package patch exists under a different name-prefix variant (see script docstring)." } +check-patches = { cmd = "python check_patches_clean_apply.py", depends-on = ["generate-recipes", "check-orphaned-patches"] } create_snapshot = { cmd = "vinca-snapshot -d rolling -o rosdistro_snapshot.yaml" } upload = "rattler-build upload prefix -c robostack-rolling --generate-attestation" build_continue_on_failure = { cmd = "rattler-build build --recipe-dir ./recipes -m ./conda_build_config.yaml -c https://repo.prefix.dev/robostack-rolling -c https://repo.prefix.dev/conda-forge --continue-on-failure --skip-existing --channel-priority disabled", depends-on = ["generate-recipes"] } From 714791c2ae7bf356047213cce1f6ad3ce6a0eff6 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 19:09:51 +1000 Subject: [PATCH 138/180] fix: rmf_task_ros2 WINDOWS_EXPORT_ALL_SYMBOLS for missing import lib rmf_task_ros2.dll built fine but produced no companion .lib (no explicit dllexport annotations, and only 5 source files so the 65535-object import-lib limit isn't a concern here), so rmf_task_dispatcher and rmf_bidder_node failed with LNK1181. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-task-ros2.win.patch | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/patch/ros-rolling-rmf-task-ros2.win.patch b/patch/ros-rolling-rmf-task-ros2.win.patch index 3fa544fb1..c12276f53 100644 --- a/patch/ros-rolling-rmf-task-ros2.win.patch +++ b/patch/ros-rolling-rmf-task-ros2.win.patch @@ -1,8 +1,25 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 9dc2b82c..e1c0e7f4 100644 +index 9dc2b82c..1d248be7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -37,12 +37,32 @@ target_link_libraries(rmf_task_ros2 +@@ -30,6 +30,16 @@ find_package(nlohmann_json_schema_validator REQUIRED) + file(GLOB_RECURSE core_lib_srcs "src/rmf_task_ros2/*.cpp") + add_library(rmf_task_ros2 SHARED ${core_lib_srcs}) + ++if(MSVC) ++ # No explicit dllexport annotations anywhere in this target, so ++ # without this MSVC produces the .dll but no companion .lib, and ++ # rmf_task_dispatcher/rmf_bidder_node fail with LNK1181. Only 5 ++ # source files here (vs. rmf_traffic_ros2's 26), so the LNK1189 ++ # 65535-object import-lib limit isn't a concern. ++ set_target_properties(rmf_task_ros2 PROPERTIES ++ WINDOWS_EXPORT_ALL_SYMBOLS ON) ++endif() ++ + target_link_libraries(rmf_task_ros2 + PUBLIC + ${std_msgs_TARGETS} +@@ -37,12 +47,32 @@ target_link_libraries(rmf_task_ros2 rmf_traffic::rmf_traffic rmf_traffic_ros2::rmf_traffic_ros2 rmf_websocket::rmf_websocket From 0794d45360a17f7f7c2a2ccda64bb033b4d23228 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 19:21:48 +1000 Subject: [PATCH 139/180] fix: rmf_task_sequence M_PI undeclared via rmf_traffic's Interpolate.hpp Same _USE_MATH_DEFINES pattern hit repeatedly this session -- MSVC only defines M_PI when this macro is set before / is first included, and rmf_traffic's installed agv/Interpolate.hpp uses it unconditionally. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-task-sequence.win.patch | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 patch/ros-rolling-rmf-task-sequence.win.patch diff --git a/patch/ros-rolling-rmf-task-sequence.win.patch b/patch/ros-rolling-rmf-task-sequence.win.patch new file mode 100644 index 000000000..7845a0d14 --- /dev/null +++ b/patch/ros-rolling-rmf-task-sequence.win.patch @@ -0,0 +1,17 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 9c585b57..130080b2 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -13,6 +13,12 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) + endif() + ++if(MSVC) ++ # M_PI et al. are non-standard extensions MSVC only defines when this ++ # is set (used via rmf_traffic's installed agv/Interpolate.hpp). ++ add_compile_definitions(_USE_MATH_DEFINES) ++endif() ++ + if(NOT CMAKE_BUILD_TYPE) + # Use the Release build type by default if the user has not specified one + set(CMAKE_BUILD_TYPE Release) From af30f8c0d49821a631d5ec42dac7947e2106ddbc Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 19:33:41 +1000 Subject: [PATCH 140/180] fix: rmf_task_sequence WINDOWS_EXPORT_ALL_SYMBOLS for missing import lib rmf_task_sequence.dll built fine but produced no companion .lib (no explicit dllexport annotations), so test_rmf_task_sequence failed with LNK1181. This also cascaded into rmf_fleet_adapter's configure step failing to find_package(rmf_task_sequence), since the package was never successfully published. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-task-sequence.win.patch | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/patch/ros-rolling-rmf-task-sequence.win.patch b/patch/ros-rolling-rmf-task-sequence.win.patch index 7845a0d14..3a9f7396d 100644 --- a/patch/ros-rolling-rmf-task-sequence.win.patch +++ b/patch/ros-rolling-rmf-task-sequence.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 9c585b57..130080b2 100644 +index 9c585b57..834b5832 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,12 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -15,3 +15,18 @@ index 9c585b57..130080b2 100644 if(NOT CMAKE_BUILD_TYPE) # Use the Release build type by default if the user has not specified one set(CMAKE_BUILD_TYPE Release) +@@ -38,6 +44,14 @@ add_library(rmf_task_sequence SHARED + ${lib_srcs} + ) + ++if(MSVC) ++ # No explicit dllexport annotations anywhere in this target, so ++ # without this MSVC produces the .dll but no companion .lib, and ++ # test_rmf_task_sequence/downstream consumers fail with LNK1181. ++ set_target_properties(rmf_task_sequence PROPERTIES ++ WINDOWS_EXPORT_ALL_SYMBOLS ON) ++endif() ++ + target_link_libraries(rmf_task_sequence + PUBLIC + rmf_task::rmf_task From d058aeec78528f8b34f476dc88655e8f76e5a6c1 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 19:42:53 +1000 Subject: [PATCH 141/180] fix: bump rmf_task_sequence build_number to force fresh win-64 build A stale win-64 build_25 was already published (predating the WINDOWS_EXPORT_ALL_SYMBOLS fix), so skip_existing kept reusing it -- which cascades into rmf_fleet_adapter failing to find_package( rmf_task_sequence) since that stale build's .dll has no import .lib. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 73e31d2ea..4ce4ec1ee 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -304,6 +304,12 @@ rmf_task: # rather than waiting to discover the stale-cache skip on the next # run. build_number: 26 +rmf_task_sequence: + # Same skip_existing pitfall as rmf_task/rmf_traffic below: a win-64 + # build_25 got published (compiles fine, produces the .dll) from a + # run BEFORE the WINDOWS_EXPORT_ALL_SYMBOLS patch was added. Bump so + # skip_existing doesn't reuse it. + build_number: 26 rmf_traffic: # A win-64 build_number 25 got published successfully (compiles fine, # produces rmf_traffic.dll) from a run BEFORE the WINDOWS_EXPORT_ALL_ From b64e23e3d423af0cb3fb18862a4e47e33f665921 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 19:57:30 +1000 Subject: [PATCH 142/180] fix: rmf_fleet_adapter M_PI undeclared across multiple sources Same _USE_MATH_DEFINES pattern hit repeatedly this session -- M_PI is used unconditionally in rmf_traffic/rmf_utils's installed headers plus this package's own RobotContext.hpp/EasyFullControl.cpp. A large number of the reported errors in EasyFullControl.cpp are cascading parser-desync noise stemming from the M_PI failures a few lines earlier in the same file, not independent bugs. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-fleet-adapter.win.patch | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 patch/ros-rolling-rmf-fleet-adapter.win.patch diff --git a/patch/ros-rolling-rmf-fleet-adapter.win.patch b/patch/ros-rolling-rmf-fleet-adapter.win.patch new file mode 100644 index 000000000..e5ae53424 --- /dev/null +++ b/patch/ros-rolling-rmf-fleet-adapter.win.patch @@ -0,0 +1,18 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 0588eeac..ae06fc23 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -10,6 +10,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) + endif() + ++if(MSVC) ++ # M_PI et al. are non-standard extensions MSVC only defines when this ++ # is set (used across rmf_traffic/rmf_utils's installed headers and ++ # this package's own agv/RobotContext.hpp, agv/EasyFullControl.cpp). ++ add_compile_definitions(_USE_MATH_DEFINES) ++endif() ++ + find_package(ament_cmake REQUIRED) + find_package(backward_ros REQUIRED) + find_package(Eigen3 REQUIRED) From c1fd940cf370c7e4d41e03de52fb33a8748a5529 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Sun, 6 Sep 2026 20:14:13 +1000 Subject: [PATCH 143/180] fix: rmf_fleet_adapter bigobj, LNK1170, and missing import lib Three confirmed win-64 failures from the same round, bundled together: - agv/Node.cpp exceeds MSVC's object section limit -- /bigobj on the main rmf_fleet_adapter target. - experimental_lift_watchdog's ${rclcpp_LIBRARIES}/${rmf_fleet_msgs_ LIBRARIES}/${std_msgs_LIBRARIES} recursively stack up duplicated full paths, overflowing link.exe's response-file line limit (LNK1170) -- same fix as rmf_traffic_ros2/rmf_task_ros2 (switch to the aggregate/imported targets, WIN32-only). - robot_state_aggregator_main has a COMPOSITION_BUILDING_DLL define that nothing in its sources actually branches on, so it has no real export annotations and MSVC produces the .dll but no import .lib (LNK1181) -- WINDOWS_EXPORT_ALL_SYMBOLS (single source file, no LNK1189 risk). Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-fleet-adapter.win.patch | 67 ++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/patch/ros-rolling-rmf-fleet-adapter.win.patch b/patch/ros-rolling-rmf-fleet-adapter.win.patch index e5ae53424..be45ddceb 100644 --- a/patch/ros-rolling-rmf-fleet-adapter.win.patch +++ b/patch/ros-rolling-rmf-fleet-adapter.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 0588eeac..ae06fc23 100644 +index 0588eeac..6776abaf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -16,3 +16,68 @@ index 0588eeac..ae06fc23 100644 find_package(ament_cmake REQUIRED) find_package(backward_ros REQUIRED) find_package(Eigen3 REQUIRED) +@@ -84,6 +91,11 @@ add_library(rmf_fleet_adapter SHARED + ${rmf_fleet_adapter_srcs} + ) + ++if(MSVC) ++ # agv/Node.cpp exceeds the default object file section limit. ++ target_compile_options(rmf_fleet_adapter PRIVATE /bigobj) ++endif() ++ + target_link_libraries(rmf_fleet_adapter + PUBLIC + rclcpp::rclcpp +@@ -280,13 +292,29 @@ add_executable(experimental_lift_watchdog + src/experimental_lift_watchdog/main.cpp + ) + +-target_link_libraries(experimental_lift_watchdog +- PRIVATE +- ${rclcpp_LIBRARIES} +- ${rmf_fleet_msgs_LIBRARIES} +- ${std_msgs_LIBRARIES} +- Threads::Threads +-) ++if(WIN32) ++ # The raw ${..._LIBRARIES} variables below each recursively re-append ++ # their own dependencies' _LIBRARIES as plain strings with no ++ # deduplication, stacking up a lot of repeated full paths. On Windows ++ # CI the concatenated link.exe response-file line exceeded its ++ # ~131071-character limit (LNK1170) -- same issue and same fix as ++ # rmf_traffic_ros2/rmf_task_ros2 hit earlier. ++ target_link_libraries(experimental_lift_watchdog ++ PRIVATE ++ rclcpp::rclcpp ++ rmf_fleet_msgs::rmf_fleet_msgs ++ ${std_msgs_TARGETS} ++ Threads::Threads ++ ) ++else() ++ target_link_libraries(experimental_lift_watchdog ++ PRIVATE ++ ${rclcpp_LIBRARIES} ++ ${rmf_fleet_msgs_LIBRARIES} ++ ${std_msgs_LIBRARIES} ++ Threads::Threads ++ ) ++endif() + + target_include_directories(experimental_lift_watchdog + PRIVATE +@@ -321,6 +349,15 @@ add_library(robot_state_aggregator_main SHARED + src/robot_state_aggregator/RobotStateAggregator.cpp + ) + ++if(MSVC) ++ # COMPOSITION_BUILDING_DLL below is vestigial -- nothing in this ++ # package's sources actually branches on it for dllexport/dllimport, ++ # so this SHARED target has no explicit export annotations at all, ++ # and MSVC produces the .dll but no import .lib. ++ set_target_properties(robot_state_aggregator_main PROPERTIES ++ WINDOWS_EXPORT_ALL_SYMBOLS ON) ++endif() ++ + target_include_directories(robot_state_aggregator_main + PRIVATE + include From 6411fc9a8042493788880df5595ae3d97361a217 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 05:51:08 +1000 Subject: [PATCH 144/180] fix: rmf_fleet_adapter RxCpp surely() ADL collision with std::apply Vendored RxCpp-4.1.0's util::surely() calls an unqualified apply(tpl, detail::surely()), where tpl is a std::tuple -- ADL brings std::apply into the candidate set alongside rxcpp::util::apply (same-namespace, reversed argument order), and MSVC resolves the resulting ambiguity differently than GCC/Clang, ending up instantiating std::tuple_size (the functor, not the tuple) and failing with C2027/C2131/C2672. Fully qualifying the call removes the ADL ambiguity; harmless on every platform since it's the exact same function unqualified lookup would already have found. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-fleet-adapter.win.patch | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/patch/ros-rolling-rmf-fleet-adapter.win.patch b/patch/ros-rolling-rmf-fleet-adapter.win.patch index be45ddceb..5da5b7869 100644 --- a/patch/ros-rolling-rmf-fleet-adapter.win.patch +++ b/patch/ros-rolling-rmf-fleet-adapter.win.patch @@ -81,3 +81,22 @@ index 0588eeac..6776abaf 100644 target_include_directories(robot_state_aggregator_main PRIVATE include +diff --git a/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-util.hpp b/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-util.hpp +index d76fa76a..a7e36281 100644 +--- a/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-util.hpp ++++ b/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-util.hpp +@@ -713,8 +713,12 @@ namespace detail { + + template + inline auto surely(const std::tuple& tpl) +- -> decltype(apply(tpl, detail::surely())) { +- return apply(tpl, detail::surely()); ++ -> decltype(rxcpp::util::apply(tpl, detail::surely())) { ++ // Fully qualified: an unqualified apply(tpl, ...) call here is ++ // subject to ADL bringing in std::apply (tpl is a std::tuple), and ++ // MSVC resolves the resulting ambiguity differently than GCC/Clang, ++ // instantiating std::tuple_size on the wrong type (C2027/C2131). ++ return rxcpp::util::apply(tpl, detail::surely()); + } + + namespace detail { From ba5bb622bbdc9a2ab3b360be9411c75eaa177ab2 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 06:39:29 +1000 Subject: [PATCH 145/180] ci: add workflow-level concurrency group to testpr.yml Ported from humble/jazzy: cancels an in-progress run on the same PR (or ref) when a new push lands, instead of letting multiple full matrix runs pile up and burn CI minutes for commits that are already superseded. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/testpr.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/testpr.yml b/.github/workflows/testpr.yml index a66693f1f..28d48c3f3 100644 --- a/.github/workflows/testpr.yml +++ b/.github/workflows/testpr.yml @@ -2,6 +2,10 @@ on: pull_request: workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + env: ROS_VERSION: 2 PYTHONIOENCODING: utf-8 From 00398d39ae1d919616d0e06bbcf6bf89364cd1a2 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 06:46:15 +1000 Subject: [PATCH 146/180] fix: rmf_traffic_ros2 export entire public API, not just prior needs rmf_fleet_adapter -- by far the biggest consumer of this library -- surfaced a dozen missing symbols at once: Negotiation (whole class), MirrorManager/MirrorManagerFuture/make_mirror, blockade::Writer, and a Graph convert() overload. The selective-export approach (LNK1189 fix) only annotated what rmf_traffic_ros2's own 5 executables needed, which was never going to be enough for a package this central. Rather than continuing to chase individual missing symbols one downstream package at a time, added RMF_TRAFFIC_ROS2_EXPORT across every class and free function declared in every remaining public header under include/rmf_traffic_ros2/ (Profile, Route, Trajectory, agv/Graph, blockade/Writer, geometry/{Circle,ConvexShape,Shape}, schedule/{Change,Inconsistencies,Itinerary,MirrorManager,Negotiation, ParticipantRegistry,Patch,Query,ScheduleIdentity}, plus the 3 remaining ParticipantDescription.hpp overloads). Verified every defining .cpp file already includes its own public header (the missing-include pitfall hit earlier for Node.cpp/MonitorNode.cpp). This should still stay well under the 65535-symbol import-lib limit since it only covers the bounded public API surface, not every internal/template-instantiation symbol the earlier blanket WINDOWS_EXPORT_ALL_SYMBOLS attempt exported. Bumps build_number again since build_29 was already published without these. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 599 ++++++++++++++++--- pkg_additional_info.yaml | 11 +- 2 files changed, 533 insertions(+), 77 deletions(-) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index c8b88f18a..bbc1b4deb 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -233,10 +233,26 @@ index 7b2902d4..ef950ef0 100644 } diff --git a/include/rmf_traffic_ros2/schedule/Negotiation.hpp b/include/rmf_traffic_ros2/schedule/Negotiation.hpp -index 318939e..1e6a61f 100644 +index 318939ef..018f3bba 100644 --- a/include/rmf_traffic_ros2/schedule/Negotiation.hpp +++ b/include/rmf_traffic_ros2/schedule/Negotiation.hpp -@@ -109,7 +109,7 @@ public: +@@ -26,12 +26,14 @@ + + #include + ++#include ++ + namespace rmf_traffic_ros2 { + namespace schedule { + + //============================================================================== + /// A ROS2 interface for negotiating solutions to schedule conflicts +-class Negotiation ++class RMF_TRAFFIC_ROS2_EXPORT Negotiation + { + public: + +@@ -109,7 +111,7 @@ public: /// /// \param[in] count /// The number of negotiations to retain @@ -406,87 +422,144 @@ index 028d6dc0..dc7cdc22 100644 ParticipantDescription participant_description(YAML::Node node); //============================================================================== -diff --git a/include/rmf_traffic_ros2/schedule/ParticipantDescription.hpp b/include/rmf_traffic_ros2/schedule/ParticipantDescription.hpp -index 6536cc22..4f50b37d 100644 ---- a/include/rmf_traffic_ros2/schedule/ParticipantDescription.hpp -+++ b/include/rmf_traffic_ros2/schedule/ParticipantDescription.hpp -@@ -23,6 +23,8 @@ - #include - #include +diff --git a/include/rmf_traffic_ros2/Profile.hpp b/include/rmf_traffic_ros2/Profile.hpp +index d4c040ab..c6d7a649 100644 +--- a/include/rmf_traffic_ros2/Profile.hpp ++++ b/include/rmf_traffic_ros2/Profile.hpp +@@ -22,12 +22,16 @@ + + #include +#include + namespace rmf_traffic_ros2 { //============================================================================== -@@ -30,6 +32,7 @@ rmf_traffic::schedule::ParticipantDescription convert( - const rmf_traffic_msgs::msg::ParticipantDescription& from); ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::Profile convert(const rmf_traffic_msgs::msg::Profile& from); //============================================================================== +RMF_TRAFFIC_ROS2_EXPORT - rmf_traffic_msgs::msg::ParticipantDescription convert( - const rmf_traffic::schedule::ParticipantDescription& from); + rmf_traffic_msgs::msg::Profile convert(const rmf_traffic::Profile& from); -diff --git a/include/rmf_traffic_ros2/detail/export.hpp b/include/rmf_traffic_ros2/detail/export.hpp -new file mode 100644 -index 00000000..a8117028 ---- /dev/null -+++ b/include/rmf_traffic_ros2/detail/export.hpp -@@ -0,0 +1,35 @@ -+/* -+ * Copyright (C) 2026 Open Source Robotics Foundation -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ * -+*/ -+ -+#ifndef RMF_TRAFFIC_ROS2__DETAIL__EXPORT_HPP -+#define RMF_TRAFFIC_ROS2__DETAIL__EXPORT_HPP -+ -+// Blanket WINDOWS_EXPORT_ALL_SYMBOLS overflows MSVC's import-lib -+// 65535-object limit for this heavily Eigen/nlohmann-templated library -+// (LNK1189), so the small set of symbols actually needed by this -+// package's own executables are exported explicitly instead. -+#if defined(_WIN32) -+ #if defined(RMF_TRAFFIC_ROS2_BUILDING_DLL) -+ #define RMF_TRAFFIC_ROS2_EXPORT __declspec(dllexport) -+ #else -+ #define RMF_TRAFFIC_ROS2_EXPORT __declspec(dllimport) -+ #endif -+#else -+ #define RMF_TRAFFIC_ROS2_EXPORT -+#endif + } // namespace rmf_traffic_ros2 +diff --git a/include/rmf_traffic_ros2/Route.hpp b/include/rmf_traffic_ros2/Route.hpp +index 19747349..f15a83b5 100644 +--- a/include/rmf_traffic_ros2/Route.hpp ++++ b/include/rmf_traffic_ros2/Route.hpp +@@ -19,19 +19,25 @@ + + #include + ++#include + -+#endif // RMF_TRAFFIC_ROS2__DETAIL__EXPORT_HPP -diff --git a/src/rmf_traffic_ros2/schedule/MonitorNode.cpp b/src/rmf_traffic_ros2/schedule/MonitorNode.cpp -index daf4e1dd..8bde4caf 100644 ---- a/src/rmf_traffic_ros2/schedule/MonitorNode.cpp -+++ b/src/rmf_traffic_ros2/schedule/MonitorNode.cpp -@@ -19,6 +19,7 @@ + namespace rmf_traffic_ros2 { - #include "internal_Node.hpp" + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::Route convert(const rmf_traffic_msgs::msg::Route& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::Route convert(const rmf_traffic::Route& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + std::vector convert( + const std::vector& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + std::vector convert( + const std::vector& from); + +diff --git a/include/rmf_traffic_ros2/Trajectory.hpp b/include/rmf_traffic_ros2/Trajectory.hpp +index 660d220b..7c86184d 100644 +--- a/include/rmf_traffic_ros2/Trajectory.hpp ++++ b/include/rmf_traffic_ros2/Trajectory.hpp +@@ -22,6 +22,8 @@ + + #include + ++#include ++ + namespace rmf_traffic_ros2 { + + //============================================================================== +@@ -31,10 +33,12 @@ namespace rmf_traffic_ros2 { + /// describing the issue. + // TODO(MXG): Consider making conversion functions that do not require any + // allocation. ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::Trajectory convert(const rmf_traffic_msgs::msg::Trajectory& from); + + //============================================================================== + /// Convert from a Trajectory instance to a Trajectory message. ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::Trajectory convert(const rmf_traffic::Trajectory& from); + + } // namespace rmf_traffic_ros2 +diff --git a/include/rmf_traffic_ros2/agv/Graph.hpp b/include/rmf_traffic_ros2/agv/Graph.hpp +index 9603ab94..8959df45 100644 +--- a/include/rmf_traffic_ros2/agv/Graph.hpp ++++ b/include/rmf_traffic_ros2/agv/Graph.hpp +@@ -26,9 +26,12 @@ + #include + #include + ++#include ++ + namespace rmf_traffic_ros2 { + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::agv::Graph convert(const rmf_site_map_msgs::msg::SiteMap& from, + int graph_idx = 0, double wp_tolerance = 1e-3); + +@@ -36,6 +39,7 @@ rmf_traffic::agv::Graph convert(const rmf_site_map_msgs::msg::SiteMap& from, + /// Convert a valid rmf_building_map_msgs::msg::Graph message to an + /// rmf_traffic::agv::Graph object. + /// Returns nullopt if required fields are missing. ++RMF_TRAFFIC_ROS2_EXPORT + std::optional convert( + const rmf_building_map_msgs::msg::Graph& from); + +@@ -43,6 +47,7 @@ std::optional convert( + /// Convert a valid rmf_traffic::agv::Graph object to an + /// rmf_building_map_msgs::msg::Graph message. + /// Returns nullptr if required fields are missing or fleet_name is empty. ++RMF_TRAFFIC_ROS2_EXPORT + std::unique_ptr convert( + const rmf_traffic::agv::Graph& from, const std::string& fleet_name); + +diff --git a/include/rmf_traffic_ros2/blockade/Writer.hpp b/include/rmf_traffic_ros2/blockade/Writer.hpp +index f6b771bc..70b7e87c 100644 +--- a/include/rmf_traffic_ros2/blockade/Writer.hpp ++++ b/include/rmf_traffic_ros2/blockade/Writer.hpp +@@ -22,13 +22,15 @@ -+#include - #include - #include + #include -diff --git a/include/rmf_traffic_ros2/Time.hpp b/include/rmf_traffic_ros2/Time.hpp -index 34675318..963bc6d6 100644 ---- a/include/rmf_traffic_ros2/Time.hpp -+++ b/include/rmf_traffic_ros2/Time.hpp -@@ -23,24 +23,32 @@ - #include - #include ++#include ++ + namespace rmf_traffic_ros2 { + namespace blockade { + + //============================================================================== + /// The Writer class provides an API that allows a Node to create blockade + /// Participants. +-class Writer : public std::enable_shared_from_this ++class RMF_TRAFFIC_ROS2_EXPORT Writer : public std::enable_shared_from_this + { + public: + +diff --git a/include/rmf_traffic_ros2/geometry/Circle.hpp b/include/rmf_traffic_ros2/geometry/Circle.hpp +index cb3d888d..b3813ec2 100644 +--- a/include/rmf_traffic_ros2/geometry/Circle.hpp ++++ b/include/rmf_traffic_ros2/geometry/Circle.hpp +@@ -22,13 +22,17 @@ + + #include +#include + @@ -494,26 +567,400 @@ index 34675318..963bc6d6 100644 //============================================================================== +RMF_TRAFFIC_ROS2_EXPORT - builtin_interfaces::msg::Time convert(rmf_traffic::Time time); + rmf_traffic_msgs::msg::Circle convert( + const rmf_traffic::geometry::Circle& circle); //============================================================================== +RMF_TRAFFIC_ROS2_EXPORT - rmf_traffic::Time convert(builtin_interfaces::msg::Time time); + rmf_traffic::geometry::Circle convert( + const rmf_traffic_msgs::msg::Circle& circle); + +diff --git a/include/rmf_traffic_ros2/geometry/ConvexShape.hpp b/include/rmf_traffic_ros2/geometry/ConvexShape.hpp +index 403b2e60..2f33ac18 100644 +--- a/include/rmf_traffic_ros2/geometry/ConvexShape.hpp ++++ b/include/rmf_traffic_ros2/geometry/ConvexShape.hpp +@@ -23,11 +23,13 @@ + #include + #include + ++#include ++ + namespace rmf_traffic_ros2 { + namespace geometry { + + //============================================================================== +-class ConvexShapeContext ++class RMF_TRAFFIC_ROS2_EXPORT ConvexShapeContext + { + public: + +@@ -47,10 +49,12 @@ private: + } // namespace geometry //============================================================================== +RMF_TRAFFIC_ROS2_EXPORT - rclcpp::Time to_ros2(rmf_traffic::Time time); + geometry::ConvexShapeContext convert( + const rmf_traffic_msgs::msg::ConvexShapeContext& from); //============================================================================== +RMF_TRAFFIC_ROS2_EXPORT - rmf_traffic::Time convert(rclcpp::Time time); + rmf_traffic_msgs::msg::ConvexShapeContext convert( + const geometry::ConvexShapeContext& from); + +diff --git a/include/rmf_traffic_ros2/geometry/Shape.hpp b/include/rmf_traffic_ros2/geometry/Shape.hpp +index 4b5ec19a..f926cc20 100644 +--- a/include/rmf_traffic_ros2/geometry/Shape.hpp ++++ b/include/rmf_traffic_ros2/geometry/Shape.hpp +@@ -23,11 +23,13 @@ + #include + #include + ++#include ++ + namespace rmf_traffic_ros2 { + namespace geometry { + + //============================================================================== +-class ShapeContext ++class RMF_TRAFFIC_ROS2_EXPORT ShapeContext + { + public: + +@@ -47,10 +49,12 @@ private: + } // namespace geometry //============================================================================== +RMF_TRAFFIC_ROS2_EXPORT - rclcpp::Duration convert(rmf_traffic::Duration duration); + geometry::ShapeContext convert( + const rmf_traffic_msgs::msg::ShapeContext& from); //============================================================================== +RMF_TRAFFIC_ROS2_EXPORT - rmf_traffic::Duration convert(rclcpp::Duration duration); + rmf_traffic_msgs::msg::ShapeContext convert( + const geometry::ShapeContext& from); + +diff --git a/include/rmf_traffic_ros2/schedule/Change.hpp b/include/rmf_traffic_ros2/schedule/Change.hpp +index 644d7ee8..8d1485b9 100644 +--- a/include/rmf_traffic_ros2/schedule/Change.hpp ++++ b/include/rmf_traffic_ros2/schedule/Change.hpp +@@ -25,41 +25,52 @@ + #include + #include + ++#include ++ + namespace rmf_traffic_ros2 { + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::schedule::Change::Add::Item convert( + const rmf_traffic_msgs::msg::ScheduleChangeAddItem& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::ScheduleChangeAddItem convert( + const rmf_traffic::schedule::Change::Add::Item& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::schedule::Change::Add convert( + const rmf_traffic_msgs::msg::ScheduleChangeAdd& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::ScheduleChangeAdd convert( + const rmf_traffic::schedule::Change::Add& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::schedule::Change::Delay convert( + const rmf_traffic_msgs::msg::ScheduleChangeDelay& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::ScheduleChangeDelay convert( + const rmf_traffic::schedule::Change::Delay& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::schedule::ParticipantId convert( + const rmf_traffic::schedule::Change::UnregisterParticipant& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::schedule::Change::Cull convert( + const rmf_traffic_msgs::msg::ScheduleChangeCull& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::ScheduleChangeCull convert( + const rmf_traffic::schedule::Change::Cull& from); + +diff --git a/include/rmf_traffic_ros2/schedule/Inconsistencies.hpp b/include/rmf_traffic_ros2/schedule/Inconsistencies.hpp +index aea4d026..bbc0e397 100644 +--- a/include/rmf_traffic_ros2/schedule/Inconsistencies.hpp ++++ b/include/rmf_traffic_ros2/schedule/Inconsistencies.hpp +@@ -22,9 +22,12 @@ + #include + #include + ++#include ++ + namespace rmf_traffic_ros2 { + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::ScheduleInconsistency convert( + const rmf_traffic::schedule::Inconsistencies::Element& from, + const rmf_traffic::schedule::ProgressVersion progress_version); +diff --git a/include/rmf_traffic_ros2/schedule/Itinerary.hpp b/include/rmf_traffic_ros2/schedule/Itinerary.hpp +index 90d74c82..7a420d98 100644 +--- a/include/rmf_traffic_ros2/schedule/Itinerary.hpp ++++ b/include/rmf_traffic_ros2/schedule/Itinerary.hpp +@@ -23,17 +23,22 @@ + #include + #include + ++#include ++ + namespace rmf_traffic_ros2 { + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + std::vector convert( + const rmf_traffic::schedule::Itinerary& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + std::vector convert( + const std::vector& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + std::vector convert( + const std::vector& from); + +diff --git a/include/rmf_traffic_ros2/schedule/MirrorManager.hpp b/include/rmf_traffic_ros2/schedule/MirrorManager.hpp +index d3153c92..857c4531 100644 +--- a/include/rmf_traffic_ros2/schedule/MirrorManager.hpp ++++ b/include/rmf_traffic_ros2/schedule/MirrorManager.hpp +@@ -23,16 +23,18 @@ + + #include + ++#include ++ + namespace rmf_traffic_ros2 { + namespace schedule { + + //============================================================================== +-class MirrorManager ++class RMF_TRAFFIC_ROS2_EXPORT MirrorManager + { + public: + + /// Options for the MirrorManager +- class Options ++ class RMF_TRAFFIC_ROS2_EXPORT Options + { + public: + +@@ -96,7 +98,7 @@ private: + }; + + //============================================================================== +-class MirrorManagerFuture ++class RMF_TRAFFIC_ROS2_EXPORT MirrorManagerFuture + { + public: + +@@ -153,6 +155,7 @@ private: + /// + // TODO(MXG): Use std::optional here instead of std::unique_ptr when C++17 can + // be supported. ++RMF_TRAFFIC_ROS2_EXPORT + MirrorManagerFuture make_mirror( + const std::shared_ptr& node, + rmf_traffic::schedule::Query query, +diff --git a/include/rmf_traffic_ros2/schedule/ParticipantRegistry.hpp b/include/rmf_traffic_ros2/schedule/ParticipantRegistry.hpp +index 6601639f..c7536ce6 100644 +--- a/include/rmf_traffic_ros2/schedule/ParticipantRegistry.hpp ++++ b/include/rmf_traffic_ros2/schedule/ParticipantRegistry.hpp +@@ -26,6 +26,8 @@ + #include + #include + ++#include ++ + namespace rmf_traffic_ros2 { + namespace schedule { + +@@ -48,7 +50,7 @@ struct AtomicOperation + + //============================================================================= + /// This is the base class for the persistence logger. +-class AbstractParticipantLogger ++class RMF_TRAFFIC_ROS2_EXPORT AbstractParticipantLogger + { + public: + /// Called when we wish to commit an operation to disk +@@ -64,7 +66,7 @@ public: + + //============================================================================= + /// YAML logger class. Logs everything to YAML buffers on disk +-class YamlLogger : public AbstractParticipantLogger ++class RMF_TRAFFIC_ROS2_EXPORT YamlLogger : public AbstractParticipantLogger + { + public: + /// Constructor +@@ -97,7 +99,7 @@ private: + /// Internally, this class implements a an append only journal. This makes it + /// independent of any id generation inside the database, as long as the said + /// database id generation algorithm is deterministic. +-class ParticipantRegistry ++class RMF_TRAFFIC_ROS2_EXPORT ParticipantRegistry + { + public: + /// Constructor +diff --git a/include/rmf_traffic_ros2/schedule/Patch.hpp b/include/rmf_traffic_ros2/schedule/Patch.hpp +index 63915f3e..5bc62fba 100644 +--- a/include/rmf_traffic_ros2/schedule/Patch.hpp ++++ b/include/rmf_traffic_ros2/schedule/Patch.hpp +@@ -22,21 +22,27 @@ + + #include + ++#include ++ + namespace rmf_traffic_ros2 { + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::ScheduleParticipantPatch convert( + const rmf_traffic::schedule::Patch::Participant& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::schedule::Patch::Participant convert( + const rmf_traffic_msgs::msg::ScheduleParticipantPatch& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::SchedulePatch convert( + const rmf_traffic::schedule::Patch& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::schedule::Patch convert( + const rmf_traffic_msgs::msg::SchedulePatch& from); + +diff --git a/include/rmf_traffic_ros2/schedule/Query.hpp b/include/rmf_traffic_ros2/schedule/Query.hpp +index 43ccb53d..8b13f0c5 100644 +--- a/include/rmf_traffic_ros2/schedule/Query.hpp ++++ b/include/rmf_traffic_ros2/schedule/Query.hpp +@@ -22,29 +22,37 @@ + + #include + ++#include ++ + namespace rmf_traffic_ros2 { + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::schedule::Query::Spacetime convert( + const rmf_traffic_msgs::msg::ScheduleQuerySpacetime& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::ScheduleQuerySpacetime convert( + const rmf_traffic::schedule::Query::Spacetime& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::schedule::Query::Participants convert( + const rmf_traffic_msgs::msg::ScheduleQueryParticipants& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::ScheduleQueryParticipants convert( + const rmf_traffic::schedule::Query::Participants& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::schedule::Query convert( + const rmf_traffic_msgs::msg::ScheduleQuery& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::ScheduleQuery convert( + const rmf_traffic::schedule::Query& from); + +diff --git a/include/rmf_traffic_ros2/schedule/ScheduleIdentity.hpp b/include/rmf_traffic_ros2/schedule/ScheduleIdentity.hpp +index 168f5d34..4550fc59 100644 +--- a/include/rmf_traffic_ros2/schedule/ScheduleIdentity.hpp ++++ b/include/rmf_traffic_ros2/schedule/ScheduleIdentity.hpp +@@ -21,6 +21,8 @@ + #include + #include + ++#include ++ + namespace rmf_traffic_ros2 { + namespace schedule { + +@@ -30,12 +32,14 @@ namespace schedule { + /// the data of the new incoming message and the function will return true. If + /// no reconnection should happen then the previous argument will not be + /// modified and the function will return false. ++RMF_TRAFFIC_ROS2_EXPORT + bool reconnect_schedule( + rmf_traffic_msgs::msg::ScheduleIdentity& previous, + const rmf_traffic_msgs::msg::ScheduleIdentity& incoming); + + /// Same as its overload, but it accepts an optional for previous. When previous + /// is nullopt, this will save incoming and return true. ++RMF_TRAFFIC_ROS2_EXPORT + bool reconnect_schedule( + std::optional& previous, + const rmf_traffic_msgs::msg::ScheduleIdentity& incoming); +@@ -43,6 +47,7 @@ bool reconnect_schedule( + //============================================================================== + /// Equivalent to reconnect_schedule, but it does not modify the previous + /// argument. ++RMF_TRAFFIC_ROS2_EXPORT + bool need_reconnection( + const rmf_traffic_msgs::msg::ScheduleIdentity& previous, + const rmf_traffic_msgs::msg::ScheduleIdentity& incoming); +diff --git a/include/rmf_traffic_ros2/schedule/ParticipantDescription.hpp b/include/rmf_traffic_ros2/schedule/ParticipantDescription.hpp +index 6536cc22..ac62c068 100644 +--- a/include/rmf_traffic_ros2/schedule/ParticipantDescription.hpp ++++ b/include/rmf_traffic_ros2/schedule/ParticipantDescription.hpp +@@ -23,21 +23,27 @@ + #include + #include + ++#include ++ + namespace rmf_traffic_ros2 { + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::schedule::ParticipantDescription convert( + const rmf_traffic_msgs::msg::ParticipantDescription& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::ParticipantDescription convert( + const rmf_traffic::schedule::ParticipantDescription& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::schedule::ParticipantDescriptionsMap convert( + const rmf_traffic_msgs::msg::Participants& from); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic_msgs::msg::Participants convert( + const rmf_traffic::schedule::ParticipantDescriptionsMap& from); - } // namespace rmf_traffic_ros2 diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 4ce4ec1ee..c7f2ccbde 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -356,7 +356,16 @@ rmf_traffic_ros2: # Time.hpp convert()/to_ros2() overloads that were never exported. # Exported the whole (small) header rather than chasing individual # overloads one at a time. Bump again. - build_number: 29 + # + # build_29 (Time.hpp export) let rmf_task_ros2 and rmf_websocket + # build fine, but rmf_fleet_adapter -- by far the biggest consumer, + # using most of the real public API -- surfaced a dozen more missing + # symbols at once (Negotiation, MirrorManager/MirrorManagerFuture, + # blockade::Writer, a Graph convert() overload). Rather than keep + # chasing individual symbols one downstream package at a time, + # exported RMF_TRAFFIC_ROS2_EXPORT across every remaining public + # header under include/rmf_traffic_ros2/ in one pass. Bump again. + build_number: 30 rmf_utils: # The remote win-64 build (build_number 25) never actually got its # rmf_utils-config.cmake consumed by anything until rmf-traffic reached From 458cc77957f40ba9bf6c3f1a1d1d72500756e853 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 14:27:39 +1000 Subject: [PATCH 147/180] fix: rmf_traffic_ros2 restore missing detail/export.hpp patch section The new-file diff section that actually creates include/rmf_traffic_ros2/ detail/export.hpp was accidentally dropped during an earlier patch-file splice/rebuild (likely lost during the ParticipantDescription.hpp section replacement), even though every other header's #include of it survived. Local verification never caught this because it checked file *content* after patching, not that every listed file in the apply sequence actually got created -- the previous "EXIT: 0" checks were real, but I never re-grepped the patch apply's own file list against what should be there. CI caught it immediately: C1083 cannot open include file 'rmf_traffic_ros2/detail/export.hpp'. Restored the section and re-verified end-to-end this time. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 41 ++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index bbc1b4deb..ae0cfb533 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -161,6 +161,47 @@ index a05ec3e2..409ae76f 100644 # TODO(MXG): Change these executables into shared libraries that can act as # ROS2 node components +diff --git a/include/rmf_traffic_ros2/detail/export.hpp b/include/rmf_traffic_ros2/detail/export.hpp +new file mode 100644 +index 00000000..a8117028 +--- /dev/null ++++ b/include/rmf_traffic_ros2/detail/export.hpp +@@ -0,0 +1,35 @@ ++/* ++ * Copyright (C) 2026 Open Source Robotics Foundation ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ * ++*/ ++ ++#ifndef RMF_TRAFFIC_ROS2__DETAIL__EXPORT_HPP ++#define RMF_TRAFFIC_ROS2__DETAIL__EXPORT_HPP ++ ++// Blanket WINDOWS_EXPORT_ALL_SYMBOLS overflows MSVC's import-lib ++// 65535-object limit for this heavily Eigen/nlohmann-templated library ++// (LNK1189), so the small set of symbols actually needed by this ++// package's own executables are exported explicitly instead. ++#if defined(_WIN32) ++ #if defined(RMF_TRAFFIC_ROS2_BUILDING_DLL) ++ #define RMF_TRAFFIC_ROS2_EXPORT __declspec(dllexport) ++ #else ++ #define RMF_TRAFFIC_ROS2_EXPORT __declspec(dllimport) ++ #endif ++#else ++ #define RMF_TRAFFIC_ROS2_EXPORT ++#endif ++ ++#endif // RMF_TRAFFIC_ROS2__DETAIL__EXPORT_HPP diff --git a/src/rmf_traffic_ros2/schedule/Node.cpp b/src/rmf_traffic_ros2/schedule/Node.cpp index 7b2902d4..ef950ef0 100644 --- a/src/rmf_traffic_ros2/schedule/Node.cpp From c66e53bf95b9ee0f1d8e36a0edcdca25c3c38177 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 14:50:43 +1000 Subject: [PATCH 148/180] fix: rmf_traffic_ros2 restore two more sections dropped by same splice The truncation that dropped detail/export.hpp (fixed in 458cc77) also silently dropped two more sections that were positioned after ParticipantDescription.hpp at the time: MonitorNode.cpp's #include (the fix for make_monitor_node never actually getting dllexported) and the whole Time.hpp export annotations. CI confirmed the MonitorNode.cpp regression directly (LNK2019 unresolved make_monitor_node again). Restored both from the last known-good commit (6a8f481) and verified all 32 files in the patch apply cleanly in one pass this time, not just the file I suspected. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-traffic-ros2.win.patch | 49 ++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/patch/ros-rolling-rmf-traffic-ros2.win.patch b/patch/ros-rolling-rmf-traffic-ros2.win.patch index ae0cfb533..67b8830a5 100644 --- a/patch/ros-rolling-rmf-traffic-ros2.win.patch +++ b/patch/ros-rolling-rmf-traffic-ros2.win.patch @@ -1005,3 +1005,52 @@ index 6536cc22..ac62c068 100644 rmf_traffic_msgs::msg::Participants convert( const rmf_traffic::schedule::ParticipantDescriptionsMap& from); +diff --git a/src/rmf_traffic_ros2/schedule/MonitorNode.cpp b/src/rmf_traffic_ros2/schedule/MonitorNode.cpp +index daf4e1dd..8bde4caf 100644 +--- a/src/rmf_traffic_ros2/schedule/MonitorNode.cpp ++++ b/src/rmf_traffic_ros2/schedule/MonitorNode.cpp +@@ -19,6 +19,7 @@ + + #include "internal_Node.hpp" + ++#include + #include + #include + +diff --git a/include/rmf_traffic_ros2/Time.hpp b/include/rmf_traffic_ros2/Time.hpp +index 34675318..963bc6d6 100644 +--- a/include/rmf_traffic_ros2/Time.hpp ++++ b/include/rmf_traffic_ros2/Time.hpp +@@ -23,24 +23,32 @@ + #include + #include + ++#include ++ + namespace rmf_traffic_ros2 { + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + builtin_interfaces::msg::Time convert(rmf_traffic::Time time); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::Time convert(builtin_interfaces::msg::Time time); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rclcpp::Time to_ros2(rmf_traffic::Time time); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::Time convert(rclcpp::Time time); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rclcpp::Duration convert(rmf_traffic::Duration duration); + + //============================================================================== ++RMF_TRAFFIC_ROS2_EXPORT + rmf_traffic::Duration convert(rclcpp::Duration duration); + + } // namespace rmf_traffic_ros2 From df970f504329d318a0d99e48867c03bfed5086cf Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 15:38:52 +1000 Subject: [PATCH 149/180] fix: rmf_fleet_adapter missing import lib + LNK1170 on 4 executables rmf_fleet_adapter.dll had no export annotations at all (58 source files, heavy Eigen/nlohmann/rxcpp use like rmf_traffic_ros2), so every consumer failed with LNK1181. Given rmf_traffic_ros2's blanket WINDOWS_EXPORT_ALL_SYMBOLS attempt hit the 65535-symbol import-lib limit at a similar size, skipped straight to selective export this time: new detail/export.hpp + RMF_FLEET_ADAPTER_EXPORT across the entire public API (only 12 headers here, much more tractable than rmf_traffic_ros2's 23) -- Adapter, EasyTrafficLight, RobotUpdateHandle, FleetUpdateHandle (+ consider_all()), all 8 EasyFullControl-family classes (including its 7 out-of-line-defined nested classes), MockAdapter, Waypoint, Transformation, RobotCommandHandle, ParkRobotIndefinitely, parse_graph. Verified every defining .cpp (or its internal_*.hpp, which several of these route through) actually includes the header carrying the annotation. Also fixed the same LNK1170 legacy-_LIBRARIES pattern (WIN32-only aggregate targets) for 4 more executables that surfaced this round: full_control, mock_traffic_light, door_supervisor, dump_fleet_states. Several other executables in this file still use the same pattern but haven't failed yet -- will fix as they surface. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-fleet-adapter.win.patch | 468 +++++++++++++++++- 1 file changed, 464 insertions(+), 4 deletions(-) diff --git a/patch/ros-rolling-rmf-fleet-adapter.win.patch b/patch/ros-rolling-rmf-fleet-adapter.win.patch index 5da5b7869..ca2999486 100644 --- a/patch/ros-rolling-rmf-fleet-adapter.win.patch +++ b/patch/ros-rolling-rmf-fleet-adapter.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 0588eeac..6776abaf 100644 +index 0588eeac..7155d63c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") @@ -16,19 +16,86 @@ index 0588eeac..6776abaf 100644 find_package(ament_cmake REQUIRED) find_package(backward_ros REQUIRED) find_package(Eigen3 REQUIRED) -@@ -84,6 +91,11 @@ add_library(rmf_fleet_adapter SHARED +@@ -84,6 +91,18 @@ add_library(rmf_fleet_adapter SHARED ${rmf_fleet_adapter_srcs} ) +if(MSVC) + # agv/Node.cpp exceeds the default object file section limit. + target_compile_options(rmf_fleet_adapter PRIVATE /bigobj) ++ ++ # WINDOWS_EXPORT_ALL_SYMBOLS overflows MSVC's import-lib 65535-object ++ # limit (LNK1189) on this heavily Eigen/nlohmann/rxcpp-templated ++ # library, same as rmf_traffic_ros2. Use explicit ++ # RMF_FLEET_ADAPTER_EXPORT annotations (detail/export.hpp) across ++ # the whole public API instead. ++ target_compile_definitions(rmf_fleet_adapter PRIVATE RMF_FLEET_ADAPTER_BUILDING_DLL) +endif() + target_link_libraries(rmf_fleet_adapter PUBLIC rclcpp::rclcpp -@@ -280,13 +292,29 @@ add_executable(experimental_lift_watchdog +@@ -203,12 +222,25 @@ target_link_libraries(read_only_blockade + + add_executable(full_control src/full_control/main.cpp) + +-target_link_libraries(full_control +- PRIVATE +- rmf_fleet_adapter +- ${rmf_fleet_msgs_LIBRARIES} +- ${rmf_task_msgs_LIBRARIES} +-) ++if(WIN32) ++ # The raw ${..._LIBRARIES} variables below each recursively re-append ++ # their own dependencies' _LIBRARIES as plain strings with no ++ # deduplication, overflowing link.exe's response-file line limit ++ # (LNK1170) -- same issue and fix as rmf_traffic_ros2/rmf_task_ros2. ++ target_link_libraries(full_control ++ PRIVATE ++ rmf_fleet_adapter ++ rmf_fleet_msgs::rmf_fleet_msgs ++ rmf_task_msgs::rmf_task_msgs ++ ) ++else() ++ target_link_libraries(full_control ++ PRIVATE ++ rmf_fleet_adapter ++ ${rmf_fleet_msgs_LIBRARIES} ++ ${rmf_task_msgs_LIBRARIES} ++ ) ++endif() + + target_include_directories(full_control + PRIVATE +@@ -220,12 +252,21 @@ target_include_directories(full_control + + add_executable(mock_traffic_light src/mock_traffic_light/main.cpp) + +-target_link_libraries(mock_traffic_light +- PRIVATE +- rmf_fleet_adapter +- ${rmf_task_msgs_LIBRARIES} +- ${rmf_fleet_msgs_LIBRARIES} +-) ++if(WIN32) ++ target_link_libraries(mock_traffic_light ++ PRIVATE ++ rmf_fleet_adapter ++ rmf_task_msgs::rmf_task_msgs ++ rmf_fleet_msgs::rmf_fleet_msgs ++ ) ++else() ++ target_link_libraries(mock_traffic_light ++ PRIVATE ++ rmf_fleet_adapter ++ ${rmf_task_msgs_LIBRARIES} ++ ${rmf_fleet_msgs_LIBRARIES} ++ ) ++endif() + + target_include_directories(mock_traffic_light + PRIVATE +@@ -280,13 +321,29 @@ add_executable(experimental_lift_watchdog src/experimental_lift_watchdog/main.cpp ) @@ -65,7 +132,35 @@ index 0588eeac..6776abaf 100644 target_include_directories(experimental_lift_watchdog PRIVATE -@@ -321,6 +349,15 @@ add_library(robot_state_aggregator_main SHARED +@@ -302,12 +359,21 @@ add_executable(door_supervisor + src/door_supervisor/Node.cpp + ) + +-target_link_libraries(door_supervisor +- PRIVATE +- rmf_fleet_adapter +- ${rclcpp_LIBRARIES} +- ${rmf_door_msgs_LIBRARIES} +-) ++if(WIN32) ++ target_link_libraries(door_supervisor ++ PRIVATE ++ rmf_fleet_adapter ++ rclcpp::rclcpp ++ rmf_door_msgs::rmf_door_msgs ++ ) ++else() ++ target_link_libraries(door_supervisor ++ PRIVATE ++ rmf_fleet_adapter ++ ${rclcpp_LIBRARIES} ++ ${rmf_door_msgs_LIBRARIES} ++ ) ++endif() + + target_include_directories(door_supervisor + PRIVATE +@@ -321,6 +387,15 @@ add_library(robot_state_aggregator_main SHARED src/robot_state_aggregator/RobotStateAggregator.cpp ) @@ -81,6 +176,34 @@ index 0588eeac..6776abaf 100644 target_include_directories(robot_state_aggregator_main PRIVATE include +@@ -421,12 +496,21 @@ add_executable(dump_fleet_states + test/dump_fleet_states.cpp + ) + +-target_link_libraries(dump_fleet_states +- PRIVATE +- rmf_fleet_adapter +- ${rclcpp_LIBRARIES} +- ${rmf_fleet_msgs_LIBRARIES} +-) ++if(WIN32) ++ target_link_libraries(dump_fleet_states ++ PRIVATE ++ rmf_fleet_adapter ++ rclcpp::rclcpp ++ rmf_fleet_msgs::rmf_fleet_msgs ++ ) ++else() ++ target_link_libraries(dump_fleet_states ++ PRIVATE ++ rmf_fleet_adapter ++ ${rclcpp_LIBRARIES} ++ ${rmf_fleet_msgs_LIBRARIES} ++ ) ++endif() + + target_include_directories(dump_fleet_states + PRIVATE diff --git a/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-util.hpp b/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-util.hpp index d76fa76a..a7e36281 100644 --- a/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-util.hpp @@ -100,3 +223,340 @@ index d76fa76a..a7e36281 100644 } namespace detail { +diff --git a/include/rmf_fleet_adapter/detail/export.hpp b/include/rmf_fleet_adapter/detail/export.hpp +new file mode 100644 +index 00000000..5847ec21 +--- /dev/null ++++ b/include/rmf_fleet_adapter/detail/export.hpp +@@ -0,0 +1,35 @@ ++/* ++ * Copyright (C) 2026 Open Source Robotics Foundation ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ * ++*/ ++ ++#ifndef RMF_FLEET_ADAPTER__DETAIL__EXPORT_HPP ++#define RMF_FLEET_ADAPTER__DETAIL__EXPORT_HPP ++ ++// Blanket WINDOWS_EXPORT_ALL_SYMBOLS overflows MSVC's import-lib ++// 65535-object limit for this heavily Eigen/nlohmann/rxcpp-templated ++// library (same pattern rmf_traffic_ros2 hit), so the public API is ++// exported explicitly instead via this macro. ++#if defined(_WIN32) ++ #if defined(RMF_FLEET_ADAPTER_BUILDING_DLL) ++ #define RMF_FLEET_ADAPTER_EXPORT __declspec(dllexport) ++ #else ++ #define RMF_FLEET_ADAPTER_EXPORT __declspec(dllimport) ++ #endif ++#else ++ #define RMF_FLEET_ADAPTER_EXPORT ++#endif ++ ++#endif // RMF_FLEET_ADAPTER__DETAIL__EXPORT_HPP +diff --git a/include/rmf_fleet_adapter/tasks/ParkRobotIndefinitely.hpp b/include/rmf_fleet_adapter/tasks/ParkRobotIndefinitely.hpp +index 01a2d315..569cdb1d 100644 +--- a/include/rmf_fleet_adapter/tasks/ParkRobotIndefinitely.hpp ++++ b/include/rmf_fleet_adapter/tasks/ParkRobotIndefinitely.hpp +@@ -20,13 +20,15 @@ + + #include + ++#include ++ + namespace rmf_fleet_adapter { + namespace tasks { + + //============================================================================== + /// Use this task factory to make finisher tasks (idle tasks) that will move the + /// robot to a parking spot. +-class ParkRobotIndefinitely : public rmf_task::RequestFactory ++class RMF_FLEET_ADAPTER_EXPORT ParkRobotIndefinitely : public rmf_task::RequestFactory + { + public: + /// Constructor +diff --git a/include/rmf_fleet_adapter/agv/RobotCommandHandle.hpp b/include/rmf_fleet_adapter/agv/RobotCommandHandle.hpp +index 282f856a..6e5e97e5 100644 +--- a/include/rmf_fleet_adapter/agv/RobotCommandHandle.hpp ++++ b/include/rmf_fleet_adapter/agv/RobotCommandHandle.hpp +@@ -20,12 +20,14 @@ + + #include + ++#include ++ + namespace rmf_fleet_adapter { + namespace agv { + + //============================================================================== + /// Implement this class to receive robot commands from RMF +-class RobotCommandHandle ++class RMF_FLEET_ADAPTER_EXPORT RobotCommandHandle + { + public: + +diff --git a/include/rmf_fleet_adapter/agv/parse_graph.hpp b/include/rmf_fleet_adapter/agv/parse_graph.hpp +index ad925bdc..c6226f0e 100644 +--- a/include/rmf_fleet_adapter/agv/parse_graph.hpp ++++ b/include/rmf_fleet_adapter/agv/parse_graph.hpp +@@ -23,6 +23,8 @@ + + #include + ++#include ++ + namespace rmf_fleet_adapter { + namespace agv { + +@@ -30,6 +32,7 @@ namespace agv { + /// + /// \warning This will throw a std::runtime_error if the file has a syntax + /// error. ++RMF_FLEET_ADAPTER_EXPORT + rmf_traffic::agv::Graph parse_graph( + const std::string& filename, + const rmf_traffic::agv::VehicleTraits& vehicle_traits); +diff --git a/include/rmf_fleet_adapter/agv/Waypoint.hpp b/include/rmf_fleet_adapter/agv/Waypoint.hpp +index ffa92de7..34a7d5af 100644 +--- a/include/rmf_fleet_adapter/agv/Waypoint.hpp ++++ b/include/rmf_fleet_adapter/agv/Waypoint.hpp +@@ -24,11 +24,13 @@ + + #include + ++#include ++ + namespace rmf_fleet_adapter { + namespace agv { + + //============================================================================== +-class Waypoint ++class RMF_FLEET_ADAPTER_EXPORT Waypoint + { + public: + +diff --git a/include/rmf_fleet_adapter/agv/Transformation.hpp b/include/rmf_fleet_adapter/agv/Transformation.hpp +index 9b8c5389..f203f065 100644 +--- a/include/rmf_fleet_adapter/agv/Transformation.hpp ++++ b/include/rmf_fleet_adapter/agv/Transformation.hpp +@@ -22,13 +22,15 @@ + + #include + ++#include ++ + namespace rmf_fleet_adapter { + namespace agv { + + //============================================================================== + /// A Transformation object that stores the transformation data needed to + /// perform transformation between robot and RMF cartesian frames. +-class Transformation ++class RMF_FLEET_ADAPTER_EXPORT Transformation + { + public: + +diff --git a/include/rmf_fleet_adapter/agv/Adapter.hpp b/include/rmf_fleet_adapter/agv/Adapter.hpp +index c4d90ac6..7aa23875 100644 +--- a/include/rmf_fleet_adapter/agv/Adapter.hpp ++++ b/include/rmf_fleet_adapter/agv/Adapter.hpp +@@ -26,11 +26,13 @@ + + #include + ++#include ++ + namespace rmf_fleet_adapter { + namespace agv { + + //============================================================================== +-class Adapter : public std::enable_shared_from_this ++class RMF_FLEET_ADAPTER_EXPORT Adapter : public std::enable_shared_from_this + { + public: + +diff --git a/include/rmf_fleet_adapter/agv/EasyTrafficLight.hpp b/include/rmf_fleet_adapter/agv/EasyTrafficLight.hpp +index 6db7d8b0..4af6b692 100644 +--- a/include/rmf_fleet_adapter/agv/EasyTrafficLight.hpp ++++ b/include/rmf_fleet_adapter/agv/EasyTrafficLight.hpp +@@ -21,11 +21,13 @@ + #include + #include + ++#include ++ + namespace rmf_fleet_adapter { + namespace agv { + + //============================================================================== +-class EasyTrafficLight : public std::enable_shared_from_this ++class RMF_FLEET_ADAPTER_EXPORT EasyTrafficLight : public std::enable_shared_from_this + { + public: + +diff --git a/include/rmf_fleet_adapter/agv/RobotUpdateHandle.hpp b/include/rmf_fleet_adapter/agv/RobotUpdateHandle.hpp +index 35f9e32e..c5a442b3 100644 +--- a/include/rmf_fleet_adapter/agv/RobotUpdateHandle.hpp ++++ b/include/rmf_fleet_adapter/agv/RobotUpdateHandle.hpp +@@ -34,6 +34,8 @@ + #include + #include + ++#include ++ + namespace rmf_fleet_adapter { + namespace agv { + +@@ -41,7 +43,7 @@ namespace agv { + /// You will be given an instance of this class every time you add a new robot + /// to your fleet. Use that instance to send updates to RoMi-H about your + /// robot's state. +-class RobotUpdateHandle ++class RMF_FLEET_ADAPTER_EXPORT RobotUpdateHandle + { + public: + +diff --git a/include/rmf_fleet_adapter/agv/FleetUpdateHandle.hpp b/include/rmf_fleet_adapter/agv/FleetUpdateHandle.hpp +index 75d6945f..3827e083 100644 +--- a/include/rmf_fleet_adapter/agv/FleetUpdateHandle.hpp ++++ b/include/rmf_fleet_adapter/agv/FleetUpdateHandle.hpp +@@ -39,11 +39,13 @@ + + #include + ++#include ++ + namespace rmf_fleet_adapter { + namespace agv { + + //============================================================================== +-class FleetUpdateHandle : public std::enable_shared_from_this ++class RMF_FLEET_ADAPTER_EXPORT FleetUpdateHandle : public std::enable_shared_from_this + { + public: + /// Get the name of the fleet that his handle is managing. +@@ -452,6 +454,7 @@ private: + using FleetUpdateHandlePtr = std::shared_ptr; + using ConstFleetUpdateHandlePtr = std::shared_ptr; + ++RMF_FLEET_ADAPTER_EXPORT + FleetUpdateHandle::ConsiderRequest consider_all(); + + } // namespace agv +diff --git a/include/rmf_fleet_adapter/agv/EasyFullControl.hpp b/include/rmf_fleet_adapter/agv/EasyFullControl.hpp +index 77adf885..30f12e94 100644 +--- a/include/rmf_fleet_adapter/agv/EasyFullControl.hpp ++++ b/include/rmf_fleet_adapter/agv/EasyFullControl.hpp +@@ -44,6 +44,8 @@ + // System headers + #include + ++#include ++ + namespace rmf_fleet_adapter { + namespace agv { + +@@ -52,7 +54,7 @@ namespace agv { + /// To disable specific tasks, call the respective consider_*_requests() method + /// on the FleetUpdateHandle that can be accessed within this adapter. + //============================================================================== +-class EasyFullControl : public std::enable_shared_from_this ++class RMF_FLEET_ADAPTER_EXPORT EasyFullControl : public std::enable_shared_from_this + { + public: + +@@ -147,7 +149,7 @@ private: + using EasyFullControlPtr = std::shared_ptr; + + /// Handle used to update information about one robot +-class EasyFullControl::EasyRobotUpdateHandle ++class RMF_FLEET_ADAPTER_EXPORT EasyFullControl::EasyRobotUpdateHandle + { + public: + /// Recommended function for updating information about a robot in an +@@ -202,7 +204,7 @@ private: + }; + + /// The current state of a robot, passed into EasyRobotUpdateHandle::update +-class EasyFullControl::RobotState ++class RMF_FLEET_ADAPTER_EXPORT EasyFullControl::RobotState + { + public: + /// Constructor +@@ -247,7 +249,7 @@ private: + + /// The configuration of a robot. These are parameters that typically do not + /// change over time. +-class EasyFullControl::RobotConfiguration ++class RMF_FLEET_ADAPTER_EXPORT EasyFullControl::RobotConfiguration + { + public: + +@@ -334,7 +336,7 @@ private: + rmf_utils::impl_ptr _pimpl; + }; + +-class EasyFullControl::RobotCallbacks ++class RMF_FLEET_ADAPTER_EXPORT EasyFullControl::RobotCallbacks + { + public: + +@@ -377,7 +379,7 @@ private: + + /// Used by system integrators to give feedback on the progress of executing a + /// navigation or docking command. +-class EasyFullControl::CommandExecution ++class RMF_FLEET_ADAPTER_EXPORT EasyFullControl::CommandExecution + { + public: + +@@ -431,7 +433,7 @@ private: + rmf_utils::impl_ptr _pimpl; + }; + +-class EasyFullControl::Destination ++class RMF_FLEET_ADAPTER_EXPORT EasyFullControl::Destination + { + public: + /// The name of the map where the destination is located. +@@ -475,7 +477,7 @@ private: + + /// The Configuration class contains parameters necessary to initialize an + /// EasyFullControl fleet instance and add fleets to the adapter. +-class EasyFullControl::FleetConfiguration ++class RMF_FLEET_ADAPTER_EXPORT EasyFullControl::FleetConfiguration + { + public: + +diff --git a/include/rmf_fleet_adapter/agv/test/MockAdapter.hpp b/include/rmf_fleet_adapter/agv/test/MockAdapter.hpp +index 8ae80e1e..60cdb24f 100644 +--- a/include/rmf_fleet_adapter/agv/test/MockAdapter.hpp ++++ b/include/rmf_fleet_adapter/agv/test/MockAdapter.hpp +@@ -25,6 +25,8 @@ + + #include + ++#include ++ + namespace rmf_fleet_adapter { + namespace agv { + namespace test { +@@ -33,7 +35,7 @@ namespace test { + /// This class is an alternative to the Adapter class, but made specifically for + /// testing. It does not try to connect to a Schedule Node or to any Negotiation + /// topics. It keeps its database internal. +-class MockAdapter : public std::enable_shared_from_this ++class RMF_FLEET_ADAPTER_EXPORT MockAdapter : public std::enable_shared_from_this + { + public: + From 733f9fbf377662ee50c3a72f711c52874b69b487 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 16:21:43 +1000 Subject: [PATCH 150/180] fix: rmf_fleet_adapter export load_param.hpp's 5 free functions read_only_blockade (and read_only, full_control, Adapter.cpp) all directly include src/rmf_fleet_adapter/load_param.hpp -- an internal header not under include/, so it wasn't covered by the public-API export sweep. Its definitions (load_param.cpp) compile into the main library, so the free functions it declares (get_fleet_name_parameter, get_parameter_or_default_time, get_traits_or_default, get_battery_ system, get_mechanical_system) need exporting too for these executables to link. The template get_parameter_or_default() is header-only and needs no export. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-fleet-adapter.win.patch | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/patch/ros-rolling-rmf-fleet-adapter.win.patch b/patch/ros-rolling-rmf-fleet-adapter.win.patch index ca2999486..589298701 100644 --- a/patch/ros-rolling-rmf-fleet-adapter.win.patch +++ b/patch/ros-rolling-rmf-fleet-adapter.win.patch @@ -560,3 +560,50 @@ index 8ae80e1e..60cdb24f 100644 { public: +diff --git a/src/rmf_fleet_adapter/load_param.hpp b/src/rmf_fleet_adapter/load_param.hpp +index 12663d1f..2dc8b738 100644 +--- a/src/rmf_fleet_adapter/load_param.hpp ++++ b/src/rmf_fleet_adapter/load_param.hpp +@@ -29,6 +29,8 @@ + #include + #include + ++#include ++ + namespace rmf_fleet_adapter { + + //============================================================================== +@@ -51,15 +53,18 @@ T get_parameter_or_default( + } + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + std::string get_fleet_name_parameter(rclcpp::Node& node); + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + std::chrono::nanoseconds get_parameter_or_default_time( + rclcpp::Node& node, + const std::string& param_name, + const double default_value); + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + rmf_traffic::agv::VehicleTraits get_traits_or_default( + rclcpp::Node& node, + const double default_v_nom, const double default_w_nom, +@@ -67,12 +72,14 @@ rmf_traffic::agv::VehicleTraits get_traits_or_default( + const double default_r_f, const double default_r_v); + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + std::optional get_battery_system( + rclcpp::Node& node, + const double default_voltage, + const double default_capacity, + const double default_charging_current); + ++RMF_FLEET_ADAPTER_EXPORT + std::optional get_mechanical_system( + rclcpp::Node& node, + const double default_mass, From faa6dad0ecc12790a5817a873ecbd05d6dcfb843 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 17:06:02 +1000 Subject: [PATCH 151/180] fix: rmf_fleet_adapter export remaining internal headers + nested classes Three more internal shared headers (like load_param.hpp) needed exporting since executables include them directly: ScheduleManager.hpp (class + make_schedule_manager/async_make_ schedule_manager), make_trajectory.hpp and estimation.hpp (both global-namespace free functions, no rmf_fleet_adapter:: prefix). Also: RobotUpdateHandle and FleetUpdateHandle each have several inline-defined NESTED classes (ActivityIdentifier, Stubbornness, ActionExecution, Interruption, IssueTicket, Commission, LiftDestination, Unstable; Confirmation, SpeedLimitRequest) whose out-of-line member functions need their own explicit export annotation -- same lesson already learned for rmf_traffic_ros2's MirrorManager::Options. Exported all of them at once (only 2 confirmed failing this round: ActionExecution/Interruption/Unstable, Confirmation/SpeedLimitRequest) rather than waiting for each to surface individually. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-fleet-adapter.win.patch | 261 +++++++++++++++--- 1 file changed, 218 insertions(+), 43 deletions(-) diff --git a/patch/ros-rolling-rmf-fleet-adapter.win.patch b/patch/ros-rolling-rmf-fleet-adapter.win.patch index 589298701..4373711ad 100644 --- a/patch/ros-rolling-rmf-fleet-adapter.win.patch +++ b/patch/ros-rolling-rmf-fleet-adapter.win.patch @@ -405,54 +405,103 @@ index 6db7d8b0..4af6b692 100644 public: diff --git a/include/rmf_fleet_adapter/agv/RobotUpdateHandle.hpp b/include/rmf_fleet_adapter/agv/RobotUpdateHandle.hpp -index 35f9e32e..c5a442b3 100644 +index 35f9e32e..61349e17 100644 --- a/include/rmf_fleet_adapter/agv/RobotUpdateHandle.hpp +++ b/include/rmf_fleet_adapter/agv/RobotUpdateHandle.hpp -@@ -34,6 +34,8 @@ - #include - #include - -+#include -+ - namespace rmf_fleet_adapter { - namespace agv { - -@@ -41,7 +43,7 @@ namespace agv { - /// You will be given an instance of this class every time you add a new robot - /// to your fleet. Use that instance to send updates to RoMi-H about your - /// robot's state. --class RobotUpdateHandle -+class RMF_FLEET_ADAPTER_EXPORT RobotUpdateHandle - { - public: - +@@ -149,7 +149,7 @@ public: + + /// Unique identifier for an activity that the robot is performing. Used by + /// the EasyFullControl API. +- class ActivityIdentifier ++ class RMF_FLEET_ADAPTER_EXPORT ActivityIdentifier + { + public: + +@@ -171,7 +171,7 @@ public: + /// + /// When the object is destroyed, the stubbornness will automatically be + /// released. +- class Stubbornness ++ class RMF_FLEET_ADAPTER_EXPORT Stubbornness + { + public: + /// Stop being stubborn +@@ -185,7 +185,7 @@ public: + + /// The ActionExecution class should be used to manage the execution of and + /// provide updates on ongoing actions. +- class ActionExecution ++ class RMF_FLEET_ADAPTER_EXPORT ActionExecution + { + public: + /// Update the amount of time remaining for this action. +@@ -308,7 +308,7 @@ public: + + /// An object to maintain an interruption of the current task. When this + /// object is destroyed, the task will resume. +- class Interruption ++ class RMF_FLEET_ADAPTER_EXPORT Interruption + { + public: + /// Call this function to resume the task while providing labels for +@@ -384,7 +384,7 @@ public: + /// An object to maintain an issue that is happening with the robot. When this + /// object is destroyed without calling resolve(), the issue will be + /// "dropped", which issues a warning to the log. +- class IssueTicket ++ class RMF_FLEET_ADAPTER_EXPORT IssueTicket + { + public: + +@@ -443,7 +443,7 @@ public: + + /// A description of whether the robot should accept dispatched and/or direct + /// tasks. +- class Commission ++ class RMF_FLEET_ADAPTER_EXPORT Commission + { + public: + /// Construct a Commission description with all default values. +@@ -500,7 +500,7 @@ public: + void reassign_dispatched_tasks(); + + /// Information about where the lift will be asked to go for a robot. +- class LiftDestination ++ class RMF_FLEET_ADAPTER_EXPORT LiftDestination + { + public: + /// Name of the lift that is being used. +@@ -523,7 +523,7 @@ public: + + /// This API is experimental and will not be supported in the future. Users + /// are to avoid relying on these feature for any integration. +- class Unstable ++ class RMF_FLEET_ADAPTER_EXPORT Unstable + { + public: + /// True if this robot is allowed to accept new tasks. False if the robot diff --git a/include/rmf_fleet_adapter/agv/FleetUpdateHandle.hpp b/include/rmf_fleet_adapter/agv/FleetUpdateHandle.hpp -index 75d6945f..3827e083 100644 +index 75d6945f..1bde55de 100644 --- a/include/rmf_fleet_adapter/agv/FleetUpdateHandle.hpp +++ b/include/rmf_fleet_adapter/agv/FleetUpdateHandle.hpp -@@ -39,11 +39,13 @@ - - #include - -+#include -+ - namespace rmf_fleet_adapter { - namespace agv { - - //============================================================================== --class FleetUpdateHandle : public std::enable_shared_from_this -+class RMF_FLEET_ADAPTER_EXPORT FleetUpdateHandle : public std::enable_shared_from_this - { - public: - /// Get the name of the fleet that his handle is managing. -@@ -452,6 +454,7 @@ private: - using FleetUpdateHandlePtr = std::shared_ptr; - using ConstFleetUpdateHandlePtr = std::shared_ptr; - -+RMF_FLEET_ADAPTER_EXPORT - FleetUpdateHandle::ConsiderRequest consider_all(); - - } // namespace agv +@@ -83,7 +83,7 @@ public: + + /// Confirmation is a class used by the task acceptance callbacks to decide if + /// a task description should be accepted. +- class Confirmation ++ class RMF_FLEET_ADAPTER_EXPORT Confirmation + { + public: + +@@ -233,7 +233,7 @@ public: + std::string emergency_level_name); + + /// A class used to describe speed limit imposed on lanes. +- class SpeedLimitRequest ++ class RMF_FLEET_ADAPTER_EXPORT SpeedLimitRequest + { + public: + /// Constructor diff --git a/include/rmf_fleet_adapter/agv/EasyFullControl.hpp b/include/rmf_fleet_adapter/agv/EasyFullControl.hpp index 77adf885..30f12e94 100644 --- a/include/rmf_fleet_adapter/agv/EasyFullControl.hpp @@ -607,3 +656,129 @@ index 12663d1f..2dc8b738 100644 std::optional get_mechanical_system( rclcpp::Node& node, const double default_mass, +diff --git a/src/rmf_fleet_adapter/ScheduleManager.hpp b/src/rmf_fleet_adapter/ScheduleManager.hpp +index 006a9df1..3b249ce7 100644 +--- a/src/rmf_fleet_adapter/ScheduleManager.hpp ++++ b/src/rmf_fleet_adapter/ScheduleManager.hpp +@@ -30,10 +30,12 @@ + + #include + ++#include ++ + namespace rmf_fleet_adapter { + + //============================================================================== +-class ScheduleManager ++class RMF_FLEET_ADAPTER_EXPORT ScheduleManager + { + public: + +@@ -81,6 +83,7 @@ private: + }; + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + std::future make_schedule_manager( + rclcpp::Node& node, + rmf_traffic_ros2::schedule::Writer& writer, +@@ -88,6 +91,7 @@ std::future make_schedule_manager( + rmf_traffic::schedule::ParticipantDescription description); + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + void async_make_schedule_manager( + rclcpp::Node& node, + rmf_traffic_ros2::schedule::Writer& writer, +diff --git a/src/rmf_fleet_adapter/make_trajectory.hpp b/src/rmf_fleet_adapter/make_trajectory.hpp +index a9f775e3..3bc0cfdb 100644 +--- a/src/rmf_fleet_adapter/make_trajectory.hpp ++++ b/src/rmf_fleet_adapter/make_trajectory.hpp +@@ -24,30 +24,37 @@ + + #include + ++#include ++ + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + rmf_traffic::Trajectory make_trajectory( + const rmf_fleet_msgs::msg::RobotState& state, + const rmf_traffic::agv::VehicleTraits& traits, + bool& is_sitting); + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + rmf_traffic::Trajectory make_trajectory( + const rmf_traffic::Time start_time, + const std::vector& path, + const rmf_traffic::agv::VehicleTraits& traits); + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + rmf_traffic::Trajectory make_timed_trajectory( + const std::vector& path, + const rmf_traffic::agv::VehicleTraits& traits); + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + rmf_traffic::Route make_route( + const rmf_fleet_msgs::msg::RobotState& state, + const rmf_traffic::agv::VehicleTraits& traits, + bool& is_sitting); + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + rmf_traffic::Trajectory make_hold( + const rmf_fleet_msgs::msg::Location& location, + const rmf_traffic::Time time, +diff --git a/src/rmf_fleet_adapter/estimation.hpp b/src/rmf_fleet_adapter/estimation.hpp +index 479516ca..54d8b824 100644 +--- a/src/rmf_fleet_adapter/estimation.hpp ++++ b/src/rmf_fleet_adapter/estimation.hpp +@@ -25,6 +25,8 @@ + + #include + ++#include ++ + //============================================================================== + struct TravelInfo + { +@@ -48,18 +50,21 @@ struct TravelInfo + }; + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + void check_path_finish( + rclcpp::Node* node, + const rmf_fleet_msgs::msg::RobotState& state, + TravelInfo& info); + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + void estimate_path_traveling( + rclcpp::Node* node, + const rmf_fleet_msgs::msg::RobotState& state, + TravelInfo& info); + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + void estimate_midlane_state( + const rmf_fleet_msgs::msg::Location& l, + rmf_utils::optional lane_start, +@@ -67,12 +72,14 @@ void estimate_midlane_state( + TravelInfo& info); + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + void estimate_state( + rclcpp::Node* node, + const rmf_fleet_msgs::msg::Location& state, + TravelInfo& info); + + //============================================================================== ++RMF_FLEET_ADAPTER_EXPORT + void estimate_waypoint( + rclcpp::Node* node, + const rmf_fleet_msgs::msg::Location& state, From cf5e35238c54bfd883c7eee8b239debdbf433627 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 17:51:06 +1000 Subject: [PATCH 152/180] fix: rmf_fleet_adapter restore lost RobotUpdateHandle/FleetUpdateHandle export hunks The previous commit's "merge" of new nested-class annotations into these two files' existing sections silently dropped the earlier include+outer-class-annotation hunks from df970f5 (confirmed present in that commit's actual diff via git show, so the loss happened in my local intermediate baseline generation, not in what was committed then) -- CI caught it immediately: RMF_FLEET_ADAPTER_EXPORT parsed as an undefined class name (C2079) once the macro's defining include was missing, cascading into dozens of syntax errors throughout both files. Rebuilt both sections from scratch directly against pristine (include + outer class + all nested classes + consider_all() in one pass) and, this time, audited the content of every one of the 29 changed files in this patch against its previously-verified expected export count before pushing, not just confirming `patch` applies without error. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rmf-fleet-adapter.win.patch | 69 +++++++++++++++---- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/patch/ros-rolling-rmf-fleet-adapter.win.patch b/patch/ros-rolling-rmf-fleet-adapter.win.patch index 4373711ad..d1edac885 100644 --- a/patch/ros-rolling-rmf-fleet-adapter.win.patch +++ b/patch/ros-rolling-rmf-fleet-adapter.win.patch @@ -405,10 +405,28 @@ index 6db7d8b0..4af6b692 100644 public: diff --git a/include/rmf_fleet_adapter/agv/RobotUpdateHandle.hpp b/include/rmf_fleet_adapter/agv/RobotUpdateHandle.hpp -index 35f9e32e..61349e17 100644 ---- a/include/rmf_fleet_adapter/agv/RobotUpdateHandle.hpp +index 35f9e32e..7da4b9b8 100644 +--- b/include/rmf_fleet_adapter/agv/RobotUpdateHandle.hpp +++ b/include/rmf_fleet_adapter/agv/RobotUpdateHandle.hpp -@@ -149,7 +149,7 @@ public: +@@ -34,6 +34,8 @@ + #include + #include + ++#include ++ + namespace rmf_fleet_adapter { + namespace agv { + +@@ -41,7 +43,7 @@ namespace agv { + /// You will be given an instance of this class every time you add a new robot + /// to your fleet. Use that instance to send updates to RoMi-H about your + /// robot's state. +-class RobotUpdateHandle ++class RMF_FLEET_ADAPTER_EXPORT RobotUpdateHandle + { + public: + +@@ -149,7 +151,7 @@ public: /// Unique identifier for an activity that the robot is performing. Used by /// the EasyFullControl API. @@ -417,7 +435,7 @@ index 35f9e32e..61349e17 100644 { public: -@@ -171,7 +171,7 @@ public: +@@ -171,7 +173,7 @@ public: /// /// When the object is destroyed, the stubbornness will automatically be /// released. @@ -426,7 +444,7 @@ index 35f9e32e..61349e17 100644 { public: /// Stop being stubborn -@@ -185,7 +185,7 @@ public: +@@ -185,7 +187,7 @@ public: /// The ActionExecution class should be used to manage the execution of and /// provide updates on ongoing actions. @@ -435,7 +453,7 @@ index 35f9e32e..61349e17 100644 { public: /// Update the amount of time remaining for this action. -@@ -308,7 +308,7 @@ public: +@@ -308,7 +310,7 @@ public: /// An object to maintain an interruption of the current task. When this /// object is destroyed, the task will resume. @@ -444,7 +462,7 @@ index 35f9e32e..61349e17 100644 { public: /// Call this function to resume the task while providing labels for -@@ -384,7 +384,7 @@ public: +@@ -384,7 +386,7 @@ public: /// An object to maintain an issue that is happening with the robot. When this /// object is destroyed without calling resolve(), the issue will be /// "dropped", which issues a warning to the log. @@ -453,7 +471,7 @@ index 35f9e32e..61349e17 100644 { public: -@@ -443,7 +443,7 @@ public: +@@ -443,7 +445,7 @@ public: /// A description of whether the robot should accept dispatched and/or direct /// tasks. @@ -462,7 +480,7 @@ index 35f9e32e..61349e17 100644 { public: /// Construct a Commission description with all default values. -@@ -500,7 +500,7 @@ public: +@@ -500,7 +502,7 @@ public: void reassign_dispatched_tasks(); /// Information about where the lift will be asked to go for a robot. @@ -471,7 +489,7 @@ index 35f9e32e..61349e17 100644 { public: /// Name of the lift that is being used. -@@ -523,7 +523,7 @@ public: +@@ -523,7 +525,7 @@ public: /// This API is experimental and will not be supported in the future. Users /// are to avoid relying on these feature for any integration. @@ -481,10 +499,25 @@ index 35f9e32e..61349e17 100644 public: /// True if this robot is allowed to accept new tasks. False if the robot diff --git a/include/rmf_fleet_adapter/agv/FleetUpdateHandle.hpp b/include/rmf_fleet_adapter/agv/FleetUpdateHandle.hpp -index 75d6945f..1bde55de 100644 ---- a/include/rmf_fleet_adapter/agv/FleetUpdateHandle.hpp +index 75d6945f..a9859f84 100644 +--- b/include/rmf_fleet_adapter/agv/FleetUpdateHandle.hpp +++ b/include/rmf_fleet_adapter/agv/FleetUpdateHandle.hpp -@@ -83,7 +83,7 @@ public: +@@ -39,11 +39,13 @@ + + #include + ++#include ++ + namespace rmf_fleet_adapter { + namespace agv { + + //============================================================================== +-class FleetUpdateHandle : public std::enable_shared_from_this ++class RMF_FLEET_ADAPTER_EXPORT FleetUpdateHandle : public std::enable_shared_from_this + { + public: + /// Get the name of the fleet that his handle is managing. +@@ -83,7 +85,7 @@ public: /// Confirmation is a class used by the task acceptance callbacks to decide if /// a task description should be accepted. @@ -493,7 +526,7 @@ index 75d6945f..1bde55de 100644 { public: -@@ -233,7 +233,7 @@ public: +@@ -233,7 +235,7 @@ public: std::string emergency_level_name); /// A class used to describe speed limit imposed on lanes. @@ -502,6 +535,14 @@ index 75d6945f..1bde55de 100644 { public: /// Constructor +@@ -452,6 +454,7 @@ private: + using FleetUpdateHandlePtr = std::shared_ptr; + using ConstFleetUpdateHandlePtr = std::shared_ptr; + ++RMF_FLEET_ADAPTER_EXPORT + FleetUpdateHandle::ConsiderRequest consider_all(); + + } // namespace agv diff --git a/include/rmf_fleet_adapter/agv/EasyFullControl.hpp b/include/rmf_fleet_adapter/agv/EasyFullControl.hpp index 77adf885..30f12e94 100644 --- a/include/rmf_fleet_adapter/agv/EasyFullControl.hpp From 2ab8acc0bdd54f72022758b9732ed91108fb376d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 18:34:08 +1000 Subject: [PATCH 153/180] fix: rmf_fleet_adapter_python M_PI undeclared via rmf_traffic's Interpolate.hpp Same _USE_MATH_DEFINES pattern hit repeatedly this session. Co-Authored-By: Claude Sonnet 5 --- ...s-rolling-rmf-fleet-adapter-python.win.patch | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 patch/ros-rolling-rmf-fleet-adapter-python.win.patch diff --git a/patch/ros-rolling-rmf-fleet-adapter-python.win.patch b/patch/ros-rolling-rmf-fleet-adapter-python.win.patch new file mode 100644 index 000000000..c43b7e574 --- /dev/null +++ b/patch/ros-rolling-rmf-fleet-adapter-python.win.patch @@ -0,0 +1,17 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index f71ed979..c28faa14 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -14,6 +14,12 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) + endif() + ++if(MSVC) ++ # M_PI et al. are non-standard extensions MSVC only defines when this ++ # is set (used via rmf_traffic's installed agv/Interpolate.hpp). ++ add_compile_definitions(_USE_MATH_DEFINES) ++endif() ++ + if(NOT CMAKE_BUILD_TYPE) + # Use the Release build type by default if the user has not specified one + set(CMAKE_BUILD_TYPE Release) From b8e8eeab33a1d703e2c7817aaa959aec110e525f Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 19:17:00 +1000 Subject: [PATCH 154/180] fix: rmf_visualization_floorplans M_PI undeclared Same _USE_MATH_DEFINES pattern hit repeatedly this session (src/FloorplanVisualizer.cpp uses M_PI unconditionally). Co-Authored-By: Claude Sonnet 5 --- ...lling-rmf-visualization-floorplans.win.patch | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 patch/ros-rolling-rmf-visualization-floorplans.win.patch diff --git a/patch/ros-rolling-rmf-visualization-floorplans.win.patch b/patch/ros-rolling-rmf-visualization-floorplans.win.patch new file mode 100644 index 000000000..e52533c6a --- /dev/null +++ b/patch/ros-rolling-rmf-visualization-floorplans.win.patch @@ -0,0 +1,17 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index f498d456..7427243c 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -5,6 +5,12 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) + endif() + ++if(MSVC) ++ # M_PI is a non-standard extension MSVC only defines when this is ++ # set (used in src/FloorplanVisualizer.cpp). ++ add_compile_definitions(_USE_MATH_DEFINES) ++endif() ++ + include(GNUInstallDirs) + + find_package(eigen3_cmake_module REQUIRED) From 7c49c217f3657eb8c1a43591420f59eb3c26a5d6 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 20:00:07 +1000 Subject: [PATCH 155/180] fix: rmf_visualization_schedule /Zc:__cplusplus + M_PI_2 Same websocketpp boost::is_same pattern as rmf_websocket (MSVC's __cplusplus macro isn't updated without this flag, so websocketpp's feature detection wrongly falls back to a Boost shim recent Boost no longer provides), plus the usual M_PI_2/_USE_MATH_DEFINES gap in test/SubmitTrajectory.cpp. Co-Authored-By: Claude Sonnet 5 --- ...lling-rmf-visualization-schedule.win.patch | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 patch/ros-rolling-rmf-visualization-schedule.win.patch diff --git a/patch/ros-rolling-rmf-visualization-schedule.win.patch b/patch/ros-rolling-rmf-visualization-schedule.win.patch new file mode 100644 index 000000000..493a937f5 --- /dev/null +++ b/patch/ros-rolling-rmf-visualization-schedule.win.patch @@ -0,0 +1,24 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index e2fe859f..7c527238 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -7,6 +7,19 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS on) + # RoboStack/ros-lyrical#41's fix), which still provides io_service. + add_compile_definitions(ASIO_STANDALONE) + ++if(MSVC) ++ # MSVC doesn't update __cplusplus to reflect the actual C++ standard ++ # in use unless told to, so websocketpp's __cplusplus >= 201103L ++ # feature-detection in common/cpp11.hpp always fails, falling back ++ # to boost::is_same -- which recent Boost versions no longer provide ++ # (C2039/C2873 in websocketpp/common/type_traits.hpp). ++ add_compile_options(/Zc:__cplusplus) ++ ++ # M_PI_2 et al. are non-standard extensions MSVC only defines when ++ # this is set (used in test/SubmitTrajectory.cpp). ++ add_compile_definitions(_USE_MATH_DEFINES) ++endif() ++ + # Default to C++17 + if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 17) From d8bbe071f0a9f6ce96258a71ae80b406c20b8469 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 20:22:07 +1000 Subject: [PATCH 156/180] fix: rmf_visualization_schedule uint non-standard typedef Same uint->unsigned int pattern hit repeatedly this session (src/ScheduleVisualizer.cpp:110's retained_history_count parameter). Co-Authored-By: Claude Sonnet 5 --- ...ros-rolling-rmf-visualization-schedule.win.patch | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/patch/ros-rolling-rmf-visualization-schedule.win.patch b/patch/ros-rolling-rmf-visualization-schedule.win.patch index 493a937f5..7ac9e1b00 100644 --- a/patch/ros-rolling-rmf-visualization-schedule.win.patch +++ b/patch/ros-rolling-rmf-visualization-schedule.win.patch @@ -22,3 +22,16 @@ index e2fe859f..7c527238 100644 # Default to C++17 if(NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 17) +diff --git a/src/ScheduleVisualizer.cpp b/src/ScheduleVisualizer.cpp +index 961c512b..7a7bc2f9 100644 +--- a/src/ScheduleVisualizer.cpp ++++ b/src/ScheduleVisualizer.cpp +@@ -107,7 +107,7 @@ ScheduleVisualizer::ScheduleVisualizer( + "Setting parameter port to %d", port + ); + +- uint retained_history_count = this->declare_parameter( ++ unsigned int retained_history_count = this->declare_parameter( + "retained_history_count", 0); + RCLCPP_INFO( + this->get_logger(), From dc91ccdc5a77b3888b590e56b7d0e6d0dbd60d96 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 20:44:58 +1000 Subject: [PATCH 157/180] fix: rmf_visualization_schedule missing import lib, restore dropped fix Diffed the new WINDOWS_EXPORT_ALL_SYMBOLS change against the wrong baseline (base-patched pristine, predating the /Zc:__cplusplus + _USE_MATH_DEFINES fix), silently dropping that earlier hunk when spliced in -- same class of mistake as rmf_traffic_ros2/rmf_fleet_ adapter earlier. Rebuilt CMakeLists.txt's full win-64 diff in one pass (all three fixes together) directly against the base-patched baseline this time, and verified all three survive in the same independent apply-and-grep check before pushing. rmf_visualization_schedule.dll itself had no export annotations (only 2 source files, so WINDOWS_EXPORT_ALL_SYMBOLS is safe here, no LNK1189 risk), breaking schedule_visualizer's link (LNK1181). Co-Authored-By: Claude Sonnet 5 --- ...rolling-rmf-visualization-schedule.win.patch | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/patch/ros-rolling-rmf-visualization-schedule.win.patch b/patch/ros-rolling-rmf-visualization-schedule.win.patch index 7ac9e1b00..9fc9fdb80 100644 --- a/patch/ros-rolling-rmf-visualization-schedule.win.patch +++ b/patch/ros-rolling-rmf-visualization-schedule.win.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index e2fe859f..7c527238 100644 +index e2fe859f..6ea64723 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,19 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS on) @@ -22,6 +22,21 @@ index e2fe859f..7c527238 100644 # Default to C++17 if(NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 17) +@@ -53,6 +66,14 @@ endif() + file(GLOB_RECURSE core_lib_srcs "src/rmf_visualization_schedule/*.cpp") + add_library(rmf_visualization_schedule SHARED ${core_lib_srcs}) + ++if(MSVC) ++ # No explicit dllexport annotations anywhere in this small target ++ # (2 source files), so without this MSVC produces the .dll but no ++ # import .lib, and schedule_visualizer fails with LNK1181. ++ set_target_properties(rmf_visualization_schedule PROPERTIES ++ WINDOWS_EXPORT_ALL_SYMBOLS ON) ++endif() ++ + target_link_libraries(rmf_visualization_schedule + PUBLIC + rmf_traffic::rmf_traffic diff --git a/src/ScheduleVisualizer.cpp b/src/ScheduleVisualizer.cpp index 961c512b..7a7bc2f9 100644 --- a/src/ScheduleVisualizer.cpp From c796731cddd4f495d7e985cbd63763d953bd721c Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 21:50:50 +1000 Subject: [PATCH 158/180] fix: rosbag2_performance_benchmarking_msgs win-64 MSBuild parallel-build race Reproduced deterministically across two consecutive CI runs: MSVC hits "error C1083: Cannot open compiler generated file: ''" while compiling the generated Python typesupport "_s" aggregate extension targets (typesupport_c / typesupport_introspection_c / typesupport_fastrtps_c), which rosidl_generator_py's CMake macros build in parallel. Serialize these three targets via add_dependencies() on Windows only to avoid the race, guarded by if(TARGET ...) so it's a no-op if the target names ever change upstream. Co-Authored-By: Claude Sonnet 5 --- ...g2-performance-benchmarking-msgs.win.patch | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 patch/ros-rolling-rosbag2-performance-benchmarking-msgs.win.patch diff --git a/patch/ros-rolling-rosbag2-performance-benchmarking-msgs.win.patch b/patch/ros-rolling-rosbag2-performance-benchmarking-msgs.win.patch new file mode 100644 index 000000000..4566def5c --- /dev/null +++ b/patch/ros-rolling-rosbag2-performance-benchmarking-msgs.win.patch @@ -0,0 +1,34 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 0000000..0000000 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -10,5 +10,29 @@ + DEPENDENCIES + ) + ++if(WIN32) ++ # MSVC/MSBuild intermittently races when the generated Python typesupport ++ # "_s" extension targets (typesupport_c, typesupport_fastrtps_c, ++ # typesupport_introspection_c) are built in parallel, hitting ++ # "error C1083: Cannot open compiler generated file: ''" because the ++ # compiler-generated intermediate file name collides/gets invalidated ++ # across the concurrently-running cl.exe instances. Force these targets ++ # to build sequentially instead. ++ set(_rbpb_msgs_s_targets ++ "${PROJECT_NAME}_s__rosidl_typesupport_c" ++ "${PROJECT_NAME}_s__rosidl_typesupport_introspection_c" ++ "${PROJECT_NAME}_s__rosidl_typesupport_fastrtps_c" ++ ) ++ set(_rbpb_msgs_s_prev "") ++ foreach(_rbpb_msgs_s_target ${_rbpb_msgs_s_targets}) ++ if(TARGET ${_rbpb_msgs_s_target}) ++ if(_rbpb_msgs_s_prev AND TARGET ${_rbpb_msgs_s_prev}) ++ add_dependencies(${_rbpb_msgs_s_target} ${_rbpb_msgs_s_prev}) ++ endif() ++ set(_rbpb_msgs_s_prev ${_rbpb_msgs_s_target}) ++ endif() ++ endforeach() ++endif() ++ + ament_export_dependencies(rosidl_default_runtime) + ament_package() From 89e3dd7d0634dd1fe7863d534c91ac921a2ff59d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 7 Sep 2026 22:17:43 +1000 Subject: [PATCH 159/180] fix: enable Windows long-path support for win-64 to fix C1083 on rosbag2_performance_benchmarking_msgs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous add_dependencies() win.patch for this package assumed a parallel-MSBuild race, but it reproduced identically with that patch applied, disproving that theory. Computing the actual object/intermediate path for the failing target (rosbag2_performance_benchmarking_msgs_s__rosidl_typesupport_introspection_c) under the existing C:\bld\ short-prefix workaround lands right at the legacy 260-char MAX_PATH boundary — the well-documented trigger for MSVC's cryptic "error C1083: Cannot open compiler generated file: ''". Enabling the LongPathsEnabled registry key lets cl.exe/MSBuild (both long-path aware since VS 2019 16.0, well before windows-2022's toolset) use paths beyond that limit. This is a workflow-level fix rather than a per-package one, since any long-named package's generated targets can hit the same wall. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/testpr.yml | 13 +++++++ ...g2-performance-benchmarking-msgs.win.patch | 34 ------------------- 2 files changed, 13 insertions(+), 34 deletions(-) delete mode 100644 patch/ros-rolling-rosbag2-performance-benchmarking-msgs.win.patch diff --git a/.github/workflows/testpr.yml b/.github/workflows/testpr.yml index 28d48c3f3..05bbbfb23 100644 --- a/.github/workflows/testpr.yml +++ b/.github/workflows/testpr.yml @@ -77,6 +77,19 @@ jobs: echo "CONDA_BLD_PATH=C:\\bld\\" >> $GITHUB_ENV mkdir /c/bld + - name: Enable Windows long path support + if: matrix.platform == 'win-64' + shell: pwsh + run: | + # MSVC/MSBuild (VS 2019 16.0+, which windows-2022's toolset is well past) + # honor the Win32 long-path opt-in via this registry key. Without it, + # cl.exe can fail with a cryptic "fatal error C1083: Cannot open + # compiler generated file: ''" once a target's generated intermediate + # (.obj/.tlog) path exceeds the legacy 260-char MAX_PATH, which is easy + # to hit given how deeply nested and long rosidl-generated target names + # can get even under the shortened C:\bld\ prefix above. + New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force + # Workaround for https://github.com/RoboStack/ros-humble/pull/141#issuecomment-1941919816 - name: Clean up PATH if: contains(matrix.os, 'windows') diff --git a/patch/ros-rolling-rosbag2-performance-benchmarking-msgs.win.patch b/patch/ros-rolling-rosbag2-performance-benchmarking-msgs.win.patch deleted file mode 100644 index 4566def5c..000000000 --- a/patch/ros-rolling-rosbag2-performance-benchmarking-msgs.win.patch +++ /dev/null @@ -1,34 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 0000000..0000000 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -10,5 +10,29 @@ - DEPENDENCIES - ) - -+if(WIN32) -+ # MSVC/MSBuild intermittently races when the generated Python typesupport -+ # "_s" extension targets (typesupport_c, typesupport_fastrtps_c, -+ # typesupport_introspection_c) are built in parallel, hitting -+ # "error C1083: Cannot open compiler generated file: ''" because the -+ # compiler-generated intermediate file name collides/gets invalidated -+ # across the concurrently-running cl.exe instances. Force these targets -+ # to build sequentially instead. -+ set(_rbpb_msgs_s_targets -+ "${PROJECT_NAME}_s__rosidl_typesupport_c" -+ "${PROJECT_NAME}_s__rosidl_typesupport_introspection_c" -+ "${PROJECT_NAME}_s__rosidl_typesupport_fastrtps_c" -+ ) -+ set(_rbpb_msgs_s_prev "") -+ foreach(_rbpb_msgs_s_target ${_rbpb_msgs_s_targets}) -+ if(TARGET ${_rbpb_msgs_s_target}) -+ if(_rbpb_msgs_s_prev AND TARGET ${_rbpb_msgs_s_prev}) -+ add_dependencies(${_rbpb_msgs_s_target} ${_rbpb_msgs_s_prev}) -+ endif() -+ set(_rbpb_msgs_s_prev ${_rbpb_msgs_s_target}) -+ endif() -+ endforeach() -+endif() -+ - ament_export_dependencies(rosidl_default_runtime) - ament_package() From 0c0624c2295c25badac85170b8e3ccae40fb933e Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Tue, 8 Sep 2026 05:21:32 +1000 Subject: [PATCH 160/180] fix: pass --no-build-id on win-64 to further shorten build work-dir paths MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Windows long-path registry enable (89e3dd7) alone did not fix the rosbag2_performance_benchmarking_msgs C1083 failure — CMake/MSBuild's handling of paths near MAX_PATH has known gaps independent of the OS opt-in (see https://gitlab.kitware.com/cmake/cmake/-/issues/25936), so enabling long paths system-wide isn't sufficient on its own. rattler-build's per-package work directory is named rattler-build__; for a long recipe name like ros2-rosbag2-performance-benchmarking-msgs, combined with the already-deep rosidl-generated target/file names, this pushes some generated object paths right past the 260-char boundary. --no-build-id drops the timestamp suffix, saving ~11 chars back on every win-64 package build, which should give enough headroom here. Keeping the long-path registry fix too, since both are legitimate independent mitigations for the same class of problem. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/testpr.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/testpr.yml b/.github/workflows/testpr.yml index 05bbbfb23..9ccc8b6ce 100644 --- a/.github/workflows/testpr.yml +++ b/.github/workflows/testpr.yml @@ -161,7 +161,17 @@ jobs: shell: bash -l {0} run: | set +e - pixi run rattler-build build --recipe-dir recipes --target-platform ${{ matrix.platform }} -m ./conda_build_config.yaml -c https://prefix.dev/conda-forge -c https://prefix.dev/robostack-rolling --skip-existing --channel-priority disabled 2>&1 | tee rattler-build.log + EXTRA_BUILD_ARGS="" + if [ "${{ matrix.platform }}" == "win-64" ]; then + # Drop the timestamp suffix from the per-package build work dir + # (rattler-build__ -> rattler-build_) to claw + # back headroom under Windows' MAX_PATH for long package names, e.g. + # rosbag2_performance_benchmarking_msgs's generated rosidl Python + # typesupport targets (see error C1083 "Cannot open compiler + # generated file: ''"). + EXTRA_BUILD_ARGS="--no-build-id" + fi + pixi run rattler-build build --recipe-dir recipes --target-platform ${{ matrix.platform }} -m ./conda_build_config.yaml -c https://prefix.dev/conda-forge -c https://prefix.dev/robostack-rolling --skip-existing --channel-priority disabled $EXTRA_BUILD_ARGS 2>&1 | tee rattler-build.log build_status=${PIPESTATUS[0]} echo "exit-code=${build_status}" >> "$GITHUB_OUTPUT" exit "$build_status" From 3be713c4c10977d9d7c6c80d6da70576fd8cb736 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Tue, 8 Sep 2026 07:38:46 +1000 Subject: [PATCH 161/180] fix: rtabmap win-64 unresolvable libdc1394 host dependency libdc1394 (FireWire/IIDC camera driver) has no win-64 conda-forge build, so rattler-build's dependency solve for rtabmap failed outright with "No candidates were found for libdc1394 *." rtabmap only uses it for optional FireWire camera support (same pattern as the libpointmatcher gap already noted in vinca.yaml for this package), so it's safe to drop on Windows using the same conditional-dependency idiom already used for libgl-devel/libopengl-devel right above it in this same entry. Co-Authored-By: Claude Sonnet 5 --- patch/dependencies.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/patch/dependencies.yaml b/patch/dependencies.yaml index 3b2c0f438..65927330c 100644 --- a/patch/dependencies.yaml +++ b/patch/dependencies.yaml @@ -108,7 +108,11 @@ ros1_rosbag_storage_vendor: popf: add_host: ["perl"] rtabmap: - add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}", "ceres-solver", "libdc1394", "libusb", "vtk"] + # libdc1394 (FireWire/IIDC camera driver) has no win-64 conda-forge build; + # rtabmap only uses it for optional FireWire camera support (same pattern + # as the libpointmatcher gap noted in vinca.yaml), so it builds fine + # without it there. + add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}", "ceres-solver", "${{ 'libdc1394' if not win }}", "libusb", "vtk"] backward_ros: add_host: ["${{ 'binutils' if linux }}", "${{ 'elfutils' if linux }}", "ros-rolling-ament-cmake-libraries"] ompl: From 3bfaccca7834bb0b5b911e541016f9342efd814c Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Tue, 8 Sep 2026 07:39:22 +1000 Subject: [PATCH 162/180] fix: map libdc1394-dev to no conda package on win-64 in robostack.yaml Defense-in-depth alongside 3be713c: that commit stops rtabmap's own manually-injected libdc1394 host dependency (patch/dependencies.yaml) from breaking win-64's dependency solve, but any other package pulling in the libdc1394-dev rosdep key directly would hit the same "no candidates were found" failure. Mirrors ros-humble's fix (d004071d, itself following ros-jazzy@76bf93d1) for full parity. Co-Authored-By: Claude Sonnet 5 --- robostack.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/robostack.yaml b/robostack.yaml index a49e8fb12..6ed16d164 100644 --- a/robostack.yaml +++ b/robostack.yaml @@ -294,7 +294,10 @@ libcurl: libcurl-dev: robostack: [libcurl] libdc1394-dev: - robostack: [libdc1394] + robostack: + linux: [libdc1394] + osx: [libdc1394] + win64: [] libdraco-dev: robostack: [draco] libdw-dev: From c1e2cddda9ca765614fb989c107df287fc7095a3 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Tue, 8 Sep 2026 08:39:09 +1000 Subject: [PATCH 163/180] chore: remove longwinded narrative comments from pkg_additional_info.yaml and patch/dependencies.yaml Per the maintainer's review feedback on ros-jazzy PR #271 (relayed by the humble/jazzy session): these root-cause/history explanations don't belong in config files, even when accurate -- that context belongs in commit messages, not permanent file content. Pre-existing short one-liners (e.g. "the version on ros is outdated w.r.t. to the conda-forge one") are left untouched; only comments added during this session's fix work are removed. Verified zero build impact: regenerated recipes for win-64 and linux-64 before/after this cleanup and confirmed byte-identical output, and confirmed both files parse to identical YAML structures before/after. Co-Authored-By: Claude Sonnet 5 --- patch/dependencies.yaml | 47 --------------- pkg_additional_info.yaml | 126 --------------------------------------- 2 files changed, 173 deletions(-) diff --git a/patch/dependencies.yaml b/patch/dependencies.yaml index 65927330c..5ddfd066c 100644 --- a/patch/dependencies.yaml +++ b/patch/dependencies.yaml @@ -5,20 +5,8 @@ foxglove_bridge: ros_ign_interfaces: add_host: ["ros-rolling-rcl-interfaces"] cartographer_ros: - # package.xml's cartographer resolves to the REAL released - # ros2-cartographer ROS package, but add_host below ALSO pulls in the - # conda-forge cartographer C++ library directly -- vinca doesn't dedupe - # these, so both end up in host/run with conflicting lua pins (conda-forge - # cartographer wants lua 5.4.8, ros2-cartographer wants lua 5.5.0). Drop the - # ROS-released one; the conda-forge add_host below is what's actually meant - # to satisfy this dependency (see the pinocchio/hpp_fcl entry in build - # feedback for the same generate_dummy_package_with_run_deps pattern). remove_host: ["ros2-cartographer"] remove_run: ["ros2-cartographer"] - # resolvo mutex-misattribution bug: solver picks ros2-pcl-conversions 2.10.0's - # OLDEST published build (mutex rolling_19) instead of the current one - # (rolling_25) even though a matching-mutex build exists remotely. Same - # pattern as the cv-bridge/libg2o entries elsewhere in this repo. add_host: ["cartographer 2.*", "libboost-devel", "ceres-solver * cpu*", "ros2-pcl-conversions ==2.10.0 *_26"] add_run: ["ros2-pcl-conversions ==2.10.0 *_26"] libyaml_vendor: @@ -89,12 +77,6 @@ tvm_vendor: libphidget22: add_host: ["libusb"] libg2o: - # "qt" was previously added here but package.xml never declares a Qt/QGLViewer - # dependency, and CMakeLists.txt's find_package(QGLViewer) is optional (not - # REQUIRED) -- it just disables the optional viewer GUI when absent. Pulling - # in "qt" (pinned to Qt5 in conda_build_config.yaml) conflicts with vtk-base, - # which now only ships Qt6 builds, breaking anything that needs both (e.g. - # rtabmap, which also depends on pcl -> vtk-base). add_host: ["${{ 'libglu' if linux }}", "${{ 'freeglut' if not osx }}"] fmilibrary_vendor: add_host: ["fmilib"] @@ -108,10 +90,6 @@ ros1_rosbag_storage_vendor: popf: add_host: ["perl"] rtabmap: - # libdc1394 (FireWire/IIDC camera driver) has no win-64 conda-forge build; - # rtabmap only uses it for optional FireWire camera support (same pattern - # as the libpointmatcher gap noted in vinca.yaml), so it builds fine - # without it there. add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}", "ceres-solver", "${{ 'libdc1394' if not win }}", "libusb", "vtk"] backward_ros: add_host: ["${{ 'binutils' if linux }}", "${{ 'elfutils' if linux }}", "ros-rolling-ament-cmake-libraries"] @@ -322,46 +300,21 @@ zstd_point_cloud_transport: mujoco_vendor: add_host: ["libmujoco"] mujoco_ros2_control_plugins: - # package.xml's plain "opengl" rosdep only maps to libopengl-devel/libgl-devel - # (robostack.yaml), but CMakeLists.txt does - # find_package(OpenGL REQUIRED COMPONENTS EGL), which additionally needs - # EGL's own headers/lib. conda-forge doesn't ship libegl-devel for win-64, - # so restrict the addition to linux (this package is also selected there - # per vinca.yaml's "not wasm32 and not osx" block). add_host: - if: linux then: ["libegl-devel"] roboplan_ros_examples: - # package.xml only declares ament_cmake_python, but CMakeLists.txt does - # find_package(ament_cmake REQUIRED) and build_type is ament_cmake. - # Fixed for roboplan_ros 0.7.0, so it can be removed when this releases. add_host: ["ros-rolling-ament-cmake"] yasmin_pcl: - # Same resolvo mutex-misattribution bug as cartographer_ros above. add_host: ["ros2-pcl-conversions ==2.10.0 *_26"] add_run: ["ros2-pcl-conversions ==2.10.0 *_26"] rmf_fleet_adapter_python: - # pybind11_json is used for nlohmann::json <-> pybind11 conversions in the - # bindings but isn't declared in package.xml (a rosdistro release gap); - # header-only, so host-only is sufficient. add_host: ["pybind11_json"] rmf_visualization_schedule: - # Needed >=3.6.4 to build successfully on macOS during an earlier build - # pass; package.xml itself declares openssl with no version constraint. remove_host: ["openssl"] remove_run: ["openssl"] - # Same websocketpp/Boost.Asio io_service incompatibility as rmf_websocket - # above -- this package also uses websocketpp::config::asio directly. - # Pinned to 1.29.0 (the newest conda-forge build that still ships - # io_service.hpp -- 1.30+ removed it too). add_host: ["openssl >=3.6.4", "asio ==1.29.0"] add_run: ["openssl >=3.6.4", "asio ==1.29.0"] rmf_websocket: - # websocketpp 0.8.2 requires boost::asio APIs (io_service et al.) that - # Boost 1.90 removed; the patch defines ASIO_STANDALONE so websocketpp - # uses the standalone asio instead, matching ros-lyrical's fix in - # RoboStack/ros-lyrical#41. Pinned to 1.29.0 (the newest conda-forge - # build that still ships io_service.hpp -- 1.30+ removed it too, same - # underlying upstream deprecation that hit Boost.Asio). add_host: ["asio ==1.29.0"] add_run: ["asio ==1.29.0"] diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index c7f2ccbde..c150d158f 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -227,159 +227,33 @@ visp: generate_dummy_package_with_run_deps: dep_name: visp max_pin: 'x.x' - # the version on ros is outdated w.r.t. to the conda-forge one; 3.7.0 has no - # conflicting run_constraints (unlike 3.6.0, which needs an older libprotobuf). override_version: '3.7.0' zenoh_cpp_vendor: additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK -DUSE_SYSTEM_ZENOH=ON" cv_bridge: - # Same stale-remote-build pattern as libg2o below: the remote build was - # published against ros2-distro-mutex 0.19.* rolling_*, several versions - # behind the current 0.20.0 rolling_27. Bump so skip_existing forces a - # fresh local build against the current mutex. build_number: 26 distro_mutex: - # vinca.yaml's mutex_package.build_number was bumped to 26 to re-publish - # ros2-distro-mutex with vtk 9.7.0.* (was 9.6.2.*), but should_skip_mutex_package - # only compares against this file's per-package override (falling back to the - # top-level build_number: 25) -- without this entry it still matched the stale - # remote 0.20.0 rolling_25 build and skipped generating a fresh recipe entirely, - # so every package needing pcl/vtk resolved against the old vtk 9.6.2 constraint. build_number: 26 libg2o: - # The remote build was published against ros2-distro-mutex 0.19.* rolling_*, - # which is long gone now that the mutex is at 0.20.0 rolling_26 -- same - # stale-remote-build pattern as pcl_conversions/ros2cli/distro_mutex above. - # Bumped to 26 first for that fix, then to 27: a CI cache from that first - # bump already holds a build_26 artifact with the old "qt" host dep baked - # in (see the dependencies.yaml entry below), and vinca's skip_existing - # check only compares build_number, not the full package hash, so it would - # otherwise keep matching that stale cached build instead of rebuilding - # without qt (same issue independently hit on humble/jazzy's libg2o). build_number: 27 - # On win-64, csparse_extension builds as a DLL that exports no symbols - # (no dllexport macro is defined for it), so MSVC produces the .dll but no - # import .lib, and solver_csparse fails to link against it. Same fix as the - # many other packages in this repo hitting this class of Windows issue. additional_cmake_args: "-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON" libmavconn: - # Same win-64 dllexport pattern as libg2o's csparse_extension above: the - # mavconn SHARED library exports no dllexport-annotated symbols, so MSVC - # built the .dll but no import .lib, breaking downstream mavros's - # find_package(libmavconn). Fixed via a new .win.patch - # (CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON), but a prior CI run already cached - # a successful win-64 build made before that patch existed -- skip_existing - # only compares build_number, not patch content, so it kept reusing that - # stale build. Bump to force a fresh one. build_number: 26 mavlink: - # A prior CI run already cached a successful win-64 build made before the - # msgmap.hpp endian.h/win32 fix was added to the patch -- skip_existing - # only compares build_number, not patch content, so it kept reusing that - # stale build instead of picking up the fix. Bumped repeatedly (26-29) as - # the same stale-cache pattern hit each successive win-64-only fix: - # endian.h, then ssize_t, then windows.h's ERROR macro, then NO_ERROR too - # (both collide with enumerator names used across the generated dialects). build_number: 29 pcl_conversions: - # The remote build at the current build_number (25) was published against - # vtk-base 9.6.2.*, which conda-forge no longer carries -- this repo's mutex - # run_constraints now pin vtk 9.7.0.*. Bump the build number so skip_existing - # doesn't match that stale remote build, forcing a fresh local build against - # the current pins instead. build_number: 26 rmf_battery: - # Same skip_existing pitfall as rmf_utils/rmf_traffic below: a win-64 - # build_number 25 got published successfully (compiles fine, produces - # rmf_battery.dll) from a run BEFORE the WINDOWS_EXPORT_ALL_SYMBOLS - # patch was added. Bump preemptively so the next run doesn't reuse - # that unpatched build and skip exercising the fix. build_number: 26 rmf_task: - # Same skip_existing pitfall already hit repeatedly this session - # (rmf_utils/rmf_traffic/rmf_battery): a win-64 build_25 of rmf_task - # was published successfully (compiles fine, produces the .dll) from - # the run that tested the uint fix, BEFORE the - # WINDOWS_EXPORT_ALL_SYMBOLS patch was added. Bump preemptively - # rather than waiting to discover the stale-cache skip on the next - # run. build_number: 26 rmf_task_sequence: - # Same skip_existing pitfall as rmf_task/rmf_traffic below: a win-64 - # build_25 got published (compiles fine, produces the .dll) from a - # run BEFORE the WINDOWS_EXPORT_ALL_SYMBOLS patch was added. Bump so - # skip_existing doesn't reuse it. build_number: 26 rmf_traffic: - # A win-64 build_number 25 got published successfully (compiles fine, - # produces rmf_traffic.dll) from a run BEFORE the WINDOWS_EXPORT_ALL_ - # SYMBOLS patch was added -- rmf_traffic has no dllexport annotations, - # so that build's .dll has no matching import .lib, breaking every - # downstream consumer (LNK1181). skip_existing then kept reusing that - # unpatched build_25 on every subsequent run, so the export fix has - # never actually been exercised. Bump so skip_existing doesn't reuse - # it, forcing a fresh win-64 build with the fix included. Same - # skip_existing pitfall already hit for rmf_utils below. build_number: 26 rmf_traffic_ros2: - # A win-64 build_number 25 got published successfully (compiles fine, - # produces rmf_traffic_ros2.dll and packages cleanly) from a run - # BEFORE the ament_export_dependencies(PROJ) fix was added -- that - # build's exported Config.cmake never calls find_dependency(PROJ), so - # downstream consumers (e.g. rmf_task_ros2) fail with "target - # PROJ::proj ... was not found". skip_existing would otherwise keep - # reusing that unpatched build_25. Bump so the fix actually gets - # exercised. - # - # build_26 (the ament_export_dependencies(PROJ) fix) still hit the - # same consumer-side error -- rmf_task_ros2's own pkg_check_modules( - # PROJ ...) call sets PROJ_FOUND=TRUE as a side effect before - # find_package(rmf_traffic_ros2) runs, so the auto-generated - # find_dependency(PROJ) guard silently no-ops and PROJ::proj never - # gets created. Switched PROJ to a PRIVATE link dependency instead - # (it's only used in one internal .cpp, never in public headers, so - # consumers never needed to know about it) and bump again so this - # build actually gets exercised. - # - # build_27 (the PROJ PRIVATE fix) cleared the PROJ error but hit the - # identical class of bug for rmf_building_map_msgs/rmf_reservation_msgs - # -- the aggregate targets used on Windows for the LNK1170 fix are - # PUBLIC but were never in ament_export_dependencies(), so any - # consumer's own find_package(rmf_traffic_ros2) needs them to already - # exist. Added the missing ament_export_dependencies() entries - # (WIN32-only) and bump again. - # - # build_28 (the export-dependencies fix) cleared configure but hit a - # predictable gap in the selective-export scheme (LNK1189 fix): only - # symbols needed by THIS package's own executables were annotated - # with RMF_TRAFFIC_ROS2_EXPORT. rmf_task_ros2 needs several - # Time.hpp convert()/to_ros2() overloads that were never exported. - # Exported the whole (small) header rather than chasing individual - # overloads one at a time. Bump again. - # - # build_29 (Time.hpp export) let rmf_task_ros2 and rmf_websocket - # build fine, but rmf_fleet_adapter -- by far the biggest consumer, - # using most of the real public API -- surfaced a dozen more missing - # symbols at once (Negotiation, MirrorManager/MirrorManagerFuture, - # blockade::Writer, a Graph convert() overload). Rather than keep - # chasing individual symbols one downstream package at a time, - # exported RMF_TRAFFIC_ROS2_EXPORT across every remaining public - # header under include/rmf_traffic_ros2/ in one pass. Bump again. build_number: 30 rmf_utils: - # The remote win-64 build (build_number 25) never actually got its - # rmf_utils-config.cmake consumed by anything until rmf-traffic reached - # it this session -- find_package(rmf_utils) then failed to find any - # config file at all. rmf_utils' own CMakeLists.txt export logic looks - # completely standard/portable, so this is likely just a broken/stale - # published win-64 artifact rather than a real source issue. Bump the - # build number so skip_existing doesn't reuse it, forcing a fresh - # win-64 build against the current toolchain instead. - # - # build_number 26 (this same bump, no code change) still hit - # skip_existing against a build_26 published from a run BEFORE the - # WINDOWS_EXPORT_ALL_SYMBOLS patch was added -- the patch was never - # actually exercised. Bump again so the patched build actually runs. build_number: 27 ros2cli: build_number: 26 From af1efe8cba2a51dc6eda6ffb2f58af7799e14737 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 07:37:21 +1000 Subject: [PATCH 164/180] fix: avt_vimba_camera linux-64 build hang from invalid-UTF8 byte in vendored header MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root-caused a hang that has been silently eating the full 6-hour CI job timeout on every linux-64 run this session (mistaken earlier for a "large rebuild cascade" and worked around by just retrying, which never actually fixed anything since it's 100% deterministic). VimbaC/Include/VmbCommonTypes.h (Allied Vision's vendored SDK header) is ISO-8859-1 encoded and has a stray Latin-1 '´' (0xB4) byte in three comments ("Y´CbCr" instead of "Y'CbCr"). Compiling frame_observer.cpp triggers -Wdeprecated-enum-enum-conversion on the enum values right after those comments; GCC's diagnostic echoes the raw source line (including the invalid byte) to stderr, and rattler-build's output reader hits "Error reading output: stream did not contain valid UTF-8" and then hangs indefinitely instead of erroring out -- reproduced identically across 4 separate CI attempts, always at the exact same line. Confirmed via a byte-level scan of the vendored header and a local patch-apply test. Fixes the encoding at the source (comment-only change, no functional effect) rather than suppressing the warning, since the root problem is corrupted vendor data that could trip the same rattler-build bug again elsewhere. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-avt-vimba-camera.patch | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 patch/ros-rolling-avt-vimba-camera.patch diff --git a/patch/ros-rolling-avt-vimba-camera.patch b/patch/ros-rolling-avt-vimba-camera.patch new file mode 100644 index 000000000..37c04392e --- /dev/null +++ b/patch/ros-rolling-avt-vimba-camera.patch @@ -0,0 +1,17 @@ +diff --git a/include/VimbaC/Include/VmbCommonTypes.h b/include/VimbaC/Include/VmbCommonTypes.h +index 0000000..0000000 100644 +--- a/include/VimbaC/Include/VmbCommonTypes.h ++++ b/include/VimbaC/Include/VmbCommonTypes.h +@@ -237,9 +237,9 @@ + VmbPixelFormatYuv411 = VmbPixelColor | VmbPixelOccupy12Bit | 0x001E, // YUV 411 with 8 bits (GEV:YUV411Packed) + VmbPixelFormatYuv422 = VmbPixelColor | VmbPixelOccupy16Bit | 0x001F, // YUV 422 with 8 bits (GEV:YUV422Packed) + VmbPixelFormatYuv444 = VmbPixelColor | VmbPixelOccupy24Bit | 0x0020, // YUV 444 with 8 bits (GEV:YUV444Packed) +- VmbPixelFormatYCbCr411_8_CbYYCrYY = VmbPixelColor | VmbPixelOccupy12Bit | 0x003C, // YCbCr 411 with 8 bits (PFNC:YCbCr411_8_CbYYCrYY) - identical to VmbPixelFormatYuv411 +- VmbPixelFormatYCbCr422_8_CbYCrY = VmbPixelColor | VmbPixelOccupy16Bit | 0x0043, // YCbCr 422 with 8 bits (PFNC:YCbCr422_8_CbYCrY) - identical to VmbPixelFormatYuv422 +- VmbPixelFormatYCbCr8_CbYCr = VmbPixelColor | VmbPixelOccupy24Bit | 0x003A, // YCbCr 444 with 8 bits (PFNC:YCbCr8_CbYCr) - identical to VmbPixelFormatYuv444 ++ VmbPixelFormatYCbCr411_8_CbYYCrYY = VmbPixelColor | VmbPixelOccupy12Bit | 0x003C, // Y'CbCr 411 with 8 bits (PFNC:YCbCr411_8_CbYYCrYY) - identical to VmbPixelFormatYuv411 ++ VmbPixelFormatYCbCr422_8_CbYCrY = VmbPixelColor | VmbPixelOccupy16Bit | 0x0043, // Y'CbCr 422 with 8 bits (PFNC:YCbCr422_8_CbYCrY) - identical to VmbPixelFormatYuv422 ++ VmbPixelFormatYCbCr8_CbYCr = VmbPixelColor | VmbPixelOccupy24Bit | 0x003A, // Y'CbCr 444 with 8 bits (PFNC:YCbCr8_CbYCr) - identical to VmbPixelFormatYuv444 + VmbPixelFormatLast, + } VmbPixelFormatType; + typedef VmbUint32_t VmbPixelFormat_t; // Type for the pixel format; for values see VmbPixelFormatType From b826f8367bbad9edac8bc222da897408bc347134 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 07:46:16 +1000 Subject: [PATCH 165/180] fix: avt_vimba_camera compile errors from newer image_transport/camera_info_manager APIs Now that the encoding fix (af1efe8) lets the build actually reach these files instead of hanging, two genuine API-compat breaks surface: - mono_camera_node.cpp: image_transport::create_camera_publisher() now takes a NodeT& (deduced via rclcpp::node_interfaces::NodeInterfaces), not a raw Node*. Pass *this instead of this. - avt_vimba_camera.cpp: camera_info_manager::CameraInfoManager's constructor no longer accepts a single rclcpp::Node* -- current image_common (rolling) requires the three separate node interfaces (NodeBaseInterface, NodeServicesInterface, NodeLoggingInterface) individually. Switch to std::make_shared with nh_->get_node_base_interface() / get_node_services_interface() / get_node_logging_interface(). Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-avt-vimba-camera.patch | 29 ++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/patch/ros-rolling-avt-vimba-camera.patch b/patch/ros-rolling-avt-vimba-camera.patch index 37c04392e..12aed2d98 100644 --- a/patch/ros-rolling-avt-vimba-camera.patch +++ b/patch/ros-rolling-avt-vimba-camera.patch @@ -15,3 +15,32 @@ index 0000000..0000000 100644 VmbPixelFormatLast, } VmbPixelFormatType; typedef VmbUint32_t VmbPixelFormat_t; // Type for the pixel format; for values see VmbPixelFormatType +diff --git a/src/mono_camera_node.cpp b/src/mono_camera_node.cpp +index 0000000..0000000 100644 +--- a/src/mono_camera_node.cpp ++++ b/src/mono_camera_node.cpp +@@ -37,7 +37,7 @@ + MonoCameraNode::MonoCameraNode() : Node("camera"), api_(this->get_logger()), cam_(std::shared_ptr(dynamic_cast(this))) + { + // Set the image publisher before streaming +- camera_info_pub_ = image_transport::create_camera_publisher(this, "~/image", rmw_qos_profile_system_default); ++ camera_info_pub_ = image_transport::create_camera_publisher(*this, "~/image", rmw_qos_profile_system_default); + + // Set the frame callback + cam_.setCallback(std::bind(&avt_vimba_camera::MonoCameraNode::frameCallback, this, std::placeholders::_1)); +diff --git a/src/avt_vimba_camera.cpp b/src/avt_vimba_camera.cpp +index 0000000..0000000 100644 +--- a/src/avt_vimba_camera.cpp ++++ b/src/avt_vimba_camera.cpp +@@ -72,8 +72,9 @@ + return; + + frame_id_ = frame_id; +- info_man_ = std::shared_ptr( +- new camera_info_manager::CameraInfoManager(nh_.get(), frame_id, camera_info_url)); ++ info_man_ = std::make_shared( ++ nh_->get_node_base_interface(), nh_->get_node_services_interface(), ++ nh_->get_node_logging_interface(), frame_id, camera_info_url); + updater_.broadcast(0, "Starting device with IP:" + ip_str + " or GUID:" + guid_str); + + // Determine which camera to use. Try IP first From e985180284f7e34ab280f525a2079973227dcf5c Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 08:12:15 +1000 Subject: [PATCH 166/180] fix: avt_vimba_camera create_camera_publisher QoS type mismatch The *this fix from b826f83 cleared the reference-binding error, but surfaced a second-order type mismatch on the same line: current image_transport::create_camera_publisher() takes rclcpp::QoS, not a raw rmw_qos_profile_t. Use rclcpp::SystemDefaultsQoS() -- the dedicated convenience class for exactly rmw_qos_profile_system_default -- instead of passing the profile struct directly. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-avt-vimba-camera.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patch/ros-rolling-avt-vimba-camera.patch b/patch/ros-rolling-avt-vimba-camera.patch index 12aed2d98..3cbac1dc6 100644 --- a/patch/ros-rolling-avt-vimba-camera.patch +++ b/patch/ros-rolling-avt-vimba-camera.patch @@ -24,7 +24,7 @@ index 0000000..0000000 100644 { // Set the image publisher before streaming - camera_info_pub_ = image_transport::create_camera_publisher(this, "~/image", rmw_qos_profile_system_default); -+ camera_info_pub_ = image_transport::create_camera_publisher(*this, "~/image", rmw_qos_profile_system_default); ++ camera_info_pub_ = image_transport::create_camera_publisher(*this, "~/image", rclcpp::SystemDefaultsQoS()); // Set the frame callback cam_.setCallback(std::bind(&avt_vimba_camera::MonoCameraNode::frameCallback, this, std::placeholders::_1)); From 2c85b9b56eb7e02e612c866474003b62a85082c4 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 08:42:42 +1000 Subject: [PATCH 167/180] fix: sick_safetyscanners_base stale skip_existing build predates Boost.System patch find_package(Boost COMPONENTS system ...) fails to configure on Boost 1.90 (compiled boost_system library and its CMake component were removed upstream; Boost.System has been header-only since 1.69). The existing patch already drops "system" from the COMPONENTS list, but a remote build published before that patch existed is still being reused by skip_existing (same pattern as several other packages this session). Bump build_number so the already-fixed patch actually gets exercised. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index c150d158f..00f0109e5 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -259,3 +259,5 @@ ros2cli: build_number: 26 rosidl_cli: build_number: 26 +sick_safetyscanners_base: + build_number: 26 From 2059e4bfb9e8824172ecbf357e133d0b2944ae7f Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 09:09:05 +1000 Subject: [PATCH 168/180] fix: sick_safetyscanners_base still auto-exports libboost-system-dev to consumers 2c85b9b's build_number bump confirmed the CMakeLists.txt fix builds this package itself fine, but downstream consumers (sick_safetyscanners2) still hit the same "Could not find a package configuration file provided by boost_system" error -- ament_cmake auto-generates the downstream Config.cmake's find_package(Boost COMPONENTS ...) call from package.xml's tags, not from the local CMakeLists.txt find_package call. package.xml still declared libboost-system-dev, so the exported Config.cmake kept requesting the now-removed boost_system CMake component regardless of the CMakeLists.txt patch. Drop that depend tag too -- chrono and thread map to the same libboost-devel conda package, so nothing else is lost. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-sick-safetyscanners-base.patch | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/patch/ros-rolling-sick-safetyscanners-base.patch b/patch/ros-rolling-sick-safetyscanners-base.patch index 7d262b9b0..3580a8060 100644 --- a/patch/ros-rolling-sick-safetyscanners-base.patch +++ b/patch/ros-rolling-sick-safetyscanners-base.patch @@ -308,3 +308,15 @@ index 0f42f5b..bd96ba4 100644 } uint16_t ConfigData::getHostUdpPort() const +diff --git a/package.xml b/package.xml +index 0000000..0000000 100644 +--- a/package.xml ++++ b/package.xml +@@ -13,7 +13,6 @@ + cmake + + libboost-chrono-dev +- libboost-system-dev + libboost-thread-dev + + From a5e4c3c201c08b78247419e17a7d385715accb60 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 09:09:24 +1000 Subject: [PATCH 169/180] fix: bump sick_safetyscanners_base build_number again for the package.xml fix build_26 was already published in the last CI round before 2059e4b's package.xml fix existed -- same stale skip_existing pattern as before. Bump to 27 so the complete fix actually gets exercised. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 00f0109e5..c54d847c9 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -260,4 +260,4 @@ ros2cli: rosidl_cli: build_number: 26 sick_safetyscanners_base: - build_number: 26 + build_number: 27 From 48df0a766493f2b1e76ec1c0fa477bcae3073edb Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 09:33:24 +1000 Subject: [PATCH 170/180] fix: sick_safetyscanners_base ships its own hand-written Config.cmake, not ament_cmake-generated Root cause of the persisting boost_system error, found by extracting and inspecting the actual built package's Config.cmake: this package installs a hand-authored sick_safetyscanners_baseConfig.cmake (verbatim, via install(FILES ...) in CMakeLists.txt) rather than relying on ament_cmake's auto-generated one. Both the earlier CMakeLists.txt fix and the package.xml depend removal were real improvements but neither touches this file, which independently hardcodes the same broken "COMPONENTS chrono system thread" list. Fix it directly. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-sick-safetyscanners-base.patch | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/patch/ros-rolling-sick-safetyscanners-base.patch b/patch/ros-rolling-sick-safetyscanners-base.patch index 3580a8060..0b04c6fff 100644 --- a/patch/ros-rolling-sick-safetyscanners-base.patch +++ b/patch/ros-rolling-sick-safetyscanners-base.patch @@ -320,3 +320,15 @@ index 0000000..0000000 100644 libboost-thread-dev +diff --git a/sick_safetyscanners_baseConfig.cmake b/sick_safetyscanners_baseConfig.cmake +index 0000000..0000000 100644 +--- a/sick_safetyscanners_baseConfig.cmake ++++ b/sick_safetyscanners_baseConfig.cmake +@@ -1,6 +1,6 @@ + include(CMakeFindDependencyMacro) + #find_dependency(Threads) + # Note that find_dependency does not support COMPONENTS or MODULE until 3.8.0 +-find_package(Boost COMPONENTS chrono system thread REQUIRED) ++find_package(Boost COMPONENTS chrono thread REQUIRED) + include("${CMAKE_CURRENT_LIST_DIR}/sick_safetyscanners_baseTargets.cmake") + From 94d6b25f0225b6a2ef2e75f6b5ab0a0d8144719a Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 09:33:38 +1000 Subject: [PATCH 171/180] fix: bump sick_safetyscanners_base build_number for the Config.cmake fix build_27 already published before 48df0a7's Config.cmake fix existed. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index c54d847c9..8fd902e94 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -260,4 +260,4 @@ ros2cli: rosidl_cli: build_number: 26 sick_safetyscanners_base: - build_number: 27 + build_number: 28 From 2504433b3516a38d6e4bf1c4174e0f9884434656 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 09:57:44 +1000 Subject: [PATCH 172/180] fix: sick_safetyscanners2 ament_target_dependencies() removed from ament_cmake_target_dependencies Same fix already established in this repo for microstrain-inertial-driver and robotiq-controllers: ament_target_dependencies() no longer exists, so replace it with a local link_ament_dependencies() macro that links each dependency's exported _TARGETS instead. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-sick-safetyscanners2.patch | 37 ++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 patch/ros-rolling-sick-safetyscanners2.patch diff --git a/patch/ros-rolling-sick-safetyscanners2.patch b/patch/ros-rolling-sick-safetyscanners2.patch new file mode 100644 index 000000000..68ccb88a4 --- /dev/null +++ b/patch/ros-rolling-sick-safetyscanners2.patch @@ -0,0 +1,37 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 0000000..0000000 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -36,6 +36,14 @@ + sick_safetyscanners2_interfaces + ) + ++# ament_target_dependencies() was removed from ament_cmake_target_dependencies; ++# link against each dependency's exported _TARGETS instead. ++macro(link_ament_dependencies target) ++ foreach(_ament_dep ${ARGN}) ++ target_link_libraries(${target} ${${_ament_dep}_TARGETS}) ++ endforeach() ++endmacro() ++ + add_executable(sick_safetyscanners2_node + src/sick_safetyscanners2_node.cpp + src/SickSafetyscanners.cpp +@@ -46,7 +54,7 @@ + sick_safetyscanners_base::sick_safetyscanners_base + ${Boost_LIBRARIES}) + +-ament_target_dependencies(sick_safetyscanners2_node ${dependencies}) ++link_ament_dependencies(sick_safetyscanners2_node ${dependencies}) + + target_include_directories(sick_safetyscanners2_node PUBLIC + $ +@@ -62,7 +70,7 @@ + sick_safetyscanners_base::sick_safetyscanners_base + ${Boost_LIBRARIES}) + +-ament_target_dependencies(sick_safetyscanners2_lifecycle_node ${dependencies}) ++link_ament_dependencies(sick_safetyscanners2_lifecycle_node ${dependencies}) + + target_include_directories(sick_safetyscanners2_lifecycle_node PUBLIC + $ From b55611f72c4418424ee62e57a1a50bf814457a68 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 10:23:12 +1000 Subject: [PATCH 173/180] fix: add missing StatusOverview.srv to sick_safetyscanners2_interfaces sick_safetyscanners2 (1.0.5) expects sick_safetyscanners2_interfaces 1.0.1, which added srv/StatusOverview.srv, but rolling's rosdistro only has 1.0.0 released for this package so far (1.0.1 exists for jazzy/kilted/lyrical). Patch in the missing srv file and its CMakeLists.txt wiring, copied verbatim from the upstream 1.0.1 release, rather than waiting on a rosdistro sync. Bump build_number since 1.0.0's build_25 was already published without it. Co-Authored-By: Claude Sonnet 5 --- ...ling-sick-safetyscanners2-interfaces.patch | 42 +++++++++++++++++++ pkg_additional_info.yaml | 2 + 2 files changed, 44 insertions(+) create mode 100644 patch/ros-rolling-sick-safetyscanners2-interfaces.patch diff --git a/patch/ros-rolling-sick-safetyscanners2-interfaces.patch b/patch/ros-rolling-sick-safetyscanners2-interfaces.patch new file mode 100644 index 000000000..18f1c5549 --- /dev/null +++ b/patch/ros-rolling-sick-safetyscanners2-interfaces.patch @@ -0,0 +1,42 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 0000000..0000000 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -37,6 +37,7 @@ + "msg/RawMicroScanData.msg" + "msg/ScanPoint.msg" + "srv/FieldData.srv" ++ "srv/StatusOverview.srv" + DEPENDENCIES sensor_msgs + ) + +diff --git a/srv/StatusOverview.srv b/srv/StatusOverview.srv +new file mode 100644 +index 0000000..0000000 +--- /dev/null ++++ b/srv/StatusOverview.srv +@@ -0,0 +1,23 @@ ++--- ++ ++string version_c_version ++uint8 version_major_version_number ++uint8 version_minor_version_number ++uint8 version_release_number ++ ++uint8 device_state ++uint8 config_state ++uint8 application_state ++uint32 current_time_power_on_count ++ ++string current_time ++# for devices without real time clock, also provide the raw time information ++uint32 current_time_time ++uint16 current_time_date ++ ++uint32 error_info_code ++ ++string error_info_time ++# for devices without real time clock, also provide the raw time information ++uint32 error_info_time_time ++uint16 error_info_time_date +\ No newline at end of file diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 8fd902e94..d2bde8b22 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -259,5 +259,7 @@ ros2cli: build_number: 26 rosidl_cli: build_number: 26 +sick_safetyscanners2_interfaces: + build_number: 26 sick_safetyscanners_base: build_number: 28 From 96306a219227737e34f7d97336973943b74d9197 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 10:45:55 +1000 Subject: [PATCH 174/180] fix: sick_safetyscanners2 boost::asio::ip::address_v4::from_string removed Same Boost.Asio API removal already fixed in sick_safetyscanners_base (0794d45-equivalent pattern) -- from_string() was removed in favor of make_address_v4(). Fix all 3 call sites in this package's own source (SickSafetyscanners.hpp x2, SickSafetyscanners.cpp x1). Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-sick-safetyscanners2.patch | 41 ++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/patch/ros-rolling-sick-safetyscanners2.patch b/patch/ros-rolling-sick-safetyscanners2.patch index 68ccb88a4..6d32910e4 100644 --- a/patch/ros-rolling-sick-safetyscanners2.patch +++ b/patch/ros-rolling-sick-safetyscanners2.patch @@ -35,3 +35,44 @@ index 0000000..0000000 100644 target_include_directories(sick_safetyscanners2_lifecycle_node PUBLIC $ +diff --git a/include/sick_safetyscanners2/SickSafetyscanners.hpp b/include/sick_safetyscanners2/SickSafetyscanners.hpp +index 0000000..0000000 100644 +--- a/include/sick_safetyscanners2/SickSafetyscanners.hpp ++++ b/include/sick_safetyscanners2/SickSafetyscanners.hpp +@@ -148,20 +148,20 @@ + std::string sensor_ip; + node.template get_parameter("sensor_ip", sensor_ip); + RCLCPP_INFO(getLogger(), "sensor_ip: %s", sensor_ip.c_str()); +- m_config.m_sensor_ip = boost::asio::ip::address_v4::from_string(sensor_ip); ++ m_config.m_sensor_ip = boost::asio::ip::make_address_v4(sensor_ip); + + std::string interface_ip; + node.template get_parameter("interface_ip", interface_ip); + RCLCPP_INFO(getLogger(), "interface_ip: %s", interface_ip.c_str()); + m_config.m_interface_ip = +- boost::asio::ip::address_v4::from_string(interface_ip); ++ boost::asio::ip::make_address_v4(interface_ip); + + std::string host_ip; + node.template get_parameter("host_ip", host_ip); + RCLCPP_INFO(getLogger(), "host_ip: %s", host_ip.c_str()); + // TODO check if valid IP? + m_config.m_communications_settings.host_ip = +- boost::asio::ip::address_v4::from_string(host_ip); ++ boost::asio::ip::make_address_v4(host_ip); + + int host_udp_port; + node.template get_parameter("host_udp_port", host_udp_port); +diff --git a/src/SickSafetyscanners.cpp b/src/SickSafetyscanners.cpp +index 0000000..0000000 100644 +--- a/src/SickSafetyscanners.cpp ++++ b/src/SickSafetyscanners.cpp +@@ -54,7 +54,7 @@ + m_config.m_frame_id = param.value_to_string(); + } else if (param.get_name() == "host_ip") { + m_config.m_communications_settings.host_ip = +- boost::asio::ip::address_v4::from_string(param.value_to_string()); ++ boost::asio::ip::make_address_v4(param.value_to_string()); + update_sensor_config = true; + } else if (param.get_name() == "host_udp_port") { + m_config.m_communications_settings.host_udp_port = param.as_int(); From 0b0f55713a9e4b3df58dc54f01ddfd854a3195e2 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 11:44:11 +1000 Subject: [PATCH 175/180] fix: consolidate rtabmap's 5 fragmented patch files into one Per review feedback: the package had accumulated 5 separate patch files (1base/2rest/3fix/4fix/5fix) instead of one, each layering fixes on top of the last -- fragile and hard to review, and several hunks across them don't even apply cleanly with a strict patch tool (only rattler-build's own more lenient patcher tolerates it). Rebuilt from scratch: applied all 5 patches via rattler-build itself (the same tool and algorithm actually used in CI, since plain `patch`/ `git apply` reject hunks that rattler-build accepts), captured the resulting fully-patched source tree, and diffed it directly against a pristine checkout to produce one clean, non-overlapping patch. Verified byte-identical output between the old 5-file setup and the new single file via two independent rattler-build runs, and confirmed the consolidated patch applies cleanly on its own via check_patches_clean_apply.py. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-rtabmap.2rest.patch | 677 ----- patch/ros-rolling-rtabmap.3fix.patch | 60 - patch/ros-rolling-rtabmap.4fix.patch | 60 - patch/ros-rolling-rtabmap.5fix.patch | 12 - ....1base.patch => ros-rolling-rtabmap.patch} | 2492 ++++++++++------- 5 files changed, 1533 insertions(+), 1768 deletions(-) delete mode 100644 patch/ros-rolling-rtabmap.2rest.patch delete mode 100644 patch/ros-rolling-rtabmap.3fix.patch delete mode 100644 patch/ros-rolling-rtabmap.4fix.patch delete mode 100644 patch/ros-rolling-rtabmap.5fix.patch rename patch/{ros-rolling-rtabmap.1base.patch => ros-rolling-rtabmap.patch} (66%) diff --git a/patch/ros-rolling-rtabmap.2rest.patch b/patch/ros-rolling-rtabmap.2rest.patch deleted file mode 100644 index 6a4ef691d..000000000 --- a/patch/ros-rolling-rtabmap.2rest.patch +++ /dev/null @@ -1,677 +0,0 @@ -diff --git a/tools/Camera/main.cpp b/tools/Camera/main.cpp -index e337030..3bf320c 100644 ---- a/tools/Camera/main.cpp -+++ b/tools/Camera/main.cpp -@@ -32,7 +32,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include "rtabmap/utilite/UDirectory.h" - #include "rtabmap/utilite/UConversion.h" - #include --#include - #include - - void showUsage() -@@ -178,7 +177,7 @@ int main(int argc, char * argv[]) - - cv::Mat rgb; - rgb = camera->takeImage().imageRaw(); -- cv::namedWindow("Video", CV_WINDOW_AUTOSIZE); // create window -+ cv::namedWindow("Video", cv::WINDOW_AUTOSIZE); // create window - while(!rgb.empty()) - { - cv::imshow("Video", rgb); // show frame -diff --git a/tools/StereoEval/main.cpp b/tools/StereoEval/main.cpp -index bd3313f..9c15e34 100644 ---- a/tools/StereoEval/main.cpp -+++ b/tools/StereoEval/main.cpp -@@ -37,7 +37,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #include --#include - #include - #include - -@@ -222,7 +221,7 @@ int main(int argc, char * argv[]) - cv::Mat leftMono; - if(left.channels() == 3) - { -- cv::cvtColor(left, leftMono, CV_BGR2GRAY); -+ cv::cvtColor(left, leftMono, cv::COLOR_BGR2GRAY); - } - else - { -@@ -231,7 +230,7 @@ int main(int argc, char * argv[]) - cv::Mat rightMono; - if(right.channels() == 3) - { -- cv::cvtColor(right, rightMono, CV_BGR2GRAY); -+ cv::cvtColor(right, rightMono, cv::COLOR_BGR2GRAY); - } - else - { -@@ -266,7 +265,7 @@ int main(int argc, char * argv[]) - cv::cornerSubPix(leftMono, leftCorners, - cv::Size( subPixWinSize, subPixWinSize ), - cv::Size( -1, -1 ), -- cv::TermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, subPixIterations, subPixEps ) ); -+ cv::TermCriteria( cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS, subPixIterations, subPixEps ) ); - UDEBUG("cv::cornerSubPix() end"); - } - -diff --git a/app/android/jni/point_cloud_drawable.cpp b/app/android/jni/point_cloud_drawable.cpp -index ca23e31..cf38ec1 100644 ---- a/app/android/jni/point_cloud_drawable.cpp -+++ b/app/android/jni/point_cloud_drawable.cpp -@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include "rtabmap/utilite/ULogger.h" - #include "rtabmap/utilite/UTimer.h" - #include "rtabmap/utilite/UConversion.h" --#include -+#include - #include "util.h" - #include "pcl/common/transforms.h" - -diff --git a/corelib/include/rtabmap/core/DBDriverSqlite3.h b/corelib/include/rtabmap/core/DBDriverSqlite3.h -index 56e410c..fbcd49b 100644 ---- a/corelib/include/rtabmap/core/DBDriverSqlite3.h -+++ b/corelib/include/rtabmap/core/DBDriverSqlite3.h -@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines - #include "rtabmap/core/DBDriver.h" - #if CV_MAJOR_VERSION < 5 --#include -+#include - #else - #include - #endif -diff --git a/corelib/include/rtabmap/core/EpipolarGeometry.h b/corelib/include/rtabmap/core/EpipolarGeometry.h -index ea490d3..cdf7c43 100644 ---- a/corelib/include/rtabmap/core/EpipolarGeometry.h -+++ b/corelib/include/rtabmap/core/EpipolarGeometry.h -@@ -32,7 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include "rtabmap/utilite/UStl.h" - #include - #if CV_MAJOR_VERSION < 5 --#include -+#include - #else - #include - #if CV_MAJOR_VERSION >= 5 -diff --git a/corelib/include/rtabmap/core/Features2d.h b/corelib/include/rtabmap/core/Features2d.h -index e110773..9b064c1 100644 ---- a/corelib/include/rtabmap/core/Features2d.h -+++ b/corelib/include/rtabmap/core/Features2d.h -@@ -30,10 +30,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines - --#include -+#include - #include - #if CV_MAJOR_VERSION < 5 --#include -+#include - #else - #include - #endif -diff --git a/corelib/include/rtabmap/core/Memory.h b/corelib/include/rtabmap/core/Memory.h -index fd8f75a..2fe3640 100644 ---- a/corelib/include/rtabmap/core/Memory.h -+++ b/corelib/include/rtabmap/core/Memory.h -@@ -42,7 +42,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include "rtabmap/utilite/UStl.h" - #include - #if CV_MAJOR_VERSION < 5 --#include -+#include - #else - #include - #endif -diff --git a/corelib/include/rtabmap/core/OdometryInfo.h b/corelib/include/rtabmap/core/OdometryInfo.h -index 4f96a59..a3ec914 100644 ---- a/corelib/include/rtabmap/core/OdometryInfo.h -+++ b/corelib/include/rtabmap/core/OdometryInfo.h -@@ -35,7 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include "rtabmap/core/CameraModel.h" - #include "rtabmap/core/LaserScan.h" - #if CV_MAJOR_VERSION < 5 --#include -+#include - #else - #include - #endif -diff --git a/corelib/include/rtabmap/core/SensorCapture.h b/corelib/include/rtabmap/core/SensorCapture.h -index 20ee01b..4188392 100644 ---- a/corelib/include/rtabmap/core/SensorCapture.h -+++ b/corelib/include/rtabmap/core/SensorCapture.h -@@ -28,7 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines - --#include -+#include - #include - #include "rtabmap/core/SensorData.h" - #include -diff --git a/corelib/include/rtabmap/core/SensorData.h b/corelib/include/rtabmap/core/SensorData.h -index 0db8590..6688988 100644 ---- a/corelib/include/rtabmap/core/SensorData.h -+++ b/corelib/include/rtabmap/core/SensorData.h -@@ -35,7 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #if CV_MAJOR_VERSION < 5 --#include -+#include - #else - #include - #endif -diff --git a/corelib/include/rtabmap/core/Signature.h b/corelib/include/rtabmap/core/Signature.h -index 11f6f9c..49390f9 100644 ---- a/corelib/include/rtabmap/core/Signature.h -+++ b/corelib/include/rtabmap/core/Signature.h -@@ -32,11 +32,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #if CV_MAJOR_VERSION < 5 --#include -+#include - #else - #include - #endif --#include -+#include - #include - #include - #include -diff --git a/corelib/include/rtabmap/core/Statistics.h b/corelib/include/rtabmap/core/Statistics.h -index 8c4cd0a..68491a8 100644 ---- a/corelib/include/rtabmap/core/Statistics.h -+++ b/corelib/include/rtabmap/core/Statistics.h -@@ -32,11 +32,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - #include - #if CV_MAJOR_VERSION < 5 --#include -+#include - #else - #include - #endif --#include -+#include - #include - #include - #include -diff --git a/corelib/include/rtabmap/core/VWDictionary.h b/corelib/include/rtabmap/core/VWDictionary.h -index bfd5394..db7d4db 100644 ---- a/corelib/include/rtabmap/core/VWDictionary.h -+++ b/corelib/include/rtabmap/core/VWDictionary.h -@@ -29,10 +29,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines - --#include -+#include - #include - #if CV_MAJOR_VERSION < 5 --#include -+#include - #else - #include - #endif -diff --git a/corelib/include/rtabmap/core/camera/CameraVideo.h b/corelib/include/rtabmap/core/camera/CameraVideo.h -index bdc90a1..ca65116 100644 ---- a/corelib/include/rtabmap/core/camera/CameraVideo.h -+++ b/corelib/include/rtabmap/core/camera/CameraVideo.h -@@ -27,7 +27,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - #pragma once - --#include -+#include - #include "rtabmap/core/Camera.h" - - namespace rtabmap -diff --git a/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h b/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h -index 9d07bd6..3361aab 100644 ---- a/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h -+++ b/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h -@@ -43,7 +43,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - #include - #if CV_MAJOR_VERSION >= 3 --#include - - #if CV_MAJOR_VERSION >= 4 - #include -diff --git a/corelib/include/rtabmap/core/util3d_correspondences.h b/corelib/include/rtabmap/core/util3d_correspondences.h -index d53ece4..f50a98b 100644 ---- a/corelib/include/rtabmap/core/util3d_correspondences.h -+++ b/corelib/include/rtabmap/core/util3d_correspondences.h -@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #if CV_MAJOR_VERSION < 5 --#include -+#include - #else - #include - #endif -diff --git a/corelib/src/CameraModel.cpp b/corelib/src/CameraModel.cpp -index bfcde63..bc37f40 100644 ---- a/corelib/src/CameraModel.cpp -+++ b/corelib/src/CameraModel.cpp -@@ -33,7 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #include --#include -+#include - #if CV_MAJOR_VERSION >= 5 - #include - #endif -diff --git a/corelib/src/SensorCapture.cpp b/corelib/src/SensorCapture.cpp -index 5932787..a86708d 100644 ---- a/corelib/src/SensorCapture.cpp -+++ b/corelib/src/SensorCapture.cpp -@@ -35,7 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - --#include -+#include - - #include - #include -diff --git a/corelib/src/Signature.cpp b/corelib/src/Signature.cpp -index 32fca30..a7dc364 100644 ---- a/corelib/src/Signature.cpp -+++ b/corelib/src/Signature.cpp -@@ -29,7 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include "rtabmap/core/EpipolarGeometry.h" - #include "rtabmap/core/Memory.h" - #include "rtabmap/core/Compression.h" --#include -+#include - - #include - -diff --git a/corelib/src/StereoCameraModel.cpp b/corelib/src/StereoCameraModel.cpp -index 938508e..5b0e88b 100644 ---- a/corelib/src/StereoCameraModel.cpp -+++ b/corelib/src/StereoCameraModel.cpp -@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #include --#include -+#include - #if CV_MAJOR_VERSION >= 5 - #include - #endif -diff --git a/corelib/src/clams/discrete_depth_distortion_model_helpers.cpp b/corelib/src/clams/discrete_depth_distortion_model_helpers.cpp -index 06c348d..dfbdc02 100644 ---- a/corelib/src/clams/discrete_depth_distortion_model_helpers.cpp -+++ b/corelib/src/clams/discrete_depth_distortion_model_helpers.cpp -@@ -28,8 +28,8 @@ RTAB-Map integration: Mathieu Labbe - */ - - #include --#include --#include -+#include -+#include - #include - #include - -diff --git a/corelib/src/clams/frame_projector.cpp b/corelib/src/clams/frame_projector.cpp -index 3230fcf..2634911 100644 ---- a/corelib/src/clams/frame_projector.cpp -+++ b/corelib/src/clams/frame_projector.cpp -@@ -31,8 +31,8 @@ RTAB-Map integration: Mathieu Labbe - #include - #include - #include --#include --#include -+#include -+#include - #include - - using namespace std; -diff --git a/corelib/src/odometry/OdometryMono.cpp b/corelib/src/odometry/OdometryMono.cpp -index 6198c41..8cefcf7 100644 ---- a/corelib/src/odometry/OdometryMono.cpp -+++ b/corelib/src/odometry/OdometryMono.cpp -@@ -42,7 +42,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include "rtabmap/utilite/UConversion.h" - #include "rtabmap/utilite/UStl.h" - #include "rtabmap/utilite/UMath.h" --#include -+#include - #if CV_MAJOR_VERSION < 5 - #include - #else -diff --git a/corelib/src/opencv/ORBextractor.cc b/corelib/src/opencv/ORBextractor.cc -index 542e169..1197fb6 100644 ---- a/corelib/src/opencv/ORBextractor.cc -+++ b/corelib/src/opencv/ORBextractor.cc -@@ -63,13 +63,13 @@ - - - #include --#include -+#include - #if CV_MAJOR_VERSION < 5 --#include -+#include - #else - #include - #endif --#include -+#include - #include - #include - #include -diff --git a/corelib/src/opencv/Orb.h b/corelib/src/opencv/Orb.h -index e05ad9d..464ad16 100644 ---- a/corelib/src/opencv/Orb.h -+++ b/corelib/src/opencv/Orb.h -@@ -46,7 +46,7 @@ - #ifndef CORELIB_SRC_OPENCV_ORB_H_ - #define CORELIB_SRC_OPENCV_ORB_H_ - --#include -+#include - - namespace rtabmap { - -diff --git a/corelib/src/stereo/StereoBM.cpp b/corelib/src/stereo/StereoBM.cpp -index 57f6b7d..356266e 100644 ---- a/corelib/src/stereo/StereoBM.cpp -+++ b/corelib/src/stereo/StereoBM.cpp -@@ -33,7 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #endif --#include -+#include - - namespace rtabmap { - -diff --git a/corelib/src/stereo/StereoSGBM.cpp b/corelib/src/stereo/StereoSGBM.cpp -index d8e651a..291ba7f 100644 ---- a/corelib/src/stereo/StereoSGBM.cpp -+++ b/corelib/src/stereo/StereoSGBM.cpp -@@ -33,7 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #endif --#include -+#include - - namespace rtabmap { - -diff --git a/corelib/src/util2d.cpp b/corelib/src/util2d.cpp -index 55fdf67..3642e66 100644 ---- a/corelib/src/util2d.cpp -+++ b/corelib/src/util2d.cpp -@@ -34,14 +34,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #include --#include -+#include - #include --#include -+#include - #include - #include - - #if CV_MAJOR_VERSION >= 3 --#include -+#include - #endif - - #if CV_MAJOR_VERSION < 5 -diff --git a/corelib/src/util3d.cpp b/corelib/src/util3d.cpp -index c0aa08e..4619868 100644 ---- a/corelib/src/util3d.cpp -+++ b/corelib/src/util3d.cpp -@@ -40,7 +40,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #include --#include -+#include - - namespace rtabmap - { -diff --git a/guilib/include/rtabmap/gui/DatabaseViewer.h b/guilib/include/rtabmap/gui/DatabaseViewer.h -index a11b4c9..28fbc38 100644 ---- a/guilib/include/rtabmap/gui/DatabaseViewer.h -+++ b/guilib/include/rtabmap/gui/DatabaseViewer.h -@@ -36,7 +36,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #include --#include -+#include - #include - #include - #include -diff --git a/guilib/include/rtabmap/gui/ImageView.h b/guilib/include/rtabmap/gui/ImageView.h -index 8e8df85..eaf9134 100644 ---- a/guilib/include/rtabmap/gui/ImageView.h -+++ b/guilib/include/rtabmap/gui/ImageView.h -@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #include --#include -+#include - #include - #include "rtabmap/utilite/UCv2Qt.h" - #include -diff --git a/guilib/include/rtabmap/gui/KeypointItem.h b/guilib/include/rtabmap/gui/KeypointItem.h -index 7f4f9f6..11a896d 100644 ---- a/guilib/include/rtabmap/gui/KeypointItem.h -+++ b/guilib/include/rtabmap/gui/KeypointItem.h -@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #include --#include -+#include - - namespace rtabmap { - -diff --git a/guilib/src/CalibrationDialog.cpp b/guilib/src/CalibrationDialog.cpp -index dd4a052..9e40d6e 100644 ---- a/guilib/src/CalibrationDialog.cpp -+++ b/guilib/src/CalibrationDialog.cpp -@@ -29,13 +29,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include "ui_calibrationDialog.h" - - #include --#include --#include -+#include - #include - #if CV_MAJOR_VERSION >= 3 --#include - #endif --#include -+#include - #if CV_MAJOR_VERSION > 2 or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) - #include - #endif -diff --git a/guilib/src/DatabaseViewer.cpp b/guilib/src/DatabaseViewer.cpp -index 586a386..3c328f3 100644 ---- a/guilib/src/DatabaseViewer.cpp -+++ b/guilib/src/DatabaseViewer.cpp -@@ -44,8 +44,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #include --#include --#include -+#include - #include - #include - #include "rtabmap/utilite/UPlot.h" -diff --git a/tools/Camera/main.cpp b/tools/Camera/main.cpp -index 3bf320c..c856d7b 100644 ---- a/tools/Camera/main.cpp -+++ b/tools/Camera/main.cpp -@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include "rtabmap/utilite/UFile.h" - #include "rtabmap/utilite/UDirectory.h" - #include "rtabmap/utilite/UConversion.h" --#include -+#include - #include - - void showUsage() -diff --git a/tools/CameraRGBD/main.cpp b/tools/CameraRGBD/main.cpp -index 1d562d9..a6f29e4 100644 ---- a/tools/CameraRGBD/main.cpp -+++ b/tools/CameraRGBD/main.cpp -@@ -35,9 +35,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include "rtabmap/utilite/UFile.h" - #include "rtabmap/utilite/UDirectory.h" - #include "rtabmap/utilite/UConversion.h" --#include --#include --#include -+#include -+#include - #if CV_MAJOR_VERSION >= 3 - #include - #endif -diff --git a/tools/EpipolarGeometry/main.cpp b/tools/EpipolarGeometry/main.cpp -index aa309fa..d2cb81a 100644 ---- a/tools/EpipolarGeometry/main.cpp -+++ b/tools/EpipolarGeometry/main.cpp -@@ -27,8 +27,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - #include - #include --#include --#include -+#include -+#include - #include - #include - #include -diff --git a/tools/ImagesJoiner/main.cpp b/tools/ImagesJoiner/main.cpp -index ad4d3dd..3cf5264 100644 ---- a/tools/ImagesJoiner/main.cpp -+++ b/tools/ImagesJoiner/main.cpp -@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include "rtabmap/utilite/UFile.h" - #include "rtabmap/utilite/UConversion.h" - #include --#include -+#include - - void showUsage() - { -diff --git a/tools/VocabularyComparison/main.cpp b/tools/VocabularyComparison/main.cpp -index 410439b..cc65f02 100644 ---- a/tools/VocabularyComparison/main.cpp -+++ b/tools/VocabularyComparison/main.cpp -@@ -27,10 +27,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - #include - #include --#include --#include - #include --#include -+#include - #include - #include - #include -diff --git a/guilib/src/DatabaseViewer.cpp b/guilib/src/DatabaseViewer.cpp -index 3c328f3..25bb8c4 100644 ---- a/guilib/src/DatabaseViewer.cpp -+++ b/guilib/src/DatabaseViewer.cpp -@@ -43,7 +43,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #include --#include - #include - #include - #include -diff --git a/guilib/src/CalibrationDialog.cpp b/guilib/src/CalibrationDialog.cpp -index 9e40d6e..0aebf10 100644 ---- a/guilib/src/CalibrationDialog.cpp -+++ b/guilib/src/CalibrationDialog.cpp -@@ -30,7 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - #include - #include --#include -+#include - #if CV_MAJOR_VERSION >= 3 - #endif - #include -@@ -734,7 +734,7 @@ void CalibrationDialog::processImages(const cv::Mat & imageLeft, const cv::Mat & - cv::Size boardSize(ui_->spinBox_boardWidth->value(), ui_->spinBox_boardHeight->value()); - if(!viewGray.empty()) - { -- int flags = CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE; -+ int flags = cv::CALIB_CB_ADAPTIVE_THRESH | cv::CALIB_CB_NORMALIZE_IMAGE; - - if(!viewGray.empty()) - { -@@ -745,7 +745,7 @@ void CalibrationDialog::processImages(const cv::Mat & imageLeft, const cv::Mat & - if( scale == 1 ) - timg = viewGray; - else -- cv::resize(viewGray, timg, cv::Size(), scale, scale, CV_INTER_CUBIC); -+ cv::resize(viewGray, timg, cv::Size(), scale, scale, cv::INTER_CUBIC); - - #ifdef HAVE_CHARUCO - if(ui_->comboBox_board_type->currentIndex() >= 1 ) -@@ -830,7 +830,7 @@ void CalibrationDialog::processImages(const cv::Mat & imageLeft, const cv::Mat & - float ratio = ui_->comboBox_board_type->currentIndex() >= 1 ?6.0f:2.0f; - float radius = minSquareDistance==-1.0f?5.0f:(minSquareDistance/ratio); - cv::cornerSubPix( viewGray, pointBuf[id], cv::Size(radius, radius), cv::Size(-1,-1), -- cv::TermCriteria( CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1 )); -+ cv::TermCriteria( cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 30, 0.1 )); - - // Filter points that drifted to far (caused by reflection or bad subpixel gradient) - float threshold = ui_->doubleSpinBox_subpixel_error->value(); -@@ -1119,7 +1119,7 @@ void CalibrationDialog::processImages(const cv::Mat & imageLeft, const cv::Mat & - int step = imageSize_[id].height/16; - for(int i=step; i - #endif -+#include - - #define LOG_FILE_NAME "LogRtabmap.txt" diff --git a/patch/ros-rolling-rtabmap.3fix.patch b/patch/ros-rolling-rtabmap.3fix.patch deleted file mode 100644 index d33c3458b..000000000 --- a/patch/ros-rolling-rtabmap.3fix.patch +++ /dev/null @@ -1,60 +0,0 @@ -diff --git a/guilib/src/DatabaseViewer.cpp b/guilib/src/DatabaseViewer.cpp ---- a/guilib/src/DatabaseViewer.cpp -+++ b/guilib/src/DatabaseViewer.cpp -@@ -5880,7 +5880,7 @@ void DatabaseViewer::updateStereo(const SensorData * data) - cv::Mat leftMono; - if(data->imageRaw().channels() == 3) - { -- cv::cvtColor(data->imageRaw(), leftMono, CV_BGR2GRAY); -+ cv::cvtColor(data->imageRaw(), leftMono, cv::COLOR_BGR2GRAY); - } - else - { -@@ -5889,7 +5889,7 @@ void DatabaseViewer::updateStereo(const SensorData * data) - cv::Mat rightMono; - if(data->rightRaw().channels() == 3) - { -- cv::cvtColor(data->rightRaw(), rightMono, CV_BGR2GRAY); -+ cv::cvtColor(data->rightRaw(), rightMono, cv::COLOR_BGR2GRAY); - } - else - { -diff --git a/guilib/src/CalibrationDialog.cpp b/guilib/src/CalibrationDialog.cpp ---- a/guilib/src/CalibrationDialog.cpp -+++ b/guilib/src/CalibrationDialog.cpp -@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #if CV_MAJOR_VERSION >= 3 - #endif - #include --#if CV_MAJOR_VERSION > 2 or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) -+#if (CV_MAJOR_VERSION > 2 and CV_MAJOR_VERSION < 5) or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) - #include - #endif - -@@ -1747,19 +1747,22 @@ StereoCameraModel CalibrationDialog::stereoCalibration(const CameraModel & left, - UINFO("Compute stereo rectification"); - - cv::Mat R1, R2, P1, P2, Q; -+#if CV_MAJOR_VERSION < 5 - stereoRectifyFisheye( - left.K_raw(), D_left, - right.K_raw(), D_right, - imageSize, R, Tvec, R1, R2, P1, P2, Q, - cv::CALIB_ZERO_DISPARITY, 0, imageSize); -- -- // Very hard to get good results with this one: -- /*double balance = 0.0, fov_scale = 1.0; -+#else -+ // Very hard to get good results with this one, but stereoRectifyFisheye() -+ // (above) relies on the removed OpenCV C API and is not available on OpenCV 5+: -+ double balance = 0.0, fov_scale = 1.0; - cv::fisheye::stereoRectify( - left.K_raw(), D_left, - right.K_raw(), D_right, - imageSize, R, Tvec, R1, R2, P1, P2, Q, -- cv::CALIB_ZERO_DISPARITY, imageSize, balance, fov_scale);*/ -+ cv::CALIB_ZERO_DISPARITY, imageSize, balance, fov_scale); -+#endif - - std::cout << "R1 = " << R1 << std::endl; - std::cout << "R2 = " << R2 << std::endl; diff --git a/patch/ros-rolling-rtabmap.4fix.patch b/patch/ros-rolling-rtabmap.4fix.patch deleted file mode 100644 index 17a7da045..000000000 --- a/patch/ros-rolling-rtabmap.4fix.patch +++ /dev/null @@ -1,60 +0,0 @@ -diff --git a/tools/EpipolarGeometry/main.cpp b/tools/EpipolarGeometry/main.cpp ---- a/tools/EpipolarGeometry/main.cpp -+++ b/tools/EpipolarGeometry/main.cpp -@@ -26,7 +26,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - #include --#include - #include - #include - #include -diff --git a/tools/CameraRGBD/main.cpp b/tools/CameraRGBD/main.cpp ---- a/tools/CameraRGBD/main.cpp -+++ b/tools/CameraRGBD/main.cpp -@@ -37,9 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include "rtabmap/utilite/UConversion.h" - #include - #include --#if CV_MAJOR_VERSION >= 3 --#include --#endif -+#include - #include - #include - #include -@@ -398,7 +396,7 @@ int main(int argc, char * argv[]) - UASSERT(fourcc.size() == 4); - videoWriter.open( - stereoSavePath, -- CV_FOURCC(fourcc.at(0), fourcc.at(1), fourcc.at(2), fourcc.at(3)), -+ cv::VideoWriter::fourcc(fourcc.at(0), fourcc.at(1), fourcc.at(2), fourcc.at(3)), - rate, - targetSize, - data.imageRaw().channels() == 3); -@@ -479,7 +477,7 @@ int main(int argc, char * argv[]) - { - if(right.channels() == 3) - { -- cv::cvtColor(right, right, CV_BGR2GRAY); -+ cv::cvtColor(right, right, cv::COLOR_BGR2GRAY); - } - pcl::PointCloud::Ptr cloud = rtabmap::util3d::cloudFromStereoImages( - rgb, right, -@@ -506,14 +504,14 @@ int main(int argc, char * argv[]) - if(right.type() != left.type()) - { - cv::Mat tmp; -- cv::cvtColor(right, tmp, left.channels()==3?CV_GRAY2BGR:CV_BGR2GRAY); -+ cv::cvtColor(right, tmp, left.channels()==3?cv::COLOR_GRAY2BGR:cv::COLOR_BGR2GRAY); - right = tmp; - } - UASSERT(left.type() == right.type()); - - cv::Mat roiA(targetImage, cv::Rect( 0, 0, left.size().width, left.size().height )); - left.copyTo(roiA); -- cv::Mat roiB( targetImage, cvRect( left.size().width, 0, left.size().width, left.size().height ) ); -+ cv::Mat roiB( targetImage, cv::Rect( left.size().width, 0, left.size().width, left.size().height ) ); - right.copyTo(roiB); - - videoWriter.write(targetImage); diff --git a/patch/ros-rolling-rtabmap.5fix.patch b/patch/ros-rolling-rtabmap.5fix.patch deleted file mode 100644 index 0220d4d86..000000000 --- a/patch/ros-rolling-rtabmap.5fix.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/tools/EpipolarGeometry/main.cpp b/tools/EpipolarGeometry/main.cpp ---- a/tools/EpipolarGeometry/main.cpp -+++ b/tools/EpipolarGeometry/main.cpp -@@ -35,7 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - #include - #include - #include --#include -+#include - #include "rtabmap/core/Features2d.h" - #include "rtabmap/core/EpipolarGeometry.h" - #include "rtabmap/core/VWDictionary.h" diff --git a/patch/ros-rolling-rtabmap.1base.patch b/patch/ros-rolling-rtabmap.patch similarity index 66% rename from patch/ros-rolling-rtabmap.1base.patch rename to patch/ros-rolling-rtabmap.patch index 904a400f9..b3b1777dd 100644 --- a/patch/ros-rolling-rtabmap.1base.patch +++ b/patch/ros-rolling-rtabmap.patch @@ -1,4 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt +index b7d36de..80d7ea0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,9 @@ @@ -12,7 +13,7 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt SET(PROJECT_PREFIX rtabmap) # Catkin doesn't support multiarch library path, -@@ -84,12 +87,12 @@ +@@ -84,12 +87,12 @@ IF(MINGW) ENDIF(MINGW) # GCC 4 required @@ -31,7 +32,7 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt #The CDT Error Parser cannot handle error messages that span #more than one line, which is the default gcc behavior. -@@ -234,8 +237,26 @@ +@@ -234,7 +237,25 @@ option(BUILD_WITH_RPATH_NOT_RUNPATH "Explicitly disable usage of RUNPATH for the set(RTABMAP_QT_VERSION AUTO CACHE STRING "Force a specific Qt version.") set_property(CACHE RTABMAP_QT_VERSION PROPERTY STRINGS AUTO 4 5 6) @@ -43,7 +44,7 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt +SET(RTABMAP_OpenCV_COMPONENTS_4 core imgproc highgui stitching photo video videoio calib3d) +SET(RTABMAP_OpenCV_OPTIONAL_COMPONENTS_5 objdetect xfeatures2d nonfree gpu cudafeatures2d cudaoptflow cudaimgproc) +SET(RTABMAP_OpenCV_OPTIONAL_COMPONENTS_4 aruco objdetect xfeatures2d nonfree gpu cudafeatures2d cudaoptflow cudaimgproc) - ++ +# Probe OpenCV without a version constraint first, then request the components +# matching the detected major version. A version-constrained find that fails to +# match (e.g. asking for 5 when only 4 is present) resets OpenCV_DIR to NOTFOUND, @@ -55,11 +56,10 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt +ELSE() + FIND_PACKAGE(OpenCV REQUIRED QUIET COMPONENTS ${RTABMAP_OpenCV_COMPONENTS_4} OPTIONAL_COMPONENTS ${RTABMAP_OpenCV_OPTIONAL_COMPONENTS_4}) +ENDIF() -+ + IF(WITH_QT) FIND_PACKAGE(PCL 1.7 REQUIRED QUIET COMPONENTS common io kdtree search surface filters registration sample_consensus segmentation visualization) - ELSE() -@@ -494,7 +515,10 @@ +@@ -494,7 +515,10 @@ IF(WITH_DC1394) ENDIF(WITH_DC1394) IF(WITH_G2O) @@ -70,7 +70,7 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt IF(g2o_FOUND) MESSAGE(STATUS "Found g2o (targets)") SET(G2O_FOUND ${g2o_FOUND}) -@@ -530,8 +554,10 @@ +@@ -530,8 +554,10 @@ IF(WITH_G2O) ENDIF(WITH_G2O) IF(WITH_GTSAM) @@ -82,7 +82,7 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt ENDIF(WITH_GTSAM) IF(WITH_MRPT) -@@ -576,9 +602,9 @@ +@@ -576,9 +602,9 @@ IF(WITH_POINTMATCHER) ENDIF(WITH_POINTMATCHER) IF(libpointmatcher_FOUND OR GTSAM_FOUND) @@ -94,7 +94,7 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt ENDIF(Boost_MINOR_VERSION GREATER 47) IF(WIN32) MESSAGE(STATUS "Boost_LIBRARY_DIRS=${Boost_LIBRARY_DIRS}") -@@ -1207,6 +1233,18 @@ +@@ -1207,6 +1233,18 @@ install(EXPORT rtabmapTargets #### # Setup RTABMapConfig.cmake #### @@ -114,6 +114,7 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" diff --git a/RTABMapConfig.cmake.in b/RTABMapConfig.cmake.in +index 155ef3e..713359b 100644 --- a/RTABMapConfig.cmake.in +++ b/RTABMapConfig.cmake.in @@ -1,7 +1,7 @@ @@ -125,127 +126,177 @@ diff --git a/RTABMapConfig.cmake.in b/RTABMapConfig.cmake.in if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/RTABMap_guiTargets.cmake") find_dependency(PCL 1.7 COMPONENTS common io kdtree search surface filters registration sample_consensus segmentation visualization) +diff --git a/app/android/jni/point_cloud_drawable.cpp b/app/android/jni/point_cloud_drawable.cpp +index ca23e31..cf38ec1 100644 +--- a/app/android/jni/point_cloud_drawable.cpp ++++ b/app/android/jni/point_cloud_drawable.cpp +@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/ULogger.h" + #include "rtabmap/utilite/UTimer.h" + #include "rtabmap/utilite/UConversion.h" +-#include ++#include + #include "util.h" + #include "pcl/common/transforms.h" + diff --git a/corelib/include/rtabmap/core/DBDriverSqlite3.h b/corelib/include/rtabmap/core/DBDriverSqlite3.h +index 407ec7e..fbcd49b 100644 --- a/corelib/include/rtabmap/core/DBDriverSqlite3.h +++ b/corelib/include/rtabmap/core/DBDriverSqlite3.h -@@ -30,7 +30,11 @@ - - #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines - #include "rtabmap/core/DBDriver.h" -+#if CV_MAJOR_VERSION < 5 - #include -+#else -+#include -+#endif - - typedef struct sqlite3_stmt sqlite3_stmt; - typedef struct sqlite3 sqlite3; +@@ -30,7 +30,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines + #include "rtabmap/core/DBDriver.h" +-#include ++#if CV_MAJOR_VERSION < 5 ++#include ++#else ++#include ++#endif + + typedef struct sqlite3_stmt sqlite3_stmt; + typedef struct sqlite3 sqlite3; diff --git a/corelib/include/rtabmap/core/EpipolarGeometry.h b/corelib/include/rtabmap/core/EpipolarGeometry.h +index e9408cd..fec9036 100644 --- a/corelib/include/rtabmap/core/EpipolarGeometry.h +++ b/corelib/include/rtabmap/core/EpipolarGeometry.h -@@ -31,7 +31,14 @@ - #include "rtabmap/core/Parameters.h" - #include "rtabmap/utilite/UStl.h" - #include -+#if CV_MAJOR_VERSION < 5 - #include -+#else -+#include +@@ -31,7 +31,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/core/Parameters.h" + #include "rtabmap/utilite/UStl.h" + #include +-#include ++#if CV_MAJOR_VERSION < 5 ++#include ++#else ++#include +#if CV_MAJOR_VERSION >= 5 +#include +#endif -+#endif - #include - #include - #include ++#endif + #include + #include + #include diff --git a/corelib/include/rtabmap/core/Features2d.h b/corelib/include/rtabmap/core/Features2d.h +index f26f84b..9b064c1 100644 --- a/corelib/include/rtabmap/core/Features2d.h +++ b/corelib/include/rtabmap/core/Features2d.h -@@ -32,7 +32,11 @@ - - #include - #include -+#if CV_MAJOR_VERSION < 5 - #include -+#else -+#include -+#endif - #include - #include - #include "rtabmap/core/Parameters.h" -@@ -70,6 +74,10 @@ - class SIFT; - #endif - class SURF; -+#if (CV_MAJOR_VERSION == 5) -+class BRISK; -+class KAZE; -+#endif - } - namespace cuda { - class FastFeatureDetector; -@@ -89,7 +97,13 @@ - typedef cv::xfeatures2d::DAISY CV_DAISY; - typedef cv::GFTTDetector CV_GFTT; - typedef cv::xfeatures2d::BriefDescriptorExtractor CV_BRIEF; -+#if (CV_MAJOR_VERSION < 5) - typedef cv::BRISK CV_BRISK; -+typedef cv::KAZE CV_KAZE; -+#else -+typedef cv::xfeatures2d::BRISK CV_BRISK; -+typedef cv::xfeatures2d::KAZE CV_KAZE; -+#endif - typedef cv::ORB CV_ORB; - typedef cv::cuda::SURF_CUDA CV_SURF_GPU; - typedef cv::cuda::ORB CV_ORB_GPU; -@@ -573,7 +587,7 @@ - int diffusivity_; - - #if CV_MAJOR_VERSION > 2 -- cv::Ptr kaze_; -+ cv::Ptr kaze_; - #endif - }; - +@@ -30,9 +30,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines + +-#include ++#include + #include +-#include ++#if CV_MAJOR_VERSION < 5 ++#include ++#else ++#include ++#endif + #include + #include + #include "rtabmap/core/Parameters.h" +@@ -70,6 +74,10 @@ class BriefDescriptorExtractor; + class SIFT; + #endif + class SURF; ++#if (CV_MAJOR_VERSION == 5) ++class BRISK; ++class KAZE; ++#endif + } + namespace cuda { + class FastFeatureDetector; +@@ -89,7 +97,13 @@ typedef cv::xfeatures2d::FREAK CV_FREAK; + typedef cv::xfeatures2d::DAISY CV_DAISY; + typedef cv::GFTTDetector CV_GFTT; + typedef cv::xfeatures2d::BriefDescriptorExtractor CV_BRIEF; ++#if (CV_MAJOR_VERSION < 5) + typedef cv::BRISK CV_BRISK; ++typedef cv::KAZE CV_KAZE; ++#else ++typedef cv::xfeatures2d::BRISK CV_BRISK; ++typedef cv::xfeatures2d::KAZE CV_KAZE; ++#endif + typedef cv::ORB CV_ORB; + typedef cv::cuda::SURF_CUDA CV_SURF_GPU; + typedef cv::cuda::ORB CV_ORB_GPU; +@@ -573,7 +587,7 @@ private: + int diffusivity_; + + #if CV_MAJOR_VERSION > 2 +- cv::Ptr kaze_; ++ cv::Ptr kaze_; + #endif + }; + diff --git a/corelib/include/rtabmap/core/Memory.h b/corelib/include/rtabmap/core/Memory.h +index 39996d9..2fe3640 100644 --- a/corelib/include/rtabmap/core/Memory.h +++ b/corelib/include/rtabmap/core/Memory.h -@@ -41,7 +41,11 @@ - #include - #include "rtabmap/utilite/UStl.h" - #include -+#if CV_MAJOR_VERSION < 5 - #include -+#else -+#include -+#endif - #include - - namespace rtabmap { +@@ -41,7 +41,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include "rtabmap/utilite/UStl.h" + #include +-#include ++#if CV_MAJOR_VERSION < 5 ++#include ++#else ++#include ++#endif + #include + + namespace rtabmap { diff --git a/corelib/include/rtabmap/core/OdometryInfo.h b/corelib/include/rtabmap/core/OdometryInfo.h +index 484692b..a3ec914 100644 --- a/corelib/include/rtabmap/core/OdometryInfo.h +++ b/corelib/include/rtabmap/core/OdometryInfo.h -@@ -34,7 +34,11 @@ +@@ -34,7 +34,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "rtabmap/core/RegistrationInfo.h" #include "rtabmap/core/CameraModel.h" #include "rtabmap/core/LaserScan.h" +-#include +#if CV_MAJOR_VERSION < 5 - #include ++#include +#else +#include +#endif namespace rtabmap { +diff --git a/corelib/include/rtabmap/core/SensorCapture.h b/corelib/include/rtabmap/core/SensorCapture.h +index 20ee01b..13da904 100644 +--- a/corelib/include/rtabmap/core/SensorCapture.h ++++ b/corelib/include/rtabmap/core/SensorCapture.h +@@ -28,7 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines + +-#include ++#include + #include + #include "rtabmap/core/SensorData.h" + #include +@@ -44,7 +44,7 @@ namespace rtabmap + + /** + * Class Camera +- * ++ * + */ + class RTABMAP_CORE_EXPORT SensorCapture + { diff --git a/corelib/include/rtabmap/core/SensorData.h b/corelib/include/rtabmap/core/SensorData.h +index 18fc5d3..6688988 100644 --- a/corelib/include/rtabmap/core/SensorData.h +++ b/corelib/include/rtabmap/core/SensorData.h -@@ -34,7 +34,11 @@ +@@ -34,7 +34,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +-#include +#if CV_MAJOR_VERSION < 5 - #include ++#include +#else +#include +#endif @@ -253,54 +304,90 @@ diff --git a/corelib/include/rtabmap/core/SensorData.h b/corelib/include/rtabmap #include #include diff --git a/corelib/include/rtabmap/core/Signature.h b/corelib/include/rtabmap/core/Signature.h +index 9dbbe53..35d438d 100644 --- a/corelib/include/rtabmap/core/Signature.h +++ b/corelib/include/rtabmap/core/Signature.h -@@ -31,7 +31,11 @@ - - #include - #include -+#if CV_MAJOR_VERSION < 5 - #include -+#else -+#include -+#endif - #include - #include - #include +@@ -31,8 +31,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include + #include +-#include +-#include ++#if CV_MAJOR_VERSION < 5 ++#include ++#else ++#include ++#endif ++#include + #include + #include + #include +@@ -62,7 +66,7 @@ public: + virtual ~Signature(); + + /** +- * Must return a value between >=0 and <=1 (1 means 100% similarity). ++ * Must return a value between >=0 and <=1 (1 means 100% similarity). + */ + float compareTo(const Signature & signature) const; + bool isBadSignature() const; diff --git a/corelib/include/rtabmap/core/Statistics.h b/corelib/include/rtabmap/core/Statistics.h +index 61abdde..68491a8 100644 --- a/corelib/include/rtabmap/core/Statistics.h +++ b/corelib/include/rtabmap/core/Statistics.h -@@ -31,7 +31,11 @@ +@@ -31,8 +31,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines #include +-#include +-#include +#if CV_MAJOR_VERSION < 5 - #include ++#include +#else +#include +#endif - #include ++#include #include #include + #include diff --git a/corelib/include/rtabmap/core/VWDictionary.h b/corelib/include/rtabmap/core/VWDictionary.h +index fbfa7ba..db7d4db 100644 --- a/corelib/include/rtabmap/core/VWDictionary.h +++ b/corelib/include/rtabmap/core/VWDictionary.h -@@ -31,7 +31,11 @@ - - #include - #include -+#if CV_MAJOR_VERSION < 5 - #include -+#else -+#include -+#endif - #include - #include - #include "rtabmap/core/Parameters.h" +@@ -29,9 +29,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include "rtabmap/core/rtabmap_core_export.h" // DLL export/import defines + +-#include ++#include + #include +-#include ++#if CV_MAJOR_VERSION < 5 ++#include ++#else ++#include ++#endif + #include + #include + #include "rtabmap/core/Parameters.h" +diff --git a/corelib/include/rtabmap/core/camera/CameraVideo.h b/corelib/include/rtabmap/core/camera/CameraVideo.h +index bdc90a1..ca65116 100644 +--- a/corelib/include/rtabmap/core/camera/CameraVideo.h ++++ b/corelib/include/rtabmap/core/camera/CameraVideo.h +@@ -27,7 +27,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #pragma once + +-#include ++#include + #include "rtabmap/core/Camera.h" + + namespace rtabmap diff --git a/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h b/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h +index 2fc12a2..3361aab 100644 --- a/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h +++ b/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h -@@ -32,12 +32,24 @@ +@@ -32,12 +32,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef CORELIB_SRC_OPENCV_STEREORECTIFYFISHEYE_H_ #define CORELIB_SRC_OPENCV_STEREORECTIFYFISHEYE_H_ @@ -315,7 +402,7 @@ diff --git a/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h b/coreli + #include #if CV_MAJOR_VERSION >= 3 - #include +-#include #if CV_MAJOR_VERSION >= 4 #include @@ -326,15 +413,17 @@ diff --git a/corelib/include/rtabmap/core/stereo/stereoRectifyFisheye.h b/coreli // Opencv4 doesn't expose those functions below anymore, we should recopy all of them! int cvRodrigues2( const CvMat* src, CvMat* dst, CvMat* jacobian CV_DEFAULT(0)) diff --git a/corelib/include/rtabmap/core/util3d_correspondences.h b/corelib/include/rtabmap/core/util3d_correspondences.h +index 6bbaeb2..f50a98b 100644 --- a/corelib/include/rtabmap/core/util3d_correspondences.h +++ b/corelib/include/rtabmap/core/util3d_correspondences.h -@@ -32,7 +32,12 @@ +@@ -32,7 +32,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +-#include +#include +#if CV_MAJOR_VERSION < 5 - #include ++#include +#else +#include +#endif @@ -342,9 +431,10 @@ diff --git a/corelib/include/rtabmap/core/util3d_correspondences.h b/corelib/inc #include #include diff --git a/corelib/include/rtabmap/core/util3d_features.h b/corelib/include/rtabmap/core/util3d_features.h +index 2a02bf2..ac5cb75 100644 --- a/corelib/include/rtabmap/core/util3d_features.h +++ b/corelib/include/rtabmap/core/util3d_features.h -@@ -30,7 +30,12 @@ +@@ -30,7 +30,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include @@ -358,12 +448,15 @@ diff --git a/corelib/include/rtabmap/core/util3d_features.h b/corelib/include/rt #include #include diff --git a/corelib/src/CameraModel.cpp b/corelib/src/CameraModel.cpp +index 3e80d25..bc37f40 100644 --- a/corelib/src/CameraModel.cpp +++ b/corelib/src/CameraModel.cpp -@@ -34,6 +34,9 @@ +@@ -33,7 +33,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include #include #include - #include +-#include ++#include +#if CV_MAJOR_VERSION >= 5 +#include +#endif @@ -371,181 +464,185 @@ diff --git a/corelib/src/CameraModel.cpp b/corelib/src/CameraModel.cpp namespace rtabmap { diff --git a/corelib/src/EpipolarGeometry.cpp b/corelib/src/EpipolarGeometry.cpp +index 38f1584..758a14a 100644 --- a/corelib/src/EpipolarGeometry.cpp +++ b/corelib/src/EpipolarGeometry.cpp -@@ -33,8 +33,11 @@ - #include "rtabmap/utilite/UMath.h" - - #include --#include -+#if CV_MAJOR_VERSION < 5 - #include -+#else -+#include -+#endif - #include - - namespace rtabmap +@@ -33,8 +33,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/UMath.h" + + #include +-#include ++#if CV_MAJOR_VERSION < 5 + #include ++#else ++#include ++#endif + #include + + namespace rtabmap diff --git a/corelib/src/Features2d.cpp b/corelib/src/Features2d.cpp +index 90555db..cadafff 100644 --- a/corelib/src/Features2d.cpp +++ b/corelib/src/Features2d.cpp -@@ -36,7 +36,6 @@ - #include "rtabmap/utilite/UMath.h" - #include "rtabmap/utilite/ULogger.h" - #include "rtabmap/utilite/UTimer.h" --#include - #include - #include - -@@ -857,7 +856,7 @@ - cv::cornerSubPix( image, corners, - cv::Size( _subPixWinSize, _subPixWinSize ), - cv::Size( -1, -1 ), -- cv::TermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, _subPixIterations, _subPixEps ) ); -+ cv::TermCriteria( cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS, _subPixIterations, _subPixEps ) ); - - for(unsigned int i=0;i 4 -+#ifdef HAVE_OPENCV_XFEATURES2D -+ brisk_ = CV_BRISK::create(thresh_, octaves_, patternScale_); -+#else -+ UWARN("RTAB-Map is not built with OpenCV xfeatures2d module so BRISK cannot be used!"); -+#endif -+#elif CV_MAJOR_VERSION < 3 - brisk_ = cv::Ptr(new CV_BRISK(thresh_, octaves_, patternScale_)); - #else - brisk_ = CV_BRISK::create(thresh_, octaves_, patternScale_); -@@ -2357,6 +2361,7 @@ - { - UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U); - std::vector keypoints; -+#if CV_MAJOR_VERSION < 5 || (CV_MAJOR_VERSION > 4 && defined(HAVE_OPENCV_XFEATURES2D)) - cv::Mat imgRoi(image, roi); - cv::Mat maskRoi; - if(!mask.empty()) -@@ -2364,6 +2369,9 @@ - maskRoi = cv::Mat(mask, roi); - } - brisk_->detect(imgRoi, keypoints, maskRoi); // Opencv keypoints -+#else -+ UWARN("RTAB-Map is not built with BRISK feature support!"); -+#endif - return keypoints; - } - -@@ -2371,7 +2379,11 @@ - { - UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U); - cv::Mat descriptors; -+#if CV_MAJOR_VERSION < 5 || (CV_MAJOR_VERSION > 4 && defined(HAVE_OPENCV_XFEATURES2D)) - brisk_->compute(image, keypoints, descriptors); -+#else -+ UWARN("RTAB-Map is not built with BRISK feature support!"); -+#endif - return descriptors; - } - -@@ -2404,10 +2416,16 @@ - Parameters::parse(parameters, Parameters::kKAZENOctaveLayers(), nOctaveLayers_); - Parameters::parse(parameters, Parameters::kKAZEDiffusivity(), diffusivity_); - --#if CV_MAJOR_VERSION > 3 -- kaze_ = cv::KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, (cv::KAZE::DiffusivityType)diffusivity_); -+#if CV_MAJOR_VERSION > 4 -+#ifdef HAVE_OPENCV_XFEATURES2D -+ kaze_ = CV_KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, (CV_KAZE::DiffusivityType)diffusivity_); -+#else -+ UWARN("RTAB-Map is not built with OpenCV xfeatures2d module so KAZE cannot be used!"); -+#endif -+#elif CV_MAJOR_VERSION > 3 -+ kaze_ = CV_KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, (CV_KAZE::DiffusivityType)diffusivity_); - #elif CV_MAJOR_VERSION > 2 -- kaze_ = cv::KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, diffusivity_); -+ kaze_ = CV_KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, diffusivity_); - #else - UWARN("RTAB-Map is not built with OpenCV3 so Kaze feature cannot be used!"); - #endif -@@ -2417,7 +2435,7 @@ - { - UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U); - std::vector keypoints; --#if CV_MAJOR_VERSION > 2 -+#if (CV_MAJOR_VERSION > 2 && CV_MAJOR_VERSION < 5) || (CV_MAJOR_VERSION > 4 && defined(HAVE_OPENCV_XFEATURES2D)) - cv::Mat imgRoi(image, roi); - cv::Mat maskRoi; - if (!mask.empty()) -@@ -2426,7 +2444,7 @@ - } - kaze_->detect(imgRoi, keypoints, maskRoi); // Opencv keypoints - #else -- UWARN("RTAB-Map is not built with OpenCV3 so Kaze feature cannot be used!"); -+ UWARN("RTAB-Map is not built with Kaze feature support!"); - #endif - return keypoints; - } -@@ -2435,10 +2453,10 @@ - { - UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U); - cv::Mat descriptors; --#if CV_MAJOR_VERSION > 2 -+#if (CV_MAJOR_VERSION > 2 && CV_MAJOR_VERSION < 5) || (CV_MAJOR_VERSION > 4 && defined(HAVE_OPENCV_XFEATURES2D)) - kaze_->compute(image, keypoints, descriptors); - #else -- UWARN("RTAB-Map is not built with OpenCV3 so Kaze feature cannot be used!"); -+ UWARN("RTAB-Map is not built with Kaze feature support!"); - #endif - return descriptors; - } +@@ -36,7 +36,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/UMath.h" + #include "rtabmap/utilite/ULogger.h" + #include "rtabmap/utilite/UTimer.h" +-#include + #include + #include + +@@ -857,7 +856,7 @@ std::vector Feature2D::generateKeypoints(const cv::Mat & image, co + cv::cornerSubPix( image, corners, + cv::Size( _subPixWinSize, _subPixWinSize ), + cv::Size( -1, -1 ), +- cv::TermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, _subPixIterations, _subPixEps ) ); ++ cv::TermCriteria( cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS, _subPixIterations, _subPixEps ) ); + + for(unsigned int i=0;i 4 ++#ifdef HAVE_OPENCV_XFEATURES2D ++ brisk_ = CV_BRISK::create(thresh_, octaves_, patternScale_); ++#else ++ UWARN("RTAB-Map is not built with OpenCV xfeatures2d module so BRISK cannot be used!"); ++#endif ++#elif CV_MAJOR_VERSION < 3 + brisk_ = cv::Ptr(new CV_BRISK(thresh_, octaves_, patternScale_)); + #else + brisk_ = CV_BRISK::create(thresh_, octaves_, patternScale_); +@@ -2357,6 +2361,7 @@ std::vector BRISK::generateKeypointsImpl(const cv::Mat & image, co + { + UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U); + std::vector keypoints; ++#if CV_MAJOR_VERSION < 5 || (CV_MAJOR_VERSION > 4 && defined(HAVE_OPENCV_XFEATURES2D)) + cv::Mat imgRoi(image, roi); + cv::Mat maskRoi; + if(!mask.empty()) +@@ -2364,6 +2369,9 @@ std::vector BRISK::generateKeypointsImpl(const cv::Mat & image, co + maskRoi = cv::Mat(mask, roi); + } + brisk_->detect(imgRoi, keypoints, maskRoi); // Opencv keypoints ++#else ++ UWARN("RTAB-Map is not built with BRISK feature support!"); ++#endif + return keypoints; + } + +@@ -2371,7 +2379,11 @@ cv::Mat BRISK::generateDescriptorsImpl(const cv::Mat & image, std::vector 4 && defined(HAVE_OPENCV_XFEATURES2D)) + brisk_->compute(image, keypoints, descriptors); ++#else ++ UWARN("RTAB-Map is not built with BRISK feature support!"); ++#endif + return descriptors; + } + +@@ -2404,10 +2416,16 @@ void KAZE::parseParameters(const ParametersMap & parameters) + Parameters::parse(parameters, Parameters::kKAZENOctaveLayers(), nOctaveLayers_); + Parameters::parse(parameters, Parameters::kKAZEDiffusivity(), diffusivity_); + +-#if CV_MAJOR_VERSION > 3 +- kaze_ = cv::KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, (cv::KAZE::DiffusivityType)diffusivity_); ++#if CV_MAJOR_VERSION > 4 ++#ifdef HAVE_OPENCV_XFEATURES2D ++ kaze_ = CV_KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, (CV_KAZE::DiffusivityType)diffusivity_); ++#else ++ UWARN("RTAB-Map is not built with OpenCV xfeatures2d module so KAZE cannot be used!"); ++#endif ++#elif CV_MAJOR_VERSION > 3 ++ kaze_ = CV_KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, (CV_KAZE::DiffusivityType)diffusivity_); + #elif CV_MAJOR_VERSION > 2 +- kaze_ = cv::KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, diffusivity_); ++ kaze_ = CV_KAZE::create(extended_, upright_, threshold_, nOctaves_, nOctaveLayers_, diffusivity_); + #else + UWARN("RTAB-Map is not built with OpenCV3 so Kaze feature cannot be used!"); + #endif +@@ -2417,7 +2435,7 @@ std::vector KAZE::generateKeypointsImpl(const cv::Mat & image, con + { + UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U); + std::vector keypoints; +-#if CV_MAJOR_VERSION > 2 ++#if (CV_MAJOR_VERSION > 2 && CV_MAJOR_VERSION < 5) || (CV_MAJOR_VERSION > 4 && defined(HAVE_OPENCV_XFEATURES2D)) + cv::Mat imgRoi(image, roi); + cv::Mat maskRoi; + if (!mask.empty()) +@@ -2426,7 +2444,7 @@ std::vector KAZE::generateKeypointsImpl(const cv::Mat & image, con + } + kaze_->detect(imgRoi, keypoints, maskRoi); // Opencv keypoints + #else +- UWARN("RTAB-Map is not built with OpenCV3 so Kaze feature cannot be used!"); ++ UWARN("RTAB-Map is not built with Kaze feature support!"); + #endif + return keypoints; + } +@@ -2435,10 +2453,10 @@ cv::Mat KAZE::generateDescriptorsImpl(const cv::Mat & image, std::vector 2 ++#if (CV_MAJOR_VERSION > 2 && CV_MAJOR_VERSION < 5) || (CV_MAJOR_VERSION > 4 && defined(HAVE_OPENCV_XFEATURES2D)) + kaze_->compute(image, keypoints, descriptors); + #else +- UWARN("RTAB-Map is not built with OpenCV3 so Kaze feature cannot be used!"); ++ UWARN("RTAB-Map is not built with Kaze feature support!"); + #endif + return descriptors; + } diff --git a/corelib/src/Memory.cpp b/corelib/src/Memory.cpp +index 0556312..2ea825f 100644 --- a/corelib/src/Memory.cpp +++ b/corelib/src/Memory.cpp -@@ -26,6 +26,9 @@ - */ - - #include +@@ -26,6 +26,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + #include +#if CV_MAJOR_VERSION >= 5 +#include +#endif - #include - #include - #include -@@ -62,7 +65,6 @@ - #include - #include - #include --#include - #include - - namespace rtabmap { -@@ -4930,7 +4932,7 @@ - cv::Mat imageMono; - if(decimatedData.imageRaw().channels() == 3) - { -- cv::cvtColor(decimatedData.imageRaw(), imageMono, CV_BGR2GRAY); -+ cv::cvtColor(decimatedData.imageRaw(), imageMono, cv::COLOR_BGR2GRAY); - } - else - { -@@ -5239,7 +5241,7 @@ - cv::Mat imageMono; - if(data.imageRaw().channels() == 3) - { -- cv::cvtColor(data.imageRaw(), imageMono, CV_BGR2GRAY); -+ cv::cvtColor(data.imageRaw(), imageMono, cv::COLOR_BGR2GRAY); - } - else - { + #include + #include + #include +@@ -62,7 +65,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include + #include + + namespace rtabmap { +@@ -4930,7 +4932,7 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor + cv::Mat imageMono; + if(decimatedData.imageRaw().channels() == 3) + { +- cv::cvtColor(decimatedData.imageRaw(), imageMono, CV_BGR2GRAY); ++ cv::cvtColor(decimatedData.imageRaw(), imageMono, cv::COLOR_BGR2GRAY); + } + else + { +@@ -5239,7 +5241,7 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor + cv::Mat imageMono; + if(data.imageRaw().channels() == 3) + { +- cv::cvtColor(data.imageRaw(), imageMono, CV_BGR2GRAY); ++ cv::cvtColor(data.imageRaw(), imageMono, cv::COLOR_BGR2GRAY); + } + else + { diff --git a/corelib/src/RegistrationVis.cpp b/corelib/src/RegistrationVis.cpp +index 84f0101..dac3180 100644 --- a/corelib/src/RegistrationVis.cpp +++ b/corelib/src/RegistrationVis.cpp -@@ -43,7 +43,9 @@ +@@ -43,7 +43,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include @@ -556,18 +653,17 @@ diff --git a/corelib/src/RegistrationVis.cpp b/corelib/src/RegistrationVis.cpp #if defined(HAVE_OPENCV_XFEATURES2D) && (CV_MAJOR_VERSION > 3 || (CV_MAJOR_VERSION==3 && CV_MINOR_VERSION >=4 && CV_SUBMINOR_VERSION >= 1)) #include // For GMS matcher -@@ -52,7 +54,10 @@ +@@ -52,6 +54,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifdef HAVE_OPENCV_CUDAOPTFLOW #include #include +#if CV_MAJOR_VERSION >= 5 +#include - #endif +#endif + #endif #include - -@@ -2170,7 +2175,7 @@ +@@ -2170,7 +2175,7 @@ Transform RegistrationVis::computeTransformationImpl( if(!transform.isNull() && !pcaData.empty()) { cv::Mat pcaEigenVectors, pcaEigenValues; @@ -576,80 +672,110 @@ diff --git a/corelib/src/RegistrationVis.cpp b/corelib/src/RegistrationVis.cpp // We take the second eigen value info.inliersDistribution = pca_analysis.eigenvalues.at(0, 1); +diff --git a/corelib/src/SensorCapture.cpp b/corelib/src/SensorCapture.cpp +index 5932787..a86708d 100644 +--- a/corelib/src/SensorCapture.cpp ++++ b/corelib/src/SensorCapture.cpp +@@ -35,7 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + +-#include ++#include + + #include + #include diff --git a/corelib/src/SensorCaptureThread.cpp b/corelib/src/SensorCaptureThread.cpp +index 8941c3d..7d62f70 100644 --- a/corelib/src/SensorCaptureThread.cpp +++ b/corelib/src/SensorCaptureThread.cpp -@@ -39,7 +39,6 @@ - #include "rtabmap/core/IMUFilter.h" - #include "rtabmap/core/Features2d.h" - #include "rtabmap/core/clams/discrete_depth_distortion_model.h" --#include - #include - #include - #include -@@ -742,11 +741,11 @@ - else if(data.imageRaw().type() == CV_8UC3) - { - cv::Mat channels[3]; -- cv::cvtColor(data.imageRaw(), image, CV_BGR2YCrCb); -+ cv::cvtColor(data.imageRaw(), image, cv::COLOR_BGR2YCrCb); - cv::split(image, channels); - cv::equalizeHist(channels[0], channels[0]); - cv::merge(channels, 3, image); -- cv::cvtColor(image, image, CV_YCrCb2BGR); -+ cv::cvtColor(image, image, cv::COLOR_YCrCb2BGR); - } - if(!data.depthRaw().empty()) - { -@@ -762,11 +761,11 @@ - else if(data.rightRaw().type() == CV_8UC3) - { - cv::Mat channels[3]; -- cv::cvtColor(data.rightRaw(), right, CV_BGR2YCrCb); -+ cv::cvtColor(data.rightRaw(), right, cv::COLOR_BGR2YCrCb); - cv::split(right, channels); - cv::equalizeHist(channels[0], channels[0]); - cv::merge(channels, 3, right); -- cv::cvtColor(right, right, CV_YCrCb2BGR); -+ cv::cvtColor(right, right, cv::COLOR_YCrCb2BGR); - } - data.setStereoImage(image, right, data.stereoCameraModels()[0]); - } -@@ -781,11 +780,11 @@ - else if(data.imageRaw().type() == CV_8UC3) - { - cv::Mat channels[3]; -- cv::cvtColor(data.imageRaw(), image, CV_BGR2YCrCb); -+ cv::cvtColor(data.imageRaw(), image, cv::COLOR_BGR2YCrCb); - cv::split(image, channels); - clahe->apply(channels[0], channels[0]); - cv::merge(channels, 3, image); -- cv::cvtColor(image, image, CV_YCrCb2BGR); -+ cv::cvtColor(image, image, cv::COLOR_YCrCb2BGR); - } - if(!data.depthRaw().empty()) - { -@@ -801,11 +800,11 @@ - else if(data.rightRaw().type() == CV_8UC3) - { - cv::Mat channels[3]; -- cv::cvtColor(data.rightRaw(), right, CV_BGR2YCrCb); -+ cv::cvtColor(data.rightRaw(), right, cv::COLOR_BGR2YCrCb); - cv::split(right, channels); - clahe->apply(channels[0], channels[0]); - cv::merge(channels, 3, right); -- cv::cvtColor(right, right, CV_YCrCb2BGR); -+ cv::cvtColor(right, right, cv::COLOR_YCrCb2BGR); - } - data.setStereoImage(image, right, data.stereoCameraModels()[0]); - } +@@ -39,7 +39,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/core/IMUFilter.h" + #include "rtabmap/core/Features2d.h" + #include "rtabmap/core/clams/discrete_depth_distortion_model.h" +-#include + #include + #include + #include +@@ -742,11 +741,11 @@ void SensorCaptureThread::postUpdate(SensorData * dataPtr, SensorCaptureInfo * i + else if(data.imageRaw().type() == CV_8UC3) + { + cv::Mat channels[3]; +- cv::cvtColor(data.imageRaw(), image, CV_BGR2YCrCb); ++ cv::cvtColor(data.imageRaw(), image, cv::COLOR_BGR2YCrCb); + cv::split(image, channels); + cv::equalizeHist(channels[0], channels[0]); + cv::merge(channels, 3, image); +- cv::cvtColor(image, image, CV_YCrCb2BGR); ++ cv::cvtColor(image, image, cv::COLOR_YCrCb2BGR); + } + if(!data.depthRaw().empty()) + { +@@ -762,11 +761,11 @@ void SensorCaptureThread::postUpdate(SensorData * dataPtr, SensorCaptureInfo * i + else if(data.rightRaw().type() == CV_8UC3) + { + cv::Mat channels[3]; +- cv::cvtColor(data.rightRaw(), right, CV_BGR2YCrCb); ++ cv::cvtColor(data.rightRaw(), right, cv::COLOR_BGR2YCrCb); + cv::split(right, channels); + cv::equalizeHist(channels[0], channels[0]); + cv::merge(channels, 3, right); +- cv::cvtColor(right, right, CV_YCrCb2BGR); ++ cv::cvtColor(right, right, cv::COLOR_YCrCb2BGR); + } + data.setStereoImage(image, right, data.stereoCameraModels()[0]); + } +@@ -781,11 +780,11 @@ void SensorCaptureThread::postUpdate(SensorData * dataPtr, SensorCaptureInfo * i + else if(data.imageRaw().type() == CV_8UC3) + { + cv::Mat channels[3]; +- cv::cvtColor(data.imageRaw(), image, CV_BGR2YCrCb); ++ cv::cvtColor(data.imageRaw(), image, cv::COLOR_BGR2YCrCb); + cv::split(image, channels); + clahe->apply(channels[0], channels[0]); + cv::merge(channels, 3, image); +- cv::cvtColor(image, image, CV_YCrCb2BGR); ++ cv::cvtColor(image, image, cv::COLOR_YCrCb2BGR); + } + if(!data.depthRaw().empty()) + { +@@ -801,11 +800,11 @@ void SensorCaptureThread::postUpdate(SensorData * dataPtr, SensorCaptureInfo * i + else if(data.rightRaw().type() == CV_8UC3) + { + cv::Mat channels[3]; +- cv::cvtColor(data.rightRaw(), right, CV_BGR2YCrCb); ++ cv::cvtColor(data.rightRaw(), right, cv::COLOR_BGR2YCrCb); + cv::split(right, channels); + clahe->apply(channels[0], channels[0]); + cv::merge(channels, 3, right); +- cv::cvtColor(right, right, CV_YCrCb2BGR); ++ cv::cvtColor(right, right, cv::COLOR_YCrCb2BGR); + } + data.setStereoImage(image, right, data.stereoCameraModels()[0]); + } +diff --git a/corelib/src/Signature.cpp b/corelib/src/Signature.cpp +index 32fca30..a7dc364 100644 +--- a/corelib/src/Signature.cpp ++++ b/corelib/src/Signature.cpp +@@ -29,7 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/core/EpipolarGeometry.h" + #include "rtabmap/core/Memory.h" + #include "rtabmap/core/Compression.h" +-#include ++#include + + #include + diff --git a/corelib/src/StereoCameraModel.cpp b/corelib/src/StereoCameraModel.cpp +index 421d3f4..5b0e88b 100644 --- a/corelib/src/StereoCameraModel.cpp +++ b/corelib/src/StereoCameraModel.cpp -@@ -32,8 +32,11 @@ +@@ -31,9 +31,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include #include #include - #include +-#include ++#include +#if CV_MAJOR_VERSION >= 5 +#include +#endif @@ -659,7 +785,7 @@ diff --git a/corelib/src/StereoCameraModel.cpp b/corelib/src/StereoCameraModel.c #include #endif -@@ -179,12 +182,20 @@ +@@ -179,12 +182,20 @@ void StereoCameraModel::updateStereoRectification() { cv::Vec4d D_left(left_.D_raw().at(0,0), left_.D_raw().at(0,1), left_.D_raw().at(0,4), left_.D_raw().at(0,5)); cv::Vec4d D_right(right_.D_raw().at(0,0), right_.D_raw().at(0,1), right_.D_raw().at(0,4), right_.D_raw().at(0,5)); @@ -682,142 +808,147 @@ diff --git a/corelib/src/StereoCameraModel.cpp b/corelib/src/StereoCameraModel.c // Re-zoom to original focal distance if(P1.at(0,0) < 0) diff --git a/corelib/src/camera/CameraDepthAI.cpp b/corelib/src/camera/CameraDepthAI.cpp +index 9eb0179..a0d4699 100644 --- a/corelib/src/camera/CameraDepthAI.cpp +++ b/corelib/src/camera/CameraDepthAI.cpp -@@ -32,7 +32,11 @@ - #include - #include - #include -- -+#if CV_MAJOR_VERSION < 5 -+#include -+#else -+#include -+#endif - - namespace rtabmap { - +@@ -32,7 +32,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +- ++#if CV_MAJOR_VERSION < 5 ++#include ++#else ++#include ++#endif + + namespace rtabmap { + diff --git a/corelib/src/camera/CameraFreenect.cpp b/corelib/src/camera/CameraFreenect.cpp +index 9d48215..a402c7b 100644 --- a/corelib/src/camera/CameraFreenect.cpp +++ b/corelib/src/camera/CameraFreenect.cpp -@@ -28,7 +28,6 @@ - #include - #include - #include --#include - - #ifdef RTABMAP_FREENECT - #include -@@ -183,7 +182,7 @@ - - if(color_) - { -- cv::cvtColor(rgbIrBuffer_, rgbIrLastFrame_, CV_RGB2BGR); -+ cv::cvtColor(rgbIrBuffer_, rgbIrLastFrame_, cv::COLOR_RGB2BGR); - } - else // IrDepth - { +@@ -28,7 +28,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include + + #ifdef RTABMAP_FREENECT + #include +@@ -183,7 +182,7 @@ private: + + if(color_) + { +- cv::cvtColor(rgbIrBuffer_, rgbIrLastFrame_, CV_RGB2BGR); ++ cv::cvtColor(rgbIrBuffer_, rgbIrLastFrame_, cv::COLOR_RGB2BGR); + } + else // IrDepth + { diff --git a/corelib/src/camera/CameraFreenect2.cpp b/corelib/src/camera/CameraFreenect2.cpp +index 85f7bdf..1514311 100644 --- a/corelib/src/camera/CameraFreenect2.cpp +++ b/corelib/src/camera/CameraFreenect2.cpp -@@ -29,7 +29,6 @@ - #include - #include - #include --#include - - #ifdef RTABMAP_FREENECT2 - #include -@@ -430,11 +429,11 @@ - cv::Mat rgbMat; // rtabmap uses 3 channels RGB - #ifdef LIBFREENECT2_WITH_TEGRAJPEG_SUPPORT - -- cv::cvtColor(rgbMatC4, rgbMat, CV_RGBA2BGR); -+ cv::cvtColor(rgbMatC4, rgbMat, cv::COLOR_RGBA2BGR); - - #else - -- cv::cvtColor(rgbMatC4, rgbMat, CV_BGRA2BGR); -+ cv::cvtColor(rgbMatC4, rgbMat, cv::COLOR_BGRA2BGR); - - #endif - cv::flip(rgbMat, rgb, 1); -@@ -490,11 +489,11 @@ - cv::Mat rgbMat; // rtabmap uses 3 channels RGB - #ifdef LIBFREENECT2_WITH_TEGRAJPEG_SUPPORT - -- cv::cvtColor(rgbMatC4, rgbMat, CV_RGB2BGR); -+ cv::cvtColor(rgbMatC4, rgbMat, cv::COLOR_RGB2BGR); - - #else - -- cv::cvtColor(rgbMatC4, rgbMat, CV_BGRA2BGR); -+ cv::cvtColor(rgbMatC4, rgbMat, cv::COLOR_BGRA2BGR); - - #endif - cv::flip(rgbMat, rgb, 1); -@@ -607,11 +606,11 @@ - // rtabmap uses 3 channels RGB - #ifdef LIBFREENECT2_WITH_TEGRAJPEG_SUPPORT - -- cv::cvtColor(rgbMatBGRA, rgb, CV_RGBA2BGR); -+ cv::cvtColor(rgbMatBGRA, rgb, cv::COLOR_RGBA2BGR); - - #else - -- cv::cvtColor(rgbMatBGRA, rgb, CV_BGRA2BGR); -+ cv::cvtColor(rgbMatBGRA, rgb, cv::COLOR_BGRA2BGR); - - #endif - cv::flip(rgb, rgb, 1); -@@ -629,11 +628,11 @@ - // rtabmap uses 3 channels RGB - #ifdef LIBFREENECT2_WITH_TEGRAJPEG_SUPPORT - -- cv::cvtColor(rgbMatBGRA, rgb, CV_RGBA2BGR); -+ cv::cvtColor(rgbMatBGRA, rgb, cv::COLOR_RGBA2BGR); - - #else - -- cv::cvtColor(rgbMatBGRA, rgb, CV_BGRA2BGR); -+ cv::cvtColor(rgbMatBGRA, rgb, cv::COLOR_BGRA2BGR); - - #endif - cv::flip(rgb, rgb, 1); +@@ -29,7 +29,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include + + #ifdef RTABMAP_FREENECT2 + #include +@@ -430,11 +429,11 @@ SensorData CameraFreenect2::captureImage(SensorCaptureInfo * info) + cv::Mat rgbMat; // rtabmap uses 3 channels RGB + #ifdef LIBFREENECT2_WITH_TEGRAJPEG_SUPPORT + +- cv::cvtColor(rgbMatC4, rgbMat, CV_RGBA2BGR); ++ cv::cvtColor(rgbMatC4, rgbMat, cv::COLOR_RGBA2BGR); + + #else + +- cv::cvtColor(rgbMatC4, rgbMat, CV_BGRA2BGR); ++ cv::cvtColor(rgbMatC4, rgbMat, cv::COLOR_BGRA2BGR); + + #endif + cv::flip(rgbMat, rgb, 1); +@@ -490,11 +489,11 @@ SensorData CameraFreenect2::captureImage(SensorCaptureInfo * info) + cv::Mat rgbMat; // rtabmap uses 3 channels RGB + #ifdef LIBFREENECT2_WITH_TEGRAJPEG_SUPPORT + +- cv::cvtColor(rgbMatC4, rgbMat, CV_RGB2BGR); ++ cv::cvtColor(rgbMatC4, rgbMat, cv::COLOR_RGB2BGR); + + #else + +- cv::cvtColor(rgbMatC4, rgbMat, CV_BGRA2BGR); ++ cv::cvtColor(rgbMatC4, rgbMat, cv::COLOR_BGRA2BGR); + + #endif + cv::flip(rgbMat, rgb, 1); +@@ -607,11 +606,11 @@ SensorData CameraFreenect2::captureImage(SensorCaptureInfo * info) + // rtabmap uses 3 channels RGB + #ifdef LIBFREENECT2_WITH_TEGRAJPEG_SUPPORT + +- cv::cvtColor(rgbMatBGRA, rgb, CV_RGBA2BGR); ++ cv::cvtColor(rgbMatBGRA, rgb, cv::COLOR_RGBA2BGR); + + #else + +- cv::cvtColor(rgbMatBGRA, rgb, CV_BGRA2BGR); ++ cv::cvtColor(rgbMatBGRA, rgb, cv::COLOR_BGRA2BGR); + + #endif + cv::flip(rgb, rgb, 1); +@@ -629,11 +628,11 @@ SensorData CameraFreenect2::captureImage(SensorCaptureInfo * info) + // rtabmap uses 3 channels RGB + #ifdef LIBFREENECT2_WITH_TEGRAJPEG_SUPPORT + +- cv::cvtColor(rgbMatBGRA, rgb, CV_RGBA2BGR); ++ cv::cvtColor(rgbMatBGRA, rgb, cv::COLOR_RGBA2BGR); + + #else + +- cv::cvtColor(rgbMatBGRA, rgb, CV_BGRA2BGR); ++ cv::cvtColor(rgbMatBGRA, rgb, cv::COLOR_BGRA2BGR); + + #endif + cv::flip(rgb, rgb, 1); diff --git a/corelib/src/camera/CameraImages.cpp b/corelib/src/camera/CameraImages.cpp +index 0591181..9109ac4 100644 --- a/corelib/src/camera/CameraImages.cpp +++ b/corelib/src/camera/CameraImages.cpp -@@ -34,7 +34,7 @@ - #include - #include - #include --#include -+#include - #include - - namespace rtabmap -@@ -914,7 +914,7 @@ - { - UWARN("Conversion from 4 channels to 3 channels (file=%s)", imageFilePath.c_str()); - cv::Mat out; -- cv::cvtColor(img, out, CV_BGRA2BGR); -+ cv::cvtColor(img, out, cv::COLOR_BGRA2BGR); - img = out; - } - else if(!img.empty() && _bayerMode >= 0 && _bayerMode <=3) -@@ -922,7 +922,7 @@ - cv::Mat debayeredImg; - try - { -- cv::cvtColor(img, debayeredImg, CV_BayerBG2BGR + _bayerMode); -+ cv::cvtColor(img, debayeredImg, cv::COLOR_BayerBG2BGR + _bayerMode); - img = debayeredImg; - } - catch(const cv::Exception & e) +@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include ++#include + #include + + namespace rtabmap +@@ -914,7 +914,7 @@ SensorData CameraImages::captureImage(SensorCaptureInfo * info) + { + UWARN("Conversion from 4 channels to 3 channels (file=%s)", imageFilePath.c_str()); + cv::Mat out; +- cv::cvtColor(img, out, CV_BGRA2BGR); ++ cv::cvtColor(img, out, cv::COLOR_BGRA2BGR); + img = out; + } + else if(!img.empty() && _bayerMode >= 0 && _bayerMode <=3) +@@ -922,7 +922,7 @@ SensorData CameraImages::captureImage(SensorCaptureInfo * info) + cv::Mat debayeredImg; + try + { +- cv::cvtColor(img, debayeredImg, CV_BayerBG2BGR + _bayerMode); ++ cv::cvtColor(img, debayeredImg, cv::COLOR_BayerBG2BGR + _bayerMode); + img = debayeredImg; + } + catch(const cv::Exception & e) diff --git a/corelib/src/camera/CameraK4A.cpp b/corelib/src/camera/CameraK4A.cpp +index ad5714d..caf659b 100644 --- a/corelib/src/camera/CameraK4A.cpp +++ b/corelib/src/camera/CameraK4A.cpp -@@ -29,7 +29,6 @@ +@@ -29,7 +29,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include @@ -825,7 +956,7 @@ diff --git a/corelib/src/camera/CameraK4A.cpp b/corelib/src/camera/CameraK4A.cpp #ifdef RTABMAP_K4A #include -@@ -508,7 +507,7 @@ +@@ -508,7 +507,7 @@ SensorData CameraK4A::captureImage(SensorCaptureInfo * info) CV_8UC4, (void*)k4a_image_get_buffer(rgb_image_)); @@ -835,222 +966,231 @@ diff --git a/corelib/src/camera/CameraK4A.cpp b/corelib/src/camera/CameraK4A.cpp bgrCV = model_.rectifyImage(bgrCV); diff --git a/corelib/src/camera/CameraK4W2.cpp b/corelib/src/camera/CameraK4W2.cpp +index e289029..9a96251 100644 --- a/corelib/src/camera/CameraK4W2.cpp +++ b/corelib/src/camera/CameraK4W2.cpp -@@ -28,7 +28,6 @@ - #include - #include - #include --#include - - #ifdef RTABMAP_K4W2 - #include -@@ -486,11 +485,11 @@ - { - cv::Mat tmp; - cv::resize(cv::Mat(nColorHeight, nColorWidth, CV_8UC4, pColorBuffer), tmp, cv::Size(), 0.5, 0.5, cv::INTER_AREA); -- cv::cvtColor(tmp, imageColor, CV_BGRA2BGR); -+ cv::cvtColor(tmp, imageColor, cv::COLOR_BGRA2BGR); - } - else - { -- cv::cvtColor(cv::Mat(nColorHeight, nColorWidth, CV_8UC4, pColorBuffer), imageColor, CV_BGRA2BGR); -+ cv::cvtColor(cv::Mat(nColorHeight, nColorWidth, CV_8UC4, pColorBuffer), imageColor, cv::COLOR_BGRA2BGR); - } - // loop over output pixels - for (int depthIndex = 0; depthIndex < (nDepthWidth*nDepthHeight); ++depthIndex) +@@ -28,7 +28,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include + + #ifdef RTABMAP_K4W2 + #include +@@ -486,11 +485,11 @@ SensorData CameraK4W2::captureImage(SensorCaptureInfo * info) + { + cv::Mat tmp; + cv::resize(cv::Mat(nColorHeight, nColorWidth, CV_8UC4, pColorBuffer), tmp, cv::Size(), 0.5, 0.5, cv::INTER_AREA); +- cv::cvtColor(tmp, imageColor, CV_BGRA2BGR); ++ cv::cvtColor(tmp, imageColor, cv::COLOR_BGRA2BGR); + } + else + { +- cv::cvtColor(cv::Mat(nColorHeight, nColorWidth, CV_8UC4, pColorBuffer), imageColor, CV_BGRA2BGR); ++ cv::cvtColor(cv::Mat(nColorHeight, nColorWidth, CV_8UC4, pColorBuffer), imageColor, cv::COLOR_BGRA2BGR); + } + // loop over output pixels + for (int depthIndex = 0; depthIndex < (nDepthWidth*nDepthHeight); ++depthIndex) diff --git a/corelib/src/camera/CameraOpenNI2.cpp b/corelib/src/camera/CameraOpenNI2.cpp +index 8be86b7..4d2ff1a 100644 --- a/corelib/src/camera/CameraOpenNI2.cpp +++ b/corelib/src/camera/CameraOpenNI2.cpp -@@ -29,7 +29,6 @@ - #include - #include - #include --#include - - #ifdef RTABMAP_OPENNI2 - #include -@@ -514,7 +513,7 @@ - cv::Mat tmp(h, w, CV_8UC3, (void *)colorFrame.getData()); - if(_type==kTypeColorDepth) - { -- cv::cvtColor(tmp, rgb, CV_RGB2BGR); -+ cv::cvtColor(tmp, rgb, cv::COLOR_RGB2BGR); - } - else // IR - { +@@ -29,7 +29,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include + + #ifdef RTABMAP_OPENNI2 + #include +@@ -514,7 +513,7 @@ SensorData CameraOpenNI2::captureImage(SensorCaptureInfo * info) + cv::Mat tmp(h, w, CV_8UC3, (void *)colorFrame.getData()); + if(_type==kTypeColorDepth) + { +- cv::cvtColor(tmp, rgb, CV_RGB2BGR); ++ cv::cvtColor(tmp, rgb, cv::COLOR_RGB2BGR); + } + else // IR + { diff --git a/corelib/src/camera/CameraOpenNICV.cpp b/corelib/src/camera/CameraOpenNICV.cpp +index 13536d6..1359561 100644 --- a/corelib/src/camera/CameraOpenNICV.cpp +++ b/corelib/src/camera/CameraOpenNICV.cpp -@@ -26,9 +26,7 @@ - - #include - #include --#if CV_MAJOR_VERSION > 3 --#include --#endif -+#include - - namespace rtabmap - { -@@ -59,30 +57,34 @@ - } - - ULOGGER_DEBUG("Camera::init()"); -- _capture.open( _asus?CV_CAP_OPENNI_ASUS:CV_CAP_OPENNI ); -+#if CV_MAJOR_VERSION < 5 -+ _capture.open( _asus?cv::CAP_OPENNI_ASUS:cv::CAP_OPENNI ); -+#else -+ _capture.open( _asus?cv::CAP_OPENNI2_ASUS:cv::CAP_OPENNI2 ); -+#endif - if(_capture.isOpened()) - { -- _capture.set( CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, CV_CAP_OPENNI_VGA_30HZ ); -- _depthFocal = _capture.get( CV_CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH ); -+ _capture.set( cv::CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, cv::CAP_OPENNI_VGA_30HZ ); -+ _depthFocal = _capture.get( cv::CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH ); - // Print some avalible device settings. - UINFO("Depth generator output mode:"); -- UINFO("FRAME_WIDTH %f", _capture.get( CV_CAP_PROP_FRAME_WIDTH )); -- UINFO("FRAME_HEIGHT %f", _capture.get( CV_CAP_PROP_FRAME_HEIGHT )); -- UINFO("FRAME_MAX_DEPTH %f mm", _capture.get( CV_CAP_PROP_OPENNI_FRAME_MAX_DEPTH )); -- UINFO("BASELINE %f mm", _capture.get( CV_CAP_PROP_OPENNI_BASELINE )); -- UINFO("FPS %f", _capture.get( CV_CAP_PROP_FPS )); -- UINFO("Focal %f", _capture.get( CV_CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH )); -- UINFO("REGISTRATION %f", _capture.get( CV_CAP_PROP_OPENNI_REGISTRATION )); -- if(_capture.get( CV_CAP_PROP_OPENNI_REGISTRATION ) == 0.0) -+ UINFO("FRAME_WIDTH %f", _capture.get( cv::CAP_PROP_FRAME_WIDTH )); -+ UINFO("FRAME_HEIGHT %f", _capture.get( cv::CAP_PROP_FRAME_HEIGHT )); -+ UINFO("FRAME_MAX_DEPTH %f mm", _capture.get( cv::CAP_PROP_OPENNI_FRAME_MAX_DEPTH )); -+ UINFO("BASELINE %f mm", _capture.get( cv::CAP_PROP_OPENNI_BASELINE )); -+ UINFO("FPS %f", _capture.get( cv::CAP_PROP_FPS )); -+ UINFO("Focal %f", _capture.get( cv::CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH )); -+ UINFO("REGISTRATION %f", _capture.get( cv::CAP_PROP_OPENNI_REGISTRATION )); -+ if(_capture.get( cv::CAP_PROP_OPENNI_REGISTRATION ) == 0.0) - { - UERROR("Depth registration is not activated on this device!"); - } -- if( _capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR_PRESENT ) ) -+ if( _capture.get( cv::CAP_OPENNI_IMAGE_GENERATOR_PRESENT ) ) - { - UINFO("Image generator output mode:"); -- UINFO("FRAME_WIDTH %f", _capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR+CV_CAP_PROP_FRAME_WIDTH )); -- UINFO("FRAME_HEIGHT %f", _capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR+CV_CAP_PROP_FRAME_HEIGHT )); -- UINFO("FPS %f", _capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR+CV_CAP_PROP_FPS )); -+ UINFO("FRAME_WIDTH %f", _capture.get( cv::CAP_OPENNI_IMAGE_GENERATOR+cv::CAP_PROP_FRAME_WIDTH )); -+ UINFO("FRAME_HEIGHT %f", _capture.get( cv::CAP_OPENNI_IMAGE_GENERATOR+cv::CAP_PROP_FRAME_HEIGHT )); -+ UINFO("FPS %f", _capture.get( cv::CAP_OPENNI_IMAGE_GENERATOR+cv::CAP_PROP_FPS )); - } - else - { -@@ -112,8 +114,8 @@ - { - _capture.grab(); - cv::Mat depth, rgb; -- _capture.retrieve(depth, CV_CAP_OPENNI_DEPTH_MAP ); -- _capture.retrieve(rgb, CV_CAP_OPENNI_BGR_IMAGE ); -+ _capture.retrieve(depth, cv::CAP_OPENNI_DEPTH_MAP ); -+ _capture.retrieve(rgb, cv::CAP_OPENNI_BGR_IMAGE ); - - depth = depth.clone(); - rgb = rgb.clone(); +@@ -26,9 +26,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include + #include +-#if CV_MAJOR_VERSION > 3 +-#include +-#endif ++#include + + namespace rtabmap + { +@@ -59,30 +57,34 @@ bool CameraOpenNICV::init(const std::string & calibrationFolder, const std::stri + } + + ULOGGER_DEBUG("Camera::init()"); +- _capture.open( _asus?CV_CAP_OPENNI_ASUS:CV_CAP_OPENNI ); ++#if CV_MAJOR_VERSION < 5 ++ _capture.open( _asus?cv::CAP_OPENNI_ASUS:cv::CAP_OPENNI ); ++#else ++ _capture.open( _asus?cv::CAP_OPENNI2_ASUS:cv::CAP_OPENNI2 ); ++#endif + if(_capture.isOpened()) + { +- _capture.set( CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, CV_CAP_OPENNI_VGA_30HZ ); +- _depthFocal = _capture.get( CV_CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH ); ++ _capture.set( cv::CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, cv::CAP_OPENNI_VGA_30HZ ); ++ _depthFocal = _capture.get( cv::CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH ); + // Print some avalible device settings. + UINFO("Depth generator output mode:"); +- UINFO("FRAME_WIDTH %f", _capture.get( CV_CAP_PROP_FRAME_WIDTH )); +- UINFO("FRAME_HEIGHT %f", _capture.get( CV_CAP_PROP_FRAME_HEIGHT )); +- UINFO("FRAME_MAX_DEPTH %f mm", _capture.get( CV_CAP_PROP_OPENNI_FRAME_MAX_DEPTH )); +- UINFO("BASELINE %f mm", _capture.get( CV_CAP_PROP_OPENNI_BASELINE )); +- UINFO("FPS %f", _capture.get( CV_CAP_PROP_FPS )); +- UINFO("Focal %f", _capture.get( CV_CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH )); +- UINFO("REGISTRATION %f", _capture.get( CV_CAP_PROP_OPENNI_REGISTRATION )); +- if(_capture.get( CV_CAP_PROP_OPENNI_REGISTRATION ) == 0.0) ++ UINFO("FRAME_WIDTH %f", _capture.get( cv::CAP_PROP_FRAME_WIDTH )); ++ UINFO("FRAME_HEIGHT %f", _capture.get( cv::CAP_PROP_FRAME_HEIGHT )); ++ UINFO("FRAME_MAX_DEPTH %f mm", _capture.get( cv::CAP_PROP_OPENNI_FRAME_MAX_DEPTH )); ++ UINFO("BASELINE %f mm", _capture.get( cv::CAP_PROP_OPENNI_BASELINE )); ++ UINFO("FPS %f", _capture.get( cv::CAP_PROP_FPS )); ++ UINFO("Focal %f", _capture.get( cv::CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH )); ++ UINFO("REGISTRATION %f", _capture.get( cv::CAP_PROP_OPENNI_REGISTRATION )); ++ if(_capture.get( cv::CAP_PROP_OPENNI_REGISTRATION ) == 0.0) + { + UERROR("Depth registration is not activated on this device!"); + } +- if( _capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR_PRESENT ) ) ++ if( _capture.get( cv::CAP_OPENNI_IMAGE_GENERATOR_PRESENT ) ) + { + UINFO("Image generator output mode:"); +- UINFO("FRAME_WIDTH %f", _capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR+CV_CAP_PROP_FRAME_WIDTH )); +- UINFO("FRAME_HEIGHT %f", _capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR+CV_CAP_PROP_FRAME_HEIGHT )); +- UINFO("FPS %f", _capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR+CV_CAP_PROP_FPS )); ++ UINFO("FRAME_WIDTH %f", _capture.get( cv::CAP_OPENNI_IMAGE_GENERATOR+cv::CAP_PROP_FRAME_WIDTH )); ++ UINFO("FRAME_HEIGHT %f", _capture.get( cv::CAP_OPENNI_IMAGE_GENERATOR+cv::CAP_PROP_FRAME_HEIGHT )); ++ UINFO("FPS %f", _capture.get( cv::CAP_OPENNI_IMAGE_GENERATOR+cv::CAP_PROP_FPS )); + } + else + { +@@ -112,8 +114,8 @@ SensorData CameraOpenNICV::captureImage(SensorCaptureInfo * info) + { + _capture.grab(); + cv::Mat depth, rgb; +- _capture.retrieve(depth, CV_CAP_OPENNI_DEPTH_MAP ); +- _capture.retrieve(rgb, CV_CAP_OPENNI_BGR_IMAGE ); ++ _capture.retrieve(depth, cv::CAP_OPENNI_DEPTH_MAP ); ++ _capture.retrieve(rgb, cv::CAP_OPENNI_BGR_IMAGE ); + + depth = depth.clone(); + rgb = rgb.clone(); diff --git a/corelib/src/camera/CameraOpenni.cpp b/corelib/src/camera/CameraOpenni.cpp +index 9fb8dc7..68cba16 100644 --- a/corelib/src/camera/CameraOpenni.cpp +++ b/corelib/src/camera/CameraOpenni.cpp -@@ -28,7 +28,6 @@ - #include - #include - #include --#include - - #ifdef RTABMAP_OPENNI - #include -@@ -94,7 +93,7 @@ - - cv::Mat rgbFrame(rgb->getHeight(), rgb->getWidth(), CV_8UC3); - rgb->fillRGB(rgb->getWidth(), rgb->getHeight(), rgbFrame.data); -- cv::cvtColor(rgbFrame, rgb_, CV_RGB2BGR); -+ cv::cvtColor(rgbFrame, rgb_, cv::COLOR_RGB2BGR); - - depth_ = cv::Mat(rgb->getHeight(), rgb->getWidth(), CV_16UC1); - depth->fillDepthImageRaw(rgb->getWidth(), rgb->getHeight(), (unsigned short*)depth_.data); +@@ -28,7 +28,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include + + #ifdef RTABMAP_OPENNI + #include +@@ -94,7 +93,7 @@ void CameraOpenni::image_cb ( + + cv::Mat rgbFrame(rgb->getHeight(), rgb->getWidth(), CV_8UC3); + rgb->fillRGB(rgb->getWidth(), rgb->getHeight(), rgbFrame.data); +- cv::cvtColor(rgbFrame, rgb_, CV_RGB2BGR); ++ cv::cvtColor(rgbFrame, rgb_, cv::COLOR_RGB2BGR); + + depth_ = cv::Mat(rgb->getHeight(), rgb->getWidth(), CV_16UC1); + depth->fillDepthImageRaw(rgb->getWidth(), rgb->getHeight(), (unsigned short*)depth_.data); diff --git a/corelib/src/camera/CameraRealSense.cpp b/corelib/src/camera/CameraRealSense.cpp +index 3f545bb..0136238 100644 --- a/corelib/src/camera/CameraRealSense.cpp +++ b/corelib/src/camera/CameraRealSense.cpp -@@ -29,7 +29,6 @@ - #include - #include - #include --#include - - #ifdef RTABMAP_REALSENSE - #include -@@ -938,7 +937,7 @@ - } - else - { -- cv::cvtColor(rgb, bgr, CV_RGB2BGR); -+ cv::cvtColor(rgb, bgr, cv::COLOR_RGB2BGR); - } - - bool rectified = false; +@@ -29,7 +29,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include + + #ifdef RTABMAP_REALSENSE + #include +@@ -938,7 +937,7 @@ SensorData CameraRealSense::captureImage(SensorCaptureInfo * info) + } + else + { +- cv::cvtColor(rgb, bgr, CV_RGB2BGR); ++ cv::cvtColor(rgb, bgr, cv::COLOR_RGB2BGR); + } + + bool rectified = false; diff --git a/corelib/src/camera/CameraRealSense2.cpp b/corelib/src/camera/CameraRealSense2.cpp +index 4ddfc77..cc803c8 100644 --- a/corelib/src/camera/CameraRealSense2.cpp +++ b/corelib/src/camera/CameraRealSense2.cpp -@@ -30,7 +30,6 @@ - #include - #include - #include --#include - - #ifdef RTABMAP_REALSENSE2 - #include +@@ -30,7 +30,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include + + #ifdef RTABMAP_REALSENSE2 + #include diff --git a/corelib/src/camera/CameraStereoDC1394.cpp b/corelib/src/camera/CameraStereoDC1394.cpp +index 691516b..2c21108 100644 --- a/corelib/src/camera/CameraStereoDC1394.cpp +++ b/corelib/src/camera/CameraStereoDC1394.cpp -@@ -28,7 +28,6 @@ - #include - #include - #include --#include - - #ifdef RTABMAP_DC1394 - #include -@@ -295,8 +294,8 @@ - - //DC1394_COLOR_CODING_RAW16: - //DC1394_COLOR_FILTER_BGGR -- cv::cvtColor(cv::Mat(frame->size[1], frame->size[0], CV_8UC1, capture_buffer), left, CV_BayerRG2BGR); -- cv::cvtColor(cv::Mat(frame->size[1], frame->size[0], CV_8UC1, capture_buffer+image.total()), right, CV_BayerRG2GRAY); -+ cv::cvtColor(cv::Mat(frame->size[1], frame->size[0], CV_8UC1, capture_buffer), left, cv::COLOR_BayerRG2BGR); -+ cv::cvtColor(cv::Mat(frame->size[1], frame->size[0], CV_8UC1, capture_buffer+image.total()), right, cv::COLOR_BayerRG2GRAY); - - dc1394_capture_enqueue(camera_, frame); - +@@ -28,7 +28,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include + + #ifdef RTABMAP_DC1394 + #include +@@ -295,8 +294,8 @@ public: + + //DC1394_COLOR_CODING_RAW16: + //DC1394_COLOR_FILTER_BGGR +- cv::cvtColor(cv::Mat(frame->size[1], frame->size[0], CV_8UC1, capture_buffer), left, CV_BayerRG2BGR); +- cv::cvtColor(cv::Mat(frame->size[1], frame->size[0], CV_8UC1, capture_buffer+image.total()), right, CV_BayerRG2GRAY); ++ cv::cvtColor(cv::Mat(frame->size[1], frame->size[0], CV_8UC1, capture_buffer), left, cv::COLOR_BayerRG2BGR); ++ cv::cvtColor(cv::Mat(frame->size[1], frame->size[0], CV_8UC1, capture_buffer+image.total()), right, cv::COLOR_BayerRG2GRAY); + + dc1394_capture_enqueue(camera_, frame); + diff --git a/corelib/src/camera/CameraStereoImages.cpp b/corelib/src/camera/CameraStereoImages.cpp +index c50a3b8..e0dd643 100644 --- a/corelib/src/camera/CameraStereoImages.cpp +++ b/corelib/src/camera/CameraStereoImages.cpp -@@ -27,7 +27,6 @@ - - #include - #include --#include - - namespace rtabmap - { -@@ -184,7 +183,7 @@ - if(rightImage.type() != CV_8UC1 && rightGrayScale_) - { - cv::Mat tmp; -- cv::cvtColor(rightImage, tmp, CV_BGR2GRAY); -+ cv::cvtColor(rightImage, tmp, cv::COLOR_BGR2GRAY); - rightImage = tmp; - } - if(this->isImagesRectified() && stereoModel_.isValidForRectification()) +@@ -27,7 +27,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include + #include +-#include + + namespace rtabmap + { +@@ -184,7 +183,7 @@ SensorData CameraStereoImages::captureImage(SensorCaptureInfo * info) + if(rightImage.type() != CV_8UC1 && rightGrayScale_) + { + cv::Mat tmp; +- cv::cvtColor(rightImage, tmp, CV_BGR2GRAY); ++ cv::cvtColor(rightImage, tmp, cv::COLOR_BGR2GRAY); + rightImage = tmp; + } + if(this->isImagesRectified() && stereoModel_.isValidForRectification()) diff --git a/corelib/src/camera/CameraStereoTara.cpp b/corelib/src/camera/CameraStereoTara.cpp +index e4ea3cd..f4ec60a 100644 --- a/corelib/src/camera/CameraStereoTara.cpp +++ b/corelib/src/camera/CameraStereoTara.cpp -@@ -34,9 +34,7 @@ +@@ -34,9 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include @@ -1061,7 +1201,7 @@ diff --git a/corelib/src/camera/CameraStereoTara.cpp b/corelib/src/camera/Camera namespace rtabmap { -@@ -81,18 +79,18 @@ +@@ -81,18 +79,18 @@ bool CameraStereoTara::init(const std::string & calibrationFolder, const std::st capture_.open(usbDevice_); @@ -1087,220 +1227,254 @@ diff --git a/corelib/src/camera/CameraStereoTara.cpp b/corelib/src/camera/Camera { cameraName_ = uFormat("%08x", guid); diff --git a/corelib/src/camera/CameraStereoVideo.cpp b/corelib/src/camera/CameraStereoVideo.cpp +index f31f40b..5de23a6 100644 --- a/corelib/src/camera/CameraStereoVideo.cpp +++ b/corelib/src/camera/CameraStereoVideo.cpp -@@ -28,13 +28,7 @@ - #include - #include - #include --#include --#if CV_MAJOR_VERSION > 3 --#include --#if CV_MAJOR_VERSION > 4 --#include --#endif --#endif -+#include - - namespace rtabmap - { -@@ -172,7 +166,7 @@ - - if (cameraName_.empty()) - { -- unsigned int guid = (unsigned int)capture_.get(CV_CAP_PROP_GUID); -+ unsigned int guid = (unsigned int)capture_.get(cv::CAP_PROP_GUID); - if (guid != 0 && guid != 0xffffffff) - { - cameraName_ = uFormat("%08x", guid); -@@ -214,17 +208,17 @@ - if(capture_.isOpened()) - { - bool resolutionSet = false; -- resolutionSet = capture_.set(CV_CAP_PROP_FRAME_WIDTH, stereoModel_.left().imageWidth()*(capture2_.isOpened()?1:2)); -- resolutionSet = resolutionSet && capture_.set(CV_CAP_PROP_FRAME_HEIGHT, stereoModel_.left().imageHeight()); -+ resolutionSet = capture_.set(cv::CAP_PROP_FRAME_WIDTH, stereoModel_.left().imageWidth()*(capture2_.isOpened()?1:2)); -+ resolutionSet = resolutionSet && capture_.set(cv::CAP_PROP_FRAME_HEIGHT, stereoModel_.left().imageHeight()); - if(capture2_.isOpened()) - { -- resolutionSet = resolutionSet && capture2_.set(CV_CAP_PROP_FRAME_WIDTH, stereoModel_.right().imageWidth()); -- resolutionSet = resolutionSet && capture2_.set(CV_CAP_PROP_FRAME_HEIGHT, stereoModel_.right().imageHeight()); -+ resolutionSet = resolutionSet && capture2_.set(cv::CAP_PROP_FRAME_WIDTH, stereoModel_.right().imageWidth()); -+ resolutionSet = resolutionSet && capture2_.set(cv::CAP_PROP_FRAME_HEIGHT, stereoModel_.right().imageHeight()); - } - - // Check if the resolution was set successfully -- int actualWidth = int(capture_.get(CV_CAP_PROP_FRAME_WIDTH)); -- int actualHeight = int(capture_.get(CV_CAP_PROP_FRAME_HEIGHT)); -+ int actualWidth = int(capture_.get(cv::CAP_PROP_FRAME_WIDTH)); -+ int actualHeight = int(capture_.get(cv::CAP_PROP_FRAME_HEIGHT)); - if(!resolutionSet || - actualWidth != stereoModel_.left().imageWidth()*(capture2_.isOpened()?1:2) || - actualHeight != stereoModel_.left().imageHeight()) -@@ -244,17 +238,17 @@ - if(capture_.isOpened()) - { - bool resolutionSet = false; -- resolutionSet = capture_.set(CV_CAP_PROP_FRAME_WIDTH, _width*(capture2_.isOpened()?1:2)); -- resolutionSet = resolutionSet && capture_.set(CV_CAP_PROP_FRAME_HEIGHT, _height); -+ resolutionSet = capture_.set(cv::CAP_PROP_FRAME_WIDTH, _width*(capture2_.isOpened()?1:2)); -+ resolutionSet = resolutionSet && capture_.set(cv::CAP_PROP_FRAME_HEIGHT, _height); - if(capture2_.isOpened()) - { -- resolutionSet = resolutionSet && capture2_.set(CV_CAP_PROP_FRAME_WIDTH, _width); -- resolutionSet = resolutionSet && capture2_.set(CV_CAP_PROP_FRAME_HEIGHT, _height); -+ resolutionSet = resolutionSet && capture2_.set(cv::CAP_PROP_FRAME_WIDTH, _width); -+ resolutionSet = resolutionSet && capture2_.set(cv::CAP_PROP_FRAME_HEIGHT, _height); - } - - // Check if the resolution was set successfully -- int actualWidth = int(capture_.get(CV_CAP_PROP_FRAME_WIDTH)); -- int actualHeight = int(capture_.get(CV_CAP_PROP_FRAME_HEIGHT)); -+ int actualWidth = int(capture_.get(cv::CAP_PROP_FRAME_WIDTH)); -+ int actualHeight = int(capture_.get(cv::CAP_PROP_FRAME_HEIGHT)); - if(!resolutionSet || - actualWidth != _width*(capture2_.isOpened()?1:2) || - actualHeight != _height) -@@ -273,10 +267,10 @@ - if (this->getFrameRate() > 0) - { - bool fpsSupported = false; -- fpsSupported = capture_.set(CV_CAP_PROP_FPS, this->getFrameRate()); -+ fpsSupported = capture_.set(cv::CAP_PROP_FPS, this->getFrameRate()); - if (capture2_.isOpened()) - { -- fpsSupported = fpsSupported && capture2_.set(CV_CAP_PROP_FPS, this->getFrameRate()); -+ fpsSupported = fpsSupported && capture2_.set(cv::CAP_PROP_FPS, this->getFrameRate()); - } - if(fpsSupported) - { -@@ -310,14 +304,14 @@ - std::string fourccUpperCase = uToUpperCase(_fourcc); - int fourcc = cv::VideoWriter::fourcc(fourccUpperCase.at(0), fourccUpperCase.at(1), fourccUpperCase.at(2), fourccUpperCase.at(3)); - bool fourccSupported = false; -- fourccSupported = capture_.set(CV_CAP_PROP_FOURCC, fourcc); -+ fourccSupported = capture_.set(cv::CAP_PROP_FOURCC, fourcc); - if (capture2_.isOpened()) - { -- fourccSupported = fourccSupported && capture2_.set(CV_CAP_PROP_FOURCC, fourcc); -+ fourccSupported = fourccSupported && capture2_.set(cv::CAP_PROP_FOURCC, fourcc); - } - - // Check if the FOURCC was set successfully -- int actualFourcc = int(capture_.get(CV_CAP_PROP_FOURCC)); -+ int actualFourcc = int(capture_.get(cv::CAP_PROP_FOURCC)); - - if(!fourccSupported || actualFourcc != fourcc) - { -@@ -386,7 +380,7 @@ - if(rightImage.type() != CV_8UC1 && rightGrayScale_) - { - cv::Mat tmp; -- cv::cvtColor(rightImage, tmp, CV_BGR2GRAY); -+ cv::cvtColor(rightImage, tmp, cv::COLOR_BGR2GRAY); - rightImage = tmp; - rightCvt = true; - } +@@ -28,13 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include +-#if CV_MAJOR_VERSION > 3 +-#include +-#if CV_MAJOR_VERSION > 4 +-#include +-#endif +-#endif ++#include + + namespace rtabmap + { +@@ -172,7 +166,7 @@ bool CameraStereoVideo::init(const std::string & calibrationFolder, const std::s + + if (cameraName_.empty()) + { +- unsigned int guid = (unsigned int)capture_.get(CV_CAP_PROP_GUID); ++ unsigned int guid = (unsigned int)capture_.get(cv::CAP_PROP_GUID); + if (guid != 0 && guid != 0xffffffff) + { + cameraName_ = uFormat("%08x", guid); +@@ -214,17 +208,17 @@ bool CameraStereoVideo::init(const std::string & calibrationFolder, const std::s + if(capture_.isOpened()) + { + bool resolutionSet = false; +- resolutionSet = capture_.set(CV_CAP_PROP_FRAME_WIDTH, stereoModel_.left().imageWidth()*(capture2_.isOpened()?1:2)); +- resolutionSet = resolutionSet && capture_.set(CV_CAP_PROP_FRAME_HEIGHT, stereoModel_.left().imageHeight()); ++ resolutionSet = capture_.set(cv::CAP_PROP_FRAME_WIDTH, stereoModel_.left().imageWidth()*(capture2_.isOpened()?1:2)); ++ resolutionSet = resolutionSet && capture_.set(cv::CAP_PROP_FRAME_HEIGHT, stereoModel_.left().imageHeight()); + if(capture2_.isOpened()) + { +- resolutionSet = resolutionSet && capture2_.set(CV_CAP_PROP_FRAME_WIDTH, stereoModel_.right().imageWidth()); +- resolutionSet = resolutionSet && capture2_.set(CV_CAP_PROP_FRAME_HEIGHT, stereoModel_.right().imageHeight()); ++ resolutionSet = resolutionSet && capture2_.set(cv::CAP_PROP_FRAME_WIDTH, stereoModel_.right().imageWidth()); ++ resolutionSet = resolutionSet && capture2_.set(cv::CAP_PROP_FRAME_HEIGHT, stereoModel_.right().imageHeight()); + } + + // Check if the resolution was set successfully +- int actualWidth = int(capture_.get(CV_CAP_PROP_FRAME_WIDTH)); +- int actualHeight = int(capture_.get(CV_CAP_PROP_FRAME_HEIGHT)); ++ int actualWidth = int(capture_.get(cv::CAP_PROP_FRAME_WIDTH)); ++ int actualHeight = int(capture_.get(cv::CAP_PROP_FRAME_HEIGHT)); + if(!resolutionSet || + actualWidth != stereoModel_.left().imageWidth()*(capture2_.isOpened()?1:2) || + actualHeight != stereoModel_.left().imageHeight()) +@@ -244,17 +238,17 @@ bool CameraStereoVideo::init(const std::string & calibrationFolder, const std::s + if(capture_.isOpened()) + { + bool resolutionSet = false; +- resolutionSet = capture_.set(CV_CAP_PROP_FRAME_WIDTH, _width*(capture2_.isOpened()?1:2)); +- resolutionSet = resolutionSet && capture_.set(CV_CAP_PROP_FRAME_HEIGHT, _height); ++ resolutionSet = capture_.set(cv::CAP_PROP_FRAME_WIDTH, _width*(capture2_.isOpened()?1:2)); ++ resolutionSet = resolutionSet && capture_.set(cv::CAP_PROP_FRAME_HEIGHT, _height); + if(capture2_.isOpened()) + { +- resolutionSet = resolutionSet && capture2_.set(CV_CAP_PROP_FRAME_WIDTH, _width); +- resolutionSet = resolutionSet && capture2_.set(CV_CAP_PROP_FRAME_HEIGHT, _height); ++ resolutionSet = resolutionSet && capture2_.set(cv::CAP_PROP_FRAME_WIDTH, _width); ++ resolutionSet = resolutionSet && capture2_.set(cv::CAP_PROP_FRAME_HEIGHT, _height); + } + + // Check if the resolution was set successfully +- int actualWidth = int(capture_.get(CV_CAP_PROP_FRAME_WIDTH)); +- int actualHeight = int(capture_.get(CV_CAP_PROP_FRAME_HEIGHT)); ++ int actualWidth = int(capture_.get(cv::CAP_PROP_FRAME_WIDTH)); ++ int actualHeight = int(capture_.get(cv::CAP_PROP_FRAME_HEIGHT)); + if(!resolutionSet || + actualWidth != _width*(capture2_.isOpened()?1:2) || + actualHeight != _height) +@@ -273,10 +267,10 @@ bool CameraStereoVideo::init(const std::string & calibrationFolder, const std::s + if (this->getFrameRate() > 0) + { + bool fpsSupported = false; +- fpsSupported = capture_.set(CV_CAP_PROP_FPS, this->getFrameRate()); ++ fpsSupported = capture_.set(cv::CAP_PROP_FPS, this->getFrameRate()); + if (capture2_.isOpened()) + { +- fpsSupported = fpsSupported && capture2_.set(CV_CAP_PROP_FPS, this->getFrameRate()); ++ fpsSupported = fpsSupported && capture2_.set(cv::CAP_PROP_FPS, this->getFrameRate()); + } + if(fpsSupported) + { +@@ -310,14 +304,14 @@ bool CameraStereoVideo::init(const std::string & calibrationFolder, const std::s + std::string fourccUpperCase = uToUpperCase(_fourcc); + int fourcc = cv::VideoWriter::fourcc(fourccUpperCase.at(0), fourccUpperCase.at(1), fourccUpperCase.at(2), fourccUpperCase.at(3)); + bool fourccSupported = false; +- fourccSupported = capture_.set(CV_CAP_PROP_FOURCC, fourcc); ++ fourccSupported = capture_.set(cv::CAP_PROP_FOURCC, fourcc); + if (capture2_.isOpened()) + { +- fourccSupported = fourccSupported && capture2_.set(CV_CAP_PROP_FOURCC, fourcc); ++ fourccSupported = fourccSupported && capture2_.set(cv::CAP_PROP_FOURCC, fourcc); + } + + // Check if the FOURCC was set successfully +- int actualFourcc = int(capture_.get(CV_CAP_PROP_FOURCC)); ++ int actualFourcc = int(capture_.get(cv::CAP_PROP_FOURCC)); + + if(!fourccSupported || actualFourcc != fourcc) + { +@@ -386,7 +380,7 @@ SensorData CameraStereoVideo::captureImage(SensorCaptureInfo * info) + if(rightImage.type() != CV_8UC1 && rightGrayScale_) + { + cv::Mat tmp; +- cv::cvtColor(rightImage, tmp, CV_BGR2GRAY); ++ cv::cvtColor(rightImage, tmp, cv::COLOR_BGR2GRAY); + rightImage = tmp; + rightCvt = true; + } diff --git a/corelib/src/camera/CameraStereoZedOC.cpp b/corelib/src/camera/CameraStereoZedOC.cpp +index 014976a..e3ba6d4 100644 --- a/corelib/src/camera/CameraStereoZedOC.cpp +++ b/corelib/src/camera/CameraStereoZedOC.cpp -@@ -38,6 +38,10 @@ - #include - #include "SimpleIni.h" - -+#if CV_MAJOR_VERSION >= 5 -+#include -+#endif -+ - /////////////////////////////////////////////////////////////////////////// - // - // Copyright (c) 2018, STEREOLABS. +@@ -38,6 +38,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include "SimpleIni.h" + ++#if CV_MAJOR_VERSION >= 5 ++#include ++#endif ++ + /////////////////////////////////////////////////////////////////////////// + // + // Copyright (c) 2018, STEREOLABS. diff --git a/corelib/src/camera/CameraVideo.cpp b/corelib/src/camera/CameraVideo.cpp +index 9a0a70d..1776bca 100644 --- a/corelib/src/camera/CameraVideo.cpp +++ b/corelib/src/camera/CameraVideo.cpp -@@ -28,12 +28,7 @@ - #include - #include - #include --#if CV_MAJOR_VERSION > 3 --#include --#if CV_MAJOR_VERSION > 4 --#include --#endif --#endif -+#include - - namespace rtabmap - { -@@ -105,7 +100,7 @@ - { - if (_guid.empty()) - { -- unsigned int guid = (unsigned int)_capture.get(CV_CAP_PROP_GUID); -+ unsigned int guid = (unsigned int)_capture.get(cv::CAP_PROP_GUID); - if (guid != 0 && guid != 0xffffffff) - { - _guid = uFormat("%08x", guid); -@@ -143,12 +138,12 @@ - } - - bool resolutionSet = false; -- resolutionSet = _capture.set(CV_CAP_PROP_FRAME_WIDTH, _model.imageWidth()); -- resolutionSet = resolutionSet && _capture.set(CV_CAP_PROP_FRAME_HEIGHT, _model.imageHeight()); -+ resolutionSet = _capture.set(cv::CAP_PROP_FRAME_WIDTH, _model.imageWidth()); -+ resolutionSet = resolutionSet && _capture.set(cv::CAP_PROP_FRAME_HEIGHT, _model.imageHeight()); - - // Check if the resolution was set successfully -- int actualWidth = int(_capture.get(CV_CAP_PROP_FRAME_WIDTH)); -- int actualHeight = int(_capture.get(CV_CAP_PROP_FRAME_HEIGHT)); -+ int actualWidth = int(_capture.get(cv::CAP_PROP_FRAME_WIDTH)); -+ int actualHeight = int(_capture.get(cv::CAP_PROP_FRAME_HEIGHT)); - if(!resolutionSet || - actualWidth != _model.imageWidth() || - actualHeight != _model.imageHeight()) -@@ -165,12 +160,12 @@ - else if(_width > 0 && _height > 0) - { - int resolutionSet = false; -- resolutionSet = _capture.set(CV_CAP_PROP_FRAME_WIDTH, _width); -- resolutionSet = resolutionSet && _capture.set(CV_CAP_PROP_FRAME_HEIGHT, _height); -+ resolutionSet = _capture.set(cv::CAP_PROP_FRAME_WIDTH, _width); -+ resolutionSet = resolutionSet && _capture.set(cv::CAP_PROP_FRAME_HEIGHT, _height); - - // Check if the resolution was set successfully -- int actualWidth = int(_capture.get(CV_CAP_PROP_FRAME_WIDTH)); -- int actualHeight = int(_capture.get(CV_CAP_PROP_FRAME_HEIGHT)); -+ int actualWidth = int(_capture.get(cv::CAP_PROP_FRAME_WIDTH)); -+ int actualHeight = int(_capture.get(cv::CAP_PROP_FRAME_HEIGHT)); - if(!resolutionSet || actualWidth != _width || actualHeight != _height) - { - UWARN("Desired resolution (%dx%d) cannot be set to camera driver, " -@@ -182,7 +177,7 @@ - } - - // Set FPS -- if (this->getFrameRate() > 0 && _capture.set(CV_CAP_PROP_FPS, this->getFrameRate())) -+ if (this->getFrameRate() > 0 && _capture.set(cv::CAP_PROP_FPS, this->getFrameRate())) - { - // Check if the FPS was set successfully - double actualFPS = _capture.get(cv::CAP_PROP_FPS); -@@ -213,10 +208,10 @@ - std::string fourccUpperCase = uToUpperCase(_fourcc); - int fourcc = cv::VideoWriter::fourcc(fourccUpperCase.at(0), fourccUpperCase.at(1), fourccUpperCase.at(2), fourccUpperCase.at(3)); - -- bool fourccSupported = _capture.set(CV_CAP_PROP_FOURCC, fourcc); -+ bool fourccSupported = _capture.set(cv::CAP_PROP_FOURCC, fourcc); - - // Check if the FOURCC was set successfully -- int actualFourcc = int(_capture.get(CV_CAP_PROP_FOURCC)); -+ int actualFourcc = int(_capture.get(cv::CAP_PROP_FOURCC)); - - if(!fourccSupported || actualFourcc != fourcc) - { +@@ -28,12 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#if CV_MAJOR_VERSION > 3 +-#include +-#if CV_MAJOR_VERSION > 4 +-#include +-#endif +-#endif ++#include + + namespace rtabmap + { +@@ -105,7 +100,7 @@ bool CameraVideo::init(const std::string & calibrationFolder, const std::string + { + if (_guid.empty()) + { +- unsigned int guid = (unsigned int)_capture.get(CV_CAP_PROP_GUID); ++ unsigned int guid = (unsigned int)_capture.get(cv::CAP_PROP_GUID); + if (guid != 0 && guid != 0xffffffff) + { + _guid = uFormat("%08x", guid); +@@ -143,12 +138,12 @@ bool CameraVideo::init(const std::string & calibrationFolder, const std::string + } + + bool resolutionSet = false; +- resolutionSet = _capture.set(CV_CAP_PROP_FRAME_WIDTH, _model.imageWidth()); +- resolutionSet = resolutionSet && _capture.set(CV_CAP_PROP_FRAME_HEIGHT, _model.imageHeight()); ++ resolutionSet = _capture.set(cv::CAP_PROP_FRAME_WIDTH, _model.imageWidth()); ++ resolutionSet = resolutionSet && _capture.set(cv::CAP_PROP_FRAME_HEIGHT, _model.imageHeight()); + + // Check if the resolution was set successfully +- int actualWidth = int(_capture.get(CV_CAP_PROP_FRAME_WIDTH)); +- int actualHeight = int(_capture.get(CV_CAP_PROP_FRAME_HEIGHT)); ++ int actualWidth = int(_capture.get(cv::CAP_PROP_FRAME_WIDTH)); ++ int actualHeight = int(_capture.get(cv::CAP_PROP_FRAME_HEIGHT)); + if(!resolutionSet || + actualWidth != _model.imageWidth() || + actualHeight != _model.imageHeight()) +@@ -165,12 +160,12 @@ bool CameraVideo::init(const std::string & calibrationFolder, const std::string + else if(_width > 0 && _height > 0) + { + int resolutionSet = false; +- resolutionSet = _capture.set(CV_CAP_PROP_FRAME_WIDTH, _width); +- resolutionSet = resolutionSet && _capture.set(CV_CAP_PROP_FRAME_HEIGHT, _height); ++ resolutionSet = _capture.set(cv::CAP_PROP_FRAME_WIDTH, _width); ++ resolutionSet = resolutionSet && _capture.set(cv::CAP_PROP_FRAME_HEIGHT, _height); + + // Check if the resolution was set successfully +- int actualWidth = int(_capture.get(CV_CAP_PROP_FRAME_WIDTH)); +- int actualHeight = int(_capture.get(CV_CAP_PROP_FRAME_HEIGHT)); ++ int actualWidth = int(_capture.get(cv::CAP_PROP_FRAME_WIDTH)); ++ int actualHeight = int(_capture.get(cv::CAP_PROP_FRAME_HEIGHT)); + if(!resolutionSet || actualWidth != _width || actualHeight != _height) + { + UWARN("Desired resolution (%dx%d) cannot be set to camera driver, " +@@ -182,7 +177,7 @@ bool CameraVideo::init(const std::string & calibrationFolder, const std::string + } + + // Set FPS +- if (this->getFrameRate() > 0 && _capture.set(CV_CAP_PROP_FPS, this->getFrameRate())) ++ if (this->getFrameRate() > 0 && _capture.set(cv::CAP_PROP_FPS, this->getFrameRate())) + { + // Check if the FPS was set successfully + double actualFPS = _capture.get(cv::CAP_PROP_FPS); +@@ -213,10 +208,10 @@ bool CameraVideo::init(const std::string & calibrationFolder, const std::string + std::string fourccUpperCase = uToUpperCase(_fourcc); + int fourcc = cv::VideoWriter::fourcc(fourccUpperCase.at(0), fourccUpperCase.at(1), fourccUpperCase.at(2), fourccUpperCase.at(3)); + +- bool fourccSupported = _capture.set(CV_CAP_PROP_FOURCC, fourcc); ++ bool fourccSupported = _capture.set(cv::CAP_PROP_FOURCC, fourcc); + + // Check if the FOURCC was set successfully +- int actualFourcc = int(_capture.get(CV_CAP_PROP_FOURCC)); ++ int actualFourcc = int(_capture.get(cv::CAP_PROP_FOURCC)); + + if(!fourccSupported || actualFourcc != fourcc) + { +diff --git a/corelib/src/clams/discrete_depth_distortion_model_helpers.cpp b/corelib/src/clams/discrete_depth_distortion_model_helpers.cpp +index 06c348d..dfbdc02 100644 +--- a/corelib/src/clams/discrete_depth_distortion_model_helpers.cpp ++++ b/corelib/src/clams/discrete_depth_distortion_model_helpers.cpp +@@ -28,8 +28,8 @@ RTAB-Map integration: Mathieu Labbe + */ + + #include +-#include +-#include ++#include ++#include + #include + #include + +diff --git a/corelib/src/clams/frame_projector.cpp b/corelib/src/clams/frame_projector.cpp +index 3230fcf..2634911 100644 +--- a/corelib/src/clams/frame_projector.cpp ++++ b/corelib/src/clams/frame_projector.cpp +@@ -31,8 +31,8 @@ RTAB-Map integration: Mathieu Labbe + #include + #include + #include +-#include +-#include ++#include ++#include + #include + + using namespace std; diff --git a/corelib/src/odometry/OdometryDVO.cpp b/corelib/src/odometry/OdometryDVO.cpp +index 2f7190d..a1e425d 100644 --- a/corelib/src/odometry/OdometryDVO.cpp +++ b/corelib/src/odometry/OdometryDVO.cpp -@@ -31,7 +31,6 @@ +@@ -31,7 +31,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "rtabmap/utilite/ULogger.h" #include "rtabmap/utilite/UTimer.h" #include "rtabmap/utilite/UStl.h" @@ -1308,7 +1482,7 @@ diff --git a/corelib/src/odometry/OdometryDVO.cpp b/corelib/src/odometry/Odometr #ifdef RTABMAP_DVO #include -@@ -124,7 +123,7 @@ +@@ -124,7 +123,7 @@ Transform OdometryDVO::computeTransform( { if(data.imageRaw().type() == CV_8UC3) { @@ -1318,9 +1492,10 @@ diff --git a/corelib/src/odometry/OdometryDVO.cpp b/corelib/src/odometry/Odometr else { diff --git a/corelib/src/odometry/OdometryF2M.cpp b/corelib/src/odometry/OdometryF2M.cpp +index ba47ac1..92ac0fc 100644 --- a/corelib/src/odometry/OdometryF2M.cpp +++ b/corelib/src/odometry/OdometryF2M.cpp -@@ -42,7 +42,11 @@ +@@ -42,7 +42,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "rtabmap/utilite/UTimer.h" #include "rtabmap/utilite/UMath.h" #include "rtabmap/utilite/UConversion.h" @@ -1333,9 +1508,10 @@ diff --git a/corelib/src/odometry/OdometryF2M.cpp b/corelib/src/odometry/Odometr #include diff --git a/corelib/src/odometry/OdometryFovis.cpp b/corelib/src/odometry/OdometryFovis.cpp +index 673639a..c1f5a99 100644 --- a/corelib/src/odometry/OdometryFovis.cpp +++ b/corelib/src/odometry/OdometryFovis.cpp -@@ -31,7 +31,6 @@ +@@ -31,7 +31,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "rtabmap/utilite/ULogger.h" #include "rtabmap/utilite/UTimer.h" #include "rtabmap/utilite/UStl.h" @@ -1343,7 +1519,7 @@ diff --git a/corelib/src/odometry/OdometryFovis.cpp b/corelib/src/odometry/Odome #ifdef RTABMAP_FOVIS #include -@@ -137,7 +136,7 @@ +@@ -137,7 +136,7 @@ Transform OdometryFovis::computeTransform( cv::Mat gray; if(data.imageRaw().type() == CV_8UC3) { @@ -1352,7 +1528,7 @@ diff --git a/corelib/src/odometry/OdometryFovis.cpp b/corelib/src/odometry/Odome } else if(data.imageRaw().type() == CV_8UC1) { -@@ -302,7 +301,7 @@ +@@ -302,7 +301,7 @@ Transform OdometryFovis::computeTransform( } if(data.rightRaw().type() == CV_8UC3) { @@ -1362,9 +1538,10 @@ diff --git a/corelib/src/odometry/OdometryFovis.cpp b/corelib/src/odometry/Odome else if(data.rightRaw().type() == CV_8UC1) { diff --git a/corelib/src/odometry/OdometryMSCKF.cpp b/corelib/src/odometry/OdometryMSCKF.cpp +index ac62c25..6b6737c 100644 --- a/corelib/src/odometry/OdometryMSCKF.cpp +++ b/corelib/src/odometry/OdometryMSCKF.cpp -@@ -26,13 +26,15 @@ +@@ -26,13 +26,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "rtabmap/core/odometry/OdometryMSCKF.h" @@ -1381,7 +1558,7 @@ diff --git a/corelib/src/odometry/OdometryMSCKF.cpp b/corelib/src/odometry/Odome #ifdef RTABMAP_MSCKF_VIO #include -@@ -867,7 +869,7 @@ +@@ -867,7 +869,7 @@ Transform OdometryMSCKF::computeTransform( if(data.imageRaw().type() == CV_8UC3) { @@ -1390,7 +1567,7 @@ diff --git a/corelib/src/odometry/OdometryMSCKF.cpp b/corelib/src/odometry/Odome } else { -@@ -875,7 +877,7 @@ +@@ -875,7 +877,7 @@ Transform OdometryMSCKF::computeTransform( } if(data.rightRaw().type() == CV_8UC3) { @@ -1400,12 +1577,15 @@ diff --git a/corelib/src/odometry/OdometryMSCKF.cpp b/corelib/src/odometry/Odome else { diff --git a/corelib/src/odometry/OdometryMono.cpp b/corelib/src/odometry/OdometryMono.cpp +index 7df312e..8cefcf7 100644 --- a/corelib/src/odometry/OdometryMono.cpp +++ b/corelib/src/odometry/OdometryMono.cpp -@@ -43,8 +43,15 @@ +@@ -42,9 +42,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/UConversion.h" #include "rtabmap/utilite/UStl.h" #include "rtabmap/utilite/UMath.h" - #include +-#include ++#include +#if CV_MAJOR_VERSION < 5 #include +#else @@ -1419,9 +1599,10 @@ diff --git a/corelib/src/odometry/OdometryMono.cpp b/corelib/src/odometry/Odomet namespace rtabmap { diff --git a/corelib/src/odometry/OdometryORBSLAM2.cpp b/corelib/src/odometry/OdometryORBSLAM2.cpp +index 1ae10bc..616678c 100644 --- a/corelib/src/odometry/OdometryORBSLAM2.cpp +++ b/corelib/src/odometry/OdometryORBSLAM2.cpp -@@ -33,7 +33,6 @@ +@@ -33,7 +33,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "rtabmap/utilite/UStl.h" #include "rtabmap/utilite/UDirectory.h" #include @@ -1429,7 +1610,7 @@ diff --git a/corelib/src/odometry/OdometryORBSLAM2.cpp b/corelib/src/odometry/Od #include #if defined(RTABMAP_ORB_SLAM) and RTABMAP_ORB_SLAM == 2 -@@ -426,7 +425,7 @@ +@@ -426,7 +425,7 @@ public: } else { @@ -1438,7 +1619,7 @@ diff --git a/corelib/src/odometry/OdometryORBSLAM2.cpp b/corelib/src/odometry/Od } } else if(mImGray.channels()==4) -@@ -437,7 +436,7 @@ +@@ -437,7 +436,7 @@ public: } else { @@ -1447,7 +1628,7 @@ diff --git a/corelib/src/odometry/OdometryORBSLAM2.cpp b/corelib/src/odometry/Od } } if(imGrayRight.channels()==3) -@@ -448,7 +447,7 @@ +@@ -448,7 +447,7 @@ public: } else { @@ -1456,7 +1637,7 @@ diff --git a/corelib/src/odometry/OdometryORBSLAM2.cpp b/corelib/src/odometry/Od } } else if(imGrayRight.channels()==4) -@@ -459,7 +458,7 @@ +@@ -459,7 +458,7 @@ public: } else { @@ -1465,7 +1646,7 @@ diff --git a/corelib/src/odometry/OdometryORBSLAM2.cpp b/corelib/src/odometry/Od } } -@@ -480,14 +479,14 @@ +@@ -480,14 +479,14 @@ public: if(mbRGB) cvtColor(mImGray,mImGray,CV_RGB2GRAY); else @@ -1483,9 +1664,10 @@ diff --git a/corelib/src/odometry/OdometryORBSLAM2.cpp b/corelib/src/odometry/Od UASSERT(imDepth.type()==CV_32F); diff --git a/corelib/src/odometry/OdometryORBSLAM3.cpp b/corelib/src/odometry/OdometryORBSLAM3.cpp +index 7cde70a..ff87bce 100644 --- a/corelib/src/odometry/OdometryORBSLAM3.cpp +++ b/corelib/src/odometry/OdometryORBSLAM3.cpp -@@ -33,7 +33,6 @@ +@@ -33,7 +33,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "rtabmap/utilite/UStl.h" #include "rtabmap/utilite/UDirectory.h" #include @@ -1493,7 +1675,7 @@ diff --git a/corelib/src/odometry/OdometryORBSLAM3.cpp b/corelib/src/odometry/Od #include #if defined(RTABMAP_ORB_SLAM) and RTABMAP_ORB_SLAM == 3 -@@ -450,12 +449,12 @@ +@@ -450,12 +449,12 @@ Transform OdometryORBSLAM3::computeTransform( cv::Mat leftMono = data.imageRaw(); if(data.imageRaw().channels() == 3) { leftMono = cv::Mat(); @@ -1509,9 +1691,10 @@ diff --git a/corelib/src/odometry/OdometryORBSLAM3.cpp b/corelib/src/odometry/Od Tcw = orbslam_->TrackStereo(leftMono, rightMono, data.stamp(), orbslamImus_); orbslamImus_.clear(); diff --git a/corelib/src/odometry/OdometryOkvis.cpp b/corelib/src/odometry/OdometryOkvis.cpp +index 10497b9..7c97e27 100644 --- a/corelib/src/odometry/OdometryOkvis.cpp +++ b/corelib/src/odometry/OdometryOkvis.cpp -@@ -34,7 +34,6 @@ +@@ -34,7 +34,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "rtabmap/utilite/UThread.h" #include "rtabmap/utilite/UFile.h" #include "rtabmap/utilite/UDirectory.h" @@ -1519,7 +1702,7 @@ diff --git a/corelib/src/odometry/OdometryOkvis.cpp b/corelib/src/odometry/Odome #ifdef RTABMAP_OKVIS #include -@@ -427,7 +426,7 @@ +@@ -427,7 +426,7 @@ Transform OdometryOkvis::computeTransform( cv::Mat gray; if(images[i].type() == CV_8UC3) { @@ -1529,9 +1712,10 @@ diff --git a/corelib/src/odometry/OdometryOkvis.cpp b/corelib/src/odometry/Odome else if(images[i].type() == CV_8UC1) { diff --git a/corelib/src/odometry/OdometryOpenVINS.cpp b/corelib/src/odometry/OdometryOpenVINS.cpp +index da81f7e..a14d74c 100644 --- a/corelib/src/odometry/OdometryOpenVINS.cpp +++ b/corelib/src/odometry/OdometryOpenVINS.cpp -@@ -32,7 +32,6 @@ +@@ -32,7 +32,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "rtabmap/utilite/ULogger.h" #include "rtabmap/utilite/UTimer.h" #include @@ -1539,7 +1723,7 @@ diff --git a/corelib/src/odometry/OdometryOpenVINS.cpp b/corelib/src/odometry/Od #ifdef RTABMAP_OPENVINS #include "core/VioManager.h" -@@ -340,7 +339,7 @@ +@@ -340,7 +339,7 @@ Transform OdometryOpenVINS::computeTransform( cv::Mat image; if(data.imageRaw().type() == CV_8UC3) @@ -1548,7 +1732,7 @@ diff --git a/corelib/src/odometry/OdometryOpenVINS.cpp b/corelib/src/odometry/Od else if(data.imageRaw().type() == CV_8UC1) image = data.imageRaw().clone(); else -@@ -371,7 +370,7 @@ +@@ -371,7 +370,7 @@ Transform OdometryOpenVINS::computeTransform( if(!data.rightRaw().empty()) { if(data.rightRaw().type() == CV_8UC3) @@ -1558,9 +1742,10 @@ diff --git a/corelib/src/odometry/OdometryOpenVINS.cpp b/corelib/src/odometry/Od image = data.rightRaw().clone(); else diff --git a/corelib/src/odometry/OdometryVINS.cpp b/corelib/src/odometry/OdometryVINS.cpp +index aa18393..bd8585d 100644 --- a/corelib/src/odometry/OdometryVINS.cpp +++ b/corelib/src/odometry/OdometryVINS.cpp -@@ -26,6 +26,9 @@ +@@ -26,6 +26,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "rtabmap/core/odometry/OdometryVINS.h" @@ -1570,7 +1755,7 @@ diff --git a/corelib/src/odometry/OdometryVINS.cpp b/corelib/src/odometry/Odomet #include "rtabmap/core/OdometryInfo.h" #include "rtabmap/core/util3d_transforms.h" #include "rtabmap/utilite/ULogger.h" -@@ -33,7 +36,6 @@ +@@ -33,7 +36,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "rtabmap/utilite/UStl.h" #include "rtabmap/utilite/UThread.h" #include "rtabmap/utilite/UDirectory.h" @@ -1578,7 +1763,7 @@ diff --git a/corelib/src/odometry/OdometryVINS.cpp b/corelib/src/odometry/Odomet #ifdef RTABMAP_VINS #include -@@ -388,7 +390,7 @@ +@@ -388,7 +390,7 @@ Transform OdometryVINS::computeTransform( cv::Mat right; if(data.imageRaw().type() == CV_8UC3) { @@ -1587,7 +1772,7 @@ diff --git a/corelib/src/odometry/OdometryVINS.cpp b/corelib/src/odometry/Odomet } else if(data.imageRaw().type() == CV_8UC1) { -@@ -400,7 +402,7 @@ +@@ -400,7 +402,7 @@ Transform OdometryVINS::computeTransform( } if(data.rightRaw().type() == CV_8UC3) { @@ -1597,9 +1782,10 @@ diff --git a/corelib/src/odometry/OdometryVINS.cpp b/corelib/src/odometry/Odomet else if(data.rightRaw().type() == CV_8UC1) { diff --git a/corelib/src/odometry/OdometryViso2.cpp b/corelib/src/odometry/OdometryViso2.cpp +index 808e763..dc6192b 100644 --- a/corelib/src/odometry/OdometryViso2.cpp +++ b/corelib/src/odometry/OdometryViso2.cpp -@@ -31,7 +31,6 @@ +@@ -31,7 +31,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "rtabmap/utilite/ULogger.h" #include "rtabmap/utilite/UTimer.h" #include "rtabmap/utilite/UStl.h" @@ -1607,7 +1793,7 @@ diff --git a/corelib/src/odometry/OdometryViso2.cpp b/corelib/src/odometry/Odome #ifdef RTABMAP_VISO2 #include -@@ -131,7 +130,7 @@ +@@ -131,7 +130,7 @@ Transform OdometryViso2::computeTransform( cv::Mat leftGray; if(data.imageRaw().type() == CV_8UC3) { @@ -1616,7 +1802,7 @@ diff --git a/corelib/src/odometry/OdometryViso2.cpp b/corelib/src/odometry/Odome } else if(data.imageRaw().type() == CV_8UC1) { -@@ -144,7 +143,7 @@ +@@ -144,7 +143,7 @@ Transform OdometryViso2::computeTransform( cv::Mat rightGray; if(data.rightRaw().type() == CV_8UC3) { @@ -1626,21 +1812,28 @@ diff --git a/corelib/src/odometry/OdometryViso2.cpp b/corelib/src/odometry/Odome else if(data.rightRaw().type() == CV_8UC1) { diff --git a/corelib/src/opencv/ORBextractor.cc b/corelib/src/opencv/ORBextractor.cc +index 2d3cd7c..1197fb6 100644 --- a/corelib/src/opencv/ORBextractor.cc +++ b/corelib/src/opencv/ORBextractor.cc -@@ -64,7 +64,11 @@ +@@ -63,9 +63,13 @@ + #include - #include +-#include +-#include +-#include ++#include +#if CV_MAJOR_VERSION < 5 - #include ++#include +#else +#include +#endif - #include ++#include #include #include + #include diff --git a/corelib/src/opencv/ORBextractor.h b/corelib/src/opencv/ORBextractor.h +index 861ca05..82ede5b 100644 --- a/corelib/src/opencv/ORBextractor.h +++ b/corelib/src/opencv/ORBextractor.h @@ -31,8 +31,6 @@ @@ -1653,6 +1846,7 @@ diff --git a/corelib/src/opencv/ORBextractor.h b/corelib/src/opencv/ORBextractor namespace rtabmap { diff --git a/corelib/src/opencv/Orb.cpp b/corelib/src/opencv/Orb.cpp +index f56874e..c5034a7 100644 --- a/corelib/src/opencv/Orb.cpp +++ b/corelib/src/opencv/Orb.cpp @@ -40,7 +40,6 @@ @@ -1663,7 +1857,7 @@ diff --git a/corelib/src/opencv/Orb.cpp b/corelib/src/opencv/Orb.cpp #include #include -@@ -252,7 +251,7 @@ +@@ -252,7 +251,7 @@ static void computeOrbDescriptor(const KeyPoint& kpt, } } else @@ -1672,7 +1866,7 @@ diff --git a/corelib/src/opencv/Orb.cpp b/corelib/src/opencv/Orb.cpp #undef GET_VALUE } -@@ -752,7 +751,7 @@ +@@ -752,7 +751,7 @@ void CV_ORB::operator()( InputArray _image, InputArray _mask, std::vectornlevels; +diff --git a/corelib/src/opencv/Orb.h b/corelib/src/opencv/Orb.h +index e05ad9d..464ad16 100644 +--- a/corelib/src/opencv/Orb.h ++++ b/corelib/src/opencv/Orb.h +@@ -46,7 +46,7 @@ + #ifndef CORELIB_SRC_OPENCV_ORB_H_ + #define CORELIB_SRC_OPENCV_ORB_H_ + +-#include ++#include + + namespace rtabmap { + diff --git a/corelib/src/opencv/five-point.cpp b/corelib/src/opencv/five-point.cpp +index 7e5c2c5..a389c9f 100644 --- a/corelib/src/opencv/five-point.cpp +++ b/corelib/src/opencv/five-point.cpp @@ -30,6 +30,9 @@ @@ -1695,6 +1903,7 @@ diff --git a/corelib/src/opencv/five-point.cpp b/corelib/src/opencv/five-point.c using namespace cv; diff --git a/corelib/src/opencv/five-point.h b/corelib/src/opencv/five-point.h +index 1a5b778..f1aa8c7 100644 --- a/corelib/src/opencv/five-point.h +++ b/corelib/src/opencv/five-point.h @@ -8,6 +8,10 @@ @@ -1709,9 +1918,10 @@ diff --git a/corelib/src/opencv/five-point.h b/corelib/src/opencv/five-point.h { diff --git a/corelib/src/opencv/solvepnp.cpp b/corelib/src/opencv/solvepnp.cpp +index f5b3a07..ecd2be9 100644 --- a/corelib/src/opencv/solvepnp.cpp +++ b/corelib/src/opencv/solvepnp.cpp -@@ -53,7 +53,7 @@ +@@ -53,7 +53,7 @@ class PnPRansacCallback : public PointSetRegistrator::Callback public: @@ -1720,7 +1930,7 @@ diff --git a/corelib/src/opencv/solvepnp.cpp b/corelib/src/opencv/solvepnp.cpp bool _useExtrinsicGuess=false, Mat _rvec=Mat(), Mat _tvec=Mat() ) : cameraMatrix(_cameraMatrix), distCoeffs(_distCoeffs), flags(_flags), useExtrinsicGuess(_useExtrinsicGuess), rvec(_rvec), tvec(_tvec) {} -@@ -142,12 +142,12 @@ +@@ -142,12 +142,12 @@ bool solvePnPRansac(InputArray _opoints, InputArray _ipoints, Mat cameraMatrix = _cameraMatrix.getMat(), distCoeffs = _distCoeffs.getMat(); int model_points = 6; @@ -1735,7 +1945,7 @@ diff --git a/corelib/src/opencv/solvepnp.cpp b/corelib/src/opencv/solvepnp.cpp } Ptr cb; // pointer to callback -@@ -178,7 +178,7 @@ +@@ -178,7 +178,7 @@ bool solvePnPRansac(InputArray _opoints, InputArray _ipoints, opoints_inliers.resize(npoints1); ipoints_inliers.resize(npoints1); result = solvePnP(opoints_inliers, ipoints_inliers, cameraMatrix, @@ -1744,7 +1954,7 @@ diff --git a/corelib/src/opencv/solvepnp.cpp b/corelib/src/opencv/solvepnp.cpp } if( result <= 0 || _local_model.rows <= 0) -@@ -213,7 +213,7 @@ +@@ -213,7 +213,7 @@ bool solvePnPRansac(InputArray _opoints, InputArray _ipoints, int RANSACUpdateNumIters( double p, double ep, int modelPoints, int maxIters ) { if( modelPoints <= 0 ) @@ -1754,6 +1964,7 @@ diff --git a/corelib/src/opencv/solvepnp.cpp b/corelib/src/opencv/solvepnp.cpp p = MAX(p, 0.); p = MIN(p, 1.); diff --git a/corelib/src/opencv/solvepnp.h b/corelib/src/opencv/solvepnp.h +index e88b570..382f9db 100644 --- a/corelib/src/opencv/solvepnp.h +++ b/corelib/src/opencv/solvepnp.h @@ -45,9 +45,10 @@ @@ -1769,7 +1980,7 @@ diff --git a/corelib/src/opencv/solvepnp.h b/corelib/src/opencv/solvepnp.h #endif namespace cv3 { -@@ -95,7 +96,7 @@ +@@ -95,7 +96,7 @@ bool solvePnPRansac( cv::InputArray objectPoints, cv::InputArray imagePoints, cv::OutputArray rvec, cv::OutputArray tvec, bool useExtrinsicGuess = false, int iterationsCount = 100, float reprojectionError = 8.0, double confidence = 0.99, @@ -1779,9 +1990,10 @@ diff --git a/corelib/src/opencv/solvepnp.h b/corelib/src/opencv/solvepnp.h int RANSACUpdateNumIters( double p, double ep, int modelPoints, int maxIters ); diff --git a/corelib/src/optimizer/OptimizerCeres.cpp b/corelib/src/optimizer/OptimizerCeres.cpp +index 046d401..d2d64c3 100644 --- a/corelib/src/optimizer/OptimizerCeres.cpp +++ b/corelib/src/optimizer/OptimizerCeres.cpp -@@ -26,6 +26,12 @@ +@@ -26,6 +26,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "rtabmap/core/Graph.h" @@ -1795,24 +2007,26 @@ diff --git a/corelib/src/optimizer/OptimizerCeres.cpp b/corelib/src/optimizer/Op #include #include diff --git a/corelib/src/stereo/StereoBM.cpp b/corelib/src/stereo/StereoBM.cpp +index 1b390c6..356266e 100644 --- a/corelib/src/stereo/StereoBM.cpp +++ b/corelib/src/stereo/StereoBM.cpp -@@ -27,9 +27,13 @@ +@@ -27,9 +27,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#if CV_MAJOR_VERSION < 5 #include +-#include +-#include +#else +#include +#include +#endif - #include --#include ++#include namespace rtabmap { -@@ -88,7 +92,7 @@ +@@ -88,7 +92,7 @@ cv::Mat StereoBM::computeDisparity( cv::Mat leftMono; if(leftImage.channels() == 3) { @@ -1821,7 +2035,7 @@ diff --git a/corelib/src/stereo/StereoBM.cpp b/corelib/src/stereo/StereoBM.cpp } else { -@@ -98,7 +102,7 @@ +@@ -98,7 +102,7 @@ cv::Mat StereoBM::computeDisparity( cv::Mat rightMono; if(rightImage.channels() == 3) { @@ -1831,24 +2045,26 @@ diff --git a/corelib/src/stereo/StereoBM.cpp b/corelib/src/stereo/StereoBM.cpp else { diff --git a/corelib/src/stereo/StereoSGBM.cpp b/corelib/src/stereo/StereoSGBM.cpp +index 6763aeb..291ba7f 100644 --- a/corelib/src/stereo/StereoSGBM.cpp +++ b/corelib/src/stereo/StereoSGBM.cpp -@@ -27,9 +27,13 @@ +@@ -27,9 +27,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#if CV_MAJOR_VERSION < 5 #include +-#include +-#include +#else +#include +#include +#endif - #include --#include ++#include namespace rtabmap { -@@ -77,7 +81,7 @@ +@@ -77,7 +81,7 @@ cv::Mat StereoSGBM::computeDisparity( cv::Mat leftMono; if(leftImage.channels() == 3) { @@ -1857,7 +2073,7 @@ diff --git a/corelib/src/stereo/StereoSGBM.cpp b/corelib/src/stereo/StereoSGBM.c } else { -@@ -87,7 +91,7 @@ +@@ -87,7 +91,7 @@ cv::Mat StereoSGBM::computeDisparity( cv::Mat rightMono; if(rightImage.channels() == 3) { @@ -1867,34 +2083,36 @@ diff --git a/corelib/src/stereo/StereoSGBM.cpp b/corelib/src/stereo/StereoSGBM.c else { diff --git a/corelib/src/util2d.cpp b/corelib/src/util2d.cpp +index 604eaa3..3642e66 100644 --- a/corelib/src/util2d.cpp +++ b/corelib/src/util2d.cpp -@@ -34,11 +34,9 @@ +@@ -34,16 +34,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include -#include - #include +-#include ++#include #include - #include +-#include -#include ++#include #include #include -@@ -46,6 +44,12 @@ - #include - #endif - + #if CV_MAJOR_VERSION >= 3 +-#include ++#include ++#endif ++ +#if CV_MAJOR_VERSION < 5 +#include +#else +#include -+#endif -+ - namespace rtabmap - { + #endif -@@ -747,7 +751,7 @@ + namespace rtabmap +@@ -747,7 +751,7 @@ cv::Mat disparityFromStereoImages( cv::Mat leftMono; if(leftImage.channels() == 3) { @@ -1903,7 +2121,7 @@ diff --git a/corelib/src/util2d.cpp b/corelib/src/util2d.cpp } else { -@@ -2042,8 +2046,8 @@ +@@ -2042,8 +2046,8 @@ cv::Mat brightnessAndContrastAuto(const cv::Mat &src, const cv::Mat & mask, floa //to calculate grayscale histogram cv::Mat gray; if (src.type() == CV_8UC1) gray = src; @@ -1915,17 +2133,20 @@ diff --git a/corelib/src/util2d.cpp b/corelib/src/util2d.cpp { // keep full available range diff --git a/corelib/src/util3d.cpp b/corelib/src/util3d.cpp +index 563e22a..4619868 100644 --- a/corelib/src/util3d.cpp +++ b/corelib/src/util3d.cpp -@@ -41,7 +41,6 @@ +@@ -40,8 +40,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include #include #include - #include +-#include -#include ++#include namespace rtabmap { -@@ -892,7 +891,7 @@ +@@ -892,7 +891,7 @@ pcl::PointCloud::Ptr cloudFromStereoImages( cv::Mat leftMono; if(leftColor.channels() == 3) { @@ -1934,7 +2155,7 @@ diff --git a/corelib/src/util3d.cpp b/corelib/src/util3d.cpp } else { -@@ -902,7 +901,7 @@ +@@ -902,7 +901,7 @@ pcl::PointCloud::Ptr cloudFromStereoImages( cv::Mat rightMono; if(rightColor.channels() == 3) { @@ -1943,7 +2164,7 @@ diff --git a/corelib/src/util3d.cpp b/corelib/src/util3d.cpp } else { -@@ -1038,7 +1037,7 @@ +@@ -1038,7 +1037,7 @@ std::vector::Ptr> cloudsFromSensorData( cv::Mat leftMono; if(sensorData.imageRaw().channels() == 3) { @@ -1952,7 +2173,7 @@ diff --git a/corelib/src/util3d.cpp b/corelib/src/util3d.cpp } else { -@@ -1048,7 +1047,7 @@ +@@ -1048,7 +1047,7 @@ std::vector::Ptr> cloudsFromSensorData( cv::Mat rightMono; if(sensorData.rightRaw().channels() == 3) { @@ -1962,9 +2183,10 @@ diff --git a/corelib/src/util3d.cpp b/corelib/src/util3d.cpp else { diff --git a/corelib/src/util3d_correspondences.cpp b/corelib/src/util3d_correspondences.cpp +index 5a81869..41cc1e6 100644 --- a/corelib/src/util3d_correspondences.cpp +++ b/corelib/src/util3d_correspondences.cpp -@@ -30,7 +30,11 @@ +@@ -30,7 +30,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include @@ -1977,9 +2199,10 @@ diff --git a/corelib/src/util3d_correspondences.cpp b/corelib/src/util3d_corresp #include diff --git a/corelib/src/util3d_motion_estimation.cpp b/corelib/src/util3d_motion_estimation.cpp +index 63ed9ac..41ea2a0 100644 --- a/corelib/src/util3d_motion_estimation.cpp +++ b/corelib/src/util3d_motion_estimation.cpp -@@ -26,6 +26,9 @@ +@@ -26,6 +26,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "rtabmap/core/util3d_motion_estimation.h" @@ -1990,9 +2213,10 @@ diff --git a/corelib/src/util3d_motion_estimation.cpp b/corelib/src/util3d_motio #include "rtabmap/utilite/UStl.h" #include "rtabmap/utilite/UMath.h" diff --git a/corelib/src/util3d_surface.cpp b/corelib/src/util3d_surface.cpp +index bccae36..3625426 100644 --- a/corelib/src/util3d_surface.cpp +++ b/corelib/src/util3d_surface.cpp -@@ -39,8 +39,6 @@ +@@ -39,8 +39,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "rtabmap/utilite/UConversion.h" #include "rtabmap/utilite/UMath.h" #include "rtabmap/utilite/UTimer.h" @@ -2001,7 +2225,7 @@ diff --git a/corelib/src/util3d_surface.cpp b/corelib/src/util3d_surface.cpp #include #include #include -@@ -1745,7 +1743,7 @@ +@@ -1745,7 +1743,7 @@ cv::Mat mergeTextures( if(resizedImage.type() == CV_8UC1) { cv::Mat resizedImageColor; @@ -2010,7 +2234,7 @@ diff --git a/corelib/src/util3d_surface.cpp b/corelib/src/util3d_surface.cpp resizedImage = resizedImageColor; } UASSERT(resizedImage.type() == globalTextures.type()); -@@ -2609,7 +2607,7 @@ +@@ -2609,7 +2607,7 @@ bool multiBandTexturing( if(imageRoi.channels() == 1) { cv::Mat imageRoiColor; @@ -2019,7 +2243,7 @@ diff --git a/corelib/src/util3d_surface.cpp b/corelib/src/util3d_surface.cpp imageRoi = imageRoiColor; } -@@ -3218,7 +3216,7 @@ +@@ -3218,7 +3216,7 @@ float computeNormalsComplexity( } if(oi>1) { @@ -2028,7 +2252,7 @@ diff --git a/corelib/src/util3d_surface.cpp b/corelib/src/util3d_surface.cpp if(pcaEigenVectors) { -@@ -3279,7 +3277,7 @@ +@@ -3279,7 +3277,7 @@ float computeNormalsComplexity( } if(oi>1) { @@ -2037,7 +2261,7 @@ diff --git a/corelib/src/util3d_surface.cpp b/corelib/src/util3d_surface.cpp if(pcaEigenVectors) { -@@ -3335,7 +3333,7 @@ +@@ -3335,7 +3333,7 @@ float computeNormalsComplexity( } if(oi>1) { @@ -2046,7 +2270,7 @@ diff --git a/corelib/src/util3d_surface.cpp b/corelib/src/util3d_surface.cpp if(pcaEigenVectors) { -@@ -3391,7 +3389,7 @@ +@@ -3391,7 +3389,7 @@ float computeNormalsComplexity( } if(oi>1) { @@ -2055,7 +2279,7 @@ diff --git a/corelib/src/util3d_surface.cpp b/corelib/src/util3d_surface.cpp if(pcaEigenVectors) { -@@ -3447,7 +3445,7 @@ +@@ -3447,7 +3445,7 @@ float computeNormalsComplexity( } if(oi>1) { @@ -2064,3 +2288,353 @@ diff --git a/corelib/src/util3d_surface.cpp b/corelib/src/util3d_surface.cpp if(pcaEigenVectors) { +diff --git a/guilib/include/rtabmap/gui/DatabaseViewer.h b/guilib/include/rtabmap/gui/DatabaseViewer.h +index a11b4c9..28fbc38 100644 +--- a/guilib/include/rtabmap/gui/DatabaseViewer.h ++++ b/guilib/include/rtabmap/gui/DatabaseViewer.h +@@ -36,7 +36,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include ++#include + #include + #include + #include +diff --git a/guilib/include/rtabmap/gui/ImageView.h b/guilib/include/rtabmap/gui/ImageView.h +index 8e8df85..eaf9134 100644 +--- a/guilib/include/rtabmap/gui/ImageView.h ++++ b/guilib/include/rtabmap/gui/ImageView.h +@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include ++#include + #include + #include "rtabmap/utilite/UCv2Qt.h" + #include +diff --git a/guilib/include/rtabmap/gui/KeypointItem.h b/guilib/include/rtabmap/gui/KeypointItem.h +index 7f4f9f6..11a896d 100644 +--- a/guilib/include/rtabmap/gui/KeypointItem.h ++++ b/guilib/include/rtabmap/gui/KeypointItem.h +@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include ++#include + + namespace rtabmap { + +diff --git a/guilib/src/CalibrationDialog.cpp b/guilib/src/CalibrationDialog.cpp +index dd4a052..8262210 100644 +--- a/guilib/src/CalibrationDialog.cpp ++++ b/guilib/src/CalibrationDialog.cpp +@@ -29,14 +29,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "ui_calibrationDialog.h" + + #include +-#include +-#include +-#include ++#include ++#include + #if CV_MAJOR_VERSION >= 3 +-#include + #endif +-#include +-#if CV_MAJOR_VERSION > 2 or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) ++#include ++#if (CV_MAJOR_VERSION > 2 and CV_MAJOR_VERSION < 5) or (CV_MAJOR_VERSION == 2 and (CV_MINOR_VERSION >4 or (CV_MINOR_VERSION == 4 and CV_SUBMINOR_VERSION >=10))) + #include + #endif + +@@ -736,7 +734,7 @@ void CalibrationDialog::processImages(const cv::Mat & imageLeft, const cv::Mat & + cv::Size boardSize(ui_->spinBox_boardWidth->value(), ui_->spinBox_boardHeight->value()); + if(!viewGray.empty()) + { +- int flags = CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE; ++ int flags = cv::CALIB_CB_ADAPTIVE_THRESH | cv::CALIB_CB_NORMALIZE_IMAGE; + + if(!viewGray.empty()) + { +@@ -747,7 +745,7 @@ void CalibrationDialog::processImages(const cv::Mat & imageLeft, const cv::Mat & + if( scale == 1 ) + timg = viewGray; + else +- cv::resize(viewGray, timg, cv::Size(), scale, scale, CV_INTER_CUBIC); ++ cv::resize(viewGray, timg, cv::Size(), scale, scale, cv::INTER_CUBIC); + + #ifdef HAVE_CHARUCO + if(ui_->comboBox_board_type->currentIndex() >= 1 ) +@@ -832,7 +830,7 @@ void CalibrationDialog::processImages(const cv::Mat & imageLeft, const cv::Mat & + float ratio = ui_->comboBox_board_type->currentIndex() >= 1 ?6.0f:2.0f; + float radius = minSquareDistance==-1.0f?5.0f:(minSquareDistance/ratio); + cv::cornerSubPix( viewGray, pointBuf[id], cv::Size(radius, radius), cv::Size(-1,-1), +- cv::TermCriteria( CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1 )); ++ cv::TermCriteria( cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 30, 0.1 )); + + // Filter points that drifted to far (caused by reflection or bad subpixel gradient) + float threshold = ui_->doubleSpinBox_subpixel_error->value(); +@@ -1121,7 +1119,7 @@ void CalibrationDialog::processImages(const cv::Mat & imageLeft, const cv::Mat & + int step = imageSize_[id].height/16; + for(int i=step; iimageRaw().channels() == 3) + { +- cv::cvtColor(data->imageRaw(), leftMono, CV_BGR2GRAY); ++ cv::cvtColor(data->imageRaw(), leftMono, cv::COLOR_BGR2GRAY); + } + else + { +@@ -5891,7 +5889,7 @@ void DatabaseViewer::updateStereo(const SensorData * data) + cv::Mat rightMono; + if(data->rightRaw().channels() == 3) + { +- cv::cvtColor(data->rightRaw(), rightMono, CV_BGR2GRAY); ++ cv::cvtColor(data->rightRaw(), rightMono, cv::COLOR_BGR2GRAY); + } + else + { +diff --git a/guilib/src/MainWindow.cpp b/guilib/src/MainWindow.cpp +index 86e6924..06cb82f 100644 +--- a/guilib/src/MainWindow.cpp ++++ b/guilib/src/MainWindow.cpp +@@ -126,6 +126,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #ifdef HAVE_OPENCV_ARUCO + #include + #endif ++#include + + #define LOG_FILE_NAME "LogRtabmap.txt" + #define SHARE_SHOW_LOG_FILE "share/rtabmap/showlogs.m" +diff --git a/tools/Camera/main.cpp b/tools/Camera/main.cpp +index e337030..c856d7b 100644 +--- a/tools/Camera/main.cpp ++++ b/tools/Camera/main.cpp +@@ -31,8 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/UFile.h" + #include "rtabmap/utilite/UDirectory.h" + #include "rtabmap/utilite/UConversion.h" +-#include +-#include ++#include + #include + + void showUsage() +@@ -178,7 +177,7 @@ int main(int argc, char * argv[]) + + cv::Mat rgb; + rgb = camera->takeImage().imageRaw(); +- cv::namedWindow("Video", CV_WINDOW_AUTOSIZE); // create window ++ cv::namedWindow("Video", cv::WINDOW_AUTOSIZE); // create window + while(!rgb.empty()) + { + cv::imshow("Video", rgb); // show frame +diff --git a/tools/CameraRGBD/main.cpp b/tools/CameraRGBD/main.cpp +index 1d562d9..a1274f1 100644 +--- a/tools/CameraRGBD/main.cpp ++++ b/tools/CameraRGBD/main.cpp +@@ -35,12 +35,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/UFile.h" + #include "rtabmap/utilite/UDirectory.h" + #include "rtabmap/utilite/UConversion.h" +-#include +-#include +-#include +-#if CV_MAJOR_VERSION >= 3 +-#include +-#endif ++#include ++#include ++#include + #include + #include + #include +@@ -399,7 +396,7 @@ int main(int argc, char * argv[]) + UASSERT(fourcc.size() == 4); + videoWriter.open( + stereoSavePath, +- CV_FOURCC(fourcc.at(0), fourcc.at(1), fourcc.at(2), fourcc.at(3)), ++ cv::VideoWriter::fourcc(fourcc.at(0), fourcc.at(1), fourcc.at(2), fourcc.at(3)), + rate, + targetSize, + data.imageRaw().channels() == 3); +@@ -480,7 +477,7 @@ int main(int argc, char * argv[]) + { + if(right.channels() == 3) + { +- cv::cvtColor(right, right, CV_BGR2GRAY); ++ cv::cvtColor(right, right, cv::COLOR_BGR2GRAY); + } + pcl::PointCloud::Ptr cloud = rtabmap::util3d::cloudFromStereoImages( + rgb, right, +@@ -507,14 +504,14 @@ int main(int argc, char * argv[]) + if(right.type() != left.type()) + { + cv::Mat tmp; +- cv::cvtColor(right, tmp, left.channels()==3?CV_GRAY2BGR:CV_BGR2GRAY); ++ cv::cvtColor(right, tmp, left.channels()==3?cv::COLOR_GRAY2BGR:cv::COLOR_BGR2GRAY); + right = tmp; + } + UASSERT(left.type() == right.type()); + + cv::Mat roiA(targetImage, cv::Rect( 0, 0, left.size().width, left.size().height )); + left.copyTo(roiA); +- cv::Mat roiB( targetImage, cvRect( left.size().width, 0, left.size().width, left.size().height ) ); ++ cv::Mat roiB( targetImage, cv::Rect( left.size().width, 0, left.size().width, left.size().height ) ); + right.copyTo(roiB); + + videoWriter.write(targetImage); +diff --git a/tools/EpipolarGeometry/main.cpp b/tools/EpipolarGeometry/main.cpp +index aa309fa..49cc610 100644 +--- a/tools/EpipolarGeometry/main.cpp ++++ b/tools/EpipolarGeometry/main.cpp +@@ -26,9 +26,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + #include +-#include +-#include +-#include ++#include ++#include + #include + #include + #include +@@ -36,7 +35,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include ++#include + #include "rtabmap/core/Features2d.h" + #include "rtabmap/core/EpipolarGeometry.h" + #include "rtabmap/core/VWDictionary.h" +diff --git a/tools/ImagesJoiner/main.cpp b/tools/ImagesJoiner/main.cpp +index ad4d3dd..3cf5264 100644 +--- a/tools/ImagesJoiner/main.cpp ++++ b/tools/ImagesJoiner/main.cpp +@@ -31,7 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include "rtabmap/utilite/UFile.h" + #include "rtabmap/utilite/UConversion.h" + #include +-#include ++#include + + void showUsage() + { +diff --git a/tools/StereoEval/main.cpp b/tools/StereoEval/main.cpp +index bd3313f..9c15e34 100644 +--- a/tools/StereoEval/main.cpp ++++ b/tools/StereoEval/main.cpp +@@ -37,7 +37,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + #include + #include + #include +-#include + #include + #include + +@@ -222,7 +221,7 @@ int main(int argc, char * argv[]) + cv::Mat leftMono; + if(left.channels() == 3) + { +- cv::cvtColor(left, leftMono, CV_BGR2GRAY); ++ cv::cvtColor(left, leftMono, cv::COLOR_BGR2GRAY); + } + else + { +@@ -231,7 +230,7 @@ int main(int argc, char * argv[]) + cv::Mat rightMono; + if(right.channels() == 3) + { +- cv::cvtColor(right, rightMono, CV_BGR2GRAY); ++ cv::cvtColor(right, rightMono, cv::COLOR_BGR2GRAY); + } + else + { +@@ -266,7 +265,7 @@ int main(int argc, char * argv[]) + cv::cornerSubPix(leftMono, leftCorners, + cv::Size( subPixWinSize, subPixWinSize ), + cv::Size( -1, -1 ), +- cv::TermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, subPixIterations, subPixEps ) ); ++ cv::TermCriteria( cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS, subPixIterations, subPixEps ) ); + UDEBUG("cv::cornerSubPix() end"); + } + +diff --git a/tools/VocabularyComparison/main.cpp b/tools/VocabularyComparison/main.cpp +index 410439b..cc65f02 100644 +--- a/tools/VocabularyComparison/main.cpp ++++ b/tools/VocabularyComparison/main.cpp +@@ -27,10 +27,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + #include + #include +-#include +-#include + #include +-#include ++#include + #include + #include + #include From 1007c7574ca38de23ba530635d7507a72f8e6a37 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 11:47:07 +1000 Subject: [PATCH 176/180] fix: system_modes use target_link_libraries directly, drop the macro shim Per review feedback: system_modes has a single target and a fixed, short dependency list, so the link_ament_dependencies() macro is unnecessary indirection here. Replace with a direct target_link_libraries(mode \${_TARGETS} ...) call. Co-Authored-By: Claude Sonnet 5 --- patch/ros-rolling-system-modes.patch | 40 +++++++++++++--------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/patch/ros-rolling-system-modes.patch b/patch/ros-rolling-system-modes.patch index 0b40a6668..64d0a80dd 100644 --- a/patch/ros-rolling-system-modes.patch +++ b/patch/ros-rolling-system-modes.patch @@ -1,29 +1,25 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 2c0bf30..5b5354f 100644 +index 0000000..0000000 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -25,6 +25,15 @@ find_package(rosidl_typesupport_cpp REQUIRED) - find_package(lifecycle_msgs REQUIRED) - find_package(system_modes_msgs REQUIRED) - -+# ament_target_dependencies() was removed on Rolling; every ament_cmake -+# package that exports targets populates a _TARGETS list, which is the -+# modern replacement. -+macro(link_ament_dependencies target) -+ foreach(_ament_dep ${ARGN}) -+ target_link_libraries(${target} ${${_ament_dep}_TARGETS}) -+ endforeach() -+endmacro() -+ - add_library(mode SHARED - src/system_modes/mode.cpp - src/system_modes/mode_impl.cpp -@@ -34,7 +43,7 @@ add_library(mode SHARED +@@ -34,13 +34,13 @@ target_include_directories(mode PUBLIC $ $) -ament_target_dependencies(mode -+link_ament_dependencies(mode - "rclcpp" - "rcl_lifecycle" - "rclcpp_lifecycle" +- "rclcpp" +- "rcl_lifecycle" +- "rclcpp_lifecycle" +- "rosidl_typesupport_cpp" +- "lifecycle_msgs" +- "system_modes_msgs" ++target_link_libraries(mode ++ ${rclcpp_TARGETS} ++ ${rcl_lifecycle_TARGETS} ++ ${rclcpp_lifecycle_TARGETS} ++ ${rosidl_typesupport_cpp_TARGETS} ++ ${lifecycle_msgs_TARGETS} ++ ${system_modes_msgs_TARGETS} + ) + + # Causes the visibility macros to use dllexport rather than dllimport, From a7a2d0b777d92883b48f3454f04f5cfd921974c1 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 11:50:02 +1000 Subject: [PATCH 177/180] fix: avoid exact version+build pins in dependencies.yaml Per review feedback: - cartographer_ros/yasmin_pcl: drop the "==2.10.0 *_26" exact pin on ros2-pcl-conversions entirely -- unnecessary. - rmf_visualization_schedule/rmf_websocket: replace the exact "asio ==1.29.0" pin with a range ("asio <1.30"), since the real constraint is the upstream removal of io_service.hpp in asio 1.30+ (which websocketpp needs), not a specific patch version -- an exact pin was needlessly fragile for that. Co-Authored-By: Claude Sonnet 5 --- patch/dependencies.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/patch/dependencies.yaml b/patch/dependencies.yaml index 5ddfd066c..2bba7815e 100644 --- a/patch/dependencies.yaml +++ b/patch/dependencies.yaml @@ -7,8 +7,8 @@ ros_ign_interfaces: cartographer_ros: remove_host: ["ros2-cartographer"] remove_run: ["ros2-cartographer"] - add_host: ["cartographer 2.*", "libboost-devel", "ceres-solver * cpu*", "ros2-pcl-conversions ==2.10.0 *_26"] - add_run: ["ros2-pcl-conversions ==2.10.0 *_26"] + add_host: ["cartographer 2.*", "libboost-devel", "ceres-solver * cpu*", "ros2-pcl-conversions"] + add_run: ["ros2-pcl-conversions"] libyaml_vendor: add_host: ["yaml-cpp", "yaml"] add_run: ["yaml-cpp", "yaml"] @@ -306,15 +306,15 @@ mujoco_ros2_control_plugins: roboplan_ros_examples: add_host: ["ros-rolling-ament-cmake"] yasmin_pcl: - add_host: ["ros2-pcl-conversions ==2.10.0 *_26"] - add_run: ["ros2-pcl-conversions ==2.10.0 *_26"] + add_host: ["ros2-pcl-conversions"] + add_run: ["ros2-pcl-conversions"] rmf_fleet_adapter_python: add_host: ["pybind11_json"] rmf_visualization_schedule: remove_host: ["openssl"] remove_run: ["openssl"] - add_host: ["openssl >=3.6.4", "asio ==1.29.0"] - add_run: ["openssl >=3.6.4", "asio ==1.29.0"] + add_host: ["openssl >=3.6.4", "asio <1.30"] + add_run: ["openssl >=3.6.4", "asio <1.30"] rmf_websocket: - add_host: ["asio ==1.29.0"] - add_run: ["asio ==1.29.0"] + add_host: ["asio <1.30"] + add_run: ["asio <1.30"] From 49548e948e988cc5731b106129ab625a650c7586 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 12:04:00 +1000 Subject: [PATCH 178/180] fix: remove per-package build_number overrides, unify mutex to the global number Per review feedback: a full rebuild should use a single build_number for every package rather than accumulating one-off per-package overrides. Removes all 15 overrides added this session (cv_bridge/distro_mutex/libg2o/libmavconn/mavlink/pcl_conversions/ rmf_battery/rmf_task/rmf_task_sequence/rmf_traffic/rmf_traffic_ros2/ rmf_utils/ros2cli/rosidl_cli/sick_safetyscanners2_interfaces/ sick_safetyscanners_base), keeping libg2o's unrelated additional_cmake_args entry. Also drops the mutex package's independent build_number, using the same global number as everything else. Verified this means skip_existing will reuse each affected package's pre-session published artifact rather than rebuilding it in this PR -- expected and accepted, since the next full rebuild (a single fresh build_number for everything) is what actually re-validates these patches going forward, not a per-package micro-bump here. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 31 ------------------------------- vinca.yaml | 4 +--- 2 files changed, 1 insertion(+), 34 deletions(-) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index d2bde8b22..37bb96083 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -230,36 +230,5 @@ visp: override_version: '3.7.0' zenoh_cpp_vendor: additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK -DUSE_SYSTEM_ZENOH=ON" -cv_bridge: - build_number: 26 -distro_mutex: - build_number: 26 libg2o: - build_number: 27 additional_cmake_args: "-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON" -libmavconn: - build_number: 26 -mavlink: - build_number: 29 -pcl_conversions: - build_number: 26 -rmf_battery: - build_number: 26 -rmf_task: - build_number: 26 -rmf_task_sequence: - build_number: 26 -rmf_traffic: - build_number: 26 -rmf_traffic_ros2: - build_number: 30 -rmf_utils: - build_number: 27 -ros2cli: - build_number: 26 -rosidl_cli: - build_number: 26 -sick_safetyscanners2_interfaces: - build_number: 26 -sick_safetyscanners_base: - build_number: 28 diff --git a/vinca.yaml b/vinca.yaml index 37c71f612..72c75bb04 100644 --- a/vinca.yaml +++ b/vinca.yaml @@ -13,9 +13,7 @@ build_number: 25 mutex_package: name: "ros2-distro-mutex" version: "0.20.0" - # Bumped independently of build_number so the mutex is re-published with the new - # run_constraints while already-built packages (ros2-distro-mutex 0.20.* rolling_*) stay valid. - build_number: 26 + build_number: 25 upper_bound: "x.x" run_constraints: - libboost 1.90.* From 5fc6d2daeef5b8c564d6ebf75d876cb6db8e2ef0 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 12:58:10 +1000 Subject: [PATCH 179/180] fix: re-sort pkg_additional_info.yaml after removing build_number overrides vinca-sort-yaml-keys groups build_number-override entries at the bottom; with libg2o's build_number gone (only additional_cmake_args left), it now sorts alphabetically with the regular entries instead. Co-Authored-By: Claude Sonnet 5 --- pkg_additional_info.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg_additional_info.yaml b/pkg_additional_info.yaml index 37bb96083..78584686f 100644 --- a/pkg_additional_info.yaml +++ b/pkg_additional_info.yaml @@ -110,6 +110,8 @@ libcamera: override_version: '0.5.2' libcurl_vendor: additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK" +libg2o: + additional_cmake_args: "-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON" liblz4_vendor: additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK" librealsense2: @@ -230,5 +232,3 @@ visp: override_version: '3.7.0' zenoh_cpp_vendor: additional_cmake_args: "-DAMENT_VENDOR_POLICY=NEVER_VENDOR_IGNORE_SATISFIED_CHECK -DUSE_SYSTEM_ZENOH=ON" -libg2o: - additional_cmake_args: "-DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON" From ecce9da9a81a3c5c1d200fb7b18365de785467e0 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Wed, 9 Sep 2026 15:22:05 +1000 Subject: [PATCH 180/180] fix: pin sip to 6.15 to avoid conda-forge's 6.16.1 ABI regression conda-forge published sip 6.16.1 on 2026-09-08, breaking ABI targeting for packages like qt_gui_cpp_sip ("ABI v12 is being targeted but the libqt_gui_cpp_sip module doesn't support it"). Already hit humble/jazzy's CI (osx-arm64, linux-aarch64) via cache eviction; rolling builds qt_gui_cpp through the same pyqt6/sip stack and carries qt_gui_cpp in its rosdistro snapshot, so it's equally exposed once any platform's cache for that package next evicts. Same fix as humble/jazzy: pin sip to the 6.15 line in vinca_pinning.yaml and regenerate conda_build_config.yaml via vinca-pinning-render. Co-Authored-By: Claude Sonnet 5 --- conda_build_config.yaml | 7 +++++++ vinca_pinning.yaml | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/conda_build_config.yaml b/conda_build_config.yaml index 02c342a48..2b0ba3424 100644 --- a/conda_build_config.yaml +++ b/conda_build_config.yaml @@ -1171,3 +1171,10 @@ libzenohc: - 1.9.0 libzenohcxx: - 1.9.0 + # conda-forge published sip 6.16.1 on 2026-09-08, which broke ABI targeting for + # packages like qt_gui_cpp_sip that build against PyQt-sip's fixed ABI v12 + # (hit this on humble/jazzy first; rolling also builds qt_gui_cpp via + # pyqt6/sip so it's equally exposed). Pin back to the last known-good line + # until upstream fixes it. +sip: + - 6.15 diff --git a/vinca_pinning.yaml b/vinca_pinning.yaml index 7b4c28b13..30ecdc8fb 100644 --- a/vinca_pinning.yaml +++ b/vinca_pinning.yaml @@ -43,6 +43,13 @@ pinning_overrides: - 1.9.0 libzenohcxx: - 1.9.0 + # conda-forge published sip 6.16.1 on 2026-09-08, which broke ABI targeting for + # packages like qt_gui_cpp_sip that build against PyQt-sip's fixed ABI v12 + # (hit this on humble/jazzy first; rolling also builds qt_gui_cpp via + # pyqt6/sip so it's equally exposed). Pin back to the last known-good line + # until upstream fixes it. + sip: + - 6.15 python: - 3.14.* *_cp314 is_python_min: