Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions rclpy/rclpy/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -801,7 +801,9 @@ def _set_parameters_atomically(
if descriptors is not None:
self._descriptors[param.name] = descriptors[param.name]
elif param.name not in self._descriptors:
self._descriptors[param.name] = ParameterDescriptor()
descriptor = ParameterDescriptor()
descriptor.dynamic_typing = True
self._descriptors[param.name] = descriptor

if Parameter.Type.NOT_SET == self.get_parameter_or(param.name).type_:
# Parameter is new. (Parameter had no value and new value is set)
Expand Down Expand Up @@ -901,7 +903,7 @@ def _apply_descriptor(
successful=False,
reason='Trying to set a read-only parameter: {}.'.format(parameter.name))

if descriptor.dynamic_typing or self._allow_undeclared_parameters:
if descriptor.dynamic_typing:
descriptor.type = parameter.type_.value
elif descriptor.type != parameter.type_.value:
return SetParametersResult(
Expand Down
20 changes: 20 additions & 0 deletions rclpy/test/test_node.py
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,26 @@ def test_node_get_parameter_returns_parameter_not_set(self):
self.assertIsInstance(self.node.get_parameter('unset'), Parameter)
self.assertEqual(self.node.get_parameter('unset').type_, Parameter.Type.NOT_SET)

def test_node_declare_static_parameter(self):
value = self.node.declare_parameter('an_integer', 5)
self.assertEqual(value.value, 5)
self.assertFalse(
self.node.set_parameters([Parameter('an_integer', value='asd')])[0].successful)
self.assertEqual(self.node.get_parameter('an_integer').value, 5)

def test_node_undeclared_parameters_are_dynamically_typed(self):
self.assertTrue(self.node.set_parameters([Parameter('my_param', value=5)])[0].successful)
self.assertEqual(self.node.get_parameter('my_param').value, 5)
self.assertTrue(
self.node.set_parameters([Parameter('my_param', value='asd')])[0].successful)
self.assertEqual(self.node.get_parameter('my_param').value, 'asd')

def test_node_cannot_declare_after_set(self):
self.assertTrue(self.node.set_parameters([Parameter('my_param', value=5)])[0].successful)
self.assertEqual(self.node.get_parameter('my_param').value, 5)
with pytest.raises(rclpy.exceptions.ParameterAlreadyDeclaredException):
self.node.declare_parameter('my_param', 5)

def test_node_has_parameter_services(self):
service_names_and_types = self.node.get_service_names_and_types()
self.assertIn(
Expand Down