推薦博文:
創建ROS服務端(service)和客戶端(client)
服務端和客戶端的關係實際上就是請求和響應的關係。我們在定義服務類型的時候實際上只是定義了請求時客戶端發送的數據類型及個數,還有服務端響應時返回來的數據類型和個數。對C++語言而言、服務端和客戶端同樣是.cpp文件編譯生成的可執行文件。
一、服務端:
1、cd到包目錄下,然後在src文件夾下創建.cpp文件;
2、.cpp文件包括以下部分:
①包含(include)依賴庫,如ros/ros.h、beginner_tutorials/AddTwoInts.h(已生成的服務類型頭文件)等
②請求處理函數部分:
bool add(beginner_tutorials::AddTwoInts::Request &req, beginner_tutorials::AddTwoInts::Request &res)
{
客戶端傳來的數據存在req中,在此函數體處理請求,並將結果存在res中
}
③主函數部分: ros::init(argc,argv,"add_two_ints_server");
ros::NodeHandle n;
// 向ROS節點網絡廣播:當前節點提供add_two_ints服務,這個服務通過調用add函數完成,
// 需要這個服務的可以來請求當前節點
ros::ServiceServer service = n.advertiseService("add_two_ints",add);
ros::spin(); //自循環,等待請求
二、客戶端:
1、cd到包目錄下,然後在src文件夾下創建.cpp文件;
2、.cpp文件包括以下部分:
主函數: ros::init(argc,argv,"add_two_ints_client");
// 客戶端需要通過命令行輸入參數,這裏是兩個加數用空格隔開,
// 所以輸入參數個數不等於3時屬於非法輸入
if(argc != 3){return;};
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
beginner_tutorials::AddTwoInts srv; // 實例化需要請求的服務
srv.request.a = atoll(argv[1]); // 把要傳遞給服務端的參數存入服務srv中
srv.request.b = atoll(argv[2]);
if (client.call(srv))
{
如果服務端成功響應,返回值存在srv.response中,在此函數體處理結果
}
else return;
return;
三、CMakeLists.txt文件的設置:
1、添加可執行文件,即add_executable(add_two_ints_server src/talker.cpp);
add_executable(add_two_ints_client src/talker.cpp);
2、添加目標連接庫,即target_link_libraries(add_two_ints_server ${catkin_LIBRARIES});
target_link_libraries(add_two_ints_client ${catkin_LIBRARIES});
3、添加對生成的消息文件的依賴項,即 add_dependencies(add_two_ints_server beginner_tutorials_generate_messages_cpp);
add_dependencies(add_two_ints_client beginner_tutorials_generate_messages_cpp);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.