param:
Param基本功能
什么是Param
¶
Param
是
Parameters
的简写,意为参数。在ROS种,起到的作用是节点间共享数据。
实现的原理是将需要共享的数据存放到
ROS Master
中,这样所有的节点都可以访问。
存储规范
¶
Param存储数据遵循的是YAML规范。
如果去简单的理解,可以认为是一个
key
value
的组合,
key
是string类型,
value
的类型可以有多种。
value的类型有:
- integer: 整数类型
- boolean: bool类型
- double: 小数类型
- list: 集合列表类型
- map: 字典类型
- binary: 二进制数据类型
命令行工具
¶
ROS 提供了命令行工具,供我们对
Param
进行操作。
查询操作
¶
rosparam list
通过
list
命令,可以查询出当前所有可共享的参数。
/rosdistro
/roslaunch/uris/host_ubuntu__40479
/rosversion
/run_id
获取操作
¶
rosparam get /run_id
Tip
通过
get
命令可以获取要获取的值
设置操作
¶
rosparam set /run_id aaa
Tip
通过
set
命令可以修改参数的值
删除操作
¶
rosparam delete /run_id
Tip
可以产出对应的key
导出Param
¶
rosparam dump abc.yml
Tip
dump
命令可以把当前的param导出为一个文件
导入Param
¶
rosparam load abc.yml
Tip
load
命令可以把
yml
文件导入到param中
API使用
前言¶
我们在开发过程中,通常在API层级中是需要操作Param数据的,并且通Param进行数据操作
C++操作Param¶
获取所有参数名称¶
vector<string> names;
if(node.getParamNames(names)) {
for(string name : names) {
ROS_INFO(name);
}
}
获取参数的值¶
node.getParam(name);
设置参数的值¶
node.setParam(name, value);
判断参数是否存在¶
node.hasParam(name)
Python操作Param¶
获取所有参数名称¶
names = rospy.get_param_names()
获取参数的值¶
rospy.get_param(name)
设置参数的值¶
node.set_param(name, value);
判断参数是否存在¶
node.has_param(name)
代码:
c++
/*-------------------------- 设置param --------------------------*/
node.setParam("/heihei",123);
/*-------------------------- param --------------------------*/
//获取所有的param
//定义vector保存所有的param的名字
vector<string> names;
string value;
int a;
node.getParam("heihei",a);
ROS_INFO_STREAM("HEIHEI----"<<a);
// node.getParam("/turtlesim/background_b",value);
// ROS_INFO_STREAM("turtlesim key----------------- "<<value);
//获取所有的param的名字
if (node.getParamNames(names)) {
//获取每一个key:value
for (string ele:names) {
ROS_INFO_STREAM("names----"<<ele);
//前提 需要知道当前数据类型
// //定义value
// string value;
// if(node.getParam(ele,value)){
// ROS_INFO_STREAM("key "<<ele<<" value "<<value);
// }
}
python:
#!/usr/bin/env python
# coding:utf-8
import rospy
import sys
if __name__ == '__main__':
# 创建节点
rospy.init_node("param_node_py")
rospy.loginfo('param----- py ---- {}'.format(sys.argv))
result = rospy.get_param_names()
for ele in result:
value = rospy.get_param(ele)
rospy.loginfo(value)
rospy.spin()
launch:
<launch>
<!--
pkg:包
type:可执行程序名字 或者py文件名
name:节点名
-->
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node"></node>
<node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key"></node>
<node pkg="demo_config" type="param" name="param_node"></node>
<node pkg="demo_config" type="param.py" name="param_node_py"></node>
</launch>
<launch>
<!--
pkg:包
type:可执行程序名字 或者py文件名
name:节点名(可以和程序中节点名不同 ,最终以launch文件为准)
如果通过launch文件启动,会自动启动ros master节点
-->
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node"></node>
<node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key"></node>
<node pkg="demo_config" type="param" name="aaa"></node>
<node pkg="demo_config" type="param.py" name="param_node_py"></node>
</launch>
<launch>
<!--
remap
-->
<!-- <node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node"-->
<!-- respawn="true" respawn_delay="5"></node>-->
<!-- -->
<!-- <node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key"></node>-->
<node pkg="demo_config" type="param" name="aaa" output="screen">
<!--
remap:修改topic的名字
-->
<remap from="/param_topic" to="/hahaha"></remap>
</node>
<!-- <node pkg="demo_config" type="param.py" name="param_node_py"></node>-->
</launch>
<launch>
<!--
param
-->
<param name="jjj" value="456" type="int"></param>
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node"></node>
<node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key"></node>
<node pkg="demo_config" type="param" name="param_node"></node>
<node pkg="demo_config" type="param.py" name="param_node_py">
<param name="haha" value="123" type="str"></param>
</node>
</launch>
<launch>
<!--
param改变小乌龟颜色
-->
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
<param name="background_b" value="0" type="int"></param>
<param name="background_g" value="0" type="int"></param>
<param name="background_r" value="255" type="int"></param>
</node>
</launch>
<launch>
<!--
arg
-->
<node pkg="demo_config" type="param.py" name="param_node_py" output="screen" args="a b c" ></node>
<!-- <node pkg="demo_config" type="param" name="param_node" output="screen" args="10 20"></node>-->
</launch>
<launch>
<!--
外置arg
roslaunch demo_confimo07.launch bgb:=0 bgg:=255 bgr:=0
-->
<arg name="bgb" default="0"></arg>
<arg name="bgg" default="0"></arg>
<arg name="bgr" default="255"></arg>
<node pkg="demo_config" type="param.py" name="param_node_py" output="screen" args="a b c" ></node>
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
<param name="background_b" value="$(arg bgb)" type="int"></param>
<param name="background_g" value="$(arg bgg)" type="int"></param>
<param name="background_r" value="$(arg bgr)" type="int"></param>
</node>
</launch>
<launch>
<!--
其他launch文件
-->
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node"></node>
</launch>
<launch>
<!--
启动demo08.launch 文件
-->
<!--启动demo08.launch 全路径-->
<include file="$(find demo_config)/launch/demo08.launch"></include>
<node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key"></node>
</launch>
<launch>
<node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key"></node>
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node" ></node>
<node pkg="demo_tf" type="turtle1_01_cpp" name="turtle1_cpp" output="screen"></node>
<node pkg="demo_tf" type="turtle2_02_cpp" name="turtle2_cpp" output="screen" args="turtle2 back"></node>
<!--<node pkg="demo_tf" type="turtle2_02_cpp" name="turtle3_cpp" output="screen" args="turtle3 up"></node>
<node pkg="demo_tf" type="turtle2_02_cpp" name="turtle4_cpp" output="screen" args="turtle4 do"></node>-->
<!--<node pkg="rviz" type="rviz" name="rviz" args="-d $(find demo_tf)/rviz/rviz.rviz"></node>-->
</launch>
启动: launch
roslaunch demo_tf config.launch
URDF与xacro 制作模拟仿真 启动配置
<launch>
<arg name="model" default="geometry_box.urdf"/>
<arg name="gui" default="true" />
<arg name="rvizconfig" default="$(find demo_urdf)/rviz/urdf.rviz" />
<param name="robot_description" command="$(find xacro)/xacro --inorder $(find demo_urdf)/urdf/$(arg model)" />
<param name="use_gui" value="$(arg gui)"/>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />
</launch>
启动: 仿真
roslaunch demo_tf config.launch mode:=geometry_box.urdf 后面参数自己改,不传的话默认geometry_box.urdf