<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 6.4 service in roscpp ## 6.4.1 Service通信 Service是一種請求-反饋的通信機制。請求的一方通常被稱為客戶端,提供服務的一方叫做服務器端。Service機制相比于Topic的不同之處在于: 1. 消息的傳輸是雙向的,有反饋的,而不是單一的流向。 2. 消息往往不會以固定頻率傳輸,不連續,而是在需要時才會向服務器發起請求。 在ROS中如何請求或者提供一個服務,我們來看`service_demo`的代碼:**一個節點發出服務請求(姓名,年齡),另一個節點進行服務響應,答復請求。** ## 6.4.2 創建Greeting服務 創建`service_demo/Greeting.srv`文件,內容包括: ``` string name #短橫線上邊部分是服務請求的數據 int32 age --- #短橫線下面是服務回傳的內容。 string feedback ``` srv格式的文件創建后,也需要修改`CMakeLissts.txt`,在其中加入 ```cmake add_service_files(FILES Greeting.srv) ``` 其余與添加msg的改動一樣。然后進行`catkin_make`,系統就會生成在代碼中可用的Greeting類型。在代碼中使用,只需要`#include <service_demo/Greeting.h>`,然后即可創建該類型的srv。 ```cpp service_demo::Greeting grt; //grt分為grt.request和grt.response兩部分 grt.request.name = "HAN"; //不能用grt.name或者grt.age來訪問 grt.request.age = "20"; ... ``` 新生成的Greeting類型的服務,其結構體的風格更為明顯,可以這么理解,一個Greeting服務結構體中嵌套了兩個結構體,分別是請求和響應: ```cpp struct Greeting { struct Request { string name; int age; }request; struct Response { string feedback; }response; } ``` ## 6.4.3 創建提供服務節點(server) `service_demo/srv/server.cpp`內容如下: ```cpp #include <ros/ros.h> #include <service_demo/Greeting.h> bool handle_function(service_demo::Greeting::Request &req, service_demo::Greeting::Response &res){ //顯示請求信息 ROS_INFO(“Request from %s with age %d”, req.name.c_str(), req.age); //處理請求,結果寫入response res.feedback = “Hi ” + req.name + “. I’m server!”; //返回true,正確處理了請求 return true; } int main(int argc, char** argv){ ros::init(argc, argv, “greetings_server”); //解析參數,命名節點 ros::NodeHandle nh; //創建句柄,實例化node ros::ServiceServer service = nh.advertiseService(“greetings”, handle_function); //寫明服務的處理函數 ros::spin(); return 0; } ``` 在以上代碼中,服務的處理操作都寫在`handle_function()`中,它的輸入參數就是Greeting的Request和Response兩部分,而非整個Greeting對象。通常在處理函數中,我們對Requst數據進行需要的操作,將結果寫入到Response中。在roscpp中,處理函數返回值是bool型,也就是服務是否成功執行。不要理解成輸入Request,返回Response,在rospy中是這樣的。 ## 6.4.4 創建服務請求節點(client) `service_demo/srv/client.cpp`內容如下: ```cpp # include "ros/ros.h" # include "service_demo/Greeting.h" int main(int argc, char **argv) { ros::init(argc, argv, "greetings_client");// 初始化,節點命名為"greetings_client" ros::NodeHandle nh; ros::ServiceClient client = nh.serviceClient<service_demo::Greeting>("greetings"); // 定義service客戶端,service名字為“greetings”,service類型為Service_demo // 實例化srv,設置其request消息的內容,這里request包含兩個變量,name和age,見Greeting.srv service_demo::Greeting srv; srv.request.name = "HAN"; srv.request.age = 20; if (client.call(srv)) { // 注意我們的response部分中的內容只包含一個變量response,另,注意將其轉變成字符串 ROS_INFO("Response from server: %s", srv.response.feedback.c_str()); } else { ROS_ERROR("Failed to call service Service_demo"); return 1; } return 0; } ``` 以上代碼比較關鍵的地方有兩處,一個是建立一個ServiceClient,另一個是開始調用服務。建立client需要用`nh.serviceClient<service_demo::Greeting>("greetings")`,指明服務的類型和服務的名稱。而調用時可以直接用`client.call(srv)`,返回結果不是response,而是是否成功調用遠程服務。 `CMakeLists.txt`和`pacakge.xml`修改方法和`topic_demo`修改方法類似,不再贅述。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看