SMACC2
|
Template structure used to adapt custom, user-defined types to ROS types. More...
#include <type_adapter.hpp>
Public Types | |
using | is_specialized = std::false_type |
using | custom_type = CustomType |
using | ros_message_type = CustomType |
Template structure used to adapt custom, user-defined types to ROS types.
Adapting a custom, user-defined type to a ROS type allows that custom type to be used when publishing and subscribing in ROS.
In order to adapt a custom type to a ROS type, the user must create a template specialization of this structure for the custom type. In that specialization they must:
is_specialized
to std::true_type
,using custom_type = ...
,using ros_message_type = ...
,The convert functions must convert from one type to the other.
For example, here is a theoretical example for adapting std::string
to the std_msgs::msg::String
ROS message type:
template<> struct rclcpp::TypeAdapter<std::string, std_msgs::msg::String> { using is_specialized = std::true_type; using custom_type = std::string; using ros_message_type = std_msgs::msg::String; static void convert_to_ros_message( const custom_type & source, ros_message_type & destination) { destination.data = source; } static void convert_to_custom( const ros_message_type & source, custom_type & destination) { destination = source.data; } };
The adapter can then be used when creating a publisher or subscription, e.g.:
using MyAdaptedType = TypeAdapter<std::string, std_msgs::msg::String>; auto pub = node->create_publisher<MyAdaptedType>("topic", 10); auto sub = node->create_subscription<MyAdaptedType>( "topic", 10, [](const std::string & msg) {...});
You can also be more declarative by using the adapt_type::as metafunctions, which are a bit less ambiguous to read:
using AdaptedType = rclcpp::adapt_type<std::string>::as<std_msgs::msg::String>; auto pub = node->create_publisher<AdaptedType>(...);
If you wish, you may associate a custom type with a single ROS message type, allowing you to be a bit more brief when creating entities, e.g.:
// First you must declare the association, this is similar to how you // would avoid using the namespace in C++ by doing `using std::vector;`. RCLCPP_USING_CUSTOM_TYPE_AS_ROS_MESSAGE_TYPE(std::string, std_msgs::msg::String); // Then you can create things with just the custom type, and the ROS // message type is implied based on the previous statement. auto pub = node->create_publisher<std::string>(...);
Definition at line 98 of file type_adapter.hpp.
using rclcpp::TypeAdapter< CustomType, ROSMessageType, Enable >::custom_type = CustomType |
Definition at line 101 of file type_adapter.hpp.
using rclcpp::TypeAdapter< CustomType, ROSMessageType, Enable >::is_specialized = std::false_type |
Definition at line 100 of file type_adapter.hpp.
using rclcpp::TypeAdapter< CustomType, ROSMessageType, Enable >::ros_message_type = CustomType |
Definition at line 104 of file type_adapter.hpp.