2.4 使用新建的srv和msg文件

创建服务并使用它:对三个整数求和。我们需要两个节点,一个服务器一个客户端。
在功能包chapter2_tutrorials中,src文件夹下新建两个节点并使用example2_a.cpp和example2_b.cpp为名称。

在example_a.cpp中:

#include "ros/ros.h"
#include "chapter2_tutorials/chapter2_srv1.h"  //包含我们创建的srv文件

bool add(chapter2_tutorials::chapter2_srv1::Request  &req,
         chapter2_tutorials::chapter2_srv1::Response &res)  //服务变量
{  
  res.sum = req.A + req.B + req.C;
  ROS_INFO("request: A=%d, B=%d C=%d", (int)req.A, (int)req.B, (int)req.C);//请求输入
  ROS_INFO("sending back response: [%d]", (int)res.sum); //输出
  return true;
}
//这个函数会对3个变量求和,并将计算结果发送给其他节点

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

  ros::ServiceServer service = n.advertiseService("add_3_ints", add); //创建服务并发布广播
  ROS_INFO("Ready to add 3 ints.");
  ros::spin();

  return 0;
}

在example_b.cpp中

#include "ros/ros.h"
#include "chapter2_tutorials/chapter2_srv1.h"
#include <cstdlib>

int main(int argc, char **argv)
{
  ros::init(argc, argv, "add_3_ints_client");
  if (argc != 4)
  {
    ROS_INFO("usage: add_3_ints_client A B C ");
    return 1;
  }

  ros::NodeHandle n;
  ros::ServiceClient client = n.serviceClient<chapter2_tutorials::chapter2_srv1>("add_3_ints");
//使用add_3_ints为名称创建一个服务的客户端

  chapter2_tutorials::chapter2_srv1 srv;
  srv.request.A = atoll(argv[1]);
  srv.request.B = atoll(argv[2]);
  srv.request.C = atoll(argv[3]);
//创建srv文件的一个实例,并加入需要发送的数据值。
  if (client.call(srv))//调用服务并发送数据,如果调用成功,call()函数会返回true;否则false
 {
    ROS_INFO("Sum: %ld", (long int)srv.response.sum);
  }
  else
  {
    ROS_ERROR("Failed to call service add_two_ints");
    return 1;
  }

  return 0;
}

编译节点,在CMakelist.txt文件中增加以下行:

现在执行以下命令:
$rosmake  chapter2_tutorials

为了启动节点,需要执行以下命令行:
rosrun  chapter2_tutorials  example2_a
rosrun  chapter2_tutorials  example2_b 1 2 3
显示结果

 

猜你喜欢

转载自blog.csdn.net/wtj318_/article/details/82852923
今日推荐