淺談ROS消息與服務——搭建簡單的服務端和客戶端

  1. 首先自定義消息和服務類型 本文創建一個用於接收兩整型數據並返回其和,消息和服務的方法可以看這個文章,個人建議使用RobWare Stduio環境,學習ros開發神器。https://www.cnblogs.com/cv-pr/p/4838177.html

  2. 客戶端程序,本人學習時疑惑的地方已經加了備註,如理解有誤請見諒

    #include "ros/ros.h"
    #include "test/srv1.h"
    #include <cstdlib>
    
    //在運行時要傳入參數 argc長度  argv數據  
    //傳入格式:(add_two_ints_clients X  Y)
    // **argv表示3個數據的地址(二維數據)
    //以本程序爲例 (**argv)這片空間的地址 (二維)
    //-----------------------------
    // 地址  |add_two_ints_clients
    //-----------------------------
    // 地址  |X
    //-----------------------------
    // 地址  |Y
    //-----------------------------
    
    int main(int argc, char **argv)
    {
        ros::init(argc, argv, "add_two_ints_client");
        //要求輸入的參數是  節點node  x   y
        //如果輸入格式不對,向終端打印輸入數據格式,提醒用戶重新輸入
        //  usage: add_two_ints_clients X  Y
        if(argc != 3)
        {
            ROS_INFO("usage: add_two_ints_clients X  Y");
            return 1;
        }
    
        ros::NodeHandle n;
        //創建一個服務,數據類型爲<test::srv1> 
        //服務名稱爲"add_two_ints"
        //服務是單對單,想使用服務必須使用它的名字,和遵守數據格式
        ros::ServiceClient client = n.serviceClient<test::srv1>("add_two_ints");
        //創建一個服務的對象
        test::srv1 srv;
        srv.request.a = atoll(argv[1]);
        srv.request.b = atoll(argv[2]);
        //在這裏等待服務完成
        //完成之後一般返回結果
        //如在srv中定義的  sum
        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+3  ,運行該節點是輸入:rosrun test add_two_ints_client 1 3。        我在剛開始的時候一直不懂  int main(int argc, char **argv)傳入的參數int argc和char **argv是什麼,其實這裏傳入的就是節點運行需要的參數,add_two_ints_client 1 3,其中argc= 3 ,表示有3個參數,分別爲節點名稱,x和y;而char **argv就是地址。                                                                                      若一個節點的運行不需要而外參數,如發佈一個話題的節點,這是argc就爲1了,而argv就是節點的運行地址

  3. 服務端程序,本人學習時疑惑的地方已經加了備註,如理解有誤請見諒

    #include "ros/ros.h"
    #include "test/srv1.h"
    
    //服務的過程中雖然看回調函數定義了兩個test::srv1  int32 a  int32 b   |    int32 sum
    //但是實際上,在一次服務過程中,只用了一次數據
    //請求服務是發送 a 和 b  結束是返回 sum
    
    bool add(test::srv1::Request &req, test::srv1::Response &res)
    {
        res.sum = req.a + req.b;
        ROS_INFO("request: x = %1d, y = %1d", req.a, req.b);
        ROS_INFO("sending back response: [%1d]", res.sum);
        return 1;
    }
    
    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+3的值返回給客戶端,一切都是自動完成的。

  4. 測試                                                                                                                          運行roscore   
    運行服務端  rosrun test add_two_int_server
    運行客戶端  rosrun test add_two_ints_client 1 3
    一切正常的話就可以看到 1+3 = 4的結果了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章