Skip to content

Add rmf_dev - #114

Draft
Tobias-Fischer wants to merge 18 commits into
mainfrom
ports/rmf-humble
Draft

Tobias-Fischer wants to merge 18 commits into
mainfrom
ports/rmf-humble

Conversation

@Tobias-Fischer

@Tobias-Fischer Tobias-Fischer commented Oct 18, 2026 •

Copy link
Copy Markdown
Collaborator

Ports RoboStack/ros-humble#298 by @Ac31415: adds rmf_dev to the shared selection (next to rmf_demos, which jazzy, lyrical and rolling already build). Building it on top of the syncs turned up fixes for humble (which hasn't built RMF yet), for jazzy (rmf_dev pulls in more of RMF than rmf_demos, and jazzy hadn't been built on GCC 15 / macOS with it), and one for every distribution.

All distributions (shared patch)

  • rmf_fleet_adapter_python: rmf_adapter is built as a Python MODULE instead of SHARED. With SHARED, pybind11 links pybind11::embed (libpython), and on macOS import rmf_adapter aborts (PyInterpreterState_Get: … the GIL is released): the module initialises a second, never-started interpreter. The published osx-arm64 builds have this today (checked rolling 2.12.0, and humble's local build). Upstream main still uses SHARED. A new recipe test (shared/tests/ros2-rmf-fleet-adapter-python.yaml) imports rmf_adapter and builds a Graph; it passes on humble and jazzy (osx-arm64). Applies to humble 2.1.8, jazzy 2.7.2, lyrical 2.13.0 and rolling 2.12.0, so lyrical and rolling rebuild this package.
  • nlohmann_json_schema_validator_vendor 0.2.5 (humble, jazzy): CMAKE_POLICY_VERSION_MINIMUM=3.5 for its external project (CMake 4), moved from humble's patch to shared/.
  • pybind11_json_vendor: host and run dependency on conda-forge's pybind11_json, for every distribution (moved from humble's and lyrical's dependencies.yaml).

humble

  • rmf_traffic 3.0.3: Fix build with Apple Clang open-rmf/rmf_traffic#98 (Apple Clang final/ParticipantId errors, as diagnosed by @traversaro in that PR), <cassert> in its bundled fcl, Eigen3::Eigen (Eigen 5 no longer sets EIGEN3_INCLUDE_DIRS).
  • rmf_task 2.1.8: <cstdint> (its headers use uint32_t without it; GCC 15 doesn't include it for them). From rolling's patch.
  • rmf_utils 1.4.1: #include <string> in Modular.hpp; WINDOWS_EXPORT_ALL_SYMBOLS on Windows (from rolling's patch).
  • rmf_websocket: Boost.System is header-only (no boost_system library since Boost 1.89).
  • rmf_traffic_ros2: lyrical's patch (macOS uuid from the SDK, Eigen3::Eigen).
  • rmf_fleet_adapter: malloc.h/malloc_trim only on Linux; RxCpp's copy assignment of a const member removed (newer clang and GCC 15 reject it); std::max<int64_t> and std::size_t lane vectors (uint64_t is unsigned long long on macOS).
  • rmf_robot_sim_common: EIGEN3_INCLUDE_DIRS from Eigen3::Eigen; sdformat parameters read as uint64_t.
  • rmf_robot_sim_gz_plugins: links the Gazebo gui library (GuiSystem); a declared but never defined slot removed.
  • rmf_building_sim_gz_classic_plugins: OpenCV 5's geometry.hpp, ${GAZEBO_LIBRARIES}; it and rmf_robot_sim_gz_classic_plugins (Gazebo Classic, EOL) are excluded off Linux, after more link errors on macOS.
  • rmf_building_map_tools 1.6.3: the old humble patch is obsolete (upstream removed np.asscalar); rolling's numpy 2 fix for the 2-D np.cross instead.
  • robostack.yaml: maps the ignition-fortress rosdep key to the Fortress libraries.

jazzy

  • rmf_traffic 3.3.3: <cstdint> in ParticipantDescription.hpp (GCC 15), and from humble's patch for the same code the macOS fixes (ParticipantId overrides, <cassert> in fcl and blockade/geometry.cpp, std::chrono instead of libstdc++'s std::chrono::_V2 in a test).
  • rmf_task 2.5.1: <cstdint> (GCC 15), from rolling's patch.
  • rmf_fleet_adapter 2.7.2: humble's RxCpp fix (GCC 15) and macOS fixes, plus a size_t cast for a route_id comparison in ExecutePlan.cpp.
  • rmf_websocket 2.7.2: no Boost.System, and asio::io_service (removed in Boost 1.90) → io_context with boost::asio::post/dispatch. conda-forge's websocketpp is already on io_context, so no standalone Asio.
  • rmf_visualization_schedule 2.3.2: links OpenSSL::SSL/OpenSSL::Crypto; ament_target_dependencies(OpenSSL) linked nothing (it looks for OpenSSL_LIBRARIES), which only macOS rejects.
  • rmf_visualization_floorplans 2.3.2 and rmf_robot_sim_common 2.3.3: Eigen3::Eigen (Eigen 5); rmf_robot_sim_common takes humble's patch.
  • rmf_robot_sim_gz_plugins 2.3.3: as humble, for the gz names (gz-sim::gui).
  • rmf_traffic_ros2 2.7.2 and rmf_building_map_tools 1.9.2: rolling's patches (macOS LibUUID; numpy 2 np.cross).

Not taken over from rolling: its rmf_visualization_schedule (standalone Asio, needs an extra dependency; neither distribution's source uses Asio directly and humble built without it), rmf_visualization_floorplans OpenCV change (not needed: humble and jazzy's uint8[] fields are std::vector<uint8_t>), and rmf_utils for jazzy (the jazzy sync already has it as ros2-rmf-utils.win.patch).

Windows: jazzy, lyrical and rolling carry Windows patches for RMF, humble none, so humble's RMF stack will likely need them (or an exclusion) once CI runs on win-64.

Built locally (on top of the syncs, see below)

  • jazzy, osx-arm64: rmf_dev and its whole closure (321 packages) with recipe tests. In a fresh environment from these packages, import rmf_adapter (with easy_full_control, graph) works and Graph() runs, after the MODULE fix; the new recipe test passes there.
  • jazzy, linux-64: all 42 RMF recipes of the closure, with recipe tests.
  • humble, osx-arm64: rmf_dev and its closure (about 350 packages) with recipe tests; rmf_fleet_adapter_python rebuilt with the MODULE fix: it no longer links libpython, and the new recipe test passes (the build before the fix had the same crash).
  • lyrical, rolling: only the shared rmf_fleet_adapter_python patch changes for them; it applies to their sync versions, not rebuilt locally.

Prepared and built on top of the current rosdistro syncs (#62 humble, #61 jazzy, #60 lyrical, #99 rolling) merged together, so it targets their package versions: merge after them. CI is held with [skip ci] until the syncs are in. In CI, evict rmf_fleet_adapter_python on lyrical and rolling if their caches hold it.

🤖 Generated with Claude Code

Tobias-Fischer and others added 18 commits October 19, 2026 09:18
Ports RoboStack/ros-humble#298. humble's rmf_traffic 3.0.3 gets the Apple
Clang fix from open-rmf/rmf_traffic#98, <cassert> in its bundled fcl and
Eigen3::Eigen (Eigen 5 no longer sets EIGEN3_INCLUDE_DIRS); rmf_utils
includes <string>; 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 <noreply@anthropic.com>
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<int64_t> 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 <noreply@anthropic.com>
…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 <noreply@anthropic.com>
…ion [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 <noreply@anthropic.com>
rmf_dev also brings rmf_traffic 3.3.3 to jazzy, which fails with GCC 15:
ParticipantDescription.hpp uses uint16_t/uint64_t without <cstdint>. Add
that include, plus lyrical's rmf_traffic changes (Eigen3::Eigen for Eigen 5,
<cassert>), which apply unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rmf_task (<cstdint>, 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 <noreply@anthropic.com>
…en 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 <noreply@anthropic.com>
…ls 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 <noreply@anthropic.com>
…hedule 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 <noreply@anthropic.com>
The OpenCV hunk taken from rolling isn't needed for humble or jazzy: their
uint8[] message fields are std::vector<uint8_t>, which cv::Mat accepts,
and humble built without it. jazzy keeps the Eigen3::Eigen link.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <cassert>, 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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
…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 <noreply@anthropic.com>
…rks [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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant