Skip to content
69 changes: 69 additions & 0 deletions distros/humble/robostack.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Qt5 for the Qt5 rosdep keys: this distribution's rviz and GUI packages still build
# against Qt5 (the shared mapping, for lyrical and newer, is Qt6). Packages already
# ported to Qt6/PyQt6 swap qt-main in patch/dependencies.yaml.
libqt5-core:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-gui:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-opengl:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-opengl-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-svg:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-svg-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-websockets-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5-widgets:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
libqt5x11extras5-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
qt5-image-formats-plugins:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
qt5-qmake:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
qtbase5-dev:
robostack:
linux: [qt-main, libopengl-devel, libgl-devel]
osx: [qt-main]
win64: [qt-main]
python-qt5-bindings:
robostack: [pyqt, pyqt-builder]
python3-qt5-bindings:
robostack: [pyqt, pyqt-builder]
python3-qt5-bindings-gl:
robostack: [pyqt, pyqt-builder]
2 changes: 2 additions & 0 deletions distros/humble/vinca.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ ros_distro: humble
patch_dir: patch
rosdistro_snapshot: rosdistro_snapshot.yaml
rosdistro_additional_recipes: rosdistro_additional_recipes.yaml
# Qt5 for the Qt5 rosdep keys (see robostack.yaml); layered over shared/robostack.yaml
conda_index: [robostack.yaml]

build_number: 20

Expand Down
5 changes: 3 additions & 2 deletions distros/lyrical/conda_build_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ cuda_compiler:
cuda_compiler_version:
- None
- 12.9 # [((linux and (x86_64 or aarch64)) or win64) and os.environ.get("CF_CUDA_ENABLED", "False") == "True"]
# libopencv 5.0.0 builds for openexr 3.5 need qt6-main >= 6.12, but pyqt6 6.11 (via
# qt6-multimedia 6.11) still requires qt6-main 6.11: stay on openexr 3.4 until pyqt6 is rebuilt
cuda_compiler_version_min:
- None # [not ((linux and (x86_64 or aarch64)) or win64)]
- 12.9 # [((linux and (x86_64 or aarch64)) or win64)]
Expand Down Expand Up @@ -916,7 +918,7 @@ oneloop:
openblas:
- 0.3.*
openexr:
- 3.4
- '3.4'
openh264:
- 2.6.0
openjpeg:
Expand Down Expand Up @@ -1002,7 +1004,6 @@ python:
python_impl:
- cpython

# ros-lyrical specific (distros/lyrical/distro.yaml)
python_min:
# minimum supported python version per CFEP-25
# bump to next minor version when we drop python versions
Expand Down
7 changes: 1 addition & 6 deletions distros/lyrical/distro.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,4 @@
channel_name: robostack-lyrical
upload_to: [prefix, anaconda]
read_from: prefix
conda_forge_pinning_version: 2026.10.09.13.11.31
conda_forge_migrations: [elfutils0196, giflib6, go_macos, gsl28, gstreamer128, hdf52, libboost190, libhwloc2150, proj99, urdfdom6]
pinning_overrides:
# libopencv 5.0.0 builds for openexr 3.5 need qt6-main >= 6.12, but pyqt6 6.11 (via
# qt6-multimedia 6.11) still requires qt6-main 6.11: stay on openexr 3.4 until pyqt6 is rebuilt
openexr: ['3.4']
rosdistro_sync: lyrical/2026-10-05
35 changes: 12 additions & 23 deletions distros/lyrical/patch/dependencies.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,17 @@ pcl_conversions:
pinocchio:
add_host: ["eigen-abi-devel"]
plotjuggler:
add_host: ["libxcb", "${{ 'elfutils' if linux }}", "ros2-ros-workspace"]
# PlotJuggler 3.17 is Qt5-only (find_package(Qt5 ...)); the Qt rosdep keys map to Qt6 here
remove_host: ["qt6-main"]
remove_run: ["qt6-main"]
add_host: ["libxcb", "${{ 'elfutils' if linux }}", "ros2-ros-workspace", "qt-main"]
add_run: ["qt-main"]
plotjuggler_ros:
# Qt5-only like plotjuggler, which it links
remove_host: ["qt6-main"]
remove_run: ["qt6-main"]
add_host: ["qt-main"]
add_run: ["qt-main"]
py_trees:
add_host: ["hatchling"]
py_trees_js:
Expand Down Expand Up @@ -156,26 +166,8 @@ rmf_visualization_schedule:
add_host: ["asio"]
ros_gz_sim:
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}", "ros2-gz-sensors-vendor"]
ros_image_to_qimage:
# Qt6, like rqt_gui_cpp (patch/ros2-ros-image-to-qimage.patch)
remove_host: ["qt-main"]
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}", "qt6-main"]
rqt_gui_cpp:
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}"]
rqt_image_overlay:
# Qt6, like rqt_gui_cpp (patch/ros2-rqt-image-overlay.patch)
remove_host: ["qt-main"]
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}", "qt6-main"]
rqt_image_overlay_layer:
# Qt6, like rqt_gui_cpp (patch/ros2-rqt-image-overlay-layer.patch)
remove_host: ["qt-main"]
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}", "qt6-main"]
rqt_image_view:
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}", "qt6-main"]
remove_host: ["qt-main"]
rqt_mocap4r2_control:
remove_host: ["qt-main"]
remove_run: ["qt-main"]
rtabmap:
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}", "ceres-solver", "libboost-devel", "${{ 'libdc1394' if not win }}", "libusb", "vtk"]
rviz_ogre_vendor:
Expand All @@ -190,10 +182,7 @@ sdformat_vendor:
add_run: ["sdformat"]
slam_toolbox:
add_build: ["${{ 'qt6-main' if (build_platform != target_platform) }}"]
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}", "blas-devel", "ceres-solver", "qt6-main"]
add_run: ["qt6-main"]
remove_host: ["qt-main"]
remove_run: ["qt-main"]
add_host: ["blas-devel", "ceres-solver"]
spatio_temporal_voxel_layer:
add_host: ["${{ 'libgl-devel' if linux }}", "${{ 'libopengl-devel' if linux }}", "openvdb"]
spdlog_vendor:
Expand Down
25 changes: 6 additions & 19 deletions distros/lyrical/patch/ros2-foxglove-bridge.patch
Original file line number Diff line number Diff line change
@@ -1,39 +1,26 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6171894..f285973 100644
index 64c1274..774140a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -97,6 +97,18 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarc
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
set(FOXGLOVE_SDK_PLATFORM "x86_64-unknown-linux-gnu")
set(FOXGLOVE_SDK_SHA "4790dad26adaced1a5f81530ed406bab7b60aa202a868eb78cfc04976b9ce6d7")
set(FOXGLOVE_SDK_SHA "1a0d8e03a885f01ae7cfb08dc9076090ba2cf8a15b7f46dda11451e2e2758978")
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
+ set(FOXGLOVE_SDK_PLATFORM "aarch64-apple-darwin")
+ set(FOXGLOVE_SDK_SHA "70c6e59cf757ac0480912c13cb2c630a3839de34eba428ef717411dae6b1688e")
+ set(FOXGLOVE_SDK_SHA "7b7a86a659a86544f23bed793b7913ad71c3f6c595233bbdb20d3968a3ce5a3a")
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+ set(FOXGLOVE_SDK_PLATFORM "x86_64-apple-darwin")
+ set(FOXGLOVE_SDK_SHA "c6092c615523d462a9d3779313b8c033cf923ce30a43dc5305d48fe4f6d26988")
+ set(FOXGLOVE_SDK_SHA "5bae49cac58fb423217e9214452c22faa95b51f5bda7c04469fb1649f8b74ce5")
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")
+ set(FOXGLOVE_SDK_PLATFORM "aarch64-pc-windows-msvc")
+ set(FOXGLOVE_SDK_SHA "b88abb1bc2c5e230db65cd3d608174f005b3b4563b1c0b2e33db05bc3a2b528b")
+ set(FOXGLOVE_SDK_SHA "8d067b5af329f808142a750e939799bfccb27926ff72b62da54e5280af002d3b")
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64")
+ set(FOXGLOVE_SDK_PLATFORM "x86_64-pc-windows-msvc")
+ set(FOXGLOVE_SDK_SHA "ae4ac0f4ab9eb998542a5626cd7870ba011824499fe33fa86936e82ed6502185")
+ set(FOXGLOVE_SDK_SHA "ea4db36121adb0ee61315442ea43603136c6910b4d82814688f507cd6f7fdd3b")
else()
message(FATAL_ERROR "Unsupported platform/architecture combination: ${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM_NAME}")
endif()
@@ -201,6 +213,12 @@ target_link_libraries(foxglove_bridge_component
rosx_introspection::rosx_introspection
)

+if(APPLE)
+ find_library(COREFOUNDATION_FRAMEWORK CoreFoundation REQUIRED)
+ find_library(SECURITY_FRAMEWORK Security REQUIRED)
+ target_link_libraries(foxglove_bridge_component ${COREFOUNDATION_FRAMEWORK} ${SECURITY_FRAMEWORK})
+endif()
+
rclcpp_components_register_nodes(foxglove_bridge_component "foxglove_bridge::FoxgloveBridge")
enable_strict_compiler_warnings(foxglove_bridge_component)
set_target_properties(foxglove_bridge_component PROPERTIES
diff --git a/src/message_definition_cache.cpp b/src/message_definition_cache.cpp
index cf2864e..9124c80 100644
--- a/src/message_definition_cache.cpp
Expand Down
112 changes: 5 additions & 107 deletions distros/lyrical/patch/ros2-foxglove-bridge.win.patch
Original file line number Diff line number Diff line change
@@ -1,116 +1,14 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f285973..28652e5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -61,7 +61,7 @@ endif()
@@ -62,7 +62,9 @@ endif()

macro(enable_strict_compiler_warnings target)
if (MSVC)
- target_compile_options(${target} PRIVATE /WX /W4)
+ target_compile_options(${target} PRIVATE /W4)
+ # /permissive: with C++20 (pulled in by the dependencies) MSVC enables /permissive-, which rejects
+ # the Foxglove SDK's explicit specializations after their first use (C2908 in parameter.hpp)
+ target_compile_options(${target} PRIVATE /W4 /permissive)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
target_compile_options(${target} PRIVATE -Wall -Wextra -Wpedantic -Werror -Wold-style-cast -Wfloat-equal -Wmost -Wunused-exception-parameter)
else()
@@ -121,6 +121,75 @@ FetchContent_Declare(
URL_HASH SHA256=${FOXGLOVE_SDK_SHA}
)
FetchContent_MakeAvailable(foxglove_sdk)
+if(MSVC)
+ file(READ
+ "${foxglove_sdk_SOURCE_DIR}/include/foxglove/parameter.hpp"
+ _foxglove_parameter_hpp
+ )
+ string(REPLACE "\r\n" "\n" _foxglove_parameter_hpp "${_foxglove_parameter_hpp}")
+ string(REPLACE
+[=[
+ [[nodiscard]] bool isArray() const noexcept {
+ if (!this->isArray<ParameterValueView>()) {
+ return false;
+ }
+ try {
+ const auto& arr = this->get<ParameterValueView::Array>();
+ return std::all_of(arr.begin(), arr.end(), [](const ParameterValueView& elem) noexcept {
+ return elem.is<T>();
+ });
+ } catch (...) {
+ return false;
+ }
+ }
+]=]
+[=[
+ [[nodiscard]] bool isArray() const noexcept {
+ auto value = this->value();
+ if (!value.has_value() || !value->is<ParameterValueView::Array>()) {
+ return false;
+ }
+ try {
+ const auto& arr = value->get<ParameterValueView::Array>();
+ return std::all_of(arr.begin(), arr.end(), [](const ParameterValueView& elem) noexcept {
+ return elem.is<T>();
+ });
+ } catch (...) {
+ return false;
+ }
+ }
+]=]
+ _foxglove_parameter_hpp
+ "${_foxglove_parameter_hpp}"
+ )
+ string(REPLACE
+[=[
+ [[nodiscard]] bool isDict() const noexcept {
+ if (!this->isDict<ParameterValueView>()) {
+ return false;
+ }
+ try {
+ const auto& dict = this->get<ParameterValueView::Dict>();
+ return std::all_of(
+]=]
+[=[
+ [[nodiscard]] bool isDict() const noexcept {
+ auto value = this->value();
+ if (!value.has_value() || !value->is<ParameterValueView::Dict>()) {
+ return false;
+ }
+ try {
+ const auto& dict = value->get<ParameterValueView::Dict>();
+ return std::all_of(
+]=]
+ _foxglove_parameter_hpp
+ "${_foxglove_parameter_hpp}"
+ )
+ file(WRITE
+ "${foxglove_sdk_SOURCE_DIR}/include/foxglove/parameter.hpp"
+ "${_foxglove_parameter_hpp}"
+ )
+endif()

# The dist's CMake package config defines IMPORTED targets for the prebuilt C libraries
# (foxglove-static, foxglove-shared) and the foxglove_sdk_add_cpp_library() helper, which
@@ -135,6 +204,16 @@ if (FOXGLOVE_BRIDGE_REMOTE_ACCESS)
else()
foxglove_sdk_add_cpp_library(foxglove_cpp_shared TYPE SHARED REMOTE_ACCESS OFF)
endif()
+if(WIN32)
+ target_link_libraries(foxglove_cpp_shared PRIVATE
+ Ws2_32.lib
+ Userenv.lib
+ Ntdll.lib
+ Crypt32.lib
+ Secur32.lib
+ Ncrypt.lib
+ )
+endif()
set_target_properties(foxglove_cpp_shared PROPERTIES
BUILD_WITH_INSTALL_RPATH TRUE
)
diff --git a/src/ros2_foxglove_bridge.cpp b/src/ros2_foxglove_bridge.cpp
index b7fc123..fa78588 100644
--- a/src/ros2_foxglove_bridge.cpp
+++ b/src/ros2_foxglove_bridge.cpp
@@ -1,3 +1,5 @@
+#define _CRT_SECURE_NO_WARNINGS
+
#include <algorithm>
#include <cctype>
#include <cinttypes>
14 changes: 12 additions & 2 deletions distros/lyrical/patch/ros2-gz-ros2-control.win.patch
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
diff --git a/hooks/gz_ros2_control.dsv.in b/hooks/gz_ros2_control.dsv.in
index afbcf3a..45a35f1 100644
--- a/hooks/gz_ros2_control.dsv.in
+++ b/hooks/gz_ros2_control.dsv.in
@@ -1 +1 @@
-prepend-non-duplicate;GZ_SIM_SYSTEM_PLUGIN_PATH;@CMAKE_INSTALL_PREFIX@/lib
+prepend-non-duplicate;GZ_SIM_SYSTEM_PLUGIN_PATH;@CMAKE_INSTALL_PREFIX@/bin
diff --git a/src/gz_system.cpp b/src/gz_system.cpp
index 5c9952b9..d5554d2c 100644
index 5ac9614..3e6fbf0 100644
--- a/src/gz_system.cpp
+++ b/src/gz_system.cpp
@@ -51,3 +51,7 @@
@@ -67,6 +67,10 @@ struct InterfaceData
hardware_interface::CommandInterface::SharedPtr command;
};

+#ifdef ERROR
+#undef ERROR
+#endif
Expand Down
Loading
Loading