Error in readMessages from generated ROS message

4 次查看(过去 30 天)
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)

采纳的回答

Joep Linssen
Joep Linssen 2018-8-28
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 个评论
Stefan Arnautu
Stefan Arnautu 2019-2-21
编辑:Stefan Arnautu 2019-2-21
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 2019-2-21
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!

请先登录,再进行评论。

更多回答(0 个)

Community Treasure Hunt

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

Start Hunting!

Translated by