I've been trying to declare a parameter using the following call:
self.declare_parameter(
devices_param,
[],
ParameterDescriptor(
description='Devices on %s output' % output.name,
type=ParameterType.PARAMETER_STRING_ARRAY))
The follow error occurs when I try to set the parameters through a config file:
rclpy.exceptions.InvalidParameterTypeException: Trying to set parameter 'outputs.5v.devices' to '['radio']' of type 'STRING_ARRAY', expecting type 'BYTE_ARRAY'
This error occurs because the ParameterDescriptor type is ignored, and instead the default value's type is inferred. Since BYTE_ARRAY is the first array type in the enum, it is chosen for an empty list.
I found an issue regarding this behavior with this proposed workaround:
param = Parameter('my_param', type_=Parameter.Type.STRING_ARRAY, value=[])
node.declare_parameter(param.name, param.get_parameter_value())
However, this doesn't fix the problem. It does fix the issue of the type being inferred incorrectly, but the declare_parameter call ultimately fails. Looking into the source code, there doesn't seem to be a situation where this approach ever works since it tries to instantiate a new Parameter class using the ParameterValue from get_parameter_value, which isn't what Parameter's constructor is expecting.
I know I can use dynamic typing to get around this, but I am trying to maintain a degree of backwards compatibility to Foxy, which doesn't have the dynamic_typing flag (Foxy's default is to not use static types in parameters). Also, static typing with array types just doesn't work if this is working as intended, which seems unlikely.
Does anyone have a solution to using empty lists with parameters in Galactic?