農(nóng)業(yè)無人機
工業(yè)無人機
軍警無人機
娛教無人機
水下無人機
反無人機設(shè)備
無人機配件
無人機租賃
無人機培訓
當前位置:全球無人機網(wǎng) ? 無人機技術(shù) ? 技術(shù) ? 正文

上海硅步ROS連載系列40期 創(chuàng)建服務(wù)器節(jié)點和客戶端節(jié)點

發(fā)布日期:2017-11-25??來源:上海硅步我要投稿我要評論

  本節(jié)介紹使用C++編寫ROS消息服務(wù)器節(jié)點和客戶端節(jié)點的方法和步驟,以及如何構(gòu)建和測試這兩個節(jié)點。

  1.編寫服務(wù)器節(jié)點代碼

  使用kdevelop在ros_tutorials/src目錄下創(chuàng)建一個名為add_two_ints_server的C++文件:

  $ roscd ros_tutorials

  $ cd src

  $ kdevelopadd_two_ints_server.cpp

  輸入如下代碼:

  #include"ros/ros.h"

  #include "ros_tutorials/AddTwoInts.h"

  bool add(ros_tutorials::AddTwoInts::Request &req,

  ros_tutorials::AddTwoInts::Response&res)

  {

  res.sum = req.a + req.b;1

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

  }

  部分代碼解釋如下:

  #include "ros_tutorials/AddTwoInts.h"

  ros_tutorials/AddTwoInts.h是由編譯系統(tǒng)自動根據(jù)先前創(chuàng)建的srv文件生成的對應(yīng)該srv文件的頭文件。

  bool add(ros_tutorials::AddTwoInts::Request &req,

  ros_tutorials::AddTwoInts::Response&res)

  該函數(shù)提供兩個int值求和的服務(wù),int值從Request里面獲取,而返回數(shù)據(jù)裝入Response內(nèi),這些數(shù)據(jù)類型都定義在srv文件內(nèi)部,函數(shù)返回一個bool值。

  {

  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;

  }

  進行兩個整數(shù)相加運算,結(jié)果存儲在Response中。把Request和Response的一些信息記錄日志,最后當運算完成時服務(wù)返回True。

  ros::ServiceServerservice = n.advertiseService("add_two_ints", add);

  創(chuàng)建服務(wù)service并在ROS網(wǎng)絡(luò)上進行廣播。

  2.編寫客戶端節(jié)點代碼

  使用kdevelop在ros_tutorials/src目錄下創(chuàng)建一個名為add_two_ints_client的C++文件:

  $ roscd ros_tutorials

  $ cd src

  $ kdevelopadd_two_ints_client.cpp

  輸入如下代碼:

  #include"ros/ros.h"

  #include "ros_tutorials/AddTwoInts.h"

  #include

  int main(int argc, char**argv)

  {

  ros::init(argc, argv,"add_two_ints_client");

  if (argc != 3)

  {

  ROS_INFO("usage: add_two_ints_client XY");

  return 1;

  }

  ros::NodeHandle n;

  ros::ServiceClient client =n.serviceClient ("add_two_ints");

  ros_tutorials::AddTwoInts srv;

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

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

  if (client.call(srv))

  {

  ROS_INFO("Sum: %ld", (longint)srv.response.sum);

  }

  else

  {

  ROS_ERROR("Failed to call serviceadd_two_ints");

  return 1;

  }

  return 0;

  }

  部分代碼解釋如下:

  ros::ServiceClientclient = n.serviceClient ("add_two_ints");

  為add_two_ints服務(wù)創(chuàng)建一個客戶端。ros::ServiceClient對象用來隨后調(diào)用服務(wù)。

  ros_tutorials::AddTwoIntssrv;

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

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

  實例化一個自動生成的服務(wù)類,并為其request成員賦值。一個服務(wù)類包含兩個成員,request和response,也包括兩個類的定義:Request和Response。

  if(client.call(srv))

  調(diào)用服務(wù),調(diào)用完成后立即返回。如果服務(wù)調(diào)用成功,call()將返回true,此時srv.response中的值有效。如果服務(wù)調(diào)用失敗,call()將返回false,srv.response中的值無效。

  3.生成節(jié)點

  打開~/catkin_ws/src/ros_tutorials/CMakeLists.txt,將以下代碼添加到最后:

  add_executable(add_two_ints_serversrc/add_two_ints_server.cpp)

  target_link_libraries(add_two_ints_server${catkin_LIBRARIES})

  add_dependencies(add_two_ints_serverros_tutorials_gencpp)

  add_executable(add_two_ints_clientsrc/add_two_ints_client.cpp)

  target_link_libraries(add_two_ints_client${catkin_LIBRARIES})

  add_dependencies(add_two_ints_clientros_tutorials_gencpp)

  這將會創(chuàng)建兩個可執(zhí)行程序,add_two_ints_server和add_two_ints_client。默認情況下,它們將會位于你的開發(fā)空間里面的ros_tutorials功能包目錄下(~/catkin_ws/devel/lib/ros_tutorials),你可以直接調(diào)用它們或者使用rosrun運行它們。

  運行 catkin_make:

  # In your catkinworkspace

  $ cd ~/catkin_ws

  $ catkin_make

  4.測試服務(wù)器和客戶端節(jié)點

  首先啟動roscore:

  $ roscore

  在另一個終端窗口運行下面的命令啟動服務(wù)器節(jié)點:

  $ rosrun ros_tutorialsadd_two_ints_server

  你會看到下面的輸出:

  Ready to add two ints.

  新建一個終端,運行客戶端節(jié)點:

  $ rosrun ros_tutorials add_two_ints_client 2 3

  你會看到類似下面的輸出:

  Requesting 2+3

  2 + 3 = 5


?
本文鏈接:http://sanehomeowner.com/tech/201711/25/590.html
標簽:??上海硅步
0相關(guān)評論
免責聲明:凡注明來源全球無人機網(wǎng)的所有作品,均為本網(wǎng)合法擁有版權(quán)或有權(quán)使用的作品,歡迎轉(zhuǎn)載,請注明出處。非本網(wǎng)作品均來自互聯(lián)網(wǎng),轉(zhuǎn)載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點和對其真實性負責。

圖文推薦

推薦新聞

推薦品牌

關(guān)于本站

合作服務(wù)電話

  • 客服熱線:0755-23779287
  • 展會負責:18682042306
  • 廣告合作:點擊這里給我發(fā)消息
  • 展會合作:點擊這里給我發(fā)消息

公眾號/APP下載


    (公眾號)


    (Android下載)

Copyright?2005-2021 81UAV.CN All Rights Reserved? 訪問和使用全球無人機網(wǎng),即表明您已完全接受和服從我們的用戶協(xié)議。 SITEMAPS 網(wǎng)站地圖 網(wǎng)站留言
運營商: 湛江中龍網(wǎng)絡(luò)科技有限公司 全球無人機網(wǎng)?
ICP備案號:粵ICP備15079343號 
全國公安機關(guān)?備案信息?可信網(wǎng)站不良舉報?文明轉(zhuǎn)播