Error in readMessages from generated ROS message

9 Ansichten (letzte 30 Tage)
Joep Linssen
Joep Linssen am 27 Aug. 2018
Kommentiert: Joep Linssen am 21 Feb. 2019
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)

Akzeptierte Antwort

Joep Linssen
Joep Linssen am 28 Aug. 2018
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.
  2 Kommentare
Stefan Arnautu
Stefan Arnautu am 21 Feb. 2019
Bearbeitet: Stefan Arnautu am 21 Feb. 2019
What version of Matlab are you using?
I use 2017b and I get this error:
Error using robotics.ros.BagSelection/readMessages
Too many input arguments.
Edit:
Just saw you have 2018a, sorry.
The solution doesn't work for 2017b.
Joep Linssen
Joep Linssen am 21 Feb. 2019
indeed it doesn't. It requires Robotics Toolbox v2.0 which comes with 2018a and later, whereas 2017b still uses v1.0. I recommend switching to 2018a if possible!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by