【ROS入门21讲】Client客户端的编程实现
【ROS入門21講】Client客戶端的編程實(shí)現(xiàn)
本文章是針對(duì)bilibili古月居up的【ROS入門21講】所作的筆記,筆記從第8講開始,主要記錄一些關(guān)鍵內(nèi)容方便查閱。
視頻連接:【ROS入門21講】
課件及源碼:
鏈接: https://pan.baidu.com/s/1UUGTN1DI-2eCeRc80OUKcg?pwd=e23b
提取碼: e23b
一、話題模型
服務(wù)通信較之于話題通信更簡(jiǎn)單些,理論模型如下圖所示,該模型中涉及到三個(gè)角色:
ROS master(管理者)
Server(服務(wù)端)
Client(客戶端)
ROS Master 負(fù)責(zé)保管 Server 和 Client 注冊(cè)的信息,并匹配話題相同的 Server 與 Client ,幫助 Server 與 Client 建立連接,連接建立后,Client 發(fā)送請(qǐng)求信息,Server 返回響應(yīng)信息。
0.Server注冊(cè)
Server 啟動(dòng)后,會(huì)通過RPC在 ROS Master 中注冊(cè)自身信息,其中包含提供的服務(wù)的名稱。ROS Master 會(huì)將節(jié)點(diǎn)的注冊(cè)信息加入到注冊(cè)表中。
1.Client注冊(cè)
Client 啟動(dòng)后,也會(huì)通過RPC在 ROS Master 中注冊(cè)自身信息,包含需要請(qǐng)求的服務(wù)的名稱。ROS Master 會(huì)將節(jié)點(diǎn)的注冊(cè)信息加入到注冊(cè)表中。
2.ROS Master實(shí)現(xiàn)信息匹配
ROS Master 會(huì)根據(jù)注冊(cè)表中的信息匹配Server和 Client,并通過 RPC 向 Client 發(fā)送 Server 的 TCP 地址信息。
3.Client發(fā)送請(qǐng)求
Client 根據(jù)步驟2 響應(yīng)的信息,使用 TCP 與 Server 建立網(wǎng)絡(luò)連接,并發(fā)送請(qǐng)求數(shù)據(jù)。
4.Server發(fā)送響應(yīng)
Server 接收、解析請(qǐng)求的數(shù)據(jù),并產(chǎn)生響應(yīng)結(jié)果返回給 Client。
二、實(shí)現(xiàn)
創(chuàng)建功能包learning_serivce,在這里就不用重新創(chuàng)建一個(gè)的工作空間了,直接在src執(zhí)行create catkin package即可,src文件夾下同時(shí)存在learning_topic learning_serivce兩個(gè)功能包,相互獨(dú)立。
需要的功能包如下:
創(chuàng)建客戶端
新建cpp文件:
/*** 該例程將請(qǐng)求/spawn服務(wù),服務(wù)數(shù)據(jù)類型turtlesim::Spawn*/#include <ros/ros.h> #include <turtlesim/Spawn.h>int main(int argc, char** argv) {// 初始化ROS節(jié)點(diǎn)ros::init(argc, argv, "turtle_spawn");// 創(chuàng)建節(jié)點(diǎn)句柄ros::NodeHandle node;// 發(fā)現(xiàn)/spawn服務(wù)后,創(chuàng)建一個(gè)服務(wù)客戶端,連接名為/spawn的serviceros::service::waitForService("/spawn");ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");// 初始化turtlesim::Spawn的請(qǐng)求數(shù)據(jù)turtlesim::Spawn srv;srv.request.x = 2.0;srv.request.y = 2.0;srv.request.name = "turtle2";// 請(qǐng)求服務(wù)調(diào)用ROS_INFO("Call service to spwan turtle[x:%0.6f, y:%0.6f, name:%s]", srv.request.x, srv.request.y, srv.request.name.c_str());add_turtle.call(srv);// 顯示服務(wù)調(diào)用結(jié)果ROS_INFO("Spwan turtle successfully [name:%s]", srv.response.name.c_str());return 0; };注意幾點(diǎn):
ros::service::waitForService("/spawn")是一個(gè)阻塞型指令,會(huì)一直等待名叫/spawn的服務(wù)。
ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn")創(chuàng)建一個(gè)服務(wù)客戶端,連接名為/spawn的service。
add_turtle.call(srv)向服務(wù)器通過call指令請(qǐng)求服務(wù)。
配置客戶端代碼編譯規(guī)則
CMakeLists.txt中添加:
add_executable(client ./src/client.cpp) target_link_libraries(client ${catkin_LIBRARIES})launch文件多節(jié)點(diǎn)運(yùn)行
1、選定功能包右擊 —> 添加 launch 文件夾
2、選定 launch 文件夾右擊 —> 添加learning_service. launch 文件
3、編輯 launch 文件內(nèi)容(根據(jù)自己情況而定)
首先在這里先解釋一下,launch文件各個(gè)關(guān)鍵字的解釋:
node —> 包含的某個(gè)節(jié)點(diǎn)
pkg -----> 功能包
type ----> 被運(yùn)行的節(jié)點(diǎn)文件
name --> 為節(jié)點(diǎn)命名
output-> 設(shè)置日志的輸出目標(biāo)
執(zhí)行ctrl + shfit + p,輸入ROS:Run a ROS launch file,然后輸入learning_service,然后輸入learning_service.launch,程序運(yùn)行起來之后,輸出會(huì)在vscode下方的終端交替輸出。
三、總結(jié):
總結(jié)
以上是生活随笔為你收集整理的【ROS入门21讲】Client客户端的编程实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hulu笔试
- 下一篇: 手机端选择收货地址html写法,jQue