1. 简介
在ROS中,参数名称可能出现重名,他不像话题重名那样,可以采用重映射加以解决。但是,可以通过添加不同的前缀,来区分不同的参数
- 分类:
- 全局:与命名空间平级
- 相对:与节点名平级
- 私有:节点名称的子级
- 实现方法:
- rosrun命令
- launch文件
- 编码实现
2. 实现方法
2.1 rosrun设置参数:参数名称使用的是私有模式
- 格式:rosrun 包名 节点名 _参数名:=参数值
- 代码实现:
rosrun turtlesim turtlesim_node _A:=100
- 运行结果:
rosparam list /turtlesim/A
2.2 launch文件设置参数
- 类型:
- 在node标签外:全局参数
- 在node标签内:私有参数
- 代码实现:
<!-- 设置参数 --> <launch> <!-- 格式1:全局 --> <param name="radius" value="10" /> <!-- 格式2:局部 --> <node pkg="turtlesim" type="turtlesim_node" name="t1" ns="xxx"> <param name="radius" value="20" /> </node> </launch>
- 运行结果:
bash1:启动launch文件 roslaunch launch_test_01 param_rename.launch bash2:查看参数列表 rosparam list /radius /xxx/t1/radius
2.3 编码设置参数
2.3.1 C++实现
- 代码实现:
#include"ros/ros.h" int main(int argc,char *argv[]){ ros::init(argc,argv,"topic_name"); ros::NodeHandle nh; /* 使用ros::param来设置参数 */ // 1. 全局 ros::param::set("/radiusA",100); // 2. 相对 ros::param::set("radiusB",100); // 3. 私有 ros::param::set("~radiusC",100); /* 使用NodeHandle设置参数 */ // 1. 全局 nh.setParam("/A",100); // 2. 相对 nh.setParam("B",100); // 3. 私有 ros::NodeHandle nh1("~"); nh1.setParam("C",100); return 0; }
- 运行结果:
bash1:运行节点,并加入命名空间 rosrun rename_01 topic_name __ns:=xxx bash2:查看参数列表 rosparam list /A /radiusA /xxx/B /xxx/radiusB /xxx/topic_name/C /xxx/topic_name/radiusC
2.3.2 Python实现
- 代码实现:
#! /usr/bin/env python from ast import Str import rospy from std_msgs.msg import String if __name__ == "__main__": rospy.init_node("topic_name_p") # 1. 全局 rospy.set_param("/p1",100) # 2. 相对 rospy.set_param("py2",100) # 3. 私有 rospy.set_param("~py3",100)
- 运行结果:
bash1:启动节点,并加入命名空间 rosrun rename_01 topic_name_p.py __ns:=xxx bash2:查看参数列表 rosparam list /p1 /xxx/py2 /xxx/topic_name_p/py3