之前的博客已经分别介绍过了ROS的话题、服务、动作三种消息的编程了。本博文介绍一下参数的使用
修改博客《 ROS复习笔记之——创建和运行服务服务器与客户端节点》中的service_server.cpp,让通过服务请求输入的a和b不光进行加法运算,还会利用参数让a和b进行四则运算。修改代码如下所示
#include "ros/ros.h" // ROS的基本头文件
#include "my_first_ros_pkg/SrvTutorial.h" // SrvTutorial服务头文件(构建后自动生成)
//这里的my_first_ros_pkg是节点所在的功能包
//服务服务器是响应服务的请求,响应来自服务客户端的请求,并将结果反馈到服务客户端
//新定义几个参数来更改四则运算
#define PLUS 1 // 加
#define MINUS 2 // 减
#define MULTIPLICATION 3 // 乘
#define DIVISION 4 // 除
int g_operator = PLUS;//初始化为+操作
// 如果有服务请求,将执行以下处理
// 将服务请求设置为req,服务响应则设置为res。
//SrvTutorial为定义的服务消息文件
bool calculation(my_first_ros_pkg::SrvTutorial::Request &req,
my_first_ros_pkg::SrvTutorial::Response &res)
{
// // 在收到服务请求时,将a和b的和保存在服务响应值中
// res.result = req.a + req.b;//服务响应的结果就是把服务请求的两个值相加
// 根据g_operator参数值进行a和b的运算
// 计算后将结果保存到服务响应值中。
switch(g_operator)
{
case PLUS:
res.result = req.a + req.b; break;
case MINUS:
res.result = req.a - req.b; break;
case MULTIPLICATION:
res.result = req.a * req.b; break;
case DIVISION:
if(req.b == 0)
{
res.result = 0; break;
}
else
{
res.result = req.a / req.b; break;
}
default:
res.result = req.a + req.b; break;
}
// 显示服务请求中用到的a和b的值以及服务响应result值
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);//显示出来
ROS_INFO("sending back response: %ld", (long int)res.result);
return true;
}
int main(int argc, char **argv) // 节点主函数
{
ros::init(argc, argv, "service_server"); // 初始化节点名称。"service_server“就算当前节点的名称,这句话的作用应该就是在ROS中初始化这个节点
ros::NodeHandle nh; // 声明节点句柄
//定义参数的名称为"calculation_method"
nh.setParam("calculation_method", PLUS); // 初始化参数。将calculate_method参数设置为PLUS值
//作为参考,参数可以设置为integers、floats、boolean、string、dictionaries和list等。
// 声明服务服务器
// 声明利用my_first_ros_pkg功能包的SrvTutorial服务文件的
// 服务服务器my_first_ros_pkg_server
// 自定义服务名称是ros_tutorial_srv,且当有服务请求时,执行calculation函数。
ros::ServiceServer my_first_ros_pkg_server = nh.advertiseService("ros_tutorial_srv", calculation);//这句可以跟之前的topic发布者文件进行对比,可以看出ros中声明服务服务器和topic发布者的关系
ROS_INFO("ready srv server!");//显示
ros::Rate r(10); // 10hz。每0.1秒检查一次参数的值
while (1)
{
// 将运算符改为通过参数收到的值。
nh.getParam("calculation_method", g_operator);//获得参数的值
ros::spinOnce(); // 后台函数处理进程
r.sleep(); // 为了反复进入进程而添加的sleep(暂歇)函数
}
// ros::spin(); // 等待服务请求
return 0;
}
编译
cd ~/catkin_ws && catkin_make
测试:
roscore
rosrun my_first_ros_pkg service_server
参考参数目录
rosparam list
输入要进行四则运算的变量a和b,默认运算加法的结果值
rosservice call /ros_tutorial_srv 10 5
更改参数(以使用“rosparam set”命令更改名为calculation_method的参数)
rosparam set /calculation_method 2
rosservice call /ros_tutorial_srv 10 5
结果如下图所示