Using memcpy is not possible right now due to the Message base class (which is going away in the future).  Even once that's gone though it's unlikely to work for most messages.  For example:

struct A
{
  char a;
  int b;
};

sizeof(A) == 8 (not 5), and offsetof(A, b) == 4 (not 1) on x64, but may be different on different architectures.

If the data is in the ROS serialization format (see the table under built-in types at http://www.ros.org/wiki/msg#Message_Description_Specification), you may be able to use the ROS serialization code (http://www.ros.org/wiki/roscpp/Overview/MessagesSerializationAndAdaptingTypes)

Unless you're doing this for a large number of devices/messages, it's probably easiest (and least brittle) to read the individual values manually into the message.

Josh

On Thu, Jul 8, 2010 at 4:21 PM, Bill Morris <morris@ee.ccny.cuny.edu> wrote:
I am wondering if there is a suggested method for constructing a message
directly from binary data stored in memory.

Right now I read in data from a serial port into a buffer and once I
have a complete chunk of data I memcpy it into a struct. I then copy
each item in the struct into the message, item by item. I would like to
avoid copying each item individually by name.

Are the following structs and messages laid out in memory the same way?
Are there byte order or alignment issues I should be aware of if i
attempt to create a message using memcpy?

Do I want to deserialize or serialize the message? Is there
documentation for this somewhere? Is there a better way to do this?

   struct IMU
   {
     int angle_nick;
     int angle_roll;
     int angle_yaw;
     short acc_x;
     short acc_y;
     short acc_z;
   };

IMU.msg
int32 angle_nick
int32 angle_roll
int32 angle_yaw
int16 acc_x
int16 acc_y
int16 acc_z


_______________________________________________
ros-users mailing list
ros-users@code.ros.org
https://code.ros.org/mailman/listinfo/ros-users