<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 4.1 Service ## 4.1.1 Service 上一章我們介紹了ROS的通信方式中的topic\(主題\)通信,我們知道topic是ROS中的一種單向的異步通信方式。然而有些時候單向的通信滿足不了通信要求,比如當一些節點只是臨時而非周期性的需要某些數據,如果用topic通信方式時就會消耗大量不必要的系統資源,造成系統的低效率高功耗。 這種情況下,就需要有另外一種請求-查詢式的通信模型。這節我們來介紹ROS通信中的另一種通信方式——service\(服務\)。 ## 4.1.2 工作原理 ### 簡介 為了解決以上問題,service方式在通信模型上與topic做了區別。Service通信是雙向的,它不僅可以發送消息,同時還會有反饋。所以service包括兩部分,一部分是請求方(Clinet),另一部分是應答方/服務提供方(Server)。這時請求方(Client)就會發送一個request,要等待server處理,反饋回一個reply,這樣通過類似“請求-應答”的機制完成整個服務通信。 這種通信方式的示意圖如下: Node B是server(應答方),提供了一個服務的接口,叫做`/Service`,我們一般都會用string類型來指定service的名稱,類似于topic。Node A向Node B發起了請求,經過處理后得到了反饋。 ![](https://img.kancloud.cn/c2/ed/c2ed52513cb16183a8a933f69488ce75_1026x206.png) ### 過程 Service是同步通信方式,所謂同步就是說,此時Node A發布請求后會在原地等待reply,直到Node B處理完了請求并且完成了reply,Node A才會繼續執行。Node A等待過程中,是處于阻塞狀態的成通信。這樣的通信模型沒有頻繁的消息傳遞,沒有沖突與高系統資源的占用,只有接受請求才執行服務,簡單而且高效。 ## 4.1.3 topic VS service 我們對比一下這兩種最常用的通信方式,加深我們對兩者的理解和認識,具體見下表: | 名稱 | Topic | Service | | :---: | :---: | :---: | | 通信方式 | 異步通信 | 同步通信 | | 實現原理 | TCP/IP | TCP/IP | | 通信模型 | Publish-Subscribe | Request-Reply | | 映射關系 | Publish-Subscribe\(多對多\) | Request-Reply(多對一) | | 特點 | 接受者收到數據會回調(Callback) | 遠程過程調用(RPC)服務器端的服務 | | 應用場景 | 連續、高頻的數據發布 | 偶爾使用的功能/具體的任務 | | 舉例 | 激光雷達、里程計發布數據 | 開關傳感器、拍照、逆解計算 | **注意:**遠程過程調用\(Remote Procedure Call,RPC\),可以簡單通俗的理解為在一個進程里調用另一個進程的函數。 ## 4.1.4 操作命令 在實際應用中,service通信方式的命令時`rosservice`,具體的命令參數如下表: | rosservice 命令 | 作用 | | :---: | :---: | | `rosservice list` | 顯示服務列表 | | `rosservice info` | 打印服務信息 | | `rosservice type` | 打印服務類型 | | `rosservice uri` | 打印服務ROSRPC uri | | `rosservice find` | 按服務類型查找服務 | | `rosservice call` | 使用所提供的args調用服務 | | `rosservice args` | 打印服務參數 | ## 4.1.5 測試實例 1. 首先依然是打開我們教材的模擬場景`roslaunch robot_sim_demo robot_spawn.launch`。 2. 輸入`rosservice list`,查看當前運行的服務。 3. 隨機選擇`/gazebo/delete_light`服務,觀察名稱,是刪除光源的操作。 4. 輸入`rosservice info /gazebo/delete_light`查看屬性信息。可以看到信息,Node:/gazebo,Type:gazebo\_msgs/DeleteLight, Args:Light\_name。這里的類型type也就是下文介紹的srv,傳遞參數Light\_name 5. 輸入`rosservice call /gazebo/delete_light sun`,這里的sun 是參數名,使我們模擬場景中的唯一光源太陽。操作完成后可以看到場景中的光線消失。 6. 可以看到終端的回傳信息:success: True和sun successfully deleted。這就是雙向通信的信息反饋,通知操作已經成功完成。 ## 小結 本節我們詳細介紹了service通信方式,建議與topic通信方式進行對比記憶,這樣我們能更深的理解這兩種通信方式,也能在以后的學習工作中更加合理使用每個通信方式,獲得更高的效率。
                  <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>

                              哎呀哎呀视频在线观看