ROS 新手测试简单的Service和Client

ROS 新手测试简单的Service和Client

编写简单的Service和Client (C++)

Description: 本教程介绍如何用C++编写Service和Client节点。

Tutorial Level: BEGINNER

Next Tutorial: 测试简单的Service和Client


编写Service节点

这里,我们将创建一个简单的service节点(“add_two_ints_server”),该节点将接收到两个整形数字,并返回它们的和。

进入先前你在catkin workspace教程中所创建的beginner_tutorials包所在的目录:

cd ~/catkin_ws/src/beginner_tutorials

请确保已经按照creating the AddTwoInts.srv教程的步骤创建了本教程所需要的srv(确保选择了对应的编译系统“catkin”和“rosbuild”)。

编写代码

在beginner_tutorials包中创建src/add_two_ints_server.cpp文件,并复制粘贴下面的代码:

   #include "ros/ros.h"
   #include "beginner_tutorials/AddTwoInts.h"

   bool add(beginner_tutorials::AddTwoInts::Request  &req,
            beginner_tutorials::AddTwoInts::Response &res)
   {
     res.sum = req.a + req.b;
     ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
     ROS_INFO("sending back response: [%ld]", (long int)res.sum);
     return true;
  }

  int main(int argc, char **argv)
  {
    ros::init(argc, argv, "add_two_ints_server");
    ros::NodeHandle n;

    ros::ServiceServer service = n.advertiseService("add_two_ints", add);
    ROS_INFO("Ready to add two ints.");
    ros::spin();

    return 0;
  }

代码解释

现在,让我们来逐步分析代码。

   #include "ros/ros.h"
   #include "beginner_tutorials/AddTwoInts.h"

beginner_tutorials/AddTwoInts.h是由编译系统自动根据我们先前创建的srv文件生成的对应该srv文件的头文件。

   bool add(beginner_tutorials::AddTwoInts::Request  &req,
            beginner_tutorials::AddTwoInts::Response &res)

这个函数提供两个int值求和的服务,int值从request里面获取,而返回数据装入response内,这些数据类型都定义在srv文件内部,函数返回一个boolean值。

   {
     res.sum = req.a + req.b;
     ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
     ROS_INFO("sending back response: [%ld]", (long int)res.sum);
     return true;
   }

现在,两个int值已经相加,并存入了response。然后一些关于request和response的信息被记录下来。最后,service完成计算后返回true值。

     ros::ServiceServer service = n.advertiseService("add_two_ints", add);

这里,service已经建立起来,并在ROS内发布出来。

编写Client节点

在beginner_tutorials包中创建src/add_two_ints_client.cpp文件,并复制粘贴下面的代码:

    #include "ros/ros.h"
    #include "beginner_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 n;
     ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
     beginner_tutorials::AddTwoInts srv;
     srv.request.a = atoll(argv[1]);
     srv.request.b = atoll(argv[2]);
     if (client.call(srv))
     {
       ROS_INFO("Sum: %ld", (long int)srv.response.sum);
     }
     else
     {
       ROS_ERROR("Failed to call service add_two_ints");
       return 1;
     }

     return 0;
   }

代码解释

现在,让我们来逐步分析代码。

     ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");

这段代码为add_two_ints service创建一个client。ros::ServiceClient 对象待会用来调用service。

     beginner_tutorials::AddTwoInts srv;
     srv.request.a = atoll(argv[1]);
     srv.request.b = atoll(argv[2]);

这里,我们实例化一个由ROS编译系统自动生成的service类,并给其request成员赋值。一个service类包含两个成员request和response。同时也包括两个类定义Request和Response。

     if (client.call(srv))

这段代码是在调用service。由于service的调用是模态过程(调用的时候占用进程阻止其他代码的执行),一旦调用完成,将返回调用结果。如果service调用成功,call()函数将返回true,srv.response里面的值将是合法的值。如果调用失败,call()函数将返回false,srv.response里面的值将是非法的。

编译节点

再来编辑一下beginner_tutorials里面的CMakeLists.txt,文件位于~/catkin_ws/src/beginner_tutorials/CMakeLists.txt,并将下面的代码添加在文件末尾:

https://raw.github.com/ros/catkin_tutorials/master/create_package_srvclient/catkin_ws/src/beginner_tutorials/CMakeLists.txt

   add_executable(add_two_ints_server src/add_two_ints_server.cpp)
   target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
   add_dependencies(add_two_ints_server beginner_tutorials_gencpp)

   add_executable(add_two_ints_client src/add_two_ints_client.cpp)
   target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
   add_dependencies(add_two_ints_client beginner_tutorials_gencpp)

这段代码将生成两个可执行程序”add_two_ints_server”和”add_two_ints_client”,这两个可执行程序默认被放在你的devel space下的包目录下,默认为~/catkin_ws/devel/lib/share/。你可以直接调用可执行程序,或者使用rosrun命令去调用它们。它们不会被装在/bin目录下,因为当你在你的系统里安装这个包的时候,这样做会污染PATH变量。如果你希望在安装的时候你的可执行程序在PATH变量里面,你需要设置一下install target,请参考:catkin/CMakeLists.txt

关于CMakeLists.txt文件更详细的描述请参考:catkin/CMakeLists.txt

现在运行catkin_make命令:

#In your catkin workspace
cd ~/catkin_ws
catkin_make

如果你的编译过程因为某些原因而失败:

确保你已经依照先前的creating the AddTwoInts.srv教程里的步骤完成操作。

运行Service

让我们从运行Service开始 之前,确保在catkin工作空间下(~/catkin_ws$):

$ source ./devel/setup.bash
$ rosrun beginner_tutorials add_two_ints_server     (C++)
$ rosrun beginner_tutorials add_two_ints_server.py  (Python)

你将会看到如下类似的信息:

Ready to add two ints.

(在新终端)运行Client

现在,运行Client并附带一些参数:

$ source ./devel/setup.bash
$ rosrun beginner_tutorials add_two_ints_client 1 3     (C++)
$ rosrun beginner_tutorials add_two_ints_client.py 1 3  (Python)

你将会看到如下类似的信息:

request: x=1, y=3
sending back response: [4]

现在,你已经成功地运行了你的第一个Service和Client程序,可以开始学习如何记录与回放数据了.

时间: 2024-10-11 06:04:16

ROS 新手测试简单的Service和Client的相关文章

ROS学习笔记_编写客户端和服务器(service and client)_C++(五)

注意要区分service.client和publisher.subscriber这两组概念的区别. 先占坑... 参考链接:Writing a Simple Service and Client (C++)

Spring IOC 方式结合TESTGN测试用例,测试简单java的命令模式

java命令模式: 可以命令("请求")封装成一个对象,一个命令对象通过在特定的接收着上绑定一组动作来封装一个请求.命令对象直接把执行动作和接收者包进对象中,只对外暴露出执行方法的的接口,从而简单的达到动作的请求者和动作的执行者解耦的目的. 下面用一个简单的实例测试简单的命令模式,同时采用spring ioc的方式+testNG的测试方式,实现遥控器的遥控开灯的命令模式实现和测试. 1.建立命令接口,包含执行方法,命令对象必须要实现的,执行方法就是暴露的接口方法,提供于接收者调用. p

网络上可供测试的Web Service

腾讯QQ在线状态 WEB 服务Endpoint: http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx Disco: http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?discoWSDL: http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl通过输入QQ号码(String)检测QQ

用C#基于WCF创建TCP的Service供Client端调用

本文将详细讲解用C#基于WCF创建TCP的Service供Client端调用的详细过程 1):首先创建一个Windows Service的工程 2):生成的代码工程结构如下所示 3):我们将Service1改名为MainService 4): 添加一个Interface来定义Service的契约 4.1):截图如下所示 4.2):IOrderService.cs的代码如下所示 using System; using System.Collections.Generic; using System

Learning WCF Chapter1 Generating a Service and Client Proxy

In the previous lab,you created a service and client from scratch without leveraging the tools available to WCF developers. Although this helps you to understand the raw requirements for sending messages between clients and services,in reality,develo

Writing a Simple Service and Client (C++)

Here we'll create the service ("add_two_ints_server") node which will receive two ints and return the sum. Change directories to your beginner_tutorials package you created in your catkin workspace previous tutorials: roscd beginner_tutorials Wr

ROS探索总结(三)——ROS新手教程【转】

转自:http://blog.csdn.net/hcx25909/article/details/8811313 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一ROS的安装 二ROS的新手教程 三ROS中的常用功能 1rviz 2tf 3gazebo 四ROS常用机器人 1PR2 2TurtleBot 3HuskyErratic 前面我们介绍了ROS的特点和结构,接下来就要开始准备动手感受一下ROS的强大了.ROS官网的wiki上针对新手的教程很详细,最好把所有的新手

java的myeclipse生成webservice的service和client

前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要的重复操作. 一.准备工作(以下为本实例使用工具) 1.MyEclipse10.7.1 2.JDK 1.6.0_22 二.创建服务端 1.创建[Web Service Project],命名为[TheService].   2.创建[Class]类,命名为[ServiceHello],位于[com.hyan.service]包下.   3.编写供客户端调用的方法,即编译方法代码. 4.进行编译 说明:编译失败的话,请将该项目引用的

(转)接口自动化测试 – Java+TestNG 测试 Restful Web Service

本文主要介绍如何用Java针对Restful web service 做接口自动化测试(数据驱动),相比UI自动化,接口自动化稳定性可靠性高,实施难易程度低,做自动化性价比高.所用到的工具或类库有 TestNG, Apache POI, Jayway rest-assured,Skyscreamer - JSONassert 简介: 思想是数据驱动测试,用Excel来管理数据,‘Input’ Sheet中存放输入数据,读取数据后拼成request 调用service, 拿到response后写入