zoukankan      html  css  js  c++  java
  • ROS教程4 ROS自定义srv类型及使用

    创建srv文件

    在上一节单独为自定义的消息和服务的包 test_msgs 里面

    创建 srv文件夹

    进入创建 testsrv.srv 文件 ,内容为;

    (srv文件和msg文件类似,唯一不同的是它包含两个部分——request和response。两部分用---分隔:)

    int64 A
    int64 B
    ---
    int64 Sum
    

      (1)打开 test_msgs 包里的 package.xml文件,确保里面存在这两行且去掉它们的注释:(上节已做过)

    <build_depend>message_generation</build_depend>
    <run_depend>message_runtime</run_depend>
    

      (2)打开包目录下的CMakeLists.txt文件,在find_message调用中添加message_generation依赖,让你可以生成ROS信息。(上节已经做过)

    find_package(catkin REQUIRED COMPONENTS
       roscpp
       rospy
       std_msgs
       message_generation
    )  

    (3) 添加srv文件

    去掉注释且修改为:

    add_service_files(
      FILES
      testsrv.srv
    )
    

    (4)然后是generate_messages,指定生成消息文件时的依赖项,比如上面嵌套了其他消息类型geometry_msgs,那么必须注明

    #generate_messages必须在catkin_package前面
    generate_messages(
     DEPENDENCIES
     geometry_msgs
    ) 
    

      

     

    (4)然后是catkin_package设置运行依赖

    catkin_package(
     
    CATKIN_DEPENDS message_runtime
     
    )
    

      

      

    编译

    回到test_msgs文件夹下

    catkin_make
    

      

    查看是否成功

    rossrv show test_msgs/testsrv
    

      

    使用自定义的srv  (testsrv.srv)

    要使用自定义的消息类型必须source自定义消息所在的工作空间,否则rosmsg show test_msgs/testsrvrostopic echo /test_msg(/test_msg是节点中使用自定义消息类型test_msgs/Test的topic)都会报错,因为没有source的情况下自定义消息类型是不可见的,被认为是未定义类型

    1 调用自定义srv类型

    (1)如果是在test_msgs包内的节点中调用test_msgs/testsrv类型,只需要在.cpp文件中如下调用即可

    #include <test_msgs/testsrv.h>
    
    test_msgs::testsrv mysrv;
    

      

    ( 2 ) 如果是在其他包调用test_msgs/testsrv类型则需要修改package.xml和CMakeLists.txt,

    比如同样在工作空间catkin_arduino_ros内有一个名为test1_pub_sub包,在它的src文件夹下,有两个节点add_two_ints_client和add_two_ints_server,

    调用test_msgs包下面的srv文件夹中的自定义的srv类型testsrv.srv,完成一个请求加法的服务。

    add_two_ints_client.cpp

    #include "ros/ros.h"
    #include <test_msgs/testsrv.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<test_msgs::testsrv>("add_two_ints");
      test_msgs::testsrv 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;
    }
    

      add_two_ints_server.cpp

    #include "ros/ros.h"
    #include <test_msgs/testsrv.h>
    
    bool add(test_msgs::testsrv::Request  &req,
             test_msgs::testsrv::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 头文件调用

    #include <test_msgs/testsrv.h>

    2 实例化自定义srv

    test_msgs::testsrv srv; (根据创建的包名test_msgs和文件名testsrv)

    3 srv 分两部分

    请求部分

    test_msgs::testsrv::Request &req

     req.a
     req.a 

    响应部分
    test_msgs::testsrv::Response &res
      res.sum

    2为编译添加依赖项

    修改调用包test1_pub_sub的编译文件,来调用包test_msgs里面的自定义服务 testsrv.srv

    (1)修改package.xml  (创建msg时已经添加)

    <build_depend>roscpp</build_depend>
    <run_depend>roscpp</run_depend>
    
    <build_depend>test_msgs</build_depend>
    <run_depend>test_msgs</run_depend>
    

      

    (2)修改CMakeLists.txt :

    1 find_package中需要声明查找包含该消息类型的包test_msgs; 

    find_package(catkin REQUIRED COMPONENTS
      roscpp
      rospy
      std_msgs
      geometry_msgs  //  上节自定义的msg中使用 跟srv没关系
      test_msgs      // 使用自定义testsrv.srv 重点调用
     # message_generation
    )
    

    2 add_dependencies要注明该消息的依赖 [包名]_gencpp (test_msgs_gencpp)其他地方和普通节点一样

    add_dependencies(add_two_ints_server test_msgs_gencpp)

    add_dependencies(add_two_ints_client test_msgs_gencpp)

      

    如果缺少add_dependencies中对test_msgs_gencpp的依赖声明,在编译的时候如果先编译test包再编译test_msgs包则会出现如下报错(ROS工作空间各个软件包的编译顺序是随机的),因为头文件test_msgs/Test.h还未生成

    测试

    roscore
    

      

  • 相关阅读:
    服务器 空间
    android 手动打包
    sql server 2000 完全卸载 2
    apk 优化
    asp.net 画 数据图表
    java 运行 bat win linux
    vb 生成 批处理
    国内平台
    委托
    observer 观察者模式
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/7405947.html
Copyright © 2011-2022 走看看