loading string parameter from a Node parameter file with map value silently fails
Generated by Generative AI
Nope
Operating System:
Linux 6.8.0-78-generic #78~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Aug 13 14:32:06 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
ROS version or commit hash:
humble
RMW implementation (if applicable):
rmw_fastrtps_cpp
RMW Configuration (if applicable):
No response
Client library (if applicable):
rclpy
'ros2 doctor --report' output
NETWORK CONFIGURATION inet : 127.0.0.1 inet4 : ['127.0.0.1'] inet6 : ['::1'] netmask : 255.0.0.0 device : lo flags : 73<RUNNING,UP,LOOPBACK> mtu : 65536 inet : 10.0.0.145 inet4 : ['10.0.0.145'] ether : 2c:7b:a0:8d:87:0e inet6 : ['2601:240:cb01:d700::9c58', '2601:240:cb01:d700:d400:a058:c9af:f000', '2601:240:cb01:d700:68a6:226d:bd60:fc15', 'fe80::d44:9c8c:133a:d638%wlp0s20f3'] netmask : 255.255.255.0 device : wlp0s20f3 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1500 broadcast : 10.0.0.255 inet : 172.17.0.1 inet4 : ['172.17.0.1'] ether : f2:72:68:19:7a:9b inet6 : ['fe80::f072:68ff:fe19:7a9b%docker0'] netmask : 255.255.0.0 device : docker0 flags : 4099<UP,MULTICAST,BROADCAST> mtu : 1500 broadcast : 172.17.255.255 inet : 172.18.0.1 inet4 : ['172.18.0.1'] ether : 76:45:d6:4c:40:d0 inet6 : ['fe80::7445:d6ff:fe4c:40d0%br-231ee1d821ca'] netmask : 255.255.0.0 device : br-231ee1d821ca flags : 4099<UP,MULTICAST,BROADCAST> mtu : 1500 broadcast : 172.18.255.255 inet : 10.1.192.192 inet4 : ['10.1.192.192'] ether : 66:24:5d:5b:63:af inet6 : ['fe80::6424:5dff:fe5b:63af%vxlan.calico'] netmask : 255.255.255.255 device : vxlan.calico flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 broadcast : 10.1.192.192 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali6d6ff81592d'] device : cali6d6ff81592d flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali1b9331f2809'] device : cali1b9331f2809 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%calid93b492c7f6'] device : calid93b492c7f6 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%calia88ee7f2b42'] device : calia88ee7f2b42 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali57c7455daf1'] device : cali57c7455daf1 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali773368a36fd'] device : cali773368a36fd flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%calicbfe74a2820'] device : calicbfe74a2820 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali1df8a9a0314'] device : cali1df8a9a0314 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali1b51fd7324b'] device : cali1b51fd7324b flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali80071b68f35'] device : cali80071b68f35 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : be:26:1f:14:ad:ab inet6 : ['fe80::bc26:1fff:fe14:adab%cali87257eb45e3'] device : cali87257eb45e3 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%caliae52ff7506a'] device : caliae52ff7506a flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali4abb6c37359'] device : cali4abb6c37359 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali474b849609c'] device : cali474b849609c flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%califcc94dae7bd'] device : califcc94dae7bd flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : 82:be:ff:ab:fc:d3 inet6 : ['fe80::80be:ffff:feab:fcd3%cali50a80278184'] device : cali50a80278184 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali1b1032fd18e'] device : cali1b1032fd18e flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali79f6904e4be'] device : cali79f6904e4be flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali7d7eeb56879'] device : cali7d7eeb56879 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%calif1a2fb89f47'] device : calif1a2fb89f47 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali4862a560023'] device : cali4862a560023 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%calica8381a664c'] device : calica8381a664c flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali71d308279d3'] device : cali71d308279d3 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali17cc7071d43'] device : cali17cc7071d43 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%cali04a6724b24d'] device : cali04a6724b24d flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%caliec0d5e2bf16'] device : caliec0d5e2bf16 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%calib8e8cf989bd'] device : calib8e8cf989bd flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%calic9a09191f01'] device : calic9a09191f01 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%califee7fc13bd5'] device : califee7fc13bd5 flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : ee:ee:ee:ee:ee:ee inet6 : ['fe80::ecee:eeff:feee:eeee%calie68003b6d9b'] device : calie68003b6d9b flags : 4163<RUNNING,UP,MULTICAST,BROADCAST> mtu : 1450 ether : c4:ef:bb:66:68:4b device : enp118s0 flags : 4099<UP,MULTICAST,BROADCAST> mtu : 1500
PACKAGE VERSIONS zivid_camera : latest=, local=3.2.0 zivid_interfaces : latest=, local=3.2.0 smartskills_interfaces : latest=, local=0.0.0 py_srvcli : latest=, local=0.0.0 py_pubsub : latest=, local=0.0.0 fastapi_bridge : latest=, local=0.0.0 cpp_pubsub : latest=, local=0.0.0 camera_manager : latest=, local=0.0.0 ament_cmake_flake8 : latest=0.12.14, local=0.12.14 sros2_cmake : latest=0.10.7, local=0.10.7 ament_cmake_export_libraries : latest=1.3.12, local=1.3.12 ros_workspace : latest=1.0.2, local=1.0.2 ros2lifecycle : latest=0.18.14, local=0.18.14 ament_cmake_auto : latest=1.3.12, local=1.3.12 ros2cli : latest=0.18.14, local=0.18.14 ros_environment : latest=3.2.2, local=3.2.2 rosidl_adapter : latest=3.1.7, local=3.1.7 ament_copyright : latest=0.12.14, local=0.12.14 osrf_pycommon : latest=2.1.6, local=2.1.6 ament_cmake_ros : latest=0.10.0, local=0.10.0 ros2component : latest=0.18.14, local=0.18.14 ament_cmake_cppcheck : latest=0.12.14, local=0.12.14 ros_core : latest=0.10.0, local=0.10.0 ament_cmake_include_directories : latest=1.3.12, local=1.3.12 ament_cmake_export_targets : latest=1.3.12, local=1.3.12 ros2run : latest=0.18.14, local=0.18.14 class_loader : latest=2.2.0, local=2.2.0 rcl : latest=5.3.10, local=5.3.10 rosidl_typesupport_interface : latest=3.1.7, local=3.1.7 launch_testing : latest=1.0.10, local=1.0.10 ros2node : latest=0.18.14, local=0.18.14 rosidl_typesupport_fastrtps_c : latest=2.2.3, local=2.2.2 rosidl_generator_py : latest=0.14.5, local=0.14.5 launch : latest=1.0.10, local=1.0.10 rcl_yaml_param_parser : latest=5.3.10, local=5.3.10 ros2pkg : latest=0.18.14, local=0.18.14 sensor_msgs : latest=4.9.0, local=4.9.0 rcl_logging_interface : latest=2.3.1, local=2.3.1 ament_cpplint : latest=0.12.14, local=0.12.14 ament_cmake_gmock : latest=1.3.12, local=1.3.12 rcpputils : latest=2.4.6, local=2.4.5 rcl_action : latest=5.3.10, local=5.3.10 rosidl_typesupport_c : latest=2.0.2, local=2.0.2 rosidl_default_runtime : latest=1.2.0, local=1.2.0 ament_cmake_xmllint : latest=0.12.14, local=0.12.14 launch_testing_ros : latest=0.19.12, local=0.19.12 ament_lint_cmake : latest=0.12.14, local=0.12.14 rmw_fastrtps_shared_cpp : latest=6.2.9, local=6.2.8 ament_lint_auto : latest=0.12.14, local=0.12.14 ros2topic : latest=0.18.14, local=0.18.14 pluginlib : latest=5.1.0, local=5.1.0 rclcpp : latest=16.0.15, local=16.0.15 rmw_fastrtps_cpp : latest=6.2.9, local=6.2.8 rclcpp_lifecycle : latest=16.0.15, local=16.0.15 launch_testing_ament_cmake : latest=1.0.10, local=1.0.10 common_interfaces : latest=4.9.0, local=4.9.0 ament_cmake : latest=1.3.12, local=1.3.12 ament_flake8 : latest=0.12.14, local=0.12.14 rclcpp_action : latest=16.0.15, local=16.0.15 console_bridge_vendor : latest=1.4.1, local=1.4.1 launch_ros : latest=0.19.12, local=0.19.12 rcl_logging_spdlog : latest=2.3.1, local=2.3.1 geometry_msgs : latest=4.9.0, local=4.9.0 rclpy : latest=3.3.17, local=3.3.17 rcl_lifecycle : latest=5.3.10, local=5.3.10 rosidl_default_generators : latest=1.2.0, local=1.2.0 spdlog_vendor : latest=1.3.1, local=1.3.1 rosidl_typesupport_introspection_cpp : latest=3.1.7, local=3.1.7 ament_cmake_export_include_directories : latest=1.3.12, local=1.3.12 ros2launch : latest=0.19.12, local=0.19.12 trajectory_msgs : latest=4.9.0, local=4.9.0 ament_lint_common : latest=0.12.14, local=0.12.14 ament_uncrustify : latest=0.12.14, local=0.12.14 stereo_msgs : latest=4.9.0, local=4.9.0 ament_cmake_pep257 : latest=0.12.14, local=0.12.14 ros2interface : latest=0.18.14, local=0.18.14 rcl_interfaces : latest=1.2.2, local=1.2.2 ament_cmake_copyright : latest=0.12.14, local=0.12.14 tracetools : latest=4.1.1, local=4.1.1 rmw_dds_common : latest=1.6.0, local=1.6.0 rmw : latest=6.1.2, local=6.1.2 ros2multicast : latest=0.18.14, local=0.18.14 ament_index_cpp : latest=1.4.0, local=1.4.0 statistics_msgs : latest=1.2.2, local=1.2.2 ament_cmake_cpplint : latest=0.12.14, local=0.12.14 lifecycle_msgs : latest=1.2.2, local=1.2.2 rosidl_cmake : latest=3.1.7, local=3.1.7 rosidl_typesupport_fastrtps_cpp : latest=2.2.3, local=2.2.2 libyaml_vendor : latest=1.2.2, local=1.2.2 ament_cppcheck : latest=0.12.14, local=0.12.14 ament_cmake_test : latest=1.3.12, local=1.3.12 ament_cmake_libraries : latest=1.3.12, local=1.3.12 domain_coordinator : latest=0.10.0, local=0.10.0 rosidl_typesupport_cpp : latest=2.0.2, local=2.0.2 rosidl_runtime_py : latest=0.9.3, local=0.9.3 rosidl_parser : latest=3.1.7, local=3.1.7 ament_cmake_lint_cmake : latest=0.12.14, local=0.12.14 ament_cmake_uncrustify : latest=0.12.14, local=0.12.14 ament_index_python : latest=1.4.0, local=1.4.0 rosidl_cli : latest=3.1.7, local=3.1.7 tinyxml2_vendor : latest=0.7.6, local=0.7.6 launch_yaml : latest=1.0.10, local=1.0.10 rmw_implementation : latest=2.8.5, local=2.8.5 fastrtps_cmake_module : latest=2.2.3, local=2.2.2 ament_lint : latest=0.12.14, local=0.12.14 ros2param : latest=0.18.14, local=0.18.14 rcutils : latest=5.1.7, local=5.1.7 ros2cli_common_extensions : latest=0.1.1, local=0.1.1 ament_pep257 : latest=0.12.14, local=0.12.14 rclcpp_components : latest=16.0.15, local=16.0.15 ros2action : latest=0.18.14, local=0.18.14 actionlib_msgs : latest=4.9.0, local=4.9.0 ament_cmake_core : latest=1.3.12, local=1.3.12 unique_identifier_msgs : latest=2.2.1, local=2.2.1 ament_xmllint : latest=0.12.14, local=0.12.14 python_cmake_module : latest=0.10.0, local=0.10.0 ament_cmake_version : latest=1.3.12, local=1.3.12 ament_cmake_gen_version_h : latest=1.3.12, local=1.3.12 rosidl_typesupport_introspection_c : latest=3.1.7, local=3.1.7 ament_cmake_export_dependencies : latest=1.3.12, local=1.3.12 sros2 : latest=0.10.7, local=0.10.7 launch_xml : latest=1.0.10, local=1.0.10 shape_msgs : latest=4.9.0, local=4.9.0 nav_msgs : latest=4.9.0, local=4.9.0 visualization_msgs : latest=4.9.0, local=4.9.0 rosidl_runtime_cpp : latest=3.1.7, local=3.1.7 builtin_interfaces : latest=1.2.2, local=1.2.2 rpyutils : latest=0.2.2, local=0.2.1 ros2service : latest=0.18.14, local=0.18.14 diagnostic_msgs : latest=4.9.0, local=4.9.0 ament_cmake_python : latest=1.3.12, local=1.3.12 ament_cmake_export_link_flags : latest=1.3.12, local=1.3.12 rosidl_generator_c : latest=3.1.7, local=3.1.7 ament_cmake_target_dependencies : latest=1.3.12, local=1.3.12 composition_interfaces : latest=1.2.2, local=1.2.2 ros2doctor : latest=0.18.14, local=0.18.14 std_srvs : latest=4.9.0, local=4.9.0 action_msgs : latest=1.2.2, local=1.2.2 ament_package : latest=0.14.1, local=0.14.1 rosidl_generator_cpp : latest=3.1.7, local=3.1.7 ament_cmake_pytest : latest=1.3.12, local=1.3.12 ament_cmake_export_definitions : latest=1.3.12, local=1.3.12 rosidl_runtime_c : latest=3.1.7, local=3.1.7 rmw_implementation_cmake : latest=6.1.2, local=6.1.2 ament_cmake_export_interfaces : latest=1.3.12, local=1.3.12 std_msgs : latest=4.9.0, local=4.9.0 rosgraph_msgs : latest=1.2.2, local=1.2.2 uncrustify_vendor : latest=2.0.2, local=2.0.2 libstatistics_collector : latest=1.3.4, local=1.3.4 ament_cmake_gtest : latest=1.3.12, local=1.3.12 rqt_console : latest=2.0.3, local=2.0.3 rosbag2_compression_zstd : latest=0.15.15, local=0.15.15 rqt_gui_cpp : latest=1.1.7, local=1.1.7 ros2bag : latest=0.15.15, local=0.15.15 dummy_sensors : latest=0.20.6, local=0.20.5 dummy_map_server : latest=0.20.6, local=0.20.5 teleop_twist_keyboard : latest=2.4.0, local=2.4.0 rqt_py_common : latest=1.1.7, local=1.1.7 examples_rclpy_minimal_publisher : latest=0.15.4, local=0.15.4 tango_icons_vendor : latest=0.1.1, local=0.1.1 rosbag2_compression : latest=0.15.15, local=0.15.15 rqt_gui : latest=1.1.7, local=1.1.7 rosbag2_transport : latest=0.15.15, local=0.15.15 examples_rclpy_minimal_action_client : latest=0.15.4, local=0.15.4 tf2_kdl : latest=0.25.16, local=0.25.16 demo_nodes_cpp : latest=0.20.6, local=0.20.5 tf2_bullet : latest=0.25.16, local=0.25.16 interactive_markers : latest=2.3.2, local=2.3.2 ros_base : latest=0.10.0, local=0.10.0 rqt_graph : latest=1.3.1, local=1.3.1 sdl2_vendor : latest=3.3.0, local=3.3.0 kdl_parser : latest=2.6.4, local=2.6.4 examples_rclpy_executors : latest=0.15.4, local=0.15.4 action_tutorials_py : latest=0.20.6, local=0.20.5 intra_process_demo : latest=0.20.6, local=0.20.5 resource_retriever : latest=3.1.3, local=3.1.3 image_geometry : latest=3.2.1, local=3.2.1 libcurl_vendor : latest=3.1.3, local=3.1.3 depthimage_to_laserscan : latest=2.5.1, local=2.5.1 desktop : latest=0.10.0, local=0.10.0 rosbag2_storage_default_plugins : latest=0.15.15, local=0.15.15 rqt_publisher : latest=1.5.0, local=1.5.0 rviz_rendering : latest=11.2.21, local=11.2.20 rqt_reconfigure : latest=1.1.2, local=1.1.2 urdf : latest=2.6.1, local=2.6.1 tf2_ros : latest=0.25.16, local=0.25.16 rqt_srv : latest=1.0.3, local=1.0.3 pendulum_msgs : latest=0.20.6, local=0.20.5 action_tutorials_interfaces : latest=0.20.6, local=0.20.5 qt_gui_py_common : latest=2.2.4, local=2.2.4 demo_nodes_cpp_native : latest=0.20.6, local=0.20.5 tlsf_cpp : latest=0.13.0, local=0.13.0 pcl_conversions : latest=2.4.5, local=2.4.5 angles : latest=1.15.0, local=1.15.0 rviz2 : latest=11.2.21, local=11.2.20 robot_state_publisher : latest=3.0.3, local=3.0.3 topic_monitor : latest=0.20.6, local=0.20.5 dummy_robot_bringup : latest=0.20.6, local=0.20.5 rqt_msg : latest=1.2.0, local=1.2.0 tf2_tools : latest=0.25.16, local=0.25.16 tf2_sensor_msgs : latest=0.25.16, local=0.25.16 rosbag2_storage : latest=0.15.15, local=0.15.15 examples_rclcpp_minimal_timer : latest=0.15.4, local=0.15.4 image_transport : latest=3.1.12, local=3.1.12 examples_rclcpp_minimal_composition : latest=0.15.4, local=0.15.4 examples_rclcpp_multithreaded_executor : latest=0.15.4, local=0.15.4 tf2_geometry_msgs : latest=0.25.16, local=0.25.16 action_tutorials_cpp : latest=0.20.6, local=0.20.5 tf2 : latest=0.25.16, local=0.25.16 rosx_introspection : latest=1.0.2, local=1.0.2 rqt_shell : latest=1.0.2, local=1.0.2 examples_rclcpp_minimal_action_server : latest=0.15.4, local=0.15.4 examples_rclpy_minimal_client : latest=0.15.4, local=0.15.4 examples_rclcpp_minimal_service : latest=0.15.4, local=0.15.4 rqt_bag_plugins : latest=1.1.5, local=1.1.5 quality_of_service_demo_cpp : latest=0.20.6, local=0.20.5 rqt_common_plugins : latest=1.2.0, local=1.2.0 demo_nodes_py : latest=0.20.6, local=0.20.5 lifecycle : latest=0.20.6, local=0.20.5 rqt_py_console : latest=1.0.2, local=1.0.2 teleop_twist_joy : latest=2.4.8, local=2.4.8 example_interfaces : latest=0.9.3, local=0.9.3 pcl_msgs : latest=1.0.0, local=1.0.0 rosbag2_cpp : latest=0.15.15, local=0.15.15 quality_of_service_demo_py : latest=0.20.6, local=0.20.5 examples_rclcpp_minimal_publisher : latest=0.15.4, local=0.15.4 joy : latest=3.3.0, local=3.3.0 rviz_common : latest=11.2.21, local=11.2.20 examples_rclcpp_minimal_subscriber : latest=0.15.4, local=0.15.4 examples_rclpy_minimal_service : latest=0.15.4, local=0.15.4 message_filters : latest=4.3.9, local=4.3.8 tlsf : latest=0.7.0, local=0.7.0 rosbag2_interfaces : latest=0.15.15, local=0.15.15 rviz_ogre_vendor : latest=11.2.21, local=11.2.20 tf2_eigen_kdl : latest=0.25.16, local=0.25.16 rqt_plot : latest=1.1.5, local=1.1.5 pendulum_control : latest=0.20.6, local=0.20.5 map_msgs : latest=2.1.0, local=2.1.0 tf2_eigen : latest=0.25.16, local=0.25.16 logging_demo : latest=0.20.6, local=0.20.5 rviz_default_plugins : latest=11.2.21, local=11.2.20 tf2_msgs : latest=0.25.16, local=0.25.16 image_tools : latest=0.20.6, local=0.20.5 turtlesim : latest=1.4.2, local=1.4.2 qt_gui_cpp : latest=2.2.4, local=2.2.4 rqt_service_caller : latest=1.0.5, local=1.0.5 sensor_msgs_py : latest=4.9.0, local=4.9.0 qt_dotgraph : latest=2.2.4, local=2.2.4 examples_rclcpp_minimal_client : latest=0.15.4, local=0.15.4 composition : latest=0.20.6, local=0.20.5 examples_rclpy_minimal_action_server : latest=0.15.4, local=0.15.4 rttest : latest=0.13.0, local=0.13.0 examples_rclcpp_minimal_action_client : latest=0.15.4, local=0.15.4 python_qt_binding : latest=1.1.2, local=1.1.2 rqt_image_view : latest=1.2.0, local=1.2.0 qt_gui : latest=2.2.4, local=2.2.4 rqt_topic : latest=1.5.0, local=1.5.0 rviz_assimp_vendor : latest=11.2.21, local=11.2.20 foxglove_bridge : latest=0.8.5, local=0.8.5 rosbag2 : latest=0.15.15, local=0.15.15 rosbag2_py : latest=0.15.15, local=0.15.15 rqt_action : latest=2.0.1, local=2.0.1 laser_geometry : latest=2.4.0, local=2.4.0 tf2_py : latest=0.25.16, local=0.25.16 cv_bridge : latest=3.2.1, local=3.2.1 rqt_bag : latest=1.1.5, local=1.1.5 geometry2 : latest=0.25.16, local=0.25.16 rqt_gui_py : latest=1.1.7, local=1.1.7 tf2_ros_py : latest=0.25.16, local=0.25.16 examples_rclpy_minimal_subscriber : latest=0.15.4, local=0.15.4 yaml_cpp_vendor : latest=8.0.2, local=8.0.2 sqlite3_vendor : latest=0.15.15, local=0.15.15 orocos_kdl_vendor : latest=0.2.5, local=0.2.5 keyboard_handler : latest=0.0.5, local=0.0.5 pybind11_vendor : latest=2.4.2, local=2.4.2 shared_queues_vendor : latest=0.15.15, local=0.15.15 urdf_parser_plugin : latest=2.6.1, local=2.6.1 python_orocos_kdl_vendor : latest=0.2.5, local=0.2.5 eigen3_cmake_module : latest=0.1.1, local=0.1.1 zstd_vendor : latest=0.15.15, local=0.15.15 tinyxml_vendor : latest=0.8.3, local=0.8.3
PLATFORM INFORMATION system : Linux platform info : Linux-6.8.0-78-generic-x86_64-with-glibc2.35 release : 6.8.0-78-generic processor : x86_64
QOS COMPATIBILITY LIST compatibility status : No publisher/subscriber pairs found
RMW MIDDLEWARE middleware name : rmw_fastrtps_cpp
ROS 2 INFORMATION distribution name : humble distribution type : ros2 distribution status : active release platforms : {'rhel': ['8'], 'ubuntu': ['jammy']}
TOPIC LIST topic : none publisher count : 0 subscriber count : 0
Steps to reproduce issue
When using a string parameter for a ros2 Node, if you load a parameter file that sets that parameter with a map value, the default string value is used, and the yaml map is ignored. Instead a type error should be thrown.
Reproducible example:
node:
class RuntimeCameraManagerNode(Node):
def __init__(self):
super().__init__("camera_manager")
# Camera process tracking
self.active_cameras: dict[str, asyncio.subprocess.Process] = {}
self.monitor_tasks: dict[str, asyncio.Task] = {}
self.shutdown_requested: bool = False
self.camera_configs: dict[str, CameraConfig] = {}
# Declare camera configuration parameters
self.declare_parameter(
name="cameras",
value="{}",
descriptor=ParameterDescriptor(
name="cameras",
type=ParameterType.PARAMETER_STRING,
description="Dictionary containing camera config info",
additional_constraints="Must be a valid YAML/JSON formatted dictionary string",
read_only=False,
),
)
And the input parameters file cameras_config.yaml is:
camera_manager:
ros__parameters:
cameras:
zivid_0:
camera_location: "cieling-front-left"
virtual_camera_path: "/usr/share/Zivid/data/FileCameraZivid2PlusM60.zfc"
When run with:
ros2 run camera_manager camera_manager --ros-args --params-file cameras_config.yaml
the default value of "{}" is used rather than throwing an exception
I see that ros is auomatically loading:
camera.zivid_0.camera_location and camera.zivid_0.virtual_camera_path as Parameter instances in node._parameter_overrides
Expected behavior
When run with:
ros2 run camera_manager camera_manager --ros-args --params-file cameras_config.yaml
the default value of "{}" is used rather than throwing an exception
Actual behavior
the default value of "{}" is used I see that ros is auomatically loading: camera.zivid_0.camera_location and camera.zivid_0.virtual_camera_path as Parameter instances in node._parameter_overrides
Additional information
No response
Here is a possible solution that may need some tweaking for other use cases:
class TypeCheckedNode(Node):
def __key_to_dict(self, map_data: dict, key_with_periods: str, value: Parameter):
if "." in key_with_periods:
key, rest = key_with_periods.split(".", 1)
if key not in map_data:
map_data[key] = {}
self.__key_to_dict(map_data[key], rest, value)
else:
map_data[key_with_periods] = value.value
def declare_parameters( # noqa: C901
self,
namespace: str,
parameters: list[tuple[str] | tuple[str, Parameter.Type] | tuple[str, typing.Any, ParameterDescriptor],],
ignore_override: bool = False,
) -> list[Parameter]:
"""Declare a list of parameters.
The tuples in the given parameter list shall contain the name for each parameter,
optionally providing a value and a descriptor.
For each entry in the list, a parameter with a name of "namespace.name"
will be declared.
The resulting value for each declared parameter will be returned, considering
parameter overrides set upon node creation as the first choice,
or provided parameter values as the second one.
The name expansion is naive, so if you set the namespace to be "foo.",
then the resulting parameter names will be like "foo..name".
However, if the namespace is an empty string, then no leading '.' will be
placed before each name, which would have been the case when naively
expanding "namespace.name".
This allows you to declare several parameters at once without a namespace.
This method, if successful, will result in any callback registered with
:func:`add_on_set_parameters_callback` to be called once for each parameter.
If one of those calls fail, an exception will be raised and the remaining parameters will
not be declared.
Parameters declared up to that point will not be undeclared.
:param namespace: Namespace for parameters.
:param parameters: List of tuples with parameters to declare.
:param ignore_override: True if overrides shall not be taken into account; False otherwise.
:return: Parameter list with the effectively assigned values for each of them.
:raises: ParameterAlreadyDeclaredException if the parameter had already been declared.
:raises: InvalidParameterException if the parameter name is invalid.
:raises: InvalidParameterValueException if the registered callback rejects any parameter.
:raises: TypeError if any tuple in **parameters** does not match the annotated type.
"""
parameter_list = []
descriptors = {}
for index, parameter_tuple in enumerate(parameters):
if len(parameter_tuple) < 1 or len(parameter_tuple) > 3:
raise TypeError(
"Invalid parameter tuple length at index {index} in parameters list: "
"{parameter_tuple}; expecting length between 1 and 3".format_map(locals())
)
value = None
# Get the values from the tuple, checking its types.
# Use defaults if the tuple doesn't contain value and / or descriptor.
name = parameter_tuple[0]
second_arg = parameter_tuple[1] if len(parameter_tuple) > 1 else None
descriptor = parameter_tuple[2] if len(parameter_tuple) > 2 else ParameterDescriptor()
if not isinstance(name, str):
raise TypeError(f"First element {name} at index {index} in parameters list is not a str.")
if not isinstance(descriptor, ParameterDescriptor):
raise TypeError(
f"Third element {descriptor} at index {index} in parameters list is not a ParameterDescriptor."
)
if len(parameter_tuple) == 1:
warnings.warn(
f"when declaring parameter named '{name}', "
"declaring a parameter only providing its name is deprecated. "
"You have to either:\n"
'\t- Pass a name and a default value different to "PARAMETER NOT SET"'
" (and optionally a descriptor).\n"
"\t- Pass a name and a parameter type.\n"
"\t- Pass a name and a descriptor with `dynamic_typing=True"
)
descriptor.dynamic_typing = True
param_type: Parameter.Type
if isinstance(second_arg, Parameter.Type):
param_type = second_arg
if second_arg == Parameter.Type.NOT_SET:
raise ValueError(f"Cannot declare parameter {{{name}}} as statically typed of type NOT_SET")
if descriptor.dynamic_typing is True:
raise ValueError(
f"When declaring parameter {{{name}}} passing a descriptor with"
"`dynamic_typing=True` is not allowed when the parameter type is provided"
)
descriptor.type = second_arg.value
else:
value = second_arg
if not descriptor.dynamic_typing and value is not None:
# infer type from default value
if not isinstance(value, ParameterValue):
param_type = Parameter.Type.from_parameter_value(value)
descriptor.type = param_type.value
else:
if value.type == ParameterType.PARAMETER_NOT_SET:
raise ValueError(
"Cannot declare a statically typed parameter with default value "
"of type PARAMETER_NOT_SET"
)
param_type = Parameter.Type(value.type)
descriptor.type = value.type
else:
# what to do here?
param_type = Parameter.Type.NOT_SET
# Get value from parameter overrides, of from tuple if it doesn't exist.
if not ignore_override and name in self._parameter_overrides:
value = self._parameter_overrides[name].value
"""
Custom code here. ros2 python loads --parameters-file data into self._parameter_overrides
If the value is type map in the yaml data, and the parameter type is string an error is not thrown because
the map data are loaded in as map_name.key where the value is a Parameter instance
So we need to throw an error if any keys in self._parameter_overrides contain map_name. because that means that incorrectly typed data was loaded
"""
if isinstance(self._parameter_overrides, dict):
converted_data = {}
for override_key, override_val in self._parameter_overrides.items():
assert isinstance(override_val, Parameter)
self.__key_to_dict(converted_data, override_key, override_val)
for override_key in self._parameter_overrides:
assert isinstance(override_key, str)
if override_key.startswith(f"{name}."):
# throws a ValueError
param = Parameter(
name,
type_=param_type,
value=converted_data[name],
)
if namespace:
name = f"{namespace}.{name}"
# Note(jubeira): declare_parameters verifies the name, but set_parameters doesn't.
validate_parameter_name(name)
parameter_list.append(Parameter(name, value=value))
descriptors.update({name: descriptor})
parameters_already_declared = [
parameter.name for parameter in parameter_list if parameter.name in self._parameters
]
if any(parameters_already_declared):
raise ParameterAlreadyDeclaredException(parameters_already_declared)
# Call the callback once for each of the parameters, using method that doesn't
# check whether the parameter was declared beforehand or not.
self._set_parameters(parameter_list, descriptors, raise_on_failure=True, allow_undeclared_parameters=True)
# Don't call get_parameters() to bypass check for NOT_SET parameters
return [self._parameters[parameter.name] for parameter in parameter_list]