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)
NOTE:-
Matlabsolutions.com provide latest MatLab Homework Help,MatLab Assignment Help , Finance Assignment Help for students, engineers and researchers in Multiple Branches like ECE, EEE, CSE, Mechanical, Civil with 100% output.Matlab Code for B.E, B.Tech,M.E,M.Tech, Ph.D. Scholars with 100% privacy guaranteed. Get MATLAB projects with source code for your learning and research.
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.
SEE COMPLETE ANSWER CLICK THE LINK