掌握ROS机器人通信系统架构
掌握参数的原理及其使用场景
掌握ROS参数指令集
掌握使用C++和Python实现ROS参数服务器
本实验主要学习以下几方面的内容:
ROS通信架构
ROS参数的原理
参数常用指令集
实现ROS参数的查询,修改,列举等功能
1.所需仪器设备
(1)“卓越之星”设备-用于功能调试;
(2)个人PC-用于应用程序的开发与展示;
2.注意事项
(1)个人PC需要安装NoMachine或者VSCode支持远程编程开发;
(2)运动实验尽可能将设备平放在地面上;
(3)实验开始前确保设备电量为满电,实验完成后关闭设备电源;
在 ROS 中,参数是一种用于存储和传递数据的机制。它们通常用于指定节点的配置参数,例如一个节点的名称、频率、发布的主题等等。
ROS 参数有两种类型:全局参数和私有参数。全局参数可由多个节点共享,而私有参数只能由一个节点使用。
在 ROS 中,可以使用命令行工具rosparam来设置和获取参数。例如,要设置一个参数,可以使用以下命令:
rosparam set <parameter_name>
其中,<parameter_name>是参数的名称,是参数的值。要获取一个参数,可以使用以下命令:
rosparam get <parameter_name>
此外,还可以通过rosparam命令从文件中读取和写入参数。
在 ROS 节点中,可以使用ros::NodeHandle类来访问参数。例如,要获取一个参数的值,可以使用以下代码:
ros::NodeHandle nh;
int my_param;
nh.getParam("my_param", my_param);
其中,"my_param"是参数的名称,my_param是一个变量来存储参数的值。
以下是一些常用的 ROS 参数指令:
以下是一个使用 C++设置和读取以及查询 ROS 参数的示例:
#include <ros/ros.h>
int main(int argc, char **argv) {
// 初始化ROS节点
ros::init(argc, argv, "my_param_node");
// 创建节点句柄
ros::NodeHandle nh;
ros::NodeHandle private_nh("~");
std::string param_name = "my_param";
std::string param_value = "hello";
std::string my_param_first;
private_nh.getParam(param_name, my_param_first);
ROS_INFO("The value of %s is %s", param_name.c_str(), my_param_first.c_str());
// 设置一个参数
nh.setParam(param_name, param_value);
// 获取一个参数
std::string my_param;
nh.getParam(param_name, my_param);
ROS_INFO("The value of %s is %s", param_name.c_str(), my_param.c_str());
ros::spin();
return 0;
}
在上面的代码中,首先我们初始化了 ROS
节点,并创建了一个节点句柄nh。然后我们设置了一个私有参数my_param,并将其值设置为hello。接下来,我们使用getParam函数获取该参数的值,并将其存储在变量my_param中。最后,我们使用ROS_INFO函数输出参数的值。
运行结果:
以下是一个使用 Python 设置和读取,查询 ROS 参数的示例:
#!/usr/bin/env python3
import rospy
def param_demo():
rospy.init_node("param_demo")
rate = rospy.Rate(1)
while(not rospy.is_shutdown()):
#get param
parameter1 = rospy.get_param("param1", default=111)
parameter2 = rospy.get_param("param2", default=222)
rospy.loginfo('Get param1 = %d', parameter1)
rospy.loginfo('Get param2 = %d', parameter2)
#set param
rospy.set_param('param2',2)
#delete param
rospy.delete_param('param2')
#check param
ifparam3 = rospy.has_param('param3')
if(ifparam3):
rospy.loginfo('param3 exists')
else:
rospy.loginfo('param3 does not exist')
#get all param names
params = rospy.get_param_names()
rospy.loginfo('param list: %s', params)
rate.sleep()
if __name__=="__main__":
param_demo()
在上面的代码中
运行结果:
除了使用代码,我们一般会使用 launch 文件配置 ROS 参数,比如上面这个节点,我们把参数配置成launch如下:
<launch>
<node name="parameter" pkg="class_4_pkg" type="ros_param" output="screen">
<param name="my_param" value="ros!!!!"/>
</node>
</launch>
上面这个文件名为parameter.launch,把节点的参数提前设置在launch里,可以通过下面指令来启动节点。
roslaunch class_4_pkg parameter.launch