ROS学习--8.写一个服务与客服端

1.写一个服务节点

  1. 移动到我们之前创建的beginner_tutorials包中去:
roscd beginner_tutorials
  • 在beginner_tutorials包中创建src / add_two_ints_server.cpp文件,并将以下内容粘贴到其中:
#include "ros/ros.h"

//beginner_tutorials / AddTwoInts.h是从我们先前创建的srv文件生成的头文件。
#include "beginer_tutorials/AddTwoInts.h"
#include "cstdlib"

//此函数提供用于添加两个int的服务,它接受srv文件中定义的请求和响应类型,并返回一个布尔值。
bool add(beginer_tutorials::AddTwoInts::Request &req, beginer_tutorials::AddTwoInts::Response &res)
{
    res.sum = req.a + req.b;
    ROS_INFO("request x = %ld, y = %ld", (long)req.a, (long)req.b);
    ROS_INFO("sending back response: [%ld]", (long)res.sum);
    return true;
}

int main(int argc, char** argv)
{
    ros::init(argc, argv, "add_two_ints_server");
    ros::NodeHandle node_handle;
    
//    在这里,两个int被添加并存储在响应中。然后记录有关请求和响应的一些信息。最后,服务完成后将返回true。
    ros::ServiceServer service = node_handle.advertiseService("add_two_ints", add);

    ROS_INFO("Ready to add two ints!");

    ros::spin();

    return 0;
}

经过前一章的介绍, 现在的代码看起来就简单多了

2.写一个客服端节点

  • 在beginner_tutorials包中创建src / add_two_ints_client.cpp文件,并将以下内容粘贴到其中:
#include "ros/ros.h"
#include "beginer_tutorials/AddTwoInts.h"
#include "cstdlib"

int main(int argc, char** argv)
{
    ros::init(argc, argv, "add_two_ints_client");

//  判断从命令行输入的参数数量是否正确 
    if(argc != 3)
    {
        ROS_INFO("usage: add_two_ints_client X Y");
        return 1;
    }

    ros::NodeHandle node_handle;

//    这将为add_two_ints服务创建一个客户端。 ros :: ServiceClient对象用于稍后调用服务。
    ros::ServiceClient client = node_handle.serviceClient("add_two_ints");

//    在这里,我们实例化一个自动生成的服务类,并为其请求成员分配值。服务类包含两个成员,
//    即请求和响应。它还包含两个类定义:Request和Response。
    beginer_tutorials::AddTwoInts srv;
    
 //  将命令行读取的参数传入srv中
    srv.request.a = atoll(argv[1]);
    srv.request.b = atoll(argv[2]);

//    这实际上称为服务。由于服务呼叫处于阻塞状态,因此呼叫完成后将返回。
//    如果服务调用成功,则call()将返回true,并且srv.response中的值将有效。
//    如果调用失败,则call()将返回false,并且srv.response中的值将无效。
    if(client.call(srv))
    {
        ROS_INFO("sum: %ld", (long)srv.response.sum);
    } else
    {
        ROS_ERROR("Failed to call server add_two_ints");
        return 1;
    }

    return 0;
}

3.编译

  • 再次编辑〜/ catkin_ws / src / beginner_tutorials / CMakeLists.txt中的beginner_tutorials CMakeLists.txt,并在末尾添加以下内容:
  27 add_executable(add_two_ints_server src/add_two_ints_server.cpp)
  28 target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
  29 add_dependencies(add_two_ints_server beginner_tutorials_gencpp)
  30 
  31 add_executable(add_two_ints_client src/add_two_ints_client.cpp)
  32 target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
  33 add_dependencies(add_two_ints_client beginner_tutorials_gencpp)

这将创建两个可执行文件,add_two_ints_server和add_two_ints_client,它们默认情况下将进入开发空间的包目录,默认情况下位于〜/ catkin_ws / devel / lib / <程序包名称>。您可以直接调用可执行文件,也可以使用rosrun调用它们。它们没有放在' / bin'中,因为在将软件包安装到系统时,这会污染PATH。如果希望在安装时将可执行文件放在PATH上,则可以设置安装目标,请参阅:catkin / CMakeLists.txt

  • 由于我们在之前已经将srv文件的相关文件, 所以这里不用添加, 若有问题, 参阅: ROS学习--6.msg和srv

回到catkin_ws并编译:

cd ~/catkin_ws
catkin_make

4.测试(两种方式)

  1. 打开三个终端分别运行:
roscore
source ~/catkin_ws/devel/setup.bash
rosrun beginer_tutorials add_two_ints_server
source ~/catkin_ws/devel/setup.bash
rosrun beginer_tutorials add_two_ints_client 4 5
  1. 打开三个终端分别运行:
roscore
~/catkin_ws/devel/lib/beginer_tutorials/add_two_ints_server
~/catkin_ws/devel/lib/beginer_tutorials/add_two_ints_client 4 5

最后结果:

你可能感兴趣的:(ROS学习--8.写一个服务与客服端)