ROS學(xué)習(xí)--8.寫一個服務(wù)與客服端

1.寫一個服務(wù)節(jié)點

  1. 移動到我們之前創(chuàng)建的beginner_tutorials包中去:
roscd beginner_tutorials
  • 在beginner_tutorials包中創(chuàng)建src / add_two_ints_server.cpp文件,并將以下內(nèi)容粘貼到其中:
#include "ros/ros.h"

//beginner_tutorials / AddTwoInts.h是從我們先前創(chuàng)建的srv文件生成的頭文件难捌。
#include "beginer_tutorials/AddTwoInts.h"
#include "cstdlib"

//此函數(shù)提供用于添加兩個int的服務(wù),它接受srv文件中定義的請求和響應(yīng)類型,并返回一個布爾值。
bool add(beginer_tutorials::AddTwoInts::Request &req, beginer_tutorials::AddTwoInts::Response &res)
{
    res.sum = req.a + req.b;
    ROS_INFO("request x = %ld, y = %ld", (long)req.a, (long)req.b);
    ROS_INFO("sending back response: [%ld]", (long)res.sum);
    return true;
}

int main(int argc, char** argv)
{
    ros::init(argc, argv, "add_two_ints_server");
    ros::NodeHandle node_handle;
    
//    在這里睡蟋,兩個int被添加并存儲在響應(yīng)中。然后記錄有關(guān)請求和響應(yīng)的一些信息。最后证杭,服務(wù)完成后將返回true。
    ros::ServiceServer service = node_handle.advertiseService("add_two_ints", add);

    ROS_INFO("Ready to add two ints!");

    ros::spin();

    return 0;
}

經(jīng)過前一章的介紹, 現(xiàn)在的代碼看起來就簡單多了

2.寫一個客服端節(jié)點

  • 在beginner_tutorials包中創(chuàng)建src / add_two_ints_client.cpp文件妒御,并將以下內(nèi)容粘貼到其中:
#include "ros/ros.h"
#include "beginer_tutorials/AddTwoInts.h"
#include "cstdlib"

int main(int argc, char** argv)
{
    ros::init(argc, argv, "add_two_ints_client");

//  判斷從命令行輸入的參數(shù)數(shù)量是否正確 
    if(argc != 3)
    {
        ROS_INFO("usage: add_two_ints_client X Y");
        return 1;
    }

    ros::NodeHandle node_handle;

//    這將為add_two_ints服務(wù)創(chuàng)建一個客戶端。 ros :: ServiceClient對象用于稍后調(diào)用服務(wù)镇饺。
    ros::ServiceClient client = node_handle.serviceClient<beginer_tutorials::AddTwoInts>("add_two_ints");

//    在這里乎莉,我們實例化一個自動生成的服務(wù)類,并為其請求成員分配值奸笤。服務(wù)類包含兩個成員惋啃,
//    即請求和響應(yīng)。它還包含兩個類定義:Request和Response监右。
    beginer_tutorials::AddTwoInts srv;
    
 //  將命令行讀取的參數(shù)傳入srv中
    srv.request.a = atoll(argv[1]);
    srv.request.b = atoll(argv[2]);

//    這實際上稱為服務(wù)边灭。由于服務(wù)呼叫處于阻塞狀態(tài),因此呼叫完成后將返回健盒。
//    如果服務(wù)調(diào)用成功绒瘦,則call()將返回true,并且srv.response中的值將有效扣癣。
//    如果調(diào)用失敗惰帽,則call()將返回false,并且srv.response中的值將無效父虑。
    if(client.call(srv))
    {
        ROS_INFO("sum: %ld", (long)srv.response.sum);
    } else
    {
        ROS_ERROR("Failed to call server add_two_ints");
        return 1;
    }

    return 0;
}

3.編譯

  • 再次編輯?/ catkin_ws / src / beginner_tutorials / CMakeLists.txt中的beginner_tutorials CMakeLists.txt该酗,并在末尾添加以下內(nèi)容:
  27 add_executable(add_two_ints_server src/add_two_ints_server.cpp)
  28 target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
  29 add_dependencies(add_two_ints_server beginner_tutorials_gencpp)
  30 
  31 add_executable(add_two_ints_client src/add_two_ints_client.cpp)
  32 target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
  33 add_dependencies(add_two_ints_client beginner_tutorials_gencpp)

這將創(chuàng)建兩個可執(zhí)行文件,add_two_ints_server和add_two_ints_client士嚎,它們默認(rèn)情況下將進(jìn)入開發(fā)空間的包目錄呜魄,默認(rèn)情況下位于?/ catkin_ws / devel / lib / <程序包名稱>。您可以直接調(diào)用可執(zhí)行文件莱衩,也可以使用rosrun調(diào)用它們爵嗅。它們沒有放在'<prefix> / bin'中,因為在將軟件包安裝到系統(tǒng)時膳殷,這會污染PATH操骡。如果希望在安裝時將可執(zhí)行文件放在PATH上九火,則可以設(shè)置安裝目標(biāo),請參閱:catkin / CMakeLists.txt

回到catkin_ws并編譯:

cd ~/catkin_ws
catkin_make

4.測試(兩種方式)

  1. 打開三個終端分別運行:
roscore
source ~/catkin_ws/devel/setup.bash
rosrun beginer_tutorials add_two_ints_server
source ~/catkin_ws/devel/setup.bash
rosrun beginer_tutorials add_two_ints_client 4 5
  1. 打開三個終端分別運行:
roscore
~/catkin_ws/devel/lib/beginer_tutorials/add_two_ints_server
~/catkin_ws/devel/lib/beginer_tutorials/add_two_ints_client 4 5

最后結(jié)果:
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末册招,一起剝皮案震驚了整個濱河市岔激,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌是掰,老刑警劉巖虑鼎,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異键痛,居然都是意外死亡炫彩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門絮短,熙熙樓的掌柜王于貴愁眉苦臉地迎上來江兢,“玉大人,你說我怎么就攤上這事丁频∩荚剩” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵席里,是天一觀的道長叔磷。 經(jīng)常有香客問我,道長奖磁,這世上最難降的妖魔是什么改基? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮咖为,結(jié)果婚禮上秕狰,老公的妹妹穿的比我還像新娘。我一直安慰自己案疲,他們只是感情好封恰,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著褐啡,像睡著了一般诺舔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上备畦,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天低飒,我揣著相機與錄音,去河邊找鬼懂盐。 笑死褥赊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的莉恼。 我是一名探鬼主播拌喉,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼速那,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尿背?” 一聲冷哼從身側(cè)響起端仰,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎田藐,沒想到半個月后荔烧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡汽久,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年鹤竭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片景醇。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡臀稚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出三痰,到底是詐尸還是另有隱情烁涌,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布酒觅,位于F島的核電站,受9級特大地震影響微峰,放射性物質(zhì)發(fā)生泄漏舷丹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一蜓肆、第九天 我趴在偏房一處隱蔽的房頂上張望颜凯。 院中可真熱鬧,春花似錦仗扬、人聲如沸症概。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彼城。三九已至,卻和暖如春退个,著一層夾襖步出監(jiān)牢的瞬間募壕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工语盈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舱馅,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓刀荒,卻偏偏與公主長得像代嗤,于是被迫代替她去往敵國和親棘钞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容