66 static handle
cast(
const T& src, return_value_policy , handle )
69 rclcpp::Serialization<T> serializer;
70 rclcpp::SerializedMessage serialized_msg;
71 serializer.serialize_message(&src, &serialized_msg);
72 py::bytes bytes = py::bytes(
reinterpret_cast<const char*
>(serialized_msg.get_rcl_serialized_message().buffer),
73 serialized_msg.get_rcl_serialized_message().buffer_length);
76 const std::string ros_msg_name = rosidl_generator_traits::name<T>();
79 std::size_t pos1 = ros_msg_name.find(
'/');
80 std::size_t pos2 = ros_msg_name.find(
'/', pos1 + 1);
81 py::module m = py::module::import((ros_msg_name.substr(0, pos1) +
".msg").c_str());
84 py::object cls = m.attr(ros_msg_name.substr(pos2 + 1).c_str());
87 py::module rclpy = py::module::import(
"rclpy.serialization");
88 py::object msg = rclpy.attr(
"deserialize_message")(bytes, cls);
94 bool load(handle src,
bool )
101 py::module rclpy = py::module::import(
"rclpy.serialization");
102 py::bytes bytes = rclpy.attr(
"serialize_message")(src);
105 rcl_serialized_message_t rcl_serialized_msg = rmw_get_zero_initialized_serialized_message();
106 char* serialized_buffer;
108 if (PYBIND11_BYTES_AS_STRING_AND_SIZE(bytes.ptr(), &serialized_buffer, &length))
110 throw py::error_already_set();
114 throw py::error_already_set();
116 rcl_serialized_msg.buffer_capacity = length;
117 rcl_serialized_msg.buffer_length = length;
118 rcl_serialized_msg.buffer =
reinterpret_cast<uint8_t*
>(serialized_buffer);
120 rmw_deserialize(&rcl_serialized_msg, rosidl_typesupport_cpp::get_message_type_support_handle<T>(), &value);
121 if (RMW_RET_OK != rmw_ret)
123 throw std::runtime_error(
"failed to deserialize ROS message");