diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2db79a0..0bce0c4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -10,13 +10,14 @@ QT5_WRAP_UI ( COMMON_UI_SRC add_library( commonROS STATIC - dialog_select_ros_topics.h + dialog_select_ros_topics.h dialog_select_ros_topics.cpp dialog_with_itemlist.h publisher_select_dialog.h parser_configuration.cpp parser_configuration.h ros_parsers/ros2_parser.cpp + typesupport_wrapper.cpp ${COMMON_UI_SRC} ) @@ -51,6 +52,7 @@ if("$ENV{ROS_DISTRO}" STREQUAL "humble") message(STATUS "Detected Humble") target_compile_definitions(DataLoadROS2 PUBLIC ROS_HUMBLE) target_compile_definitions(TopicPublisherROS2 PUBLIC ROS_HUMBLE) + target_compile_definitions(commonROS PUBLIC ROS_HUMBLE) endif() ####################################################################### diff --git a/src/DataLoadROS2/dataload_ros2.cpp b/src/DataLoadROS2/dataload_ros2.cpp index 0e757d0..4c89d59 100644 --- a/src/DataLoadROS2/dataload_ros2.cpp +++ b/src/DataLoadROS2/dataload_ros2.cpp @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -94,7 +93,6 @@ bool DataLoadROS2::readDataFromFile(PJ::FileLoadInfo* info, PJ::PlotDataMapRef& all_topics_qt.push_back({ QString::fromStdString(topic.name), QString::fromStdString(topic.type) }); topicTypesByName.emplace(topic.name, topic.type); - const auto& typesupport_identifier = rosidl_typesupport_cpp::typesupport_identifier; try { topics_info.emplace_back(CreateTopicInfo(topic.name, topic.type)); diff --git a/src/TopicPublisherROS2/generic_publisher.h b/src/TopicPublisherROS2/generic_publisher.h index ec80caf..686b15a 100644 --- a/src/TopicPublisherROS2/generic_publisher.h +++ b/src/TopicPublisherROS2/generic_publisher.h @@ -20,6 +20,8 @@ #include #include +#include "typesupport_wrapper.h" + class GenericPublisher : public rclcpp::PublisherBase { public: @@ -48,8 +50,8 @@ class GenericPublisher : public rclcpp::PublisherBase static std::shared_ptr create(rclcpp::Node& node, const std::string& topic_name, const std::string& topic_type) { - auto library = std::move(rosbag2_cpp::get_typesupport_library(topic_type, "rosidl_typesupport_cpp")); - auto type_support = rosbag2_cpp::get_typesupport_handle(topic_type, "rosidl_typesupport_cpp", library); + auto library = std::move(wrapper::get_typesupport_library(topic_type, "rosidl_typesupport_cpp")); + auto type_support = wrapper::get_message_typesupport_handle(topic_type, "rosidl_typesupport_cpp", library); return std::make_shared(node.get_node_base_interface().get(), topic_name, *type_support); } diff --git a/src/ros_parsers/ros2_parser.cpp b/src/ros_parsers/ros2_parser.cpp index 5c05427..d6ee8be 100644 --- a/src/ros_parsers/ros2_parser.cpp +++ b/src/ros_parsers/ros2_parser.cpp @@ -10,6 +10,8 @@ #include #include +#include "typesupport_wrapper.h" + bool TypeHasHeader(const rosidl_message_type_support_t* type_support) { auto members = static_cast(type_support->data); @@ -35,17 +37,15 @@ bool TypeHasHeader(const rosidl_message_type_support_t* type_support) std::string CreateSchema(const std::string& base_type) { std::string schema; - using TypeSupport = rosidl_message_type_support_t; using namespace rosidl_typesupport_introspection_cpp; std::set secondary_types_pending; std::set secondary_types_done; auto addTypeToSchema = [&](const std::string& type_name, bool add_header) { - auto introspection_library = - rosbag2_cpp::get_typesupport_library(type_name, "rosidl_typesupport_introspection_cpp"); - auto introspection_support = - rosbag2_cpp::get_typesupport_handle(type_name, "rosidl_typesupport_introspection_cpp", introspection_library); + auto introspection_library = wrapper::get_typesupport_library(type_name, "rosidl_typesupport_introspection_cpp"); + auto introspection_support = wrapper::get_message_typesupport_handle( + type_name, "rosidl_typesupport_introspection_cpp", introspection_library); if (add_header) { @@ -147,13 +147,13 @@ TopicInfo CreateTopicInfo(const std::string& topic_name, const std::string& type info.topic_name = topic_name; info.type = type_name; - info.introspection_library = rosbag2_cpp::get_typesupport_library(type_name, "rosidl_typesupport_introspection_cpp"); - info.introspection_support = rosbag2_cpp::get_typesupport_handle(type_name, "rosidl_typesupport_introspection_cpp", - info.introspection_library); + info.introspection_library = wrapper::get_typesupport_library(type_name, "rosidl_typesupport_introspection_cpp"); + info.introspection_support = wrapper::get_message_typesupport_handle( + type_name, "rosidl_typesupport_introspection_cpp", info.introspection_library); auto identifier = rosidl_typesupport_cpp::typesupport_identifier; - info.support_library = rosbag2_cpp::get_typesupport_library(type_name, identifier); - info.type_support = rosbag2_cpp::get_typesupport_handle(type_name, identifier, info.support_library); + info.support_library = wrapper::get_typesupport_library(type_name, identifier); + info.type_support = wrapper::get_message_typesupport_handle(type_name, identifier, info.support_library); info.has_header_stamp = TypeHasHeader(info.introspection_support); return info; diff --git a/src/ros_parsers/ros2_parser.h b/src/ros_parsers/ros2_parser.h index 4fcc021..a32c8bd 100644 --- a/src/ros_parsers/ros2_parser.h +++ b/src/ros_parsers/ros2_parser.h @@ -3,7 +3,6 @@ #include "rclcpp/rclcpp.hpp" #include "rmw/rmw.h" #include "rmw/types.h" -#include "rosbag2_cpp/typesupport_helpers.hpp" #include "rosidl_typesupport_introspection_cpp/message_introspection.hpp" #include diff --git a/src/typesupport_wrapper.cpp b/src/typesupport_wrapper.cpp new file mode 100644 index 0000000..82ebbea --- /dev/null +++ b/src/typesupport_wrapper.cpp @@ -0,0 +1,34 @@ + + +#include "typesupport_wrapper.h" +#include "rosidl_runtime_cpp/message_type_support_decl.hpp" + +#ifdef ROS_HUMBLE +#include "rosbag2_cpp/typesupport_helpers.hpp" +#else +#include "rclcpp/typesupport_helpers.hpp" +#endif + +namespace wrapper +{ +std::shared_ptr get_typesupport_library(const std::string& type, + const std::string& typesupport_identifier) +{ +#ifdef ROS_HUMBLE + return rosbag2_cpp::get_typesupport_library(type, typesupport_identifier); +#else + return rclcpp::get_typesupport_library(type, typesupport_identifier); +#endif +} + +const rosidl_message_type_support_t* get_message_typesupport_handle(const std::string& type, + const std::string& typesupport_identifier, + std::shared_ptr library) +{ +#ifdef ROS_HUMBLE + return rosbag2_cpp::get_typesupport_handle(type, typesupport_identifier, library); +#else + return rclcpp::get_message_typesupport_handle(type, typesupport_identifier, *library); +#endif +} +} // namespace wrapper diff --git a/src/typesupport_wrapper.h b/src/typesupport_wrapper.h new file mode 100644 index 0000000..925f6cc --- /dev/null +++ b/src/typesupport_wrapper.h @@ -0,0 +1,23 @@ +/* + * Wrappers to keep compatibility with all active ROS versions as of 01/2026 (Kilted, Jazzy, Humble). Dropping of + * this file should be reevaluated once Humble goes end of life (07/2027). + */ + +#ifndef TYPESUPPORT_WRAPPER_H +#define TYPESUPPORT_WRAPPER_H + +#include +#include "rcpputils/shared_library.hpp" +#include "rosidl_runtime_cpp/message_type_support_decl.hpp" + +namespace wrapper +{ +std::shared_ptr get_typesupport_library(const std::string& type, + const std::string& typesupport_identifier); + +const rosidl_message_type_support_t* get_message_typesupport_handle(const std::string& type, + const std::string& typesupport_identifier, + std::shared_ptr library); +} // namespace wrapper + +#endif // TYPESUPPORT_WRAPPER_H