@@ -486,15 +486,14 @@ void MqttClient::mqtt2ros(mqtt::const_message_ptr mqtt_msg) {
486
486
// if stamped, compute latency
487
487
if (stamped) {
488
488
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);
495
492
496
493
// 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);
498
497
ros::serialization::deserialize (stamp_stream, stamp);
499
498
500
499
// compute ROS2MQTT latency
@@ -521,17 +520,16 @@ void MqttClient::mqtt2ros(mqtt::const_message_ptr mqtt_msg) {
521
520
msg_offset += stamp_length;
522
521
}
523
522
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);
528
527
529
528
// publish via ShapeShifter
530
529
NODELET_DEBUG (
531
530
" Sending ROS message of type '%s' from MQTT broker to ROS topic '%s' ..." ,
532
531
mqtt2ros.ros .shape_shifter .getDataType ().c_str (),
533
532
mqtt2ros.ros .topic .c_str ());
534
- ros::serialization::OStream msg_stream (msg_buffer.data (), msg_length);
535
533
mqtt2ros.ros .shape_shifter .read (msg_stream);
536
534
mqtt2ros.ros .publisher .publish (mqtt2ros.ros .shape_shifter );
537
535
}
@@ -590,14 +588,13 @@ void MqttClient::message_arrived(mqtt::const_message_ptr mqtt_msg) {
590
588
mqtt_topic.find (kRosMsgTypeMqttTopicPrefix ) != std::string::npos;
591
589
if (msg_contains_ros_msg_type) {
592
590
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);
598
594
599
595
// 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,
601
598
payload_length);
602
599
ros::serialization::deserialize (msg_type_stream, ros_msg_type);
603
600
0 commit comments