Error in readMessages from generated ROS message

Illustration
Joep Linssen - 2023-05-15T12:18:26+00:00
Question: Error in readMessages from generated ROS message

Hi all,   I have some custom ROS messages that I have loaded into MATLAB utilizing the rosgenmsg routine. Everything went fine and they show up when calling rosmsg list.   When I went to read messages of the custom type from my rosbag I received the following error:     Reference to non-existent field 'Forces_'. Error in robotics.ros.custom.msggen.sfm_msgs.Forces/reload (line 165) Forces_Cell = arrayfun(@(x) feval([obj.SfmMsgsForceClass '.loadobj'], x), strObj.Forces_, 'UniformOutput', false); Error in robotics.ros.Message/fromStruct (line 172) obj.reload(sObj); Error in robotics.ros.BagSelection/readMessages (line 280) msgs{i}.fromStruct(msgStructs{i}); I did some investigation on how the function works and where the error comes from. In robotics.ros.Message/fromStruct the code tries to create a message object from the bag information (which is in struct format). For my custom message of type sfm_msgs/Forces the field names for the message and the structs (these are autogenerated by rosgenmsg) differ: K>> msgs{1} ans = ROS Forces message with properties: MessageType: 'sfm_msgs/Forces' Header: [1×1 Header] Forces_: [0×1 Force] versus K>> msgStructs{1} ans = struct with fields: MessageType: 'sfm_msgs/Forces' Header: [1×1 struct] Forces: [1×6 struct] This leads to the top-most error of my error message. As mentioned, this naming difference is autogenerated by the rosgenmsg routine.   The original .msg message definitions are:   Forces.msg: std_msgs/Header header Force[] forces Force.msg: uint8 ATTRACTIVE=0 uint8 INT_ROBOT=1 uint8 INT_OBSTACLE=2 uint8 INT_HUMAN=3 uint8 type string entity_name geometry_msgs/Vector3 force So... yeah. I have no idea how to fix this and as far as I am considered this is a bug in the rosgenmsg routine. Hopefully some of you guru's have an idea!   P.S. I am using MATLAB Version: 9.4.0.813654 (R2018a) with Robotics System Toolbox Version 2.0 (R2018a)

Expert Answer

Profile picture of Neeta Dsouza Neeta Dsouza answered . 2025-11-20

I contacted MATLAB support and they let me know that there are a couple of known bugs with the readMessages function and that I should use the 'DataFormat', 'struct' options. This options is faster, does not require custom message code generation (no rosgenmsg call) and thus does not induce my error. I tried this and it works.
 
The change I thus made was; from:
 
readMessages(bagfile)

To:

readMessages(bagfile, 'DataFormat', 'struct')

This circumvents the above mentioned bug.


Not satisfied with the answer ?? ASK NOW

Get a Free Consultation or a Sample Assignment Review!