机器人操作系统ROS Indigo 入门学习(14)——用C++语言写一个简单的service和client

来源:互联网 发布:centos 拼音不出中文 编辑:程序博客网 时间:2024/05/29 04:48

 这篇教程包括怎样去用C++写一个service和一个client.

 

1.1写一个Service Node

这里我们会创建一个service(“add_two_ints_server”)node,它会接受两个整形数据并且返回它们的和.

进入你在之前教程中创建的catkin工作空间的beginner_tutorials package目录.

cd ~/catkin_ws/src/beginner_tutorials

请确认你已经遵循之前教程的指示创建这个教程所需的service,creating the AddTwoInts.srv(请确认你已经选择了正确版本的编译工具在这个链接的网页的上面).

 

1.111代码

在beginner_tutorials package中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;

}

1.1.2代码解释

现在我们分解代码:

  #include "ros/ros.h"

 #include "beginner_tutorials/AddTwoInts.h"

 

beginner_tutorials/AddTwoInts.h是由我们之前创建的srv文件中产生的头文件.

 

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

 

 

这个函数用来使两个整数的相加,它吸收在srv文件中定义的request和response类型,并且返回一个布尔量.

  {

   res.sum = req.a + req.b;

   ROS_INFO("request: x=%ld, y=%ld", (long int)lsreq.a, (long int)req.b);

   ROS_INFO("sending back response: [%ld]", (long int)res.sum);

   return true;

  }

 

这里表示将两个整数的相加并且将结果储存在response中.然后一些关于request和response的信息被记录了.最后完成时返回真.

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

这里service在ROS上被创建和广.

 

 

1.2写一个Client Node

1.2.1代码

在beginner_tutorials package中src目录下创建一个叫add_two_int_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;

 }

 

1.2.2代码解释

现在,我们分解代码

 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]);

这里我们示例了一个自动产生的servcie类,并且给它的request成员分配值.一个service类包含两个成员,request和response.它也包含两个类的定义,Request和Response.

    if (client.call(srv))

 

这里实际上调用了services.因为service的调用一直处于被阻塞状态,一旦调用结束它就会返回.如果service调用成功,call()函数会返回真并且srv.response的值会有效;如果调用没有成功,call()函数会返回错误并且srv.response的值会无效.

 

 

1.3编译源码

再一次编辑在~/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)cd

 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空间目录中,默认是~/catkin_ws/devel/lib/share/<package name>.你可以直接调用它们或者使用rosrun去调用它们.它们不在'<prefix>/bin' 中因为这样当你安装你的package到你的系统时会破坏PATH.如果你希望你的可执行文件在PATH的安装时间,你可以建立一个目标,查看:catkin/CMakeLists.txt

 

CMakeLists.txt文件的更多详细的描叙查看catkin/CMakeLists.txt

 

现在运行catkin_make:

# In your catkin workspace

cd ~/catkin_ws

catkin_make

如果编译错误可能是下面的原因:

确认你已经遵循了之前的教程creating the AddTwoInts.srv的指示.


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 社保卡电话错误怎么办 没住过酒店怎么办 上海合规网约车证件怎么办 取票没有身份证怎么办 买车票没有身份证怎么办 登机身份证丢了怎么办 飞机没带身份证怎么办 上飞机没带身份证怎么办 机场没带身份证怎么办 儿童坐飞机没有户口本怎么办 不需要行李托运化妆品怎么办 坐飞机被限制了怎么办 坐飞机没买保险怎么办 飞机起飞时难受怎么办 婴儿坐飞机没座位怎么办 转机行李不直达怎么办 儿童自己坐飞机怎么办手续 两岁宝宝发烧怎么办 网上购票待核验怎么办 老人坐飞机找不到登机口怎么办 儿童不能值机怎么办 飞机上旅客刁难怎么办 飞机上婴儿哭闹怎么办 飞机上婴儿啼哭怎么办 飞机儿童陪护手续怎么办 孕妇感冒鼻子堵怎么办 孕妇用了眼药水怎么办 孕妇用眼药水了怎么办 错过了登机时间怎么办 过了登机时间怎么办 孩子不喜欢做作业怎么办 宝宝腿不一样粗怎么办 一个小腿肿了怎么办 左右小腿不一样粗怎么办 小孩不敢自己睡怎么办 小孩不一个人睡怎么办 晚上一个人睡觉害怕怎么办 孩子自己睡害怕怎么办 小孩晚上睡觉怕怎么办 小孩分房睡害怕怎么办 坐飞机不认识字怎么办