11.Service通信

》》点赞,收藏+关注,理财&技术不迷路《《

右边的node就是摄像头,检测所有人的动作,然后把所有pose发送到 /pose,node左边的就是偶尔需要需要某些人体动作,所以不是全部需要。这样就很麻烦。

没有人调用service就不会执行,有人调用它才会执行。比如上面例子,人体识别的node写成一个server,其他程序如果需要人体坐标,就来调用这个服务,然后计算好了人体坐标再把结果传出来,如果不要,他就不会用。

同步:client发完一个请求后,就一直在原地等着,会被阻塞,直到nodeB (服务器端)返回了结果,client才会继续执行。

两个node之间通过请求和响应来通信的。

Server服务器会给外界提供一个服务/service, 别的node就会请求他调用这个服务,A把需要的参数发给service,就是请求service,node B收到请求就会开始处理,然后再回复A。

11.Service通信

 

Srv (service简写):

类别msg文件格式。

11.Service通信

Srv写法:

Srv文件一定要放在srv这个文件夹下。

‘---‘ 三个横杠必须写。---上面是问,下面是答。

11.Service通信

这里问,我们定义为bool类型,为true的时候就会返回HumanPose[] 这里我们是定义为数组类型的,因为人的动作可以有很多。

HumanPose[],这个必须是一个msg文件,因为srv只能嵌套msg,不能嵌套srv,如果是srv的话,无法解析它。

11.Service通信

修改CMakeList和.xml

因为我们自定义了msg和srv文件,所以我们一定也要相应的去修改package.xml文件和CMakeList.txt文件。

11.Service通信

 

实例:

运行模拟实验性:

Roslaunch 加载环境:

[email protected]:~$ roslaunch robot_sim_demo robot_spawn.launch

rosservice显示

[email protected]:~$ rosservice list

11.Service通信

Rosservice info 查看服务

我们随便选取一个service来查看它的信息:

[email protected]:~$ rosservice info /gazebo/delete_light

11.Service通信

Rossrv show查看类型

现在来看看这个srv的通信方式具体是什么样的:(千万注意是rossrv,不是rosservice)

[email protected]:~$ rossrv show gazebo_msg/DeleteLight

11.Service通信

Request只有一个参数:string(就是你要删除的灯光的名称)

返回Bool类型就是返回你是否成功了。

Roservice call 调用服务

调用service:要注意这里是rosservice,调用服务

Rosservice call ‘service’ “sting”

回到模拟图会发现图像里面的太阳没有了,被删除了,屏幕变暗了。

11.Service通信

Tpoic VS Service

RPC:在一个进程(node)里面去调用另一个进程(node)的函数