micro-ROS-Agent icon indicating copy to clipboard operation
micro-ROS-Agent copied to clipboard

Deserializing error for string type

Open hr-ti opened this issue 1 year ago • 3 comments

Describe the bug String types in service types cause microROS on the MCU side to fail in the executor due to a deserializing error. Running it through a debugger it fails in ucdr_deserialize_sequence_header when parsing the nested message type.

Service calls with non-string types work as expected. I've verified it's not a buffer overflow since the buffer size >> bytes received. There is also no packet corruption in UDP traffic, the dest packet and src packet match 1:1.

To Reproduce Steps to reproduce the behaviour:

  1. On MCU, init service with service type that has a string type
  2. On host side, call service

Expected behaviour The MCU accepts the service call and handles accordingly.

Actual behaviour Executor fails due to deserialization error.

System information (please complete the following information):

  • OS: Ubuntu 22.04
  • ROS 2 Humble
  • MCU: STM32F767ZI

hr-ti avatar Aug 23 '24 14:08 hr-ti

Seems like this is an error with the nested message type's string member. As it fails in ucdr_deserialize_sequence_header, the length of the string member is greater than the capacity in rosidl_runtime_c__String, which is always 0.

Since there's no issue with UDP comms, this could be due to an error in generating the string type from the agent side.

hr-ti avatar Aug 23 '24 22:08 hr-ti

This actually applies to any sequence type, like a byte array. Since capacity is always 0, any populated sequence simply just fails

hr-ti avatar Aug 26 '24 21:08 hr-ti

Edit: apologies, confused capacity with size.

re: capacity: how do you initialise your message/service structs? Are you using the appropriate _init(..)/_fini(..) pairs or are you using micro_ros_utilities?

gavanderhoorn avatar Aug 27 '24 07:08 gavanderhoorn