ros param与域名的使用

ros param与域名的使用

文章目录

  • ros param与域名的使用
    • 1. NodeHandle的域名空间
    • 2. Node节点的名称
      • 2.1. rosrun 启动时就会以默认名称启动: /imu_node
      • 2.2. roslaunch 启动的node依据launch中的name指定别名 imu_node_xx
    • 3. param 在launch中的表现
    • 4. rosparam load
      • 4.1 加载参数文件
      • 4.2 加载node域名下的参数文件
      • 4.3 加载node域名下的参数文件, 带ns

经常混淆参数域名,现在总结下参数的域名相关知识点。 注意: 域名开头的“/”全部交给代码中的NodeHandle句柄和launch中的xml格式控制,名称不以“/”开头
imu_node

1. NodeHandle的域名空间

    ros::NodeHandle n;
    ros::NodeHandle nh("~");//相对域名, 相对于在启动起来的节点node域名下

参数的域名只能由NodeHandle来控制管理, 节点程序中参数定义只由名称决定。全局NodeHandle n下带不带“/”开头都可以;相对NodeHandle nh下不要带“/”开头,带了会有问题;

    ros::NodeHandle n;
    n.param("serial_port_name", serial_port_name_, "/dev/ttyUSB0");
    n.param("/imu_topic", imu_topic_, "/imu");
    ros::NodeHandle nh("~");
    nh.param("publish_rate", publish_rate_, 200);
    nh.param("debug_raw_data", debug_raw_data_, false);

2. Node节点的名称

ros::init(argc, argv, "imu_node");

每个节点是一个进程, 初始化的时候会指定一个默认的节点名称“imu_node”

2.1. rosrun 启动时就会以默认名称启动: /imu_node

yhzhao@yhzhao:~/ys_design/ysImu_ws$ rosrun  imu_node imu_node

yhzhao@yhzhao:~/ys_design/ysImu_ws$ rosparam list 
/rosdistro
/roslaunch/uris/host_localhost__43741
/rosversion
/run_id

yhzhao@yhzhao:~/ys_design/ysImu_ws$ rosnode list 
/imu_node
/rosout

参数服务没被调用,命令 rosparam list 看不到相应的参数列表, 只要调用过 rosparam set 才会可见参数; 并且该参数的生存周期同参数服务器的周期一致,也就是roscore的周期一致;

yhzhao@yhzhao:~/ys_design/ysImu_ws$ rosparam  set  /imu_frame /imu_frame1
yhzhao@yhzhao:~/ys_design/ysImu_ws$ rosparam list 
/imu_frame
/rosdistro
/roslaunch/uris/host_localhost__45945
/rosversion
/run_id

yhzhao@yhzhao:~/ys_design/ysImu_ws$ rosparam  get  /imu_frame
/imu_frame1

2.2. roslaunch 启动的node依据launch中的name指定别名 imu_node_xx

    
        
    
yhzhao@yhzhao:~/ys_design/ysImu_ws$ roslaunch imu_node imu.launch

yhzhao@yhzhao:~/ys_design/ysImu_ws$ rosnode list 
/imu_node_xx
/rosout

3. param 在launch中的表现

launch中param的name不要以“/”开头,完全以xml的格式控制其域名的相对性;launch的param name="imu_frame"有没有“/”开头都可以, 那就不要了;

    ros::NodeHandle n;//绝对域名
    ros::NodeHandle nh("~");//相对域名

    n.param("serial_port_name", serial_port_name_, "/dev/ttyUSB0");
    n.param("imu_topic", imu_topic_, "/imu");
    n.param("imu_frame", imu_frame_, "/imu_frame");
    nh.param("publish_rate", publish_rate_, 200);

参数依据NodeHandle的命名空间确定; serial_port_name_ imu_topic_ imu_frame_ 对应绝对域名下; publish_rate_为相对域名下; 其中相对域名“~”为节点对应的域名,如果节点名称发生变化,域名也会变化;

依据launch文件修改对应的节点参数;绝对参数放外面,相对参数放节点node里面; 也可以写全相对域名参数在node外设置;

    
    
    

    <node pkg="imu_node" type="imu_node" name="imu_node_xx" output="screen">
        
    node>
yhzhao@yhzhao:~/ys_design/ysImu_ws$ roslaunch imu_node imu.launch
    
yhzhao@yhzhao:~/ys_design/ysImu_ws$ rosnode list 
/imu_node_xx
/rosout

yhzhao@yhzhao:~/ys_design/ysImu_ws$ rosparam list 
/imu_frame
/imu_node_xx/publish_rate
/imu_topic
/rosdistro
/roslaunch/uris/host_localhost__45587
/rosversion
/run_id
/serial_port_name

4. rosparam load

对应的yaml文件 :前面的为一层域名; : 后面具体值为参数对应的值; 格式对齐对应域名作用域

4.1 加载参数文件


    

imu_port_name: /dev/ttyUSB0
publish_tf: true           
cmd_time_out: 1000    #ms

4.2 加载node域名下的参数文件


  
    
  
  

global_planner_params.yaml

GlobalPlanner:
  use_dijkstra: false
  use_quadratic: true
  use_grid_path: false
  cost_factor: 5.0

4.3 加载node域名下的参数文件, 带ns

参数会在外层套上域名ns对应的global_costmap


  
    
  
  

global_planner_params.yaml

use_dijkstra: false
use_quadratic: true
use_grid_path: false
cost_factor: 5.0

你可能感兴趣的:(【ROS】,ros,rosparm,roslaunch,参数域名)