ros param与域名的使用
文章目录
经常混淆参数域名,现在总结下参数的域名相关知识点。 注意: 域名开头的“/”全部交给代码中的NodeHandle句柄和launch中的xml格式控制,名称不以“/”开头
imu_node
1. NodeHandle的域名空间
ros::NodeHandle n;
ros::NodeHandle nh("~");//相对域名, 相对于在启动起来的节点node域名下
参数的域名只能由NodeHandle来控制管理, 节点程序中参数定义只由名称决定。全局NodeHandle n下带不带“/”开头都可以;相对NodeHandle nh下不要带“/”开头,带了会有问题;
ros::NodeHandle n;
n.param<std::string>("serial_port_name", serial_port_name_, "/dev/ttyUSB0");
n.param<std::string>("/imu_topic", imu_topic_, "/imu");
ros::NodeHandle nh("~");
nh.param<int>("publish_rate", publish_rate_, 200);
nh.param<bool>("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
<node pkg="imu_node" type="imu_node" name="imu_node_xx" output="screen">
<param name="publish_rate" type="int" value= "200"/>
</node>
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<std::string>("serial_port_name", serial_port_name_, "/dev/ttyUSB0");
n.param<std::string>("imu_topic", imu_topic_, "/imu");
n.param<std::string>("imu_frame", imu_frame_, "/imu_frame");
nh.param<int>("publish_rate", publish_rate_, 200);
参数依据NodeHandle的命名空间确定; serial_port_name_ imu_topic_ imu_frame_ 对应绝对域名下; publish_rate_为相对域名下; 其中相对域名“~”为节点对应的域名,如果节点名称发生变化,域名也会变化;
依据launch文件修改对应的节点参数;绝对参数放外面,相对参数放节点node里面; 也可以写全相对域名参数在node外设置;
<param name="imu_frame" type="string" value= "/imu_frame"/>
<param name="imu_topic" type="string" value= "/imu"/>
<param name="serial_port_name" type="string" value= "/dev/ttyUSB0"/>
<node pkg="imu_node" type="imu_node" name="imu_node_xx" output="screen">
<param name="publish_rate" type="int" value= "200"/><!--参数域名会相对在node域名之下 -->
</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 加载参数文件
<launch>
<rosparam command="load" file="$(find odom)/cfg/base.yaml" />
</launch>
imu_port_name: /dev/ttyUSB0
publish_tf: true
cmd_time_out: 1000 #ms
4.2 加载node域名下的参数文件
<launch>
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<rosparam file="$(find navigation)/param/global_planner_params.yaml" command="load" />
</node>
</launch>
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
<launch>
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<rosparam file="$(find navigation)/param/global_planner_params.yaml" command="load" ns="global_costmap" />
</node>
</launch>
global_planner_params.yaml
use_dijkstra: false
use_quadratic: true
use_grid_path: false
cost_factor: 5.0