-
首先自定義消息和服務類型 本文創建一個用於接收兩整型數據並返回其和,消息和服務的方法可以看這個文章,個人建議使用RobWare Stduio環境,學習ros開發神器。https://www.cnblogs.com/cv-pr/p/4838177.html
-
客戶端程序,本人學習時疑惑的地方已經加了備註,如理解有誤請見諒
#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就是節點的運行地址
-
服務端程序,本人學習時疑惑的地方已經加了備註,如理解有誤請見諒
#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的值返回給客戶端,一切都是自動完成的。
-
測試 運行roscore
運行服務端 rosrun test add_two_int_server
運行客戶端 rosrun test add_two_ints_client 1 3
一切正常的話就可以看到 1+3 = 4的結果了。
淺談ROS消息與服務——搭建簡單的服務端和客戶端
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.