From 206b9f7579dca0bf212a6b33d6bd42d58635d314 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 09:18:45 +1000 Subject: [PATCH 01/19] Add rmf_dev [skip ci] Ports RoboStack/ros-humble#298. humble's rmf_traffic 3.0.3 gets the Apple Clang fix from open-rmf/rmf_traffic#98, in its bundled fcl and Eigen3::Eigen (Eigen 5 no longer sets EIGEN3_INCLUDE_DIRS); rmf_utils includes ; nlohmann_json_schema_validator_vendor passes CMAKE_POLICY_VERSION_MINIMUM to its external project (CMake 4). Co-authored-by: Wen-Chung (Andy) Cheng <21079375+Ac31415@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 --- ...lohmann-json-schema-validator-vendor.patch | 13 + distros/humble/patch/ros2-rmf-traffic.patch | 345 ++++++++++++++++++ distros/humble/patch/ros2-rmf-utils.patch | 12 + shared/vinca.yaml | 1 + 4 files changed, 371 insertions(+) create mode 100644 distros/humble/patch/ros2-nlohmann-json-schema-validator-vendor.patch create mode 100644 distros/humble/patch/ros2-rmf-traffic.patch create mode 100644 distros/humble/patch/ros2-rmf-utils.patch diff --git a/distros/humble/patch/ros2-nlohmann-json-schema-validator-vendor.patch b/distros/humble/patch/ros2-nlohmann-json-schema-validator-vendor.patch new file mode 100644 index 00000000..a2a503cd --- /dev/null +++ b/distros/humble/patch/ros2-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/distros/humble/patch/ros2-rmf-traffic.patch b/distros/humble/patch/ros2-rmf-traffic.patch new file mode 100644 index 00000000..00f69343 --- /dev/null +++ b/distros/humble/patch/ros2-rmf-traffic.patch @@ -0,0 +1,345 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 180bd2c..7e40537 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -96,6 +96,7 @@ endif() + + target_link_libraries(rmf_traffic + PUBLIC ++ Eigen3::Eigen + rmf_utils::rmf_utils + Threads::Threads + PRIVATE +diff --git a/include/rmf_traffic/schedule/Database.hpp b/include/rmf_traffic/schedule/Database.hpp +index 6318012..2d27b4b 100644 +--- a/include/rmf_traffic/schedule/Database.hpp ++++ b/include/rmf_traffic/schedule/Database.hpp +@@ -113,7 +113,7 @@ public: + + // Documentation inherited from Viewer + std::shared_ptr get_participant( +- std::size_t participant_id) const final; ++ ParticipantId participant_id) const final; + + // Documentation inherited from Viewer + Version latest_version() const; +@@ -125,11 +125,11 @@ public: + + // Documentation inherited from ItineraryViewer + std::optional get_itinerary( +- std::size_t participant_id) const final; ++ ParticipantId participant_id) const final; + + // Documentation inherited from ItineraryViewer + std::optional get_current_plan_id( +- std::size_t participant_id) const final; ++ ParticipantId participant_id) const final; + + // Documentation inherited from ItineraryViewer + const std::vector* get_current_progress( +diff --git a/include/rmf_traffic/schedule/Mirror.hpp b/include/rmf_traffic/schedule/Mirror.hpp +index 14c3c9e..f6a6108 100644 +--- a/include/rmf_traffic/schedule/Mirror.hpp ++++ b/include/rmf_traffic/schedule/Mirror.hpp +@@ -51,11 +51,11 @@ public: + + // Documentation inherited from Viewer + std::shared_ptr get_participant( +- std::size_t participant_id) const final; ++ ParticipantId participant_id) const final; + + // Documentation inherited from Viewer + std::optional get_itinerary( +- std::size_t participant_id) const final; ++ ParticipantId participant_id) const final; + + // Documentation inherited from Viewer + std::optional latest_version() const; +diff --git a/src/rmf_traffic/blockade/geometry.cpp b/src/rmf_traffic/blockade/geometry.cpp +index 049351e..15211a6 100644 +--- a/src/rmf_traffic/blockade/geometry.cpp ++++ b/src/rmf_traffic/blockade/geometry.cpp +@@ -15,6 +15,7 @@ + * + */ + ++#include + #include "geometry.hpp" + + #include +diff --git a/src/rmf_traffic/schedule/Database.cpp b/src/rmf_traffic/schedule/Database.cpp +index 3f6dd48..2377692 100644 +--- a/src/rmf_traffic/schedule/Database.cpp ++++ b/src/rmf_traffic/schedule/Database.cpp +@@ -1303,7 +1303,7 @@ const std::unordered_set& Database::participant_ids() const + + //============================================================================== + std::shared_ptr Database::get_participant( +- std::size_t participant_id) const ++ ParticipantId participant_id) const + { + const auto state_it = _pimpl->descriptions.find(participant_id); + if (state_it == _pimpl->descriptions.end()) +@@ -1320,7 +1320,7 @@ Version Database::latest_version() const + + //============================================================================== + std::optional Database::get_itinerary( +- const std::size_t participant_id) const ++ const ParticipantId participant_id) const + { + const auto state_it = _pimpl->states.find(participant_id); + if (state_it == _pimpl->states.end()) +@@ -1345,7 +1345,7 @@ std::optional Database::get_itinerary( + + //============================================================================== + std::optional Database::get_current_plan_id( +- const std::size_t participant_id) const ++ const ParticipantId participant_id) const + { + const auto state_it = _pimpl->states.find(participant_id); + if (state_it == _pimpl->states.end()) +diff --git a/src/rmf_traffic/schedule/Mirror.cpp b/src/rmf_traffic/schedule/Mirror.cpp +index 4c1d710..e84006a 100644 +--- a/src/rmf_traffic/schedule/Mirror.cpp ++++ b/src/rmf_traffic/schedule/Mirror.cpp +@@ -255,7 +255,7 @@ const std::unordered_set& Mirror::participant_ids() const + + //============================================================================== + std::shared_ptr Mirror::get_participant( +- std::size_t participant_id) const ++ ParticipantId participant_id) const + { + const auto p = _pimpl->descriptions.find(participant_id); + if (p == _pimpl->descriptions.end()) +@@ -272,7 +272,7 @@ std::optional Mirror::latest_version() const + + //============================================================================== + std::optional Mirror::get_itinerary( +- const std::size_t participant_id) const ++ const ParticipantId participant_id) const + { + const auto p = _pimpl->states.find(participant_id); + if (p == _pimpl->states.end()) +@@ -297,7 +297,7 @@ std::optional Mirror::get_itinerary( + + //============================================================================== + std::optional Mirror::get_current_plan_id( +- const std::size_t participant_id) const ++ const ParticipantId participant_id) const + { + const auto p = _pimpl->states.find(participant_id); + if (p == _pimpl->states.end()) +diff --git a/test/unit/schedule/test_Spacetime.cpp b/test/unit/schedule/test_Spacetime.cpp +index e96cfb6..140ac52 100644 +--- a/test/unit/schedule/test_Spacetime.cpp ++++ b/test/unit/schedule/test_Spacetime.cpp +@@ -41,8 +41,8 @@ SCENARIO("Testing intersection of spacetime with trajectories") + const auto region_box_shape = rmf_traffic::geometry::make_final_convex< + rmf_traffic::geometry::Box>(10.0, 1.0); + +- std::chrono::_V2::steady_clock::time_point lower_time_bound = time; +- std::chrono::_V2::steady_clock::time_point upper_time_bound = time+10s; ++ std::chrono::steady_clock::time_point lower_time_bound = time; ++ std::chrono::steady_clock::time_point upper_time_bound = time+10s; + + rmf_traffic::internal::Spacetime region = { + &lower_time_bound, +@@ -117,8 +117,8 @@ SCENARIO("Testing intersction of various spacetimes and trajectories") + using namespace std::chrono_literals; + auto time = std::chrono::steady_clock::now(); + Eigen::Isometry2d tf = Eigen::Isometry2d::Identity(); +- std::chrono::_V2::steady_clock::time_point lower_time_bound; +- std::chrono::_V2::steady_clock::time_point upper_time_bound; ++ std::chrono::steady_clock::time_point lower_time_bound; ++ std::chrono::steady_clock::time_point upper_time_bound; + + const auto region_box_shape = rmf_traffic::geometry::make_final_convex< + rmf_traffic::geometry::Box>(10.0, 1.0); +@@ -1210,8 +1210,8 @@ SCENARIO("Testing intersection of curved trajectory with various spacetimes") + GIVEN("spacetime that encompasses the trajectory in space and time") + { + //creating space to create spacetime +- std::chrono::_V2::steady_clock::time_point lower_time_bound = time; +- std::chrono::_V2::steady_clock::time_point upper_time_bound = time+10s; ++ std::chrono::steady_clock::time_point lower_time_bound = time; ++ std::chrono::steady_clock::time_point upper_time_bound = time+10s; + Eigen::Isometry2d tf = Eigen::Isometry2d::Identity(); + + rmf_traffic::internal::Spacetime region = { +@@ -1227,8 +1227,8 @@ SCENARIO("Testing intersection of curved trajectory with various spacetimes") + GIVEN("spacetime that encompasses the trajectory in space but not time") + { + //creating space to create spacetime +- std::chrono::_V2::steady_clock::time_point lower_time_bound = time+20s; +- std::chrono::_V2::steady_clock::time_point upper_time_bound = time+30s; ++ std::chrono::steady_clock::time_point lower_time_bound = time+20s; ++ std::chrono::steady_clock::time_point upper_time_bound = time+30s; + Eigen::Isometry2d tf = Eigen::Isometry2d::Identity(); + + rmf_traffic::internal::Spacetime region = { +@@ -1244,8 +1244,8 @@ SCENARIO("Testing intersection of curved trajectory with various spacetimes") + GIVEN("spacetime that partially intersects the trajectory in space and time") + { + //creating space to create spacetime +- std::chrono::_V2::steady_clock::time_point lower_time_bound = time; +- std::chrono::_V2::steady_clock::time_point upper_time_bound = time+10s; ++ std::chrono::steady_clock::time_point lower_time_bound = time; ++ std::chrono::steady_clock::time_point upper_time_bound = time+10s; + Eigen::Isometry2d tf = Eigen::Isometry2d::Identity(); + + rmf_traffic::internal::Spacetime region = { +@@ -1263,8 +1263,8 @@ SCENARIO("Testing intersection of curved trajectory with various spacetimes") + SCENARIO("Testing multi-waypoint trajectories with various spacetimes") + { + using namespace std::chrono_literals; +- std::chrono::_V2::steady_clock::time_point lower_time_bound; +- std::chrono::_V2::steady_clock::time_point upper_time_bound; ++ std::chrono::steady_clock::time_point lower_time_bound; ++ std::chrono::steady_clock::time_point upper_time_bound; + + const auto small_circle_shape = rmf_traffic::geometry::make_final_convex< + rmf_traffic::geometry::Circle>(0.5); +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/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/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/detail/primitive_shape_algorithm/capsule_capsule-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/capsule_capsule-inl.h +index b316c95..10af788 100644 +--- a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/capsule_capsule-inl.h ++++ b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/capsule_capsule-inl.h +@@ -38,6 +38,7 @@ + #ifndef FCL_NARROWPHASE_DETAIL_CAPSULECAPSULE_INL_H + #define FCL_NARROWPHASE_DETAIL_CAPSULECAPSULE_INL_H + ++#include + #include "fcl/narrowphase/detail/primitive_shape_algorithm/capsule_capsule.h" + + namespace fcl +diff --git a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/plane-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/plane-inl.h +index 1373dce..dd19a87 100755 +--- a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/plane-inl.h ++++ b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/plane-inl.h +@@ -38,6 +38,7 @@ + #ifndef FCL_NARROWPHASE_DETAIL_PLANE_INL_H + #define FCL_NARROWPHASE_DETAIL_PLANE_INL_H + ++#include + #include "fcl/narrowphase/detail/primitive_shape_algorithm/plane.h" + + namespace fcl +diff --git a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box-inl.h +index 77e0a66..a82f049 100644 +--- a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box-inl.h ++++ b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box-inl.h +@@ -37,6 +37,7 @@ + #ifndef FCL_NARROWPHASE_DETAIL_SPHEREBOX_INL_H + #define FCL_NARROWPHASE_DETAIL_SPHEREBOX_INL_H + ++#include + #include "fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box.h" + + namespace fcl { +diff --git a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder-inl.h +index abda262..793f278 100644 +--- a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder-inl.h ++++ b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder-inl.h +@@ -37,6 +37,7 @@ + #ifndef FCL_NARROWPHASE_DETAIL_SPHERECYLINDER_INL_H + #define FCL_NARROWPHASE_DETAIL_SPHERECYLINDER_INL_H + ++#include + #include "fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder.h" + + namespace fcl { +diff --git a/thirdparty/fcl/include/fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node-inl.h +index 44ddde5..2e63bee 100644 +--- a/thirdparty/fcl/include/fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node-inl.h ++++ b/thirdparty/fcl/include/fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node-inl.h +@@ -38,6 +38,7 @@ + #ifndef FCL_TRAVERSAL_MESHCONSERVATIVEADVANCEMENTTRAVERSALNODE_INL_H + #define FCL_TRAVERSAL_MESHCONSERVATIVEADVANCEMENTTRAVERSALNODE_INL_H + ++#include + #include "fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node.h" + + #include "fcl/math/bv/RSS.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/distros/humble/patch/ros2-rmf-utils.patch b/distros/humble/patch/ros2-rmf-utils.patch new file mode 100644 index 00000000..3093acf5 --- /dev/null +++ b/distros/humble/patch/ros2-rmf-utils.patch @@ -0,0 +1,12 @@ +diff --git a/include/rmf_utils/Modular.hpp b/include/rmf_utils/Modular.hpp +index c994808..ca8397c 100644 +--- a/include/rmf_utils/Modular.hpp ++++ b/include/rmf_utils/Modular.hpp +@@ -19,6 +19,7 @@ + #define RMF_UTILS__MODULAR_HPP + + #include ++#include + #include + #include + diff --git a/shared/vinca.yaml b/shared/vinca.yaml index c93bc085..e8f10fff 100644 --- a/shared/vinca.yaml +++ b/shared/vinca.yaml @@ -267,6 +267,7 @@ packages_select_by_deps: - realsense2_description # IntelRealSense - realtime_tools - rmf_demos + - rmf_dev # Open RMF; requested in https://github.com/RoboStack/ros-humble/pull/298 - rmw - rmw_stats_shim - rmw_zenoh_cpp From d8c07efe8d642a7a07422c38270d239d82c9a333 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 11:55:02 +1000 Subject: [PATCH 02/19] humble: the rest of the RMF stack for rmf_dev [skip ci] Found building rmf_dev's closure for humble on osx-arm64 (humble never built RMF before): - rmf_traffic: also the test part of open-rmf/rmf_traffic#98 - rmf_websocket: Boost.System is header-only (no boost_system since 1.89) - rmf_traffic_ros2: lyrical's patch (macOS uuid comes from the SDK, Eigen3::Eigen) - rmf_fleet_adapter: malloc.h/malloc_trim only on Linux, RxCpp's const copy-assignment removed (newer clang rejects it), std::max and std::size_t lane vectors (uint64_t is unsigned long long on macOS) - rmf_robot_sim_common: EIGEN3_INCLUDE_DIRS from Eigen3::Eigen (Eigen 5), sdformat parameters read as uint64_t - rmf_robot_sim_gz_plugins: link the gazebo gui library, drop a declared but never defined slot - rmf_building_sim_gz_classic_plugins: OpenCV 5 geometry header, link libgazebo; excluded off Linux (Gazebo Classic, more link errors on macOS) - rmf_building_map_tools: its patch is upstream in 1.6.3 (np.asscalar) - robostack.yaml: map ignition-fortress to the Fortress libraries Co-Authored-By: Claude Opus 5.5 --- .../patch/ros2-rmf-building-map-tools.patch | 24 --- ...-rmf-building-sim-gz-classic-plugins.patch | 29 ++++ .../humble/patch/ros2-rmf-fleet-adapter.patch | 140 ++++++++++++++++++ .../patch/ros2-rmf-robot-sim-common.patch | 39 +++++ .../patch/ros2-rmf-robot-sim-gz-plugins.patch | 34 +++++ .../humble/patch/ros2-rmf-traffic-ros2.patch | 39 +++++ distros/humble/patch/ros2-rmf-websocket.patch | 22 +++ distros/humble/vinca.yaml | 2 + shared/robostack.yaml | 5 + 9 files changed, 310 insertions(+), 24 deletions(-) delete mode 100644 distros/humble/patch/ros2-rmf-building-map-tools.patch create mode 100644 distros/humble/patch/ros2-rmf-building-sim-gz-classic-plugins.patch create mode 100644 distros/humble/patch/ros2-rmf-fleet-adapter.patch create mode 100644 distros/humble/patch/ros2-rmf-robot-sim-common.patch create mode 100644 distros/humble/patch/ros2-rmf-robot-sim-gz-plugins.patch create mode 100644 distros/humble/patch/ros2-rmf-traffic-ros2.patch create mode 100644 distros/humble/patch/ros2-rmf-websocket.patch diff --git a/distros/humble/patch/ros2-rmf-building-map-tools.patch b/distros/humble/patch/ros2-rmf-building-map-tools.patch deleted file mode 100644 index bb22014d..00000000 --- a/distros/humble/patch/ros2-rmf-building-map-tools.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/building_map/transform.py b/building_map/transform.py -index a3980ab..a9286c6 100644 ---- a/building_map/transform.py -+++ b/building_map/transform.py -@@ -29,7 +29,7 @@ class Transform: - def transform_point(self, p): - vec = np.array([[p[0]], [p[1]]]) - transformed = (self.rot_mat @ vec) * self.scale + self.t_vec -- return (np.asscalar(transformed[0]), np.asscalar(transformed[1])) -+ return (transformed.item(0), transformed.item(1)) - - def set_from_fiducials(self, fiducial_pairs, ref_scale): - print(f'Transform.set_from_fiducials()') -@@ -93,8 +93,8 @@ class Transform: - f1x = f_pair[1].x / mean_rel_scale - f1y = f_pair[1].y / mean_rel_scale - rot_f_pair1 = rot_mat @ np.array([[f1x], [f1y]]) -- rot_f1x = np.asscalar(rot_f_pair1[0]) -- rot_f1y = np.asscalar(rot_f_pair1[1]) -+ rot_f1x = rot_f_pair1.item(0) -+ rot_f1y = rot_f_pair1.item(1) - - mean_translation[0] += rot_f1x - f_pair[0].x - mean_translation[1] += rot_f1y - f_pair[0].y diff --git a/distros/humble/patch/ros2-rmf-building-sim-gz-classic-plugins.patch b/distros/humble/patch/ros2-rmf-building-sim-gz-classic-plugins.patch new file mode 100644 index 00000000..f76dc3b0 --- /dev/null +++ b/distros/humble/patch/ros2-rmf-building-sim-gz-classic-plugins.patch @@ -0,0 +1,29 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 9ffa144..c890ff0 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -148,6 +148,9 @@ target_include_directories(crowd_simulator + ${rmf_building_sim_common_INCLUDE_DIRS} + ) + ++# libgazebo and sdformat (macOS links with -undefined error) ++target_link_libraries(crowd_simulator ${GAZEBO_LIBRARIES}) ++ + ############################### + # install stuff + ############################### +diff --git a/src/thumbnail_generator.cpp b/src/thumbnail_generator.cpp +index 584a92f..c41c8cf 100644 +--- a/src/thumbnail_generator.cpp ++++ b/src/thumbnail_generator.cpp +@@ -21,6 +21,10 @@ + #include + #include + #include ++#if __has_include() ++// OpenCV 5 moved cv::boundingRect to the geometry module ++#include ++#endif + + #include "gazebo/msgs/msgs.hh" + #include "gazebo/transport/transport.hh" diff --git a/distros/humble/patch/ros2-rmf-fleet-adapter.patch b/distros/humble/patch/ros2-rmf-fleet-adapter.patch new file mode 100644 index 00000000..255aa5dc --- /dev/null +++ b/distros/humble/patch/ros2-rmf-fleet-adapter.patch @@ -0,0 +1,140 @@ +diff --git a/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-notification.hpp b/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-notification.hpp +index 20e0c69..0fae30f 100644 +--- a/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-notification.hpp ++++ b/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-notification.hpp +@@ -150,7 +150,6 @@ private: + } + on_error_notification(const on_error_notification& o) : ep(o.ep) {} + on_error_notification(const on_error_notification&& o) : ep(std::move(o.ep)) {} +- on_error_notification& operator=(on_error_notification o) { ep = std::move(o.ep); return *this; } + virtual void out(std::ostream& os) const { + os << "on_error("; + os << rxu::what(ep); +diff --git a/src/full_control/main.cpp b/src/full_control/main.cpp +index e979212..6ae1df8 100644 +--- a/src/full_control/main.cpp ++++ b/src/full_control/main.cpp +@@ -1039,8 +1039,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 +1097,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/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 6edcf44..e9e8d78 100644 +--- a/src/rmf_fleet_adapter/TaskManager.cpp ++++ b/src/rmf_fleet_adapter/TaskManager.cpp +@@ -344,9 +344,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"]; + +@@ -410,7 +410,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()); + } + + //============================================================================== +@@ -484,9 +484,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()); +@@ -1838,7 +1838,7 @@ rmf_task::State TaskManager::_publish_pending_task( + const auto estimate = + pending.finish_state().time().value() - pending.deployment_time(); + pending_json["original_estimate_millis"] = +- std::max(0l, to_millis(estimate).count()); ++ std::max(0, to_millis(estimate).count()); + } + copy_assignment(pending_json["assigned_to"], *_context); + pending_json["status"] = "queued"; +diff --git a/src/rmf_fleet_adapter/agv/internal_FleetUpdateHandle.hpp b/src/rmf_fleet_adapter/agv/internal_FleetUpdateHandle.hpp +index 56e8e5a..a27465c 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 { +@@ -360,7 +362,12 @@ 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/distros/humble/patch/ros2-rmf-robot-sim-common.patch b/distros/humble/patch/ros2-rmf-robot-sim-common.patch new file mode 100644 index 00000000..e369277e --- /dev/null +++ b/distros/humble/patch/ros2-rmf-robot-sim-common.patch @@ -0,0 +1,39 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 250bb9a..ff56169 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -18,6 +18,10 @@ endif() + + find_package(eigen3_cmake_module REQUIRED) + find_package(Eigen3 REQUIRED) ++if(NOT EIGEN3_INCLUDE_DIRS) ++ # Eigen 5's CMake config only provides the Eigen3::Eigen target ++ get_target_property(EIGEN3_INCLUDE_DIRS Eigen3::Eigen INTERFACE_INCLUDE_DIRECTORIES) ++endif() + find_package(ament_cmake REQUIRED) + find_package(rclcpp REQUIRED) + find_package(geometry_msgs REQUIRED) +diff --git a/include/rmf_robot_sim_common/readonly_common.hpp b/include/rmf_robot_sim_common/readonly_common.hpp +index 3621daf..b3f493f 100644 +--- a/include/rmf_robot_sim_common/readonly_common.hpp ++++ b/include/rmf_robot_sim_common/readonly_common.hpp +@@ -122,7 +122,8 @@ void ReadonlyCommon::read_sdf(SdfPtrT& sdf) + RCLCPP_INFO(logger(), "Setting level name to: %s", _level_name.c_str()); + + if (sdf->HasElement("graph_index")) +- _nav_graph_index = sdf->template Get("graph_index"); ++ // sdformat has no std::size_t parameter type where it is unsigned long (macOS) ++ _nav_graph_index = static_cast(sdf->template Get("graph_index")); + RCLCPP_INFO(logger(), "Setting nav graph index: %d", _nav_graph_index); + + if (sdf->HasElement("spawn_waypoint")) +@@ -130,7 +131,8 @@ void ReadonlyCommon::read_sdf(SdfPtrT& sdf) + RCLCPP_INFO(logger(), "Setting start wp name: %s", _start_wp_name.c_str()); + + if (sdf->HasElement("look_ahead")) +- _lookahead = sdf->template Get("look_ahead"); ++ // sdformat has no std::size_t parameter type where it is unsigned long (macOS) ++ _lookahead = static_cast(sdf->template Get("look_ahead")); + _lookahead = _lookahead < 1 ? 1 : _lookahead; + _next_wp.resize(_lookahead); + _path.resize(_lookahead); diff --git a/distros/humble/patch/ros2-rmf-robot-sim-gz-plugins.patch b/distros/humble/patch/ros2-rmf-robot-sim-gz-plugins.patch new file mode 100644 index 00000000..3183c1a8 --- /dev/null +++ b/distros/humble/patch/ros2-rmf-robot-sim-gz-plugins.patch @@ -0,0 +1,34 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 352806f..5332f2d 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -24,7 +24,7 @@ find_package(rclcpp REQUIRED) + + find_package(ignition-cmake2 REQUIRED) + +-ign_find_package(ignition-gazebo6 REQUIRED) ++ign_find_package(ignition-gazebo6 REQUIRED COMPONENTS gui) + set(IGN_GAZEBO_VER 6) + ign_find_package(ignition-plugin1 REQUIRED COMPONENTS register) + set(IGN_PLUGIN_VER 1) +@@ -173,6 +173,8 @@ ament_target_dependencies(LightTuning + Qt5Quick + rclcpp + ) ++# GuiSystem lives in the gui library (macOS doesn't allow it to stay undefined) ++target_link_libraries(LightTuning ignition-gazebo${IGN_GAZEBO_VER}::ignition-gazebo${IGN_GAZEBO_VER}-gui) + + target_include_directories(LightTuning + PUBLIC +diff --git a/src/LightTuning/LightTuning.cpp b/src/LightTuning/LightTuning.cpp +index 0b23f05..bb52ad7 100644 +--- a/src/LightTuning/LightTuning.cpp ++++ b/src/LightTuning/LightTuning.cpp +@@ -450,7 +450,6 @@ signals: + void markerSelected(QString nm); + + public slots: +- void OnLightTypeSelect(sdf::Light& light, const QString& type); + void OnCreateLightBtnPress( + int idx, bool cast_shadow, const QString& type, + const QString& name, const QString& pose_str, diff --git a/distros/humble/patch/ros2-rmf-traffic-ros2.patch b/distros/humble/patch/ros2-rmf-traffic-ros2.patch new file mode 100644 index 00000000..51425713 --- /dev/null +++ b/distros/humble/patch/ros2-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/distros/humble/patch/ros2-rmf-websocket.patch b/distros/humble/patch/ros2-rmf-websocket.patch new file mode 100644 index 00000000..c48b1a7a --- /dev/null +++ b/distros/humble/patch/ros2-rmf-websocket.patch @@ -0,0 +1,22 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index abc3bae..2cef478 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -21,7 +21,8 @@ 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 filesystem REQUIRED) ++# Boost.System is header-only (no boost_system library since Boost 1.89) ++find_package(Boost COMPONENTS filesystem REQUIRED) + find_package(Threads) + + file(GLOB_RECURSE core_lib_srcs "src/rmf_websocket/*.cpp") +@@ -36,7 +37,6 @@ target_link_libraries(rmf_websocket + nlohmann_json_schema_validator + PRIVATE + ${Boost_FILESYSTEM_LIBRARY} +- ${Boost_SYSTEM_LIBRARY} + Threads::Threads + ) + diff --git a/distros/humble/vinca.yaml b/distros/humble/vinca.yaml index 6ddebe7c..2bc96f54 100644 --- a/distros/humble/vinca.yaml +++ b/distros/humble/vinca.yaml @@ -18,6 +18,8 @@ packages_exclude: - mujoco_ros2_control # runtime uses Linux-specific files (as everywhere) - mujoco_ros2_control_demos # readlink and Linux-specific files at runtime (as everywhere) - rclc_examples # MSVC C2055 on rcl_timer_t callbacks; macOS humble-only (no reason recorded) + - rmf_building_sim_gz_classic_plugins # Gazebo Classic (EOL) plugins: macOS link errors against libgazebo/sdformat9; not tried on Windows + - rmf_robot_sim_gz_classic_plugins # Gazebo Classic (EOL) plugins, as rmf_building_sim_gz_classic_plugins - if: win then: diff --git a/shared/robostack.yaml b/shared/robostack.yaml index e1dd8aea..fbfa0159 100644 --- a/shared/robostack.yaml +++ b/shared/robostack.yaml @@ -175,6 +175,11 @@ ignition-cmake2: robostack: [libignition-cmake2] ignition-common4: robostack: [libignition-common4] +ignition-fortress: + robostack: + linux: [libignition-cmake2, libignition-common4, libignition-gazebo6, libignition-gui6, libignition-math6, libignition-msgs8, libignition-plugin1, libignition-rendering6, libignition-transport11, libgl-devel] + osx: [libignition-cmake2, libignition-common4, libignition-gazebo6, libignition-gui6, libignition-math6, libignition-msgs8, libignition-plugin1, libignition-rendering6, libignition-transport11] + win64: [libignition-cmake2, libignition-common4, libignition-gazebo6, libignition-gui6, libignition-math6, libignition-msgs8, libignition-plugin1, libignition-rendering6, libignition-transport11] ignition-gazebo3: robostack: [libignition-gazebo5] ignition-gazebo5: From c8d2dc4d60040783f31a8613fdacf3ca8e612672 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 12:17:06 +1000 Subject: [PATCH 03/19] nlohmann_json_schema_validator_vendor: shared CMake 4 fix for humble and jazzy [skip ci] jazzy's 0.4.1 (needed by rmf_dev there) fails the same way as humble's 0.2.5: its external project declares cmake_minimum_required < 3.5. The same one-line patch applies to both, so share it; lyrical and rolling keep their own patch for 0.6.1/0.5.0. Co-Authored-By: Claude Opus 5.5 --- .../patch/ros2-nlohmann-json-schema-validator-vendor.patch | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {distros/humble => shared}/patch/ros2-nlohmann-json-schema-validator-vendor.patch (100%) diff --git a/distros/humble/patch/ros2-nlohmann-json-schema-validator-vendor.patch b/shared/patch/ros2-nlohmann-json-schema-validator-vendor.patch similarity index 100% rename from distros/humble/patch/ros2-nlohmann-json-schema-validator-vendor.patch rename to shared/patch/ros2-nlohmann-json-schema-validator-vendor.patch From 8af33ae1d0715a58c5f883854aea15cb255f2c83 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 13:29:49 +1000 Subject: [PATCH 04/19] pybind11_json_vendor: conda-forge's pybind11_json for every distribution [skip ci] The shared pkg_additional_info.yaml builds pybind11_json_vendor with AMENT_VENDOR_POLICY=NEVER_VENDOR, but only humble and lyrical added pybind11_json as a dependency, so jazzy (pulled in by rmf_dev) failed: "SATISFIED argument is not TRUE, but AMENT_VENDOR_POLICY is set to NEVER_VENDOR". Move the dependency to the shared dependencies.yaml. Co-Authored-By: Claude Opus 5.5 --- distros/humble/patch/dependencies.yaml | 3 --- distros/lyrical/patch/dependencies.yaml | 3 --- shared/patch/dependencies.yaml | 4 ++++ 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/distros/humble/patch/dependencies.yaml b/distros/humble/patch/dependencies.yaml index 3f8d989c..426a4ab6 100644 --- a/distros/humble/patch/dependencies.yaml +++ b/distros/humble/patch/dependencies.yaml @@ -93,9 +93,6 @@ py_trees_ros_tutorials: # PyQt6 (the rqt stack) can't be installed together remove_run: ["pyqt", "pyqt-builder"] add_run: ["pyqt6"] -pybind11_json_vendor: - add_host: ["pybind11_json"] - add_run: ["pybind11_json"] python_qt_binding: # pyside2 has no python 3.14 build; port to PyQt6 instead. remove_host: ["qt-main", "pyqt"] diff --git a/distros/lyrical/patch/dependencies.yaml b/distros/lyrical/patch/dependencies.yaml index 3a162666..8221fb12 100644 --- a/distros/lyrical/patch/dependencies.yaml +++ b/distros/lyrical/patch/dependencies.yaml @@ -132,9 +132,6 @@ py_trees_ros_tutorials: add_run: ["pyqt6"] py_trees_ros_viewer: add_host: ["poetry-core"] -pybind11_json_vendor: - add_host: ["pybind11_json"] - add_run: ["pybind11_json"] python_qt_binding: add_host: ["pyqt-builder", "qt6-main", "pyqt6"] add_run: ["pyqt-builder", "qt6-main", "pyqt6"] diff --git a/shared/patch/dependencies.yaml b/shared/patch/dependencies.yaml index 0a42505a..db0ff701 100644 --- a/shared/patch/dependencies.yaml +++ b/shared/patch/dependencies.yaml @@ -115,6 +115,10 @@ plotjuggler_ros: add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}"] popf: add_host: ["perl"] +pybind11_json_vendor: + # the shared NEVER_VENDOR policy (pkg_additional_info.yaml) needs conda-forge's pybind11_json + add_host: ["pybind11_json"] + add_run: ["pybind11_json"] pybind11_vendor: add_host: ["pybind11"] add_run: ["pybind11"] From 59cdd6ffe49b80909e8a52456d618296d1059f73 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 13:53:18 +1000 Subject: [PATCH 05/19] jazzy: rmf_traffic patch for rmf_dev [skip ci] rmf_dev also brings rmf_traffic 3.3.3 to jazzy, which fails with GCC 15: ParticipantDescription.hpp uses uint16_t/uint64_t without . Add that include, plus lyrical's rmf_traffic changes (Eigen3::Eigen for Eigen 5, ), which apply unchanged. Co-Authored-By: Claude Opus 5.5 --- distros/jazzy/patch/ros2-rmf-traffic.patch | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 distros/jazzy/patch/ros2-rmf-traffic.patch diff --git a/distros/jazzy/patch/ros2-rmf-traffic.patch b/distros/jazzy/patch/ros2-rmf-traffic.patch new file mode 100644 index 00000000..9c560f9c --- /dev/null +++ b/distros/jazzy/patch/ros2-rmf-traffic.patch @@ -0,0 +1,49 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 8d341d0..324322f 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -96,6 +96,7 @@ endif() + + target_link_libraries(rmf_traffic + PUBLIC ++ Eigen3::Eigen + rmf_utils::rmf_utils + Threads::Threads + PRIVATE +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/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/math/motion/taylor_model/taylor_model-inl.h b/thirdparty/fcl/include/fcl/math/motion/taylor_model/taylor_model-inl.h +index 861f72d..a239104 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,8 @@ + #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 From 51926ca78cedf894fbd323c8c648baa323e20a09 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 14:03:47 +1000 Subject: [PATCH 06/19] rmf_dev: port rolling's RMF fixes to humble and jazzy [skip ci] rmf_task (, needed by GCC 15 on linux-64), rmf_building_map_tools (numpy 2 cross product), rmf_visualization_floorplans (OpenCV imread flag), rmf_visualization_schedule (standalone asio, Boost 1.90), and for jazzy rmf_utils (WINDOWS_EXPORT_ALL_SYMBOLS) and rmf_traffic_ros2 (macOS LibUUID). humble's rmf_utils patch gains the Windows export hunk. All apply cleanly to the sync snapshot tags. Co-Authored-By: Claude Opus 5.5 --- .../patch/ros2-rmf-building-map-tools.patch | 16 ++ distros/humble/patch/ros2-rmf-task.patch | 168 ++++++++++++++++++ distros/humble/patch/ros2-rmf-utils.patch | 14 ++ .../ros2-rmf-visualization-floorplans.patch | 26 +++ .../ros2-rmf-visualization-schedule.patch | 16 ++ .../patch/ros2-rmf-building-map-tools.patch | 16 ++ distros/jazzy/patch/ros2-rmf-task.patch | 168 ++++++++++++++++++ .../jazzy/patch/ros2-rmf-traffic-ros2.patch | 39 ++++ distros/jazzy/patch/ros2-rmf-utils.patch | 14 ++ .../ros2-rmf-visualization-floorplans.patch | 26 +++ .../ros2-rmf-visualization-schedule.patch | 16 ++ 11 files changed, 519 insertions(+) create mode 100644 distros/humble/patch/ros2-rmf-building-map-tools.patch create mode 100644 distros/humble/patch/ros2-rmf-task.patch create mode 100644 distros/humble/patch/ros2-rmf-visualization-floorplans.patch create mode 100644 distros/humble/patch/ros2-rmf-visualization-schedule.patch create mode 100644 distros/jazzy/patch/ros2-rmf-building-map-tools.patch create mode 100644 distros/jazzy/patch/ros2-rmf-task.patch create mode 100644 distros/jazzy/patch/ros2-rmf-traffic-ros2.patch create mode 100644 distros/jazzy/patch/ros2-rmf-utils.patch create mode 100644 distros/jazzy/patch/ros2-rmf-visualization-floorplans.patch create mode 100644 distros/jazzy/patch/ros2-rmf-visualization-schedule.patch diff --git a/distros/humble/patch/ros2-rmf-building-map-tools.patch b/distros/humble/patch/ros2-rmf-building-map-tools.patch new file mode 100644 index 00000000..94e081e3 --- /dev/null +++ b/distros/humble/patch/ros2-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/distros/humble/patch/ros2-rmf-task.patch b/distros/humble/patch/ros2-rmf-task.patch new file mode 100644 index 00000000..2019760f --- /dev/null +++ b/distros/humble/patch/ros2-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 { diff --git a/distros/humble/patch/ros2-rmf-utils.patch b/distros/humble/patch/ros2-rmf-utils.patch index 3093acf5..e5d7e0e8 100644 --- a/distros/humble/patch/ros2-rmf-utils.patch +++ b/distros/humble/patch/ros2-rmf-utils.patch @@ -1,3 +1,17 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index a93554f..a08c67a 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -14,6 +14,9 @@ include(GNUInstallDirs) + + file(GLOB_RECURSE lib_srcs "src/rmf_utils/*.cpp") + add_library(rmf_utils SHARED ${lib_srcs}) ++if(WIN32) ++ set_target_properties(rmf_utils PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) ++endif() + + target_include_directories(rmf_utils + PUBLIC diff --git a/include/rmf_utils/Modular.hpp b/include/rmf_utils/Modular.hpp index c994808..ca8397c 100644 --- a/include/rmf_utils/Modular.hpp diff --git a/distros/humble/patch/ros2-rmf-visualization-floorplans.patch b/distros/humble/patch/ros2-rmf-visualization-floorplans.patch new file mode 100644 index 00000000..1ae964f5 --- /dev/null +++ b/distros/humble/patch/ros2-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/distros/humble/patch/ros2-rmf-visualization-schedule.patch b/distros/humble/patch/ros2-rmf-visualization-schedule.patch new file mode 100644 index 00000000..6c1c2f5d --- /dev/null +++ b/distros/humble/patch/ros2-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) diff --git a/distros/jazzy/patch/ros2-rmf-building-map-tools.patch b/distros/jazzy/patch/ros2-rmf-building-map-tools.patch new file mode 100644 index 00000000..94e081e3 --- /dev/null +++ b/distros/jazzy/patch/ros2-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/distros/jazzy/patch/ros2-rmf-task.patch b/distros/jazzy/patch/ros2-rmf-task.patch new file mode 100644 index 00000000..2019760f --- /dev/null +++ b/distros/jazzy/patch/ros2-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 { diff --git a/distros/jazzy/patch/ros2-rmf-traffic-ros2.patch b/distros/jazzy/patch/ros2-rmf-traffic-ros2.patch new file mode 100644 index 00000000..51425713 --- /dev/null +++ b/distros/jazzy/patch/ros2-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/distros/jazzy/patch/ros2-rmf-utils.patch b/distros/jazzy/patch/ros2-rmf-utils.patch new file mode 100644 index 00000000..2d804cc2 --- /dev/null +++ b/distros/jazzy/patch/ros2-rmf-utils.patch @@ -0,0 +1,14 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 125a926..59fa385 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -14,6 +14,9 @@ include(GNUInstallDirs) + + file(GLOB_RECURSE lib_srcs "src/rmf_utils/*.cpp") + add_library(rmf_utils SHARED ${lib_srcs}) ++if(WIN32) ++ set_target_properties(rmf_utils PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) ++endif() + + target_include_directories(rmf_utils + PUBLIC diff --git a/distros/jazzy/patch/ros2-rmf-visualization-floorplans.patch b/distros/jazzy/patch/ros2-rmf-visualization-floorplans.patch new file mode 100644 index 00000000..1ae964f5 --- /dev/null +++ b/distros/jazzy/patch/ros2-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/distros/jazzy/patch/ros2-rmf-visualization-schedule.patch b/distros/jazzy/patch/ros2-rmf-visualization-schedule.patch new file mode 100644 index 00000000..6c1c2f5d --- /dev/null +++ b/distros/jazzy/patch/ros2-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 4bceba66d26ebb63ec18d42baa263a3000bc6649 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 14:51:48 +1000 Subject: [PATCH 07/19] jazzy: rmf_visualization_floorplans and rmf_robot_sim_common with Eigen 5 [skip ci] Eigen 5's CMake config only provides the Eigen3::Eigen target, not the Eigen3_INCLUDE_DIRS that ament_target_dependencies and these CMakeLists use: floorplans now links Eigen3::Eigen, and robot_sim_common takes humble's patch (which also reads the sdformat size_t parameters as uint64_t on macOS). Co-Authored-By: Claude Opus 5.5 --- .../patch/ros2-rmf-robot-sim-common.patch | 39 +++++++++++++++++++ .../ros2-rmf-visualization-floorplans.patch | 16 +++++++- 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 distros/jazzy/patch/ros2-rmf-robot-sim-common.patch diff --git a/distros/jazzy/patch/ros2-rmf-robot-sim-common.patch b/distros/jazzy/patch/ros2-rmf-robot-sim-common.patch new file mode 100644 index 00000000..e369277e --- /dev/null +++ b/distros/jazzy/patch/ros2-rmf-robot-sim-common.patch @@ -0,0 +1,39 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 250bb9a..ff56169 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -18,6 +18,10 @@ endif() + + find_package(eigen3_cmake_module REQUIRED) + find_package(Eigen3 REQUIRED) ++if(NOT EIGEN3_INCLUDE_DIRS) ++ # Eigen 5's CMake config only provides the Eigen3::Eigen target ++ get_target_property(EIGEN3_INCLUDE_DIRS Eigen3::Eigen INTERFACE_INCLUDE_DIRECTORIES) ++endif() + find_package(ament_cmake REQUIRED) + find_package(rclcpp REQUIRED) + find_package(geometry_msgs REQUIRED) +diff --git a/include/rmf_robot_sim_common/readonly_common.hpp b/include/rmf_robot_sim_common/readonly_common.hpp +index 3621daf..b3f493f 100644 +--- a/include/rmf_robot_sim_common/readonly_common.hpp ++++ b/include/rmf_robot_sim_common/readonly_common.hpp +@@ -122,7 +122,8 @@ void ReadonlyCommon::read_sdf(SdfPtrT& sdf) + RCLCPP_INFO(logger(), "Setting level name to: %s", _level_name.c_str()); + + if (sdf->HasElement("graph_index")) +- _nav_graph_index = sdf->template Get("graph_index"); ++ // sdformat has no std::size_t parameter type where it is unsigned long (macOS) ++ _nav_graph_index = static_cast(sdf->template Get("graph_index")); + RCLCPP_INFO(logger(), "Setting nav graph index: %d", _nav_graph_index); + + if (sdf->HasElement("spawn_waypoint")) +@@ -130,7 +131,8 @@ void ReadonlyCommon::read_sdf(SdfPtrT& sdf) + RCLCPP_INFO(logger(), "Setting start wp name: %s", _start_wp_name.c_str()); + + if (sdf->HasElement("look_ahead")) +- _lookahead = sdf->template Get("look_ahead"); ++ // sdformat has no std::size_t parameter type where it is unsigned long (macOS) ++ _lookahead = static_cast(sdf->template Get("look_ahead")); + _lookahead = _lookahead < 1 ? 1 : _lookahead; + _next_wp.resize(_lookahead); + _path.resize(_lookahead); diff --git a/distros/jazzy/patch/ros2-rmf-visualization-floorplans.patch b/distros/jazzy/patch/ros2-rmf-visualization-floorplans.patch index 1ae964f5..7a9b9cbb 100644 --- a/distros/jazzy/patch/ros2-rmf-visualization-floorplans.patch +++ b/distros/jazzy/patch/ros2-rmf-visualization-floorplans.patch @@ -1,5 +1,19 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index a4a50fa..3e74cd5 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -38,6 +38,9 @@ ament_target_dependencies(floorplan_visualizer + ) + + ++# Eigen 5's config doesn't set the Eigen3_INCLUDE_DIRS that ament_target_dependencies uses ++target_link_libraries(floorplan_visualizer PUBLIC Eigen3::Eigen) ++ + target_include_directories(floorplan_visualizer + PRIVATE + $ diff --git a/src/FloorplanVisualizer.cpp b/src/FloorplanVisualizer.cpp -index 15c07c0..6c6035e 100644 +index e0eefa6..4fb84b0 100644 --- a/src/FloorplanVisualizer.cpp +++ b/src/FloorplanVisualizer.cpp @@ -74,7 +74,9 @@ FloorplanVisualizer::FloorplanVisualizer(const rclcpp::NodeOptions& options) From c63f1fcee593dbd9431aa9d8cab6240a221a6037 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 14:59:33 +1000 Subject: [PATCH 08/19] jazzy: rmf_websocket without Boost.System; drop the duplicate rmf_utils patch [skip ci] Boost 1.90 has no boost_system library (Boost.System is header-only), so rmf_websocket's find_package(Boost COMPONENTS system) fails: link Boost::headers instead. The rmf_utils Windows export taken from rolling duplicates the jazzy sync's own ros2-rmf-utils.win.patch, so remove it again. Co-Authored-By: Claude Opus 5.5 --- distros/jazzy/patch/ros2-rmf-utils.patch | 14 ----- distros/jazzy/patch/ros2-rmf-websocket.patch | 59 ++++++++++++++++++++ 2 files changed, 59 insertions(+), 14 deletions(-) delete mode 100644 distros/jazzy/patch/ros2-rmf-utils.patch create mode 100644 distros/jazzy/patch/ros2-rmf-websocket.patch diff --git a/distros/jazzy/patch/ros2-rmf-utils.patch b/distros/jazzy/patch/ros2-rmf-utils.patch deleted file mode 100644 index 2d804cc2..00000000 --- a/distros/jazzy/patch/ros2-rmf-utils.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 125a926..59fa385 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -14,6 +14,9 @@ include(GNUInstallDirs) - - file(GLOB_RECURSE lib_srcs "src/rmf_utils/*.cpp") - add_library(rmf_utils SHARED ${lib_srcs}) -+if(WIN32) -+ set_target_properties(rmf_utils PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON) -+endif() - - target_include_directories(rmf_utils - PUBLIC diff --git a/distros/jazzy/patch/ros2-rmf-websocket.patch b/distros/jazzy/patch/ros2-rmf-websocket.patch new file mode 100644 index 00000000..54d25865 --- /dev/null +++ b/distros/jazzy/patch/ros2-rmf-websocket.patch @@ -0,0 +1,59 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 6c6745a..4d5c35d 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -21,7 +21,8 @@ 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) ++# Boost.System is header-only (no boost_system library since Boost 1.89) ++find_package(Boost REQUIRED) + find_package(Threads) + + +@@ -39,7 +40,7 @@ target_link_libraries(rmf_websocket + nlohmann_json::nlohmann_json + nlohmann_json_schema_validator + PRIVATE +- Boost::system ++ Boost::headers + Threads::Threads + ) + +@@ -113,7 +114,7 @@ if(BUILD_TESTING) + target_link_libraries(test_ring_buffer + PRIVATE + rmf_utils::rmf_utils +- Boost::system ++ Boost::headers + ) + + #integration test +@@ -126,7 +127,7 @@ if(BUILD_TESTING) + ${websocketpp_LIBRARIES} + ${rclcpp_LIBRARIES} + rmf_utils::rmf_utils +- Boost::system ++ Boost::headers + rmf_websocket + PRIVATE + Threads::Threads +@@ -149,7 +150,7 @@ if(BUILD_TESTING) + ${websocketpp_LIBRARIES} + ${rclcpp_LIBRARIES} + rmf_utils::rmf_utils +- Boost::system ++ Boost::headers + rmf_websocket + PRIVATE + Threads::Threads +@@ -171,7 +172,7 @@ if(BUILD_TESTING) + ${websocketpp_LIBRARIES} + ${rclcpp_LIBRARIES} + rmf_utils::rmf_utils +- Boost::system ++ Boost::headers + rmf_websocket + PRIVATE + Threads::Threads From a873a8d62ae3c4b7c22d8c89c3e0b375d42f8d95 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 15:02:47 +1000 Subject: [PATCH 09/19] rmf_dev: jazzy rmf_websocket on io_context; drop the visualization_schedule patch [skip ci] Boost 1.90 removed asio::io_service with its post()/dispatch() members. conda-forge's websocketpp 0.8.2 is already patched to io_context (get_io_context()), so jazzy's rmf_websocket only needs its own uses switched: io_context, boost::asio::post/dispatch. No standalone Asio. rolling's rmf_visualization_schedule patch (ASIO_STANDALONE) isn't needed here: neither distribution's source uses Asio directly, humble's built with Boost 1.90 without it, and it would need asio as an extra dependency. Co-Authored-By: Claude Opus 5.5 --- .../ros2-rmf-visualization-schedule.patch | 16 --- .../ros2-rmf-visualization-schedule.patch | 16 --- distros/jazzy/patch/ros2-rmf-websocket.patch | 103 ++++++++++++++++++ 3 files changed, 103 insertions(+), 32 deletions(-) delete mode 100644 distros/humble/patch/ros2-rmf-visualization-schedule.patch delete mode 100644 distros/jazzy/patch/ros2-rmf-visualization-schedule.patch diff --git a/distros/humble/patch/ros2-rmf-visualization-schedule.patch b/distros/humble/patch/ros2-rmf-visualization-schedule.patch deleted file mode 100644 index 6c1c2f5d..00000000 --- a/distros/humble/patch/ros2-rmf-visualization-schedule.patch +++ /dev/null @@ -1,16 +0,0 @@ -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) diff --git a/distros/jazzy/patch/ros2-rmf-visualization-schedule.patch b/distros/jazzy/patch/ros2-rmf-visualization-schedule.patch deleted file mode 100644 index 6c1c2f5d..00000000 --- a/distros/jazzy/patch/ros2-rmf-visualization-schedule.patch +++ /dev/null @@ -1,16 +0,0 @@ -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) diff --git a/distros/jazzy/patch/ros2-rmf-websocket.patch b/distros/jazzy/patch/ros2-rmf-websocket.patch index 54d25865..283fe4f4 100644 --- a/distros/jazzy/patch/ros2-rmf-websocket.patch +++ b/distros/jazzy/patch/ros2-rmf-websocket.patch @@ -57,3 +57,106 @@ index 6c6745a..4d5c35d 100644 rmf_websocket PRIVATE Threads::Threads +diff --git a/src/rmf_websocket/BroadcastClient.cpp b/src/rmf_websocket/BroadcastClient.cpp +index 01d3ac1..d2950e0 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,8 @@ private: + } + // create pimpl + std::string _uri; +- boost::asio::io_service _io_service; ++ // Boost 1.90 removed io_service (and its post/dispatch members) ++ boost::asio::io_context _io_service; + std::shared_ptr _node; + RingBuffer _queue; + ProvideJsonUpdates _get_json_updates_cb; +diff --git a/src/rmf_websocket/client/ClientWebSocketEndpoint.cpp b/src/rmf_websocket/client/ClientWebSocketEndpoint.cpp +index 99a823b..0aad552 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); ++ 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); ++ 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_service, + ConnectionCallback cb) + : _uri(uri), _node(node), _init{false}, _reconnect_enqueued(false), + _connection_cb(std::move(cb)) +@@ -144,7 +144,7 @@ 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_service = &_endpoint->get_io_context(); + _endpoint = std::make_unique(); + _endpoint->clear_access_channels(websocketpp::log::alevel::all); + _endpoint->clear_error_channels(websocketpp::log::elevel::all); +diff --git a/src/rmf_websocket/client/ClientWebSocketEndpoint.hpp b/src/rmf_websocket/client/ClientWebSocketEndpoint.hpp +index 55f7105..1d79b6f 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_service, + ConnectionCallback cb); + + /// Delete move constructor From 3d83a91937fec89dfa5e146e8057605dd0607c84 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 15:03:36 +1000 Subject: [PATCH 10/19] rmf_visualization_floorplans: only the Eigen 5 fix [skip ci] The OpenCV hunk taken from rolling isn't needed for humble or jazzy: their uint8[] message fields are std::vector, which cv::Mat accepts, and humble built without it. jazzy keeps the Eigen3::Eigen link. Co-Authored-By: Claude Opus 5.5 --- .../ros2-rmf-visualization-floorplans.patch | 26 ------------------- .../ros2-rmf-visualization-floorplans.patch | 26 ------------------- 2 files changed, 52 deletions(-) delete mode 100644 distros/humble/patch/ros2-rmf-visualization-floorplans.patch diff --git a/distros/humble/patch/ros2-rmf-visualization-floorplans.patch b/distros/humble/patch/ros2-rmf-visualization-floorplans.patch deleted file mode 100644 index 1ae964f5..00000000 --- a/distros/humble/patch/ros2-rmf-visualization-floorplans.patch +++ /dev/null @@ -1,26 +0,0 @@ -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/distros/jazzy/patch/ros2-rmf-visualization-floorplans.patch b/distros/jazzy/patch/ros2-rmf-visualization-floorplans.patch index 7a9b9cbb..4e6edd8b 100644 --- a/distros/jazzy/patch/ros2-rmf-visualization-floorplans.patch +++ b/distros/jazzy/patch/ros2-rmf-visualization-floorplans.patch @@ -12,29 +12,3 @@ index a4a50fa..3e74cd5 100644 target_include_directories(floorplan_visualizer PRIVATE $ -diff --git a/src/FloorplanVisualizer.cpp b/src/FloorplanVisualizer.cpp -index e0eefa6..4fb84b0 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]; From b84b1f7b3c8cfc0f1e3d89809fa57f6c7fad281d Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 15:11:37 +1000 Subject: [PATCH 11/19] jazzy: rmf_fleet_adapter with GCC 15 and on macOS [skip ci] The bundled RxCpp 4.1.0 assigns to a const exception_ptr in on_error_notification's operator=, which GCC 15 now rejects; humble's patch removes it. The macOS fixes carry over from humble's patch as well (malloc_trim is Linux-only; int64_t and uint64_t aren't long and size_t there), plus a cast for the route_id comparison in ExecutePlan that jazzy's source has and humble's doesn't. Co-Authored-By: Claude Opus 5.5 --- .../jazzy/patch/ros2-rmf-fleet-adapter.patch | 154 ++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 distros/jazzy/patch/ros2-rmf-fleet-adapter.patch diff --git a/distros/jazzy/patch/ros2-rmf-fleet-adapter.patch b/distros/jazzy/patch/ros2-rmf-fleet-adapter.patch new file mode 100644 index 00000000..9e3ed2ce --- /dev/null +++ b/distros/jazzy/patch/ros2-rmf-fleet-adapter.patch @@ -0,0 +1,154 @@ +diff --git a/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-notification.hpp b/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-notification.hpp +index 20e0c69..0fae30f 100644 +--- a/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-notification.hpp ++++ b/rmf_rxcpp/RxCpp-4.1.0/Rx/v2/src/rxcpp/rx-notification.hpp +@@ -150,7 +150,6 @@ private: + } + on_error_notification(const on_error_notification& o) : ep(o.ep) {} + on_error_notification(const on_error_notification&& o) : ep(std::move(o.ep)) {} +- on_error_notification& operator=(on_error_notification o) { ep = std::move(o.ep); return *this; } + virtual void out(std::ostream& os) const { + os << "on_error("; + os << rxu::what(ep); +diff --git a/src/full_control/main.cpp b/src/full_control/main.cpp +index 6cde76f..e6b50c3 100644 +--- a/src/full_control/main.cpp ++++ b/src/full_control/main.cpp +@@ -1039,8 +1039,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 +1097,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/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 38cca49..2651d22 100644 +--- a/src/rmf_fleet_adapter/TaskManager.cpp ++++ b/src/rmf_fleet_adapter/TaskManager.cpp +@@ -322,9 +322,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"]; + +@@ -388,7 +388,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()); + } + + //============================================================================== +@@ -467,9 +467,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()); +@@ -2090,7 +2090,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/internal_FleetUpdateHandle.hpp b/src/rmf_fleet_adapter/agv/internal_FleetUpdateHandle.hpp +index 7b58004..e7d2024 100644 +--- a/src/rmf_fleet_adapter/agv/internal_FleetUpdateHandle.hpp ++++ b/src/rmf_fleet_adapter/agv/internal_FleetUpdateHandle.hpp +@@ -75,7 +75,9 @@ + #include + #include + #include ++#if defined(__linux__) + #include ++#endif + + namespace rmf_fleet_adapter { + namespace agv { +@@ -431,7 +433,12 @@ 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/ExecutePlan.cpp b/src/rmf_fleet_adapter/events/ExecutePlan.cpp +index 8e24390..e4484d9 100644 +--- a/src/rmf_fleet_adapter/events/ExecutePlan.cpp ++++ b/src/rmf_fleet_adapter/events/ExecutePlan.cpp +@@ -117,7 +117,8 @@ 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); ++ // route_id is uint64_t, which isn't std::size_t on macOS ++ 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(); + From 45ad918fad856fb603e63b310e4fb45035794a09 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 16:15:14 +1000 Subject: [PATCH 12/19] jazzy: rmf_traffic on macOS [skip ci] From humble's patch, for the same code: Database and Mirror declare their participant overrides with std::size_t where the base class uses ParticipantId (uint64_t), which isn't std::size_t on macOS, so clang rejects them as hiding the virtual functions; and the bundled fcl and blockade/geometry.cpp use assert without , which libc++ doesn't include for them. The test-only hunk isn't needed: the tests aren't built. Co-Authored-By: Claude Opus 5.5 --- distros/jazzy/patch/ros2-rmf-traffic.patch | 251 ++++++++++++++++++++- 1 file changed, 247 insertions(+), 4 deletions(-) diff --git a/distros/jazzy/patch/ros2-rmf-traffic.patch b/distros/jazzy/patch/ros2-rmf-traffic.patch index 9c560f9c..6ea07237 100644 --- a/distros/jazzy/patch/ros2-rmf-traffic.patch +++ b/distros/jazzy/patch/ros2-rmf-traffic.patch @@ -10,6 +10,51 @@ index 8d341d0..324322f 100644 rmf_utils::rmf_utils Threads::Threads PRIVATE +diff --git a/include/rmf_traffic/schedule/Database.hpp b/include/rmf_traffic/schedule/Database.hpp +index 6318012..2d27b4b 100644 +--- a/include/rmf_traffic/schedule/Database.hpp ++++ b/include/rmf_traffic/schedule/Database.hpp +@@ -113,7 +113,7 @@ public: + + // Documentation inherited from Viewer + std::shared_ptr get_participant( +- std::size_t participant_id) const final; ++ ParticipantId participant_id) const final; + + // Documentation inherited from Viewer + Version latest_version() const; +@@ -125,11 +125,11 @@ public: + + // Documentation inherited from ItineraryViewer + std::optional get_itinerary( +- std::size_t participant_id) const final; ++ ParticipantId participant_id) const final; + + // Documentation inherited from ItineraryViewer + std::optional get_current_plan_id( +- std::size_t participant_id) const final; ++ ParticipantId participant_id) const final; + + // Documentation inherited from ItineraryViewer + const std::vector* get_current_progress( +diff --git a/include/rmf_traffic/schedule/Mirror.hpp b/include/rmf_traffic/schedule/Mirror.hpp +index 14c3c9e..f6a6108 100644 +--- a/include/rmf_traffic/schedule/Mirror.hpp ++++ b/include/rmf_traffic/schedule/Mirror.hpp +@@ -51,11 +51,11 @@ public: + + // Documentation inherited from Viewer + std::shared_ptr get_participant( +- std::size_t participant_id) const final; ++ ParticipantId participant_id) const final; + + // Documentation inherited from Viewer + std::optional get_itinerary( +- std::size_t participant_id) const final; ++ ParticipantId participant_id) const final; + + // Documentation inherited from Viewer + std::optional latest_version() const; 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 @@ -23,27 +68,225 @@ index 74d272c..3ce72cd 100644 #include diff --git a/src/rmf_traffic/blockade/geometry.cpp b/src/rmf_traffic/blockade/geometry.cpp -index 049351e..d69a999 100644 +index 049351e..0817edb 100644 --- a/src/rmf_traffic/blockade/geometry.cpp +++ b/src/rmf_traffic/blockade/geometry.cpp -@@ -17,6 +17,7 @@ +@@ -15,8 +15,10 @@ + * + */ ++#include #include "geometry.hpp" +#include #include namespace rmf_traffic { +diff --git a/src/rmf_traffic/schedule/Database.cpp b/src/rmf_traffic/schedule/Database.cpp +index 3f6dd48..2377692 100644 +--- a/src/rmf_traffic/schedule/Database.cpp ++++ b/src/rmf_traffic/schedule/Database.cpp +@@ -1303,7 +1303,7 @@ const std::unordered_set& Database::participant_ids() const + + //============================================================================== + std::shared_ptr Database::get_participant( +- std::size_t participant_id) const ++ ParticipantId participant_id) const + { + const auto state_it = _pimpl->descriptions.find(participant_id); + if (state_it == _pimpl->descriptions.end()) +@@ -1320,7 +1320,7 @@ Version Database::latest_version() const + + //============================================================================== + std::optional Database::get_itinerary( +- const std::size_t participant_id) const ++ const ParticipantId participant_id) const + { + const auto state_it = _pimpl->states.find(participant_id); + if (state_it == _pimpl->states.end()) +@@ -1345,7 +1345,7 @@ std::optional Database::get_itinerary( + + //============================================================================== + std::optional Database::get_current_plan_id( +- const std::size_t participant_id) const ++ const ParticipantId participant_id) const + { + const auto state_it = _pimpl->states.find(participant_id); + if (state_it == _pimpl->states.end()) +diff --git a/src/rmf_traffic/schedule/Mirror.cpp b/src/rmf_traffic/schedule/Mirror.cpp +index 4c1d710..e84006a 100644 +--- a/src/rmf_traffic/schedule/Mirror.cpp ++++ b/src/rmf_traffic/schedule/Mirror.cpp +@@ -255,7 +255,7 @@ const std::unordered_set& Mirror::participant_ids() const + + //============================================================================== + std::shared_ptr Mirror::get_participant( +- std::size_t participant_id) const ++ ParticipantId participant_id) const + { + const auto p = _pimpl->descriptions.find(participant_id); + if (p == _pimpl->descriptions.end()) +@@ -272,7 +272,7 @@ std::optional Mirror::latest_version() const + + //============================================================================== + std::optional Mirror::get_itinerary( +- const std::size_t participant_id) const ++ const ParticipantId participant_id) const + { + const auto p = _pimpl->states.find(participant_id); + if (p == _pimpl->states.end()) +@@ -297,7 +297,7 @@ std::optional Mirror::get_itinerary( + + //============================================================================== + std::optional Mirror::get_current_plan_id( +- const std::size_t participant_id) const ++ const ParticipantId participant_id) const + { + const auto p = _pimpl->states.find(participant_id); + if (p == _pimpl->states.end()) +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/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/motion/taylor_model/taylor_model-inl.h b/thirdparty/fcl/include/fcl/math/motion/taylor_model/taylor_model-inl.h -index 861f72d..a239104 100644 +index 861f72d..c54f5d6 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,8 @@ +@@ -41,6 +41,9 @@ #ifndef FCL_CCD_TAYLOR_MODEL_INL_H #define FCL_CCD_TAYLOR_MODEL_INL_H +#include + ++#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/detail/primitive_shape_algorithm/capsule_capsule-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/capsule_capsule-inl.h +index b316c95..10af788 100644 +--- a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/capsule_capsule-inl.h ++++ b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/capsule_capsule-inl.h +@@ -38,6 +38,7 @@ + #ifndef FCL_NARROWPHASE_DETAIL_CAPSULECAPSULE_INL_H + #define FCL_NARROWPHASE_DETAIL_CAPSULECAPSULE_INL_H + ++#include + #include "fcl/narrowphase/detail/primitive_shape_algorithm/capsule_capsule.h" + + namespace fcl +diff --git a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/plane-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/plane-inl.h +index 1373dce..dd19a87 100755 +--- a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/plane-inl.h ++++ b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/plane-inl.h +@@ -38,6 +38,7 @@ + #ifndef FCL_NARROWPHASE_DETAIL_PLANE_INL_H + #define FCL_NARROWPHASE_DETAIL_PLANE_INL_H + ++#include + #include "fcl/narrowphase/detail/primitive_shape_algorithm/plane.h" + + namespace fcl +diff --git a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box-inl.h +index 77e0a66..a82f049 100644 +--- a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box-inl.h ++++ b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box-inl.h +@@ -37,6 +37,7 @@ + #ifndef FCL_NARROWPHASE_DETAIL_SPHEREBOX_INL_H + #define FCL_NARROWPHASE_DETAIL_SPHEREBOX_INL_H + ++#include + #include "fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box.h" + + namespace fcl { +diff --git a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder-inl.h +index abda262..793f278 100644 +--- a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder-inl.h ++++ b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder-inl.h +@@ -37,6 +37,7 @@ + #ifndef FCL_NARROWPHASE_DETAIL_SPHERECYLINDER_INL_H + #define FCL_NARROWPHASE_DETAIL_SPHERECYLINDER_INL_H + ++#include + #include "fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder.h" + + namespace fcl { +diff --git a/thirdparty/fcl/include/fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node-inl.h +index 44ddde5..2e63bee 100644 +--- a/thirdparty/fcl/include/fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node-inl.h ++++ b/thirdparty/fcl/include/fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node-inl.h +@@ -38,6 +38,7 @@ + #ifndef FCL_TRAVERSAL_MESHCONSERVATIVEADVANCEMENTTRAVERSALNODE_INL_H + #define FCL_TRAVERSAL_MESHCONSERVATIVEADVANCEMENTTRAVERSALNODE_INL_H + ++#include + #include "fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node.h" + + #include "fcl/math/bv/RSS.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" From d8372416c118d1cb7ac3ea5b5f1b433edba4ebce Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 16:16:46 +1000 Subject: [PATCH 13/19] jazzy: rmf_traffic tests on macOS too [skip ci] The tests are built after all (the earlier failure stopped before them): test_Spacetime.cpp names libstdc++'s internal std::chrono::_V2 namespace, which libc++ doesn't have. As in humble's patch, use std::chrono. Co-Authored-By: Claude Opus 5.5 --- distros/jazzy/patch/ros2-rmf-traffic.patch | 70 ++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/distros/jazzy/patch/ros2-rmf-traffic.patch b/distros/jazzy/patch/ros2-rmf-traffic.patch index 6ea07237..76a4792b 100644 --- a/distros/jazzy/patch/ros2-rmf-traffic.patch +++ b/distros/jazzy/patch/ros2-rmf-traffic.patch @@ -144,6 +144,76 @@ index 4c1d710..e84006a 100644 { const auto p = _pimpl->states.find(participant_id); if (p == _pimpl->states.end()) +diff --git a/test/unit/schedule/test_Spacetime.cpp b/test/unit/schedule/test_Spacetime.cpp +index e96cfb6..140ac52 100644 +--- a/test/unit/schedule/test_Spacetime.cpp ++++ b/test/unit/schedule/test_Spacetime.cpp +@@ -41,8 +41,8 @@ SCENARIO("Testing intersection of spacetime with trajectories") + const auto region_box_shape = rmf_traffic::geometry::make_final_convex< + rmf_traffic::geometry::Box>(10.0, 1.0); + +- std::chrono::_V2::steady_clock::time_point lower_time_bound = time; +- std::chrono::_V2::steady_clock::time_point upper_time_bound = time+10s; ++ std::chrono::steady_clock::time_point lower_time_bound = time; ++ std::chrono::steady_clock::time_point upper_time_bound = time+10s; + + rmf_traffic::internal::Spacetime region = { + &lower_time_bound, +@@ -117,8 +117,8 @@ SCENARIO("Testing intersction of various spacetimes and trajectories") + using namespace std::chrono_literals; + auto time = std::chrono::steady_clock::now(); + Eigen::Isometry2d tf = Eigen::Isometry2d::Identity(); +- std::chrono::_V2::steady_clock::time_point lower_time_bound; +- std::chrono::_V2::steady_clock::time_point upper_time_bound; ++ std::chrono::steady_clock::time_point lower_time_bound; ++ std::chrono::steady_clock::time_point upper_time_bound; + + const auto region_box_shape = rmf_traffic::geometry::make_final_convex< + rmf_traffic::geometry::Box>(10.0, 1.0); +@@ -1210,8 +1210,8 @@ SCENARIO("Testing intersection of curved trajectory with various spacetimes") + GIVEN("spacetime that encompasses the trajectory in space and time") + { + //creating space to create spacetime +- std::chrono::_V2::steady_clock::time_point lower_time_bound = time; +- std::chrono::_V2::steady_clock::time_point upper_time_bound = time+10s; ++ std::chrono::steady_clock::time_point lower_time_bound = time; ++ std::chrono::steady_clock::time_point upper_time_bound = time+10s; + Eigen::Isometry2d tf = Eigen::Isometry2d::Identity(); + + rmf_traffic::internal::Spacetime region = { +@@ -1227,8 +1227,8 @@ SCENARIO("Testing intersection of curved trajectory with various spacetimes") + GIVEN("spacetime that encompasses the trajectory in space but not time") + { + //creating space to create spacetime +- std::chrono::_V2::steady_clock::time_point lower_time_bound = time+20s; +- std::chrono::_V2::steady_clock::time_point upper_time_bound = time+30s; ++ std::chrono::steady_clock::time_point lower_time_bound = time+20s; ++ std::chrono::steady_clock::time_point upper_time_bound = time+30s; + Eigen::Isometry2d tf = Eigen::Isometry2d::Identity(); + + rmf_traffic::internal::Spacetime region = { +@@ -1244,8 +1244,8 @@ SCENARIO("Testing intersection of curved trajectory with various spacetimes") + GIVEN("spacetime that partially intersects the trajectory in space and time") + { + //creating space to create spacetime +- std::chrono::_V2::steady_clock::time_point lower_time_bound = time; +- std::chrono::_V2::steady_clock::time_point upper_time_bound = time+10s; ++ std::chrono::steady_clock::time_point lower_time_bound = time; ++ std::chrono::steady_clock::time_point upper_time_bound = time+10s; + Eigen::Isometry2d tf = Eigen::Isometry2d::Identity(); + + rmf_traffic::internal::Spacetime region = { +@@ -1263,8 +1263,8 @@ SCENARIO("Testing intersection of curved trajectory with various spacetimes") + SCENARIO("Testing multi-waypoint trajectories with various spacetimes") + { + using namespace std::chrono_literals; +- std::chrono::_V2::steady_clock::time_point lower_time_bound; +- std::chrono::_V2::steady_clock::time_point upper_time_bound; ++ std::chrono::steady_clock::time_point lower_time_bound; ++ std::chrono::steady_clock::time_point upper_time_bound; + + const auto small_circle_shape = rmf_traffic::geometry::make_final_convex< + rmf_traffic::geometry::Circle>(0.5); 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 From 7bb50f8ccf0e38a618efe3d1b9c803290621360b Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 16:39:59 +1000 Subject: [PATCH 14/19] jazzy: rmf_robot_sim_gz_plugins on macOS [skip ci] The LightTuning GUI plugin derives from gz::sim::GuiSystem, which lives in gz-sim's gui library, but only links gz-sim::core; Linux allows the symbols to stay undefined, macOS doesn't. Request the gui component and link gz-sim::gui. It also declares OnLightTypeSelect() without ever defining or using it, which leaves an undefined vtable-free reference from the moc code on macOS: drop the declaration. Same fixes as humble's patch, for the gz (not Ignition) names. Co-Authored-By: Claude Opus 5.5 --- .../patch/ros2-rmf-robot-sim-gz-plugins.patch | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 distros/jazzy/patch/ros2-rmf-robot-sim-gz-plugins.patch diff --git a/distros/jazzy/patch/ros2-rmf-robot-sim-gz-plugins.patch b/distros/jazzy/patch/ros2-rmf-robot-sim-gz-plugins.patch new file mode 100644 index 00000000..888e45ba --- /dev/null +++ b/distros/jazzy/patch/ros2-rmf-robot-sim-gz-plugins.patch @@ -0,0 +1,34 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 01331b9..279d989 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -23,7 +23,7 @@ find_package(ament_cmake REQUIRED) + find_package(rclcpp REQUIRED) + + find_package(gz_sim_vendor REQUIRED) +-find_package(gz-sim REQUIRED) ++find_package(gz-sim REQUIRED COMPONENTS gui) + find_package(gz_plugin_vendor REQUIRED) + find_package(gz-plugin REQUIRED) + find_package(gz_gui_vendor REQUIRED) +@@ -174,6 +174,8 @@ add_library(LightTuning SHARED ${headers_MOC} + target_link_libraries(LightTuning + gz-gui::core + gz-sim::core ++ # GuiSystem lives in the gui library (macOS doesn't allow it to stay undefined) ++ gz-sim::gui + gz-msgs::core + gz-transport::core + gz-rendering::core +diff --git a/src/LightTuning/LightTuning.cpp b/src/LightTuning/LightTuning.cpp +index 1a78e66..2a9d1c5 100644 +--- a/src/LightTuning/LightTuning.cpp ++++ b/src/LightTuning/LightTuning.cpp +@@ -450,7 +450,6 @@ signals: + void markerSelected(QString nm); + + public slots: +- void OnLightTypeSelect(sdf::Light& light, const QString& type); + void OnCreateLightBtnPress( + int idx, bool cast_shadow, const QString& type, + const QString& name, const QString& pose_str, From de96bc32356f7d9634b3f92e764fa397646a6ea4 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 16:45:32 +1000 Subject: [PATCH 15/19] jazzy: rmf_visualization_schedule links OpenSSL [skip ci] ament_target_dependencies(... OpenSSL ...) looks for OpenSSL_LIBRARIES, which FindOpenSSL doesn't set (it sets OPENSSL_LIBRARIES), so the library never linked libssl/libcrypto. Linux lets the symbols stay undefined, macOS doesn't (_BIO_free_all, ...). Link OpenSSL::SSL and OpenSSL::Crypto, as humble's version of the package does. Co-Authored-By: Claude Opus 5.5 --- .../patch/ros2-rmf-visualization-schedule.patch | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 distros/jazzy/patch/ros2-rmf-visualization-schedule.patch diff --git a/distros/jazzy/patch/ros2-rmf-visualization-schedule.patch b/distros/jazzy/patch/ros2-rmf-visualization-schedule.patch new file mode 100644 index 00000000..e065859f --- /dev/null +++ b/distros/jazzy/patch/ros2-rmf-visualization-schedule.patch @@ -0,0 +1,14 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 036ae74..2f9e406 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -63,6 +63,9 @@ target_include_directories(rmf_visualization_schedule + PUBLIC + $ + ) ++# ament_target_dependencies looks for OpenSSL_LIBRARIES, but FindOpenSSL only sets ++# OPENSSL_LIBRARIES, so nothing was linked (macOS doesn't allow the symbols to stay undefined) ++target_link_libraries(rmf_visualization_schedule PUBLIC OpenSSL::SSL OpenSSL::Crypto) + + ament_export_dependencies( + rmf_traffic From b13c8340f6cb482c267962e6c4d2a86192dcbe2a Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 16:54:40 +1000 Subject: [PATCH 16/19] rmf_fleet_adapter_python: build rmf_adapter as a module, not SHARED [skip ci] pybind11_add_module(rmf_adapter SHARED ...) makes pybind11 link pybind11::embed, i.e. libpython. On macOS, where python itself has the interpreter built in, `import rmf_adapter` then aborts ("PyInterpreterState_Get: the function must be called with the GIL held"): the module initialises the second, never-started interpreter in libpython. This affects the published osx-arm64 builds of every distribution (checked rolling 2.12.0 and humble 2.1.8). Nothing links against rmf_adapter, so build it as the default MODULE, which links pybind11::module (no libpython). Shared: applies to humble 2.1.8, jazzy 2.7.2, lyrical 2.13.0 and rolling 2.12.0. Tested on jazzy osx-arm64: the module no longer links libpython, and `import rmf_adapter` plus a Graph() call work. Upstream (open-rmf/rmf_ros2 main) still uses SHARED. Co-Authored-By: Claude Opus 5.5 --- shared/patch/ros2-rmf-fleet-adapter-python.patch | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 shared/patch/ros2-rmf-fleet-adapter-python.patch diff --git a/shared/patch/ros2-rmf-fleet-adapter-python.patch b/shared/patch/ros2-rmf-fleet-adapter-python.patch new file mode 100644 index 00000000..085c90c2 --- /dev/null +++ b/shared/patch/ros2-rmf-fleet-adapter-python.patch @@ -0,0 +1,11 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 914a737..9be2883 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -38,3 +38,5 @@ find_package(pybind11_json REQUIRED) + +-pybind11_add_module(rmf_adapter SHARED ++# A Python extension module, not a SHARED library: SHARED makes pybind11 link pybind11::embed, ++# i.e. libpython, and on macOS importing it then crashes (a second, uninitialised interpreter) ++pybind11_add_module(rmf_adapter MODULE + src/adapter.cpp From 050505cac011bac694663fc29646e3f30f2faad1 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 17:09:22 +1000 Subject: [PATCH 17/19] rmf_fleet_adapter_python: recipe test that rmf_adapter imports and works [skip ci] Regression test for the SHARED -> MODULE fix: import rmf_adapter (and easy_full_control) and build an empty Graph. With the SHARED build the import aborts on macOS. Passes on jazzy osx-arm64. Co-Authored-By: Claude Opus 5.5 --- shared/tests/ros2-rmf-fleet-adapter-python.yaml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 shared/tests/ros2-rmf-fleet-adapter-python.yaml diff --git a/shared/tests/ros2-rmf-fleet-adapter-python.yaml b/shared/tests/ros2-rmf-fleet-adapter-python.yaml new file mode 100644 index 00000000..767d9713 --- /dev/null +++ b/shared/tests/ros2-rmf-fleet-adapter-python.yaml @@ -0,0 +1,7 @@ +tests: + # Regression test: rmf_adapter must import and work. Built as a SHARED library instead of + # a Python module, it links libpython, and on macOS `import rmf_adapter` then aborts + # ("PyInterpreterState_Get: the function must be called with the GIL held"): it initialises + # a second interpreter (see shared/patch/ros2-rmf-fleet-adapter-python.patch). + - script: + - python -c "import rmf_adapter, rmf_adapter.easy_full_control, rmf_adapter.graph as graph; assert graph.Graph().num_waypoints == 0" From 940736ecf4a816bd30ba74cd5070ba47a08294f0 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Mon, 19 Oct 2026 17:41:13 +1000 Subject: [PATCH 18/19] rmf_fleet_adapter_python: recipe test without newer submodules [skip ci] humble's rmf_adapter 2.1.8 has no easy_full_control, and isn't a package there (import rmf_adapter.graph fails), so use the submodules as attributes. Passes on humble 2.1.8 and jazzy 2.7.2 (osx-arm64). Co-Authored-By: Claude Opus 5.5 --- shared/tests/ros2-rmf-fleet-adapter-python.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shared/tests/ros2-rmf-fleet-adapter-python.yaml b/shared/tests/ros2-rmf-fleet-adapter-python.yaml index 767d9713..574ac338 100644 --- a/shared/tests/ros2-rmf-fleet-adapter-python.yaml +++ b/shared/tests/ros2-rmf-fleet-adapter-python.yaml @@ -4,4 +4,5 @@ tests: # ("PyInterpreterState_Get: the function must be called with the GIL held"): it initialises # a second interpreter (see shared/patch/ros2-rmf-fleet-adapter-python.patch). - script: - - python -c "import rmf_adapter, rmf_adapter.easy_full_control, rmf_adapter.graph as graph; assert graph.Graph().num_waypoints == 0" + # submodules as attributes: older versions (humble's) don't make rmf_adapter a package + - python -c "import rmf_adapter; assert rmf_adapter.graph.Graph().num_waypoints == 0" From 44b58d2156b6985c74b32a1b9a23f417f4d50750 Mon Sep 17 00:00:00 2001 From: Tobias Fischer Date: Tue, 20 Oct 2026 09:09:10 +1000 Subject: [PATCH 19/19] rmf_dev: shared patches where the distributions had the same one [skip ci] - rmf_traffic_ros2: the same patch in all four distributions -> shared. - rmf_building_map_tools: the same numpy 2 fix in all four (lyrical's worded differently) -> shared; lyrical's package changes accordingly. - rmf_robot_sim_common: humble's and jazzy's were the same -> shared (it applies to lyrical's and rolling's too, which don't build it: no rmf_dev release there). - rmf_traffic: jazzy's patch is humble's plus the / includes jazzy needs, and applies to humble -> shared for both; lyrical and rolling keep their own. Built humble's rmf_traffic with it on osx-arm64, with its tests. Every distribution's effective patch was checked against its sync source. Co-Authored-By: Claude Opus 5.5 --- distros/humble/patch/ros2-rmf-traffic.patch | 345 ------------------ .../patch/ros2-rmf-building-map-tools.patch | 16 - .../patch/ros2-rmf-robot-sim-common.patch | 39 -- .../jazzy/patch/ros2-rmf-traffic-ros2.patch | 39 -- .../patch/ros2-rmf-building-map-tools.patch | 15 - .../lyrical/patch/ros2-rmf-traffic-ros2.patch | 39 -- .../patch/ros2-rmf-building-map-tools.patch | 16 - .../rolling/patch/ros2-rmf-traffic-ros2.patch | 39 -- .../patch/ros2-rmf-building-map-tools.patch | 0 .../patch/ros2-rmf-robot-sim-common.patch | 0 .../patch/ros2-rmf-traffic-ros2.patch | 0 .../patch/ros2-rmf-traffic.patch | 0 12 files changed, 548 deletions(-) delete mode 100644 distros/humble/patch/ros2-rmf-traffic.patch delete mode 100644 distros/jazzy/patch/ros2-rmf-building-map-tools.patch delete mode 100644 distros/jazzy/patch/ros2-rmf-robot-sim-common.patch delete mode 100644 distros/jazzy/patch/ros2-rmf-traffic-ros2.patch delete mode 100644 distros/lyrical/patch/ros2-rmf-building-map-tools.patch delete mode 100644 distros/lyrical/patch/ros2-rmf-traffic-ros2.patch delete mode 100644 distros/rolling/patch/ros2-rmf-building-map-tools.patch delete mode 100644 distros/rolling/patch/ros2-rmf-traffic-ros2.patch rename {distros/humble => shared}/patch/ros2-rmf-building-map-tools.patch (100%) rename {distros/humble => shared}/patch/ros2-rmf-robot-sim-common.patch (100%) rename {distros/humble => shared}/patch/ros2-rmf-traffic-ros2.patch (100%) rename {distros/jazzy => shared}/patch/ros2-rmf-traffic.patch (100%) diff --git a/distros/humble/patch/ros2-rmf-traffic.patch b/distros/humble/patch/ros2-rmf-traffic.patch deleted file mode 100644 index 00f69343..00000000 --- a/distros/humble/patch/ros2-rmf-traffic.patch +++ /dev/null @@ -1,345 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 180bd2c..7e40537 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -96,6 +96,7 @@ endif() - - target_link_libraries(rmf_traffic - PUBLIC -+ Eigen3::Eigen - rmf_utils::rmf_utils - Threads::Threads - PRIVATE -diff --git a/include/rmf_traffic/schedule/Database.hpp b/include/rmf_traffic/schedule/Database.hpp -index 6318012..2d27b4b 100644 ---- a/include/rmf_traffic/schedule/Database.hpp -+++ b/include/rmf_traffic/schedule/Database.hpp -@@ -113,7 +113,7 @@ public: - - // Documentation inherited from Viewer - std::shared_ptr get_participant( -- std::size_t participant_id) const final; -+ ParticipantId participant_id) const final; - - // Documentation inherited from Viewer - Version latest_version() const; -@@ -125,11 +125,11 @@ public: - - // Documentation inherited from ItineraryViewer - std::optional get_itinerary( -- std::size_t participant_id) const final; -+ ParticipantId participant_id) const final; - - // Documentation inherited from ItineraryViewer - std::optional get_current_plan_id( -- std::size_t participant_id) const final; -+ ParticipantId participant_id) const final; - - // Documentation inherited from ItineraryViewer - const std::vector* get_current_progress( -diff --git a/include/rmf_traffic/schedule/Mirror.hpp b/include/rmf_traffic/schedule/Mirror.hpp -index 14c3c9e..f6a6108 100644 ---- a/include/rmf_traffic/schedule/Mirror.hpp -+++ b/include/rmf_traffic/schedule/Mirror.hpp -@@ -51,11 +51,11 @@ public: - - // Documentation inherited from Viewer - std::shared_ptr get_participant( -- std::size_t participant_id) const final; -+ ParticipantId participant_id) const final; - - // Documentation inherited from Viewer - std::optional get_itinerary( -- std::size_t participant_id) const final; -+ ParticipantId participant_id) const final; - - // Documentation inherited from Viewer - std::optional latest_version() const; -diff --git a/src/rmf_traffic/blockade/geometry.cpp b/src/rmf_traffic/blockade/geometry.cpp -index 049351e..15211a6 100644 ---- a/src/rmf_traffic/blockade/geometry.cpp -+++ b/src/rmf_traffic/blockade/geometry.cpp -@@ -15,6 +15,7 @@ - * - */ - -+#include - #include "geometry.hpp" - - #include -diff --git a/src/rmf_traffic/schedule/Database.cpp b/src/rmf_traffic/schedule/Database.cpp -index 3f6dd48..2377692 100644 ---- a/src/rmf_traffic/schedule/Database.cpp -+++ b/src/rmf_traffic/schedule/Database.cpp -@@ -1303,7 +1303,7 @@ const std::unordered_set& Database::participant_ids() const - - //============================================================================== - std::shared_ptr Database::get_participant( -- std::size_t participant_id) const -+ ParticipantId participant_id) const - { - const auto state_it = _pimpl->descriptions.find(participant_id); - if (state_it == _pimpl->descriptions.end()) -@@ -1320,7 +1320,7 @@ Version Database::latest_version() const - - //============================================================================== - std::optional Database::get_itinerary( -- const std::size_t participant_id) const -+ const ParticipantId participant_id) const - { - const auto state_it = _pimpl->states.find(participant_id); - if (state_it == _pimpl->states.end()) -@@ -1345,7 +1345,7 @@ std::optional Database::get_itinerary( - - //============================================================================== - std::optional Database::get_current_plan_id( -- const std::size_t participant_id) const -+ const ParticipantId participant_id) const - { - const auto state_it = _pimpl->states.find(participant_id); - if (state_it == _pimpl->states.end()) -diff --git a/src/rmf_traffic/schedule/Mirror.cpp b/src/rmf_traffic/schedule/Mirror.cpp -index 4c1d710..e84006a 100644 ---- a/src/rmf_traffic/schedule/Mirror.cpp -+++ b/src/rmf_traffic/schedule/Mirror.cpp -@@ -255,7 +255,7 @@ const std::unordered_set& Mirror::participant_ids() const - - //============================================================================== - std::shared_ptr Mirror::get_participant( -- std::size_t participant_id) const -+ ParticipantId participant_id) const - { - const auto p = _pimpl->descriptions.find(participant_id); - if (p == _pimpl->descriptions.end()) -@@ -272,7 +272,7 @@ std::optional Mirror::latest_version() const - - //============================================================================== - std::optional Mirror::get_itinerary( -- const std::size_t participant_id) const -+ const ParticipantId participant_id) const - { - const auto p = _pimpl->states.find(participant_id); - if (p == _pimpl->states.end()) -@@ -297,7 +297,7 @@ std::optional Mirror::get_itinerary( - - //============================================================================== - std::optional Mirror::get_current_plan_id( -- const std::size_t participant_id) const -+ const ParticipantId participant_id) const - { - const auto p = _pimpl->states.find(participant_id); - if (p == _pimpl->states.end()) -diff --git a/test/unit/schedule/test_Spacetime.cpp b/test/unit/schedule/test_Spacetime.cpp -index e96cfb6..140ac52 100644 ---- a/test/unit/schedule/test_Spacetime.cpp -+++ b/test/unit/schedule/test_Spacetime.cpp -@@ -41,8 +41,8 @@ SCENARIO("Testing intersection of spacetime with trajectories") - const auto region_box_shape = rmf_traffic::geometry::make_final_convex< - rmf_traffic::geometry::Box>(10.0, 1.0); - -- std::chrono::_V2::steady_clock::time_point lower_time_bound = time; -- std::chrono::_V2::steady_clock::time_point upper_time_bound = time+10s; -+ std::chrono::steady_clock::time_point lower_time_bound = time; -+ std::chrono::steady_clock::time_point upper_time_bound = time+10s; - - rmf_traffic::internal::Spacetime region = { - &lower_time_bound, -@@ -117,8 +117,8 @@ SCENARIO("Testing intersction of various spacetimes and trajectories") - using namespace std::chrono_literals; - auto time = std::chrono::steady_clock::now(); - Eigen::Isometry2d tf = Eigen::Isometry2d::Identity(); -- std::chrono::_V2::steady_clock::time_point lower_time_bound; -- std::chrono::_V2::steady_clock::time_point upper_time_bound; -+ std::chrono::steady_clock::time_point lower_time_bound; -+ std::chrono::steady_clock::time_point upper_time_bound; - - const auto region_box_shape = rmf_traffic::geometry::make_final_convex< - rmf_traffic::geometry::Box>(10.0, 1.0); -@@ -1210,8 +1210,8 @@ SCENARIO("Testing intersection of curved trajectory with various spacetimes") - GIVEN("spacetime that encompasses the trajectory in space and time") - { - //creating space to create spacetime -- std::chrono::_V2::steady_clock::time_point lower_time_bound = time; -- std::chrono::_V2::steady_clock::time_point upper_time_bound = time+10s; -+ std::chrono::steady_clock::time_point lower_time_bound = time; -+ std::chrono::steady_clock::time_point upper_time_bound = time+10s; - Eigen::Isometry2d tf = Eigen::Isometry2d::Identity(); - - rmf_traffic::internal::Spacetime region = { -@@ -1227,8 +1227,8 @@ SCENARIO("Testing intersection of curved trajectory with various spacetimes") - GIVEN("spacetime that encompasses the trajectory in space but not time") - { - //creating space to create spacetime -- std::chrono::_V2::steady_clock::time_point lower_time_bound = time+20s; -- std::chrono::_V2::steady_clock::time_point upper_time_bound = time+30s; -+ std::chrono::steady_clock::time_point lower_time_bound = time+20s; -+ std::chrono::steady_clock::time_point upper_time_bound = time+30s; - Eigen::Isometry2d tf = Eigen::Isometry2d::Identity(); - - rmf_traffic::internal::Spacetime region = { -@@ -1244,8 +1244,8 @@ SCENARIO("Testing intersection of curved trajectory with various spacetimes") - GIVEN("spacetime that partially intersects the trajectory in space and time") - { - //creating space to create spacetime -- std::chrono::_V2::steady_clock::time_point lower_time_bound = time; -- std::chrono::_V2::steady_clock::time_point upper_time_bound = time+10s; -+ std::chrono::steady_clock::time_point lower_time_bound = time; -+ std::chrono::steady_clock::time_point upper_time_bound = time+10s; - Eigen::Isometry2d tf = Eigen::Isometry2d::Identity(); - - rmf_traffic::internal::Spacetime region = { -@@ -1263,8 +1263,8 @@ SCENARIO("Testing intersection of curved trajectory with various spacetimes") - SCENARIO("Testing multi-waypoint trajectories with various spacetimes") - { - using namespace std::chrono_literals; -- std::chrono::_V2::steady_clock::time_point lower_time_bound; -- std::chrono::_V2::steady_clock::time_point upper_time_bound; -+ std::chrono::steady_clock::time_point lower_time_bound; -+ std::chrono::steady_clock::time_point upper_time_bound; - - const auto small_circle_shape = rmf_traffic::geometry::make_final_convex< - rmf_traffic::geometry::Circle>(0.5); -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/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/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/detail/primitive_shape_algorithm/capsule_capsule-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/capsule_capsule-inl.h -index b316c95..10af788 100644 ---- a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/capsule_capsule-inl.h -+++ b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/capsule_capsule-inl.h -@@ -38,6 +38,7 @@ - #ifndef FCL_NARROWPHASE_DETAIL_CAPSULECAPSULE_INL_H - #define FCL_NARROWPHASE_DETAIL_CAPSULECAPSULE_INL_H - -+#include - #include "fcl/narrowphase/detail/primitive_shape_algorithm/capsule_capsule.h" - - namespace fcl -diff --git a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/plane-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/plane-inl.h -index 1373dce..dd19a87 100755 ---- a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/plane-inl.h -+++ b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/plane-inl.h -@@ -38,6 +38,7 @@ - #ifndef FCL_NARROWPHASE_DETAIL_PLANE_INL_H - #define FCL_NARROWPHASE_DETAIL_PLANE_INL_H - -+#include - #include "fcl/narrowphase/detail/primitive_shape_algorithm/plane.h" - - namespace fcl -diff --git a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box-inl.h -index 77e0a66..a82f049 100644 ---- a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box-inl.h -+++ b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box-inl.h -@@ -37,6 +37,7 @@ - #ifndef FCL_NARROWPHASE_DETAIL_SPHEREBOX_INL_H - #define FCL_NARROWPHASE_DETAIL_SPHEREBOX_INL_H - -+#include - #include "fcl/narrowphase/detail/primitive_shape_algorithm/sphere_box.h" - - namespace fcl { -diff --git a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder-inl.h -index abda262..793f278 100644 ---- a/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder-inl.h -+++ b/thirdparty/fcl/include/fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder-inl.h -@@ -37,6 +37,7 @@ - #ifndef FCL_NARROWPHASE_DETAIL_SPHERECYLINDER_INL_H - #define FCL_NARROWPHASE_DETAIL_SPHERECYLINDER_INL_H - -+#include - #include "fcl/narrowphase/detail/primitive_shape_algorithm/sphere_cylinder.h" - - namespace fcl { -diff --git a/thirdparty/fcl/include/fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node-inl.h b/thirdparty/fcl/include/fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node-inl.h -index 44ddde5..2e63bee 100644 ---- a/thirdparty/fcl/include/fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node-inl.h -+++ b/thirdparty/fcl/include/fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node-inl.h -@@ -38,6 +38,7 @@ - #ifndef FCL_TRAVERSAL_MESHCONSERVATIVEADVANCEMENTTRAVERSALNODE_INL_H - #define FCL_TRAVERSAL_MESHCONSERVATIVEADVANCEMENTTRAVERSALNODE_INL_H - -+#include - #include "fcl/narrowphase/detail/traversal/distance/mesh_conservative_advancement_traversal_node.h" - - #include "fcl/math/bv/RSS.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/distros/jazzy/patch/ros2-rmf-building-map-tools.patch b/distros/jazzy/patch/ros2-rmf-building-map-tools.patch deleted file mode 100644 index 94e081e3..00000000 --- a/distros/jazzy/patch/ros2-rmf-building-map-tools.patch +++ /dev/null @@ -1,16 +0,0 @@ -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/distros/jazzy/patch/ros2-rmf-robot-sim-common.patch b/distros/jazzy/patch/ros2-rmf-robot-sim-common.patch deleted file mode 100644 index e369277e..00000000 --- a/distros/jazzy/patch/ros2-rmf-robot-sim-common.patch +++ /dev/null @@ -1,39 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 250bb9a..ff56169 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -18,6 +18,10 @@ endif() - - find_package(eigen3_cmake_module REQUIRED) - find_package(Eigen3 REQUIRED) -+if(NOT EIGEN3_INCLUDE_DIRS) -+ # Eigen 5's CMake config only provides the Eigen3::Eigen target -+ get_target_property(EIGEN3_INCLUDE_DIRS Eigen3::Eigen INTERFACE_INCLUDE_DIRECTORIES) -+endif() - find_package(ament_cmake REQUIRED) - find_package(rclcpp REQUIRED) - find_package(geometry_msgs REQUIRED) -diff --git a/include/rmf_robot_sim_common/readonly_common.hpp b/include/rmf_robot_sim_common/readonly_common.hpp -index 3621daf..b3f493f 100644 ---- a/include/rmf_robot_sim_common/readonly_common.hpp -+++ b/include/rmf_robot_sim_common/readonly_common.hpp -@@ -122,7 +122,8 @@ void ReadonlyCommon::read_sdf(SdfPtrT& sdf) - RCLCPP_INFO(logger(), "Setting level name to: %s", _level_name.c_str()); - - if (sdf->HasElement("graph_index")) -- _nav_graph_index = sdf->template Get("graph_index"); -+ // sdformat has no std::size_t parameter type where it is unsigned long (macOS) -+ _nav_graph_index = static_cast(sdf->template Get("graph_index")); - RCLCPP_INFO(logger(), "Setting nav graph index: %d", _nav_graph_index); - - if (sdf->HasElement("spawn_waypoint")) -@@ -130,7 +131,8 @@ void ReadonlyCommon::read_sdf(SdfPtrT& sdf) - RCLCPP_INFO(logger(), "Setting start wp name: %s", _start_wp_name.c_str()); - - if (sdf->HasElement("look_ahead")) -- _lookahead = sdf->template Get("look_ahead"); -+ // sdformat has no std::size_t parameter type where it is unsigned long (macOS) -+ _lookahead = static_cast(sdf->template Get("look_ahead")); - _lookahead = _lookahead < 1 ? 1 : _lookahead; - _next_wp.resize(_lookahead); - _path.resize(_lookahead); diff --git a/distros/jazzy/patch/ros2-rmf-traffic-ros2.patch b/distros/jazzy/patch/ros2-rmf-traffic-ros2.patch deleted file mode 100644 index 51425713..00000000 --- a/distros/jazzy/patch/ros2-rmf-traffic-ros2.patch +++ /dev/null @@ -1,39 +0,0 @@ -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/distros/lyrical/patch/ros2-rmf-building-map-tools.patch b/distros/lyrical/patch/ros2-rmf-building-map-tools.patch deleted file mode 100644 index 46ce77f3..00000000 --- a/distros/lyrical/patch/ros2-rmf-building-map-tools.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/building_map/level.py b/building_map/level.py -index b602ed6..68767cf 100644 ---- a/building_map/level.py -+++ b/building_map/level.py -@@ -430,7 +430,9 @@ 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)) -+ b = np.array(b) -+ # np.cross no longer accepts 2D vectors as of NumPy 2.4. -+ cross = a[:, 0] * b[:, 1] - a[:, 1] * b[:, 0] - if np.all(cross >= 0) or np.all(cross <= 0): - return True - else: diff --git a/distros/lyrical/patch/ros2-rmf-traffic-ros2.patch b/distros/lyrical/patch/ros2-rmf-traffic-ros2.patch deleted file mode 100644 index 51425713..00000000 --- a/distros/lyrical/patch/ros2-rmf-traffic-ros2.patch +++ /dev/null @@ -1,39 +0,0 @@ -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/distros/rolling/patch/ros2-rmf-building-map-tools.patch b/distros/rolling/patch/ros2-rmf-building-map-tools.patch deleted file mode 100644 index 94e081e3..00000000 --- a/distros/rolling/patch/ros2-rmf-building-map-tools.patch +++ /dev/null @@ -1,16 +0,0 @@ -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/distros/rolling/patch/ros2-rmf-traffic-ros2.patch b/distros/rolling/patch/ros2-rmf-traffic-ros2.patch deleted file mode 100644 index 51425713..00000000 --- a/distros/rolling/patch/ros2-rmf-traffic-ros2.patch +++ /dev/null @@ -1,39 +0,0 @@ -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/distros/humble/patch/ros2-rmf-building-map-tools.patch b/shared/patch/ros2-rmf-building-map-tools.patch similarity index 100% rename from distros/humble/patch/ros2-rmf-building-map-tools.patch rename to shared/patch/ros2-rmf-building-map-tools.patch diff --git a/distros/humble/patch/ros2-rmf-robot-sim-common.patch b/shared/patch/ros2-rmf-robot-sim-common.patch similarity index 100% rename from distros/humble/patch/ros2-rmf-robot-sim-common.patch rename to shared/patch/ros2-rmf-robot-sim-common.patch diff --git a/distros/humble/patch/ros2-rmf-traffic-ros2.patch b/shared/patch/ros2-rmf-traffic-ros2.patch similarity index 100% rename from distros/humble/patch/ros2-rmf-traffic-ros2.patch rename to shared/patch/ros2-rmf-traffic-ros2.patch diff --git a/distros/jazzy/patch/ros2-rmf-traffic.patch b/shared/patch/ros2-rmf-traffic.patch similarity index 100% rename from distros/jazzy/patch/ros2-rmf-traffic.patch rename to shared/patch/ros2-rmf-traffic.patch