ROS复习笔记之——参数的使用

之前的博客已经分别介绍过了ROS的话题、服务、动作三种消息的编程了。本博文介绍一下参数的使用

《ROS复习笔记之——系统框架及其编程规范》

《 ROS复习笔记之——创建和运行服务服务器与客户端节点》

《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

ROS复习笔记之——参数的使用_第1张图片

输入要进行四则运算的变量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

结果如下图所示

ROS复习笔记之——参数的使用_第2张图片

 

 

 

参考资料

http://wiki.ros.org/Books/ROS_Robot_Programming_English

你可能感兴趣的:(ROS,移动机器人)