Error in readMessages from generated ROS message

4 ビュー (過去 30 日間)
Joep Linssen
Joep Linssen 2018 年 8 月 27 日
コメント済み: Joep Linssen 2019 年 2 月 21 日
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