如何編寫ros服務節點

2021-09-19 17:17:31 字數 3721 閱讀 2057

**此教程之前,請確保您已經按照ros編寫srv教程編寫了srv檔案

首先,我們設定並開啟相應的路徑,使用指令:

. ~/catkin_ws/devel/setup.bash   

roscd beginner_tutorials

然後建立檔案,指令:

gedit src/add_two_ints_server.cpp
將以下**塊複製貼上進入即可

#include "ros/ros.h"

#include "beginner_tutorials/addtwoints.h"

bool add(beginner_tutorials::addtwoints::request &req,

beginner_tutorials::addtwoints::response &res)

int main(int argc, char **ar**)

現在,讓我們來解釋一下各行**的作用:

#include "ros/ros.h"

#include "beginner_tutorials/addtwoints.h"

beginner_tutorials / addtwoints.h是從我們之前建立的srv檔案生成的標頭檔案。

bool add(beginner_tutorials::addtwoints::request  &req,

beginner_tutorials::addtwoints::response &res)

此函式提供新增兩個int的服務,它接受srv檔案中定義的請求和響應型別並返回乙個布林值。

這裡新增了兩個整數並儲存在響應中。然後記錄有關請求和響應的一些資訊。最後,服務在完成後返回true。

ros::serviceserver service = n.advertiseservice("add_two_ints", add);
這裡的服務是通過ros建立和宣傳(advertise)的。

在beginner_tutorials包中建立src/add_two_ints_client.cpp檔案,指令:

cd src

gedit add_two_ints_client.cpp

向檔案寫入以下**:

#include "ros/ros.h"

#include "beginner_tutorials/addtwoints.h"

#include int main(int argc, char **ar**)

ros::nodehandle n;

ros::serviceclient client = n.serviceclient("add_two_ints");

beginner_tutorials::addtwoints srv;

srv.request.a = atoll(ar**[1]);

srv.request.b = atoll(ar**[2]);

if (client.call(srv))

else

return 0;

}

現在,讓我們解釋一下各行**:

ros::serviceclient client = n.serviceclient("add_two_ints");
這將為add_two_ints服務建立乙個客戶端。該ros :: serviceclient物件用於以後呼叫服務。

beginner_tutorials::addtwoints srv;

srv.request.a = atoll(ar**[1]);

srv.request.b = atoll(ar**[2]);

這裡我們例項化乙個自動生成的服務類,並將值分配給它的request成員。服務類包含兩個成員,即requestresponse。它還包含兩個類定義,request和response。

if (client.call(srv))
這實際上是呼叫服務。由於服務呼叫是阻塞的,因此一旦呼叫完成,它將返回。如果服務呼叫成功,則call()將返回true,並且srv.response中的值將有效。如果呼叫未成功,則call()將返回false,並且srv.response中的值將無效。

roscd beginner_tutorials

gedit cmakelists.txt

在最後面加上以下**:

add_executable(add_two_ints_server src/add_two_ints_server.cpp)

target_link_libraries(add_two_ints_server $)

add_dependencies(add_two_ints_server beginner_tutorials_gencpp)

add_executable(add_two_ints_client src/add_two_ints_client.cpp)

target_link_libraries(add_two_ints_client $)

add_dependencies(add_two_ints_client beginner_tutorials_gencpp)

這將建立兩個可執行檔案add_two_ints_server和add_two_ints_client,預設情況下將進入devel空間的包目錄,預設位於〜/catkin_ws/devel/lib/。您可以直接呼叫可執行檔案,也可以使用rosrun來呼叫它們。它們不會放在』/ bin』中,因為在將軟體包安裝到系統時會汙染path。

現在執行catkin_make:

cd ~/catkin_ws

catkin_make

接下來讓我們檢驗一下自己的勞動成果,首先執行ros核心:

roscore
然後開啟新的終端,執行node:

rosrun beginner_tutorials add_two_ints_server
你應該會看到ready to add two ints.

如果你的rosrun找不到beginner_tutorials

試著輸入指令

. ~/devel/setup.bash
然後再重複上面的命令。

接下來開啟新的終端,執行客戶端,指令:

rosrun beginner_tutorials add_two_ints_client 1 3
你將會看到

[ info] [1556180034.901625414]: sum: 4

[ info] [1556180034.901459798]: request: x=1, y=3 [ info]

[1556180034.901491998]: sending back response: [4]

ROS 編寫節點訂閱雷射雷達scan話題

編寫雷射雷達訂閱節點 接上節的gazebo雷射雷達外掛程式,編寫節點訂閱 scan話題,方便後期資料處理,節點 如下,主要是標頭檔案和訊息型別引數定義 include ros ros.h include include include hao qi void lasercallback const ...

ROS建立節點

首先是自己第一次接觸ros遇到了好多的坑就想讓大家避免入坑,還有就是普及正確的東西首先我要抨擊一下這篇文章,讓許多人走了彎路浪費了大家的時間,對待發部落格一點都不嚴謹錯誤太多以下是位址按照我的做你會發現其實錯誤很簡單。很簡單就是幾條linux命令 mkdir p catkin ws src cd c...

如何編寫Windows服務

按微軟的定義,服務是乙個長時間執行的可執行檔案,它不支援使用者介面,並執行在特殊的使用者賬戶之下,也可以在沒有任何使用者登入計算機的情況下執行。預設情況下,服務執行在system賬戶之下。與一般的應用程式相比,服務自動執行的,並且無需與使用者互動。在.net framework中,與windows服...