diff --git a/rosidl_runtime_py/set_message.py b/rosidl_runtime_py/set_message.py index 5e7921e..aa62074 100644 --- a/rosidl_runtime_py/set_message.py +++ b/rosidl_runtime_py/set_message.py @@ -28,7 +28,7 @@ def set_message_fields( - msg: Any, values: Dict[str, str], expand_header_auto: bool = False, + msg: Any, values: Dict[str, Any], expand_header_auto: bool = False, expand_time_now: bool = False) -> List[Any]: """ Set the fields of a ROS message. @@ -52,7 +52,7 @@ def set_message_fields( timestamp_fields = [] def set_message_fields_internal( - msg: Any, values: Dict[str, str], + msg: Any, values: Dict[str, Any], timestamp_fields: List[Any]) -> List[Any]: try: items = values.items() @@ -70,6 +70,10 @@ def set_message_fields_internal( value = numpy.array(field_value, dtype=field.dtype) elif type(field_value) is field_type: value = field_value + elif field_type is bytes and type(field_value) is str: + # value = field_value.encode() + value = bytes([ord(c) for c in field_value]) + # value = bytes(field_value, 'ascii', 'backslashreplace') # We can't import these types directly, so we use the qualified class name to # distinguish them from other fields elif qualified_class_name == 'std_msgs.msg._header.Header' and \ diff --git a/test/rosidl_runtime_py/test_set_message.py b/test/rosidl_runtime_py/test_set_message.py index 9c39f09..093285e 100644 --- a/test/rosidl_runtime_py/test_set_message.py +++ b/test/rosidl_runtime_py/test_set_message.py @@ -14,11 +14,12 @@ import builtins import copy +import yaml from builtin_interfaces.msg import Time import pytest import rosidl_parser.definition -from rosidl_runtime_py import set_message_fields +from rosidl_runtime_py import set_message_fields, message_to_yaml from std_msgs.msg import Header from test_msgs import message_fixtures @@ -140,6 +141,18 @@ def test_set_message_fields_partial(): assert getattr(modified_msg, attr) == getattr(original_msg, attr) +def test_set_message_fields_from_yaml(): + original_msg = message_fixtures.get_msg_basic_types()[1] + original_yaml = message_to_yaml(original_msg) + values = yaml.safe_load(original_yaml) + + modified_msg = copy.copy(message_fixtures.get_msg_basic_types()[0]) + set_message_fields(modified_msg, values) + + for attr in original_msg.get_fields_and_field_types().keys(): + assert getattr(modified_msg, attr) == getattr(original_msg, attr) + + def test_set_message_fields_full(): msg_list = message_fixtures.get_msg_basic_types() msg0 = msg_list[0]