Skip to content

Commit 80a2a98

Browse files
committed
reuse buffer to avoid copy from MQTT to ROS
1 parent 5ab4ac5 commit 80a2a98

File tree

1 file changed

+15
-18
lines changed

1 file changed

+15
-18
lines changed

src/MqttClient.cpp

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -486,15 +486,14 @@ void MqttClient::mqtt2ros(mqtt::const_message_ptr mqtt_msg) {
486486
// if stamped, compute latency
487487
if (stamped) {
488488

489-
// copy timestamp from MQTT message to buffer
490-
ros::Time stamp;
491-
uint32_t stamp_length = ros::serialization::serializationLength(stamp);
492-
std::vector<uint8_t> stamp_buffer;
493-
stamp_buffer.resize(stamp_length);
494-
std::memcpy(stamp_buffer.data(), &(payload[1]), stamp_length);
489+
// create ROS message buffer on top of MQTT message payload
490+
char* non_const_payload = const_cast<char*>(&payload[1]);
491+
uint8_t* stamp_buffer = reinterpret_cast<uint8_t*>(non_const_payload);
495492

496493
// deserialize stamp
497-
ros::serialization::IStream stamp_stream(stamp_buffer.data(), stamp_length);
494+
ros::Time stamp;
495+
uint32_t stamp_length = ros::serialization::serializationLength(stamp);
496+
ros::serialization::IStream stamp_stream(stamp_buffer, stamp_length);
498497
ros::serialization::deserialize(stamp_stream, stamp);
499498

500499
// compute ROS2MQTT latency
@@ -521,17 +520,16 @@ void MqttClient::mqtt2ros(mqtt::const_message_ptr mqtt_msg) {
521520
msg_offset += stamp_length;
522521
}
523522

524-
// copy ROS message from MQTT message to buffer
525-
std::vector<uint8_t> msg_buffer;
526-
msg_buffer.resize(msg_length);
527-
std::memcpy(msg_buffer.data(), &(payload[msg_offset]), msg_length);
523+
// create ROS message buffer on top of MQTT message payload
524+
char* non_const_payload = const_cast<char*>(&payload[msg_offset]);
525+
uint8_t* msg_buffer = reinterpret_cast<uint8_t*>(non_const_payload);
526+
ros::serialization::OStream msg_stream(msg_buffer, msg_length);
528527

529528
// publish via ShapeShifter
530529
NODELET_DEBUG(
531530
"Sending ROS message of type '%s' from MQTT broker to ROS topic '%s' ...",
532531
mqtt2ros.ros.shape_shifter.getDataType().c_str(),
533532
mqtt2ros.ros.topic.c_str());
534-
ros::serialization::OStream msg_stream(msg_buffer.data(), msg_length);
535533
mqtt2ros.ros.shape_shifter.read(msg_stream);
536534
mqtt2ros.ros.publisher.publish(mqtt2ros.ros.shape_shifter);
537535
}
@@ -590,14 +588,13 @@ void MqttClient::message_arrived(mqtt::const_message_ptr mqtt_msg) {
590588
mqtt_topic.find(kRosMsgTypeMqttTopicPrefix) != std::string::npos;
591589
if (msg_contains_ros_msg_type) {
592590

593-
// copy ROS message type from MQTT message to buffer
594-
RosMsgType ros_msg_type;
595-
std::vector<uint8_t> msg_type_buffer;
596-
msg_type_buffer.resize(payload_length);
597-
std::memcpy(msg_type_buffer.data(), &(payload[0]), payload_length);
591+
// create ROS message buffer on top of MQTT message payload
592+
char* non_const_payload = const_cast<char*>(&payload[0]);
593+
uint8_t* msg_type_buffer = reinterpret_cast<uint8_t*>(non_const_payload);
598594

599595
// deserialize ROS message type
600-
ros::serialization::IStream msg_type_stream(msg_type_buffer.data(),
596+
RosMsgType ros_msg_type;
597+
ros::serialization::IStream msg_type_stream(msg_type_buffer,
601598
payload_length);
602599
ros::serialization::deserialize(msg_type_stream, ros_msg_type);
603600

0 commit comments

Comments
 (0)