-
Notifications
You must be signed in to change notification settings - Fork 417
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Type Adapter cannot convert one RosMsg to another RosMsg #2446
Comments
Yeah, this limitation is because the template logic attempts to detect whether the message is of ROSMessageType or of CustomType. In this case, since both are ROSMessageType, it will almost certainly generate the wrong code. Off-hand, I don't know of a simple way to fix this, but there may be something we can do in the templates to detect the situation and fail to compile, rather than fail at runtime. But I'm not template metaprogramming expert, so I don't exactly know how this would be done. |
I get more info as follows:
// rosAdapter.hpp
#ifndef ROS_ADAPTER_HPP
#define ROS_ADAPTER_HPP
#include <string>
#include <iostream>
#include "rclcpp/type_adapter.hpp"
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/byte_multi_array.hpp"
#include "std_msgs/msg/header.hpp"
#include "tutorial_interfaces/msg/test_msg.hpp"
#include "tutorial_interfaces/msg/msg2.hpp"
#define ROS_TYPE
#ifdef ROS_TYPE
using MsgT = tutorial_interfaces::msg::TestMsg;
#else
using MsgT = std::string;
#endif // ROS_TYPE
template <>
struct rclcpp::TypeAdapter<MsgT, tutorial_interfaces::msg::Msg2>
{
using is_specialized = std::true_type;
using custom_type = MsgT;
using ros_message_type = tutorial_interfaces::msg::Msg2;
static void
convert_to_ros_message(
const custom_type &source,
ros_message_type &destination)
{
std::cout << "convert_to_ros_message!!!" << std::endl;
#ifdef ROS_TYPE
destination.u32 = source.id;
destination.u64 = source.time;
#else
destination.data.resize(source.size());
memcpy(destination.data.data(), source.data(), source.size());
#endif
}
static void
convert_to_custom(
const ros_message_type &source,
custom_type &destination)
{
std::cout << "convert_to_custom!!!" << std::endl;
#ifdef ROS_TYPE
destination.id = source.u32;
destination.time = source.u64;
std::cout << "destination.id = " << destination.id << std::endl;
std::cout << "destination.time = " << destination.time << std::endl;
#else
memcpy(destination.data(), source.data.data(), source.data.size());
#endif
}
};
RCLCPP_USING_CUSTOM_TYPE_AS_ROS_MESSAGE_TYPE(MsgT, tutorial_interfaces::msg::Msg2);
#endif // ROS_ADAPTER_HPP In subscriber: $ ros2 run topics sub
convert_to_custom!!!
destination.id = 51
destination.time = 305419896
msg.id = 51
msg.time = 305419896
convert_to_custom!!!
destination.id = 52
destination.time = 305419896
msg.id = 52
msg.time = 305419896
convert_to_custom!!!
destination.id = 53
destination.time = 305419896
msg.id = 53
msg.time = 305419896
convert_to_custom!!!
destination.id = 54
destination.time = 305419896
msg.id = 54
msg.time = 305419896
... It works fine from one RosMsg Type (tutorial_interfaces::msg::TestMsg) to another Type (tutorial_interfaces::msg::Msg2). But, the ros2 topic info get wrong output: $ ros2 topic info /topic
Type: tutorial_interfaces/msg/TestMsg
Publisher count: 1
Subscription count: 0 The |
Bug report
Required Info:
Steps to reproduce issue
Expected behavior
The subscriber (sub.cpp) can output the message.
Actual behavior
A segmentation fault occurs because the subscriber receives zero data when calling the convert_to_custom function in TypeAdapter.
From the above-presented result, the subscriber enters the convert_to_custom function with a data size of zero. Consequently, the subscriber is unable to switch the ros_message_type to the custom_type (which is another RosMsg Type).
Additional information
It appears that TypeAdapter is unable to convert one RosMsg Type to another RosMsg Type.
The text was updated successfully, but these errors were encountered: