diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b050b1..86e75da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -154,6 +154,14 @@ elseif("$ENV{ROS_VERSION}" STREQUAL "2") ros2_foxglove_bridge/src/parameter_interface.cpp ros2_foxglove_bridge/src/generic_client.cpp ) + + target_compile_definitions(foxglove_bridge_component + PRIVATE + RCLCPP_VERSION_MAJOR=${rclcpp_VERSION_MAJOR} + RCLCPP_VERSION_MINOR=${rclcpp_VERSION_MINOR} + RCLCPP_VERSION_PATCH=${rclcpp_VERSION_PATCH} + ) + target_include_directories(foxglove_bridge_component PUBLIC $ diff --git a/ros2_foxglove_bridge/src/generic_client.cpp b/ros2_foxglove_bridge/src/generic_client.cpp index fa87083..7c58801 100644 --- a/ros2_foxglove_bridge/src/generic_client.cpp +++ b/ros2_foxglove_bridge/src/generic_client.cpp @@ -9,6 +9,21 @@ #include +// clang-format off +/* True if the version of RCLCPP is at least major.minor.patch */ +#define RCLCPP_VERSION_GTE(major, minor, patch) \ + (major < RCLCPP_VERSION_MAJOR \ + ? true \ + : major > RCLCPP_VERSION_MAJOR \ + ? false \ + : minor < RCLCPP_VERSION_MINOR \ + ? true \ + : minor > RCLCPP_VERSION_MINOR \ + ? false \ + : patch < RCLCPP_VERSION_PATCH ? true \ + : patch > RCLCPP_VERSION_PATCH ? false : true) +// clang-format on + namespace { // Copy of github.com/ros2/rclcpp/blob/33dae5d67/rclcpp/src/rclcpp/typesupport_helpers.cpp#L69-L92 @@ -123,10 +138,19 @@ GenericClient::GenericClient(rclcpp::node_interfaces::NodeBaseInterface* nodeBas _typeIntrospectionHdl = (reinterpret_cast( _typeIntrospectionLib->get_symbol(typeinstrospection_symbol_name)))(); + // get_typesupport_handle is deprecated since rclcpp 25.0.0 + // (https://github.com/ros2/rclcpp/pull/2209) +#if RCLCPP_VERSION_GTE(25, 0, 0) + _requestTypeSupportHdl = + rclcpp::get_message_typesupport_handle(requestTypeName, TYPESUPPORT_LIB_NAME, *_typeSupportLib); + _responseTypeSupportHdl = rclcpp::get_message_typesupport_handle( + responseTypeName, TYPESUPPORT_LIB_NAME, *_typeSupportLib); +#else _requestTypeSupportHdl = rclcpp::get_typesupport_handle(requestTypeName, TYPESUPPORT_LIB_NAME, *_typeSupportLib); _responseTypeSupportHdl = rclcpp::get_typesupport_handle(responseTypeName, TYPESUPPORT_LIB_NAME, *_typeSupportLib); +#endif rcl_ret_t ret = rcl_client_init(this->get_client_handle().get(), this->get_rcl_node_handle(), _serviceTypeSupportHdl, serviceName.c_str(), &client_options); diff --git a/ros2_foxglove_bridge/src/ros2_foxglove_bridge.cpp b/ros2_foxglove_bridge/src/ros2_foxglove_bridge.cpp index 9ef33e2..57042b4 100644 --- a/ros2_foxglove_bridge/src/ros2_foxglove_bridge.cpp +++ b/ros2_foxglove_bridge/src/ros2_foxglove_bridge.cpp @@ -534,7 +534,9 @@ void FoxgloveBridge::subscribe(foxglove::ChannelId channelId, ConnectionHandle c try { auto subscriber = this->create_generic_subscription( topic, datatype, qos, - std::bind(&FoxgloveBridge::rosMessageHandler, this, channelId, clientHandle, _1), + [this, channelId, clientHandle](std::shared_ptr msg) { + this->rosMessageHandler(channelId, clientHandle, msg); + }, subscriptionOptions); subscriptionsByClient.emplace(clientHandle, std::move(subscriber)); } catch (const std::exception& ex) {