DAY15的最後提到了launch文件中的節點設定,有兩個中文都是『參數』的參數(繞口令XD),分別是parameters與arguments,在xml格式是<param>與<arg>,我自己依然在努力搞懂它們的差異...那我第一次同時發現它們的存在,是因為在使用兩個不同的人寫的package,同樣都是開啟robot_state_publisher節點,但用法卻不太一樣?
# AMR_DAY15(我自己的package)
    start_rviz_cmd = Node(
        #...
        # arguments=[-d,""]
    )
        pcl_node = Node(
        # ...
        parameters=[
                {'KS': 50},
                {'RS':0.1},
                {'AT':1.2}
                ]
    )
    
# 當初發現兩個不同的package,使用robot_state_publisher的方式不太一樣
# robot_state_publisher未來天數會提到
    package_1_robot_publisher = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        arguments=[robot.urdf]
    )
    package_2_robot_publisher = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        parameters=[{'robot_description': 『robot.urdf的內容』}]
    )
我自己最後得到的結論是parameters是『ROS2中的參數服務系統』,arguments只是『launch文件中的其中一組參數』,更具體的介紹arguments應該是給c++的主程式main(int argc, char **argv)使用的參數。在python應該就是sys.argv[]?我和python沒那麼熟...
p.s.如果有錯誤理解的話請糾正我!
接下來,今天來看看『ROS2中的參數服務系統』教學吧~~
剛提到在ROS2中parameters是相當重要的一環,也就是參數服務系統,可以預設節點參數,免去掉每次修改完cpp的中一個變數,就要重新colcon build的時間。
舉我自己的例子,pcl_node中會用到歐幾里得距離分群,簡單來說需要設定一個距離變數D,在這範圍內(<D)的點都算同一群,那我不想每次為了只修改這個距離D就要重新編譯整個package,我就可以把D設為para,然後在terminal時下指令
ros2 run <package_name> <node_name> --ros-args -p D:=5
那這樣就是用參數服務系統作修改預設參數這件事了
cpp的寫法未來天數會提到,今天專注在基本的parameters命令~~
繼續用turtlesim做範例
先啟動兩個不同的terminal,並且分別ros2 run
# terminal1 小烏龜節點
ros2 run turtlesim turtlesim_node
# terminal2 鍵盤控制節點
ros2 run turtlesim turtle_teleop_key
再開一個新的terminal 來列出所有parameters
ros2 param list #列出所有可以使用的參數

ros2 param get <node_name> <parameter_name> #取得參數的值
ros2 param get /turtlesim background_g 

ros2 param set <node_name> <parameter_name> <value> #設定參數的值
ros2 param set /turtlesim background_r 255

ros2 param dump <node_name> #列出該節點的所有參數與值,並存為yaml檔
ros2 param dump /turtlesim
        Saving to:  ./turtlesim.yaml
# ./turtlesim.yaml
/turtlesim:
  ros__parameters:
    background_b: 255
    background_g: 86
    background_r: 255
    use_sim_time: false
p.s.這是ROS2 parameters參數檔個固定格式!!
/<node_name>:
  ros__parameters:
      # parameter1: 0

修改turtlesim.yaml並存檔
/turtlesim:
  ros__parameters:
    background_b: 10
    background_g: 255
    background_r: 10
    use_sim_time: false
ros2 param load <node_name> <parameter_file> #修改yaml檔,並重新載入給節點
ros2 param load /turtlesim turtlesim.yaml

ros2 run <package_name> <executable_name> --ros-args --params-file <file_name> #在啟動節點時,直接帶入參數檔
ros2 run turtlesim turtlesim_node --ros-args --params-file turtlesim.yaml
