Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9396091
  • 博文数量: 1747
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20060
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1747)

文章存档

2024年(23)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: 其他平台

2019-01-07 15:18:44

一般情况下,建议将消息文件msg和服务文件srv制作成一个只包含消息文件的单独的包,而不是将其包含在可执行节点中的目录中.

点击(此处)折叠或打开


  1. //功能包构建
  2.     cd ~/catkin_ws/src
  3.     catkin_create_pkg ros_tutorials_service message_generation std_msgs roscpp
  4.     #此时存在了 ros_tutorials_service/{include,src,package.xml,CMakeLists.txt}
  5. //创建服务文件
  6.     cd ros_tutorials_service
  7.     mkdir src msg action
  8.     #CMakeLists.txt添加
  9.     add_service_files(FILES SrvTutorial.srv) 内容如下        
  1. int64 a
  2. int64 b
  3. ---
  4. int64 result
    //创建服务服务器节点
    #CMakeLists.txt文件中添加
        add_executable(service_server src/service_server.cpp)
        同时添加源码内容

  1. #include "ros/ros.h" // ROS的基本头文件
  2. #include "ros_tutorials_service/SrvTutorial.h" // SrvTutorial服务头文件(构建后自动生成)
  3. // 如果有服务请求,将执行以下处理
  4. // 将服务请求设置为req,服务响应则设置为res。
  5. bool calculation(ros_tutorials_service::SrvTutorial::Request &req,
  6. ros_tutorials_service::SrvTutorial::Response &res)
  7. {
  8.     // 在收到服务请求时,将a和b的和保存在服务响应值中
  9.     res.result = req.a + req.b;
  10.     // 显示服务请求中用到的a和b的值以及服务响应result值
  11.     ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
  12.     ROS_INFO("sending back response: %ld", (long int)res.result);
  13.     return true;
  14. }
  15. int main(int argc, char **argv) // 节点主函数
  16. {
  17.     ros::init(argc, argv, "service_server"); // 初始化节点名称
  18.     ros::NodeHandle nh; // 声明节点句柄
  19.     // 声明服务服务器
  20.     // 声明利用ros_tutorials_service功能包的SrvTutorial服务文件的
  21.     // 服务服务器ros_tutorials_service_server
  22.     // 服务名称是ros_tutorial_srv,且当有服务请求时,执行calculation函数。
  23.     ros::ServiceServer ros_tutorials_service_server = nh.advertiseService("ros_tutorial_srv"calculation);
  24.     ROS_INFO("ready srv server!");
  25.     ros::spin(); // 等待服务请求
  26.     return 0;
  27. }
// 创建服务客户端节点
    #CMakeLists.txt文件中添加
    add_executable(service_client src/service_client.cpp), 源码内容
  1. #include "ros/ros.h" // ROS的基本头文件
  2. #include "ros_tutorials_service/SrvTutorial.h" // SrvTutorial服务头文件(构建后自动生成)
  3. #include <cstdlib> // 使用atoll函数所需的库
  4. int main(int argc, char **argv) // 节点主函数
  5. {
  6.     ros::init(argc, argv, "service_client"); // 初始化节点名称
  7.     if (argc != 3) // 处理输入值错误
  8.     {
  9.         ROS_INFO("cmd : rosrun ros_tutorials_service service_client arg0 arg1");
  10.         ROS_INFO("arg0: double number, arg1: double number");
  11.         return 1;
  12.     }
  13.     ros::NodeHandle nh; // 声明与ROS系统通信的节点句柄
  14.     // 声明客户端,声明利用ros_tutorials_service功能包的SrvTutorial服务文件的
  15.     // 服务客户端ros_tutorials_service_client。
  16.     // 服务名称是"ros_tutorial_srv"
  17.     ros::ServiceClient ros_tutorials_service_client =
  18.     nh.serviceClient<ros_tutorials_service::SrvTutorial>("ros_tutorial_srv");
  19.     // 声明一个使用SrvTutorial服务文件的叫做srv的服务
  20.     ros_tutorials_service::SrvTutorial srv;
  21.     // 在执行服务客户端节点时用作输入的参数分别保存在a和b中
  22.     srv.request.a = atoll(argv[1]);
  23.     srv.request.b = atoll(argv[2]);
  24.     // 请求服务,如果请求被接受,则显示响应值
  25.     if (ros_tutorials_service_client.call(srv))
  26.     {
  27.         ROS_INFO("send srv, srv.Request.a and b: %ld, %ld", (long int)srv.request.a, (long int)srv.request.b);
  28.         ROS_INFO("receive srv, srv.Response.result: %ld", (long int)srv.response.result);
  29.     }
  30.     else
  31.     {
  32.         ROS_ERROR("Failed to call service ros_tutorial_srv");
  33.         return 1;
  34.     }
  35.     return 0;
  36. }
// 构建节点
    cd ~/catkin_ws && catkin_make → 转到catkin目录并运行catkin构建

//运行
    roscore
    rosrun ros_tutorials_service service_server
    rosrun ros_tutorials_service service_client 2 3
    或者
    rosservice call /ros_tutorial_srv 10 2
    GUI中的ServiceCaller调用方法. rqt程序的菜单中选择[插件[Plugins]→[Service]→[Service Caller]
, 在UI中设置request内容, 点击Call, 则Response的部分会显示出啦



阅读(1251) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~