亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

基于ROS 服務通信模式詳解

2020-01-26 13:21:46
字體:
來源:轉載
供稿:網友

ROS 服務通信模式

摘自《ROS機器人開發實踐》

服務(services)是節點之間通訊的另一種方式。服務允許節點發送請求(request) 并獲得一個響應(response)

AddTwoInts.h文件是根據AddTwoInts.srv文件生成的

還會自動生成

AddTwoIntsRequest.h

AddTwoIntsResponse.h

AddTwoInts.h所在的目錄是

/catkin_ws/devel

AddTwoInts.srv

int64 aint64 b---int64 sum

server.cpp

/** * AddTwoInts Server */#include "ros/ros.h"#include "learning_communication/AddTwoInts.h"http:// service回調函數,輸入參數req,輸出參數resbool add(learning_communication::AddTwoInts::Request &req,     learning_communication::AddTwoInts::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節點初始化  ros::init(argc, argv, "add_two_ints_server");  // 創建節點句柄  ros::NodeHandle n;  // 創建一個名為add_two_ints的server,注冊回調函數add()  ros::ServiceServer service = n.advertiseService("add_two_ints", add);  // 循環等待回調函數  ROS_INFO("Ready to add two ints.");  ros::spin();  return 0;}

client.cpp

/** * AddTwoInts Client */#include <cstdlib>#include "ros/ros.h"#include "learning_communication/AddTwoInts.h"int main(int argc, char **argv){  // ROS節點初始化  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;  // 創建一個client,請求add_two_int service  // service消息類型是learning_communication::AddTwoInts  ros::ServiceClient client = n.serviceClient<learning_communication::AddTwoInts>("add_two_ints");  // 創建learning_communication::AddTwoInts類型的service消息  learning_communication::AddTwoInts srv;  srv.request.a = atoll(argv[1]);  srv.request.b = atoll(argv[2]);  // 發布service請求,等待加法運算的應答結果  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;}

CMakeLists.txt

add_executable(server src/server.cpp)target_link_libraries(server ${catkin_LIBRARIES})add_dependencies(server ${PROJECT_NAME}_gencpp)add_executable(client src/client.cpp)target_link_libraries(client ${catkin_LIBRARIES})add_dependencies(client ${PROJECT_NAME}_gencpp)

package.xml

<?xml version="1.0"?><package> <name>learning_communication</name> <version>0.0.0</version> <description>The learning_communication package</description> <maintainer email="hcx@todo.todo">hcx</maintainer> <license>TODO</license> <buildtool_depend>catkin</buildtool_depend> <build_depend>geometry_msgs</build_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> <run_depend>geometry_msgs</run_depend> <run_depend>roscpp</run_depend> <run_depend>rospy</run_depend> <run_depend>std_msgs</run_depend> <build_depend>message_generation</build_depend> <run_depend>message_runtime</run_depend> <!-- The export tag contains other, unspecified, tags --> <export>  <!-- Other tools can request additional information be placed here --> </export></package>

文件夾的主要功能

1)config:放置功能包中的配置文件,由用戶創建,文件名可以不同。2)include:放置功能包中需要用到的頭文件。3)scripts:放置可以直接運行的Python腳本。4)src:放置需要編譯的C++代碼。5)launch:放置功能包中的所有啟動文件。6)msg:放置功能包自定義的消息類型。7)srv:放置功能包自定義的服務類型。8)action:放置功能包自定義的動作指令。9)CMakeLists.txt:編譯器編譯功能包的規則。

如何自定義服務數據

與話題消息類似,ROS中的服務數據可以通過srv文件進行語言無關的接口定義,一般放置在功能包根目錄下的srv文件夾中。該文件包含請求與應答兩個數據域,數據域中的內容與話題消息的數據類型相同,只是在請求與應答的描述之間,需要使用“―”三個橫線進行分割。

針對加法運算例程中的服務需求,創建一個定義服務數據類型的srv文件learning_communication/srv/AddTwoInts.sint64 a

int64 b

int64 sumv文件的內容較為簡單,在服務請求的數據域中定義了兩個int64類型的變量a和b,用來存儲兩個加數; 又在服務應答的數據域中定義了一個int64類型的變量sum,用來存儲“a+b”的結果。

完成服務數據類型的描述后,與話題消息一樣,還需要在功能包的package.xml和CMakeLists.txt文件中配置依賴與編譯規則,在編譯過程中將該描述文件轉換成編程語言所能識別的代碼。

打開package.xml文件,添加以下依賴配置

message_generation message_runtime

打開CMakeLists.txt文件,添加如下配置

find_package(catkin REQUIRED COMPONENTS geometry_msgs roscpp rospy std_msgs message_generation )add_service_files( FILES AddTwoInts.srv ) 

message_generation包不僅可以針對話題消息產生相應的代碼,還可以根據服務消息的類型描述文件產生相關的代碼。 功能包編譯成功后,在服務的Server節點和Client節點的代碼實現中就可以直接調用這些定義好的服務消息了。 接下來我們就編寫Server和Client節點的代碼,完成兩數相加求和的服務過程。

代碼解釋

Server節點實現過程

1. 頭文件

#include "learning-communication/AddTwoInts.h"

使用ROS中的服務,必須包含服務數據類型的頭文件,這里使用的頭文件是learning_communication/AddTwoInts.h,該頭文件根據我們之前創建的服務數據類型的描述文件AddTwoInts.srv自動生成。

2.主函ros::ServiceServer service = n.advertiseService(“add_two_ints”, add);部分相對簡單,先初始化節點,創建節點句柄,重點是要創建一個服務的Server,指定服務的名稱以及接收到服務數據后的回調函數。然后開始 循環等待服務請求;一旦有服務請求,Server就跳入回調函數進行處理。

3.回調函數部分

bool add(learning_communication::AddTwoInts::Request &req,learning_communication::AddTwoInts::Response &res)

回調函數是真正實現服務功能的部分,也是設計的重點。add()函數用于完成兩個變量相加的功能,其傳入參數便是我們在服務數據類型描述文件中聲明的請求與應答的數據結構。

{ 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);ROS_INFO("sending back response: [%ld]", (long int)res.sum);return true;}

在完成加法運算后,求和結果會放到應答數據中,反饋到Client,回調函數返回true。

服務中的Server實現流程如下:

?初始化ROS節點。

?創建Server實例。

?循環等待服務請求,進入回調函數。

?在回調函數中完成服務功能的處理并反饋應答數據。

Client節點的實現過程。

1.創建Client

 ros::ServiceClient client = n.serviceClient<learning_communication::AddTwoInts> ("add_two_ints");

首先需要創建一個add_two_ints的Client實例,指定服務類型為learning_communication:AddTwoInts。

2.發布服務請求

learning_communication::AddTwoInts srv;srv.request.a = atoll(argv[1]);srv.request.b = atoll(argv[2]);

然后實例化一個服務數據類型的變量,該變量包含兩個成員:request和response。將節點運行時輸入的兩個參數作為需要相加的兩個整型數存儲到變量中。

if (client.call(srv))

接著進行服務調用。該調用過程會發生阻塞,調用成功后返回true,訪問srv.reponse即可獲取服務請求的結果。如果調用失敗會返回false,srv.reponse則不可使用。

服務中的Client實現流程如下:

?初始化ROS節點。

?創建一個Client實例。

?發布服務請求數據。

?等待Server處理之后的應答結果。

編譯功能包

編輯CMakeLists.txt文件,加入如下編譯規則:

add_executable(server src/server.cpp)target_link_libraries(server ${catkin_LIBRARIES})add_dependencies(server ${PROJECT_NAME}_gencpp)add_executable(client src/client.cpp)target_link_libraries(client ${catkin_LIBRARIES})add_dependencies(client ${PROJECT_NAME}_gencpp)

現在就可以使用catkin_make命令編譯功能包了。

運行Server和Client

運行編譯生成的Server和Client節點。

1.啟動roscore

在運行節點之前,首先需要確保ROS Master已經成功啟動:

roscore2.運行Server節點打開終端,使用如下命令運行Server節點:roscore

2.運行Server節點打開終端,使用如下命令運行

Server節點: rosrun learning_communication server

3.運行Client節點

打開一個新的終端,運行Client節點,同時需要輸入加法運算的兩個加數值:

$ rosrun learning_communication client 3 5

Client啟動后發布服務請求,并成功接收到反饋結果

Server接收到服務調用后完成加法求解,并將結果反饋給Client

wiki

rosservice list     輸出可用服務的信息rosservice call     調用帶參數的服務rosservice type     輸出服務類型rosservice find     依據類型尋找服務find services by service typerosservice uri     輸出服務的ROSRPC uri

以上這篇基于ROS 服務通信模式詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
正在播放欧美视频| 亚洲国产欧美久久| 欧美一级大片在线免费观看| 久久久国产在线视频| 美女久久久久久久久久久| 国产日韩av高清| 久久久精品视频在线观看| 久久五月天色综合| 国产精品日韩在线观看| 日韩激情av在线免费观看| 中文字幕日韩欧美| 大伊人狠狠躁夜夜躁av一区| xxx欧美精品| 国产日韩欧美夫妻视频在线观看| 国产精品永久免费在线| 亚洲精品456在线播放狼人| 亚洲天堂影视av| 欧美中文在线视频| 精品国产91乱高清在线观看| 成人网欧美在线视频| 久久中文字幕视频| 91九色蝌蚪国产| 日韩久久精品成人| 亚洲成人性视频| 日韩av一区二区在线观看| 国产精品自产拍在线观| 亚洲视频自拍偷拍| 国产日韩欧美在线| 麻豆国产精品va在线观看不卡| 欧美视频精品一区| 久久69精品久久久久久国产越南| 亚洲mm色国产网站| 亚洲在线免费观看| 久久精品91久久久久久再现| 久久香蕉精品香蕉| 国产午夜精品全部视频播放| 日韩一区二区三区国产| 粉嫩老牛aⅴ一区二区三区| 久久av资源网站| 久久国产加勒比精品无码| 中文字幕视频一区二区在线有码| 98午夜经典影视| 国产精品久久电影观看| 伊人青青综合网站| 精品久久久一区| 欧美电影电视剧在线观看| 亚州欧美日韩中文视频| 麻豆一区二区在线观看| 国产欧美日韩中文字幕| 亚洲国语精品自产拍在线观看| 国语自产精品视频在线看抢先版图片| 亚洲一区免费网站| 久久久精品影院| 91麻豆桃色免费看| 亚洲国产欧美一区| 亚洲视频精品在线| 国产精品旅馆在线| 国产亚洲精品一区二555| 91天堂在线视频| 97婷婷大伊香蕉精品视频| 亚洲国产女人aaa毛片在线| 色中色综合影院手机版在线观看| 欧美日韩亚洲一区二| 欧美激情网站在线观看| 久久综合九色九九| 亚洲网在线观看| 亚洲少妇激情视频| 国产91精品视频在线观看| 久久精品国产欧美亚洲人人爽| 欧美成人中文字幕| 欧美性xxxx极品hd欧美风情| 精品二区三区线观看| 日韩在线一区二区三区免费视频| 亚洲精品大尺度| 九色精品免费永久在线| 国内外成人免费激情在线视频网站| 亚洲人成在线电影| 亚洲欧美国产精品| 国产精品69精品一区二区三区| 国产欧美精品久久久| xxxxx成人.com| 国产精品久久久久久久久久小说| 亚洲另类xxxx| 这里只有精品在线播放| 日本成人在线视频网址| 日韩欧美有码在线| 2021久久精品国产99国产精品| 欧美孕妇与黑人孕交| 欧美亚洲成人网| 亚洲高清在线观看| 国产精品永久免费观看| 懂色av中文一区二区三区天美| 久久影视电视剧免费网站| 色综合视频网站| 国产日产亚洲精品| 欧美激情欧美激情| 成人免费看片视频| 在线免费看av不卡| 日韩视频免费在线观看| 中文字幕亚洲字幕| 欧美国产日产韩国视频| 亚洲精品电影在线观看| 久久亚洲春色中文字幕| 国产精品久久久久久av福利软件| 亚洲欧美中文字幕在线一区| 亚洲香蕉成视频在线观看| 国产精品高清免费在线观看| 日韩成人激情视频| 欧美激情亚洲自拍| 欧美一级成年大片在线观看| 国产中文日韩欧美| 韩日欧美一区二区| 欧美性极品少妇精品网站| 这里只有精品视频在线| 91国产美女在线观看| 欧美成人剧情片在线观看| 精品久久久999| 亚洲成人激情在线观看| 久久精品人人爽| 在线性视频日韩欧美| 欧美精品成人在线| 成人免费xxxxx在线观看| 欧美激情视频一区| 成人激情在线观看| 国产精品一区久久久| 欧美在线视频网站| 亚洲激情视频在线观看| 国产成人综合精品| 亚洲欧美一区二区三区四区| 日韩欧美亚洲成人| 亚洲国产精品小视频| 欧美精品情趣视频| 91人成网站www| 国产精品久久久久久久久免费| 成人性生交xxxxx网站| 国产精品久久久久久久久借妻| 久久久免费精品| 国产综合在线观看视频| 8090成年在线看片午夜| 国产伦精品免费视频| 亚洲中国色老太| 2019中文字幕在线免费观看| 亚洲欧美国产日韩中文字幕| 久久中国妇女中文字幕| 久久久久女教师免费一区| 久久精品视频网站| 亚洲大尺度美女在线| 狠狠躁18三区二区一区| 久久久在线视频| 精品国产欧美一区二区五十路| 久久夜精品香蕉| 国产精品免费久久久久久| 日本精品久久电影| 亚洲精品久久久久久久久| 欧美激情免费在线| 日韩va亚洲va欧洲va国产| 国产日产亚洲精品| 亚洲人成网站色ww在线| 国产精品视频在线播放| 国产一区二区三区日韩欧美| 欧美日韩国产一区二区| 精品久久久久久久久久久久久久| 亚洲欧美另类自拍| 日韩av在线免费播放|