11.Service通信
》》点赞,收藏+关注,理财&技术不迷路《《
右边的node就是摄像头,检测所有人的动作,然后把所有pose发送到 /pose,node左边的就是偶尔需要需要某些人体动作,所以不是全部需要。这样就很麻烦。
没有人调用service就不会执行,有人调用它才会执行。比如上面例子,人体识别的node写成一个server,其他程序如果需要人体坐标,就来调用这个服务,然后计算好了人体坐标再把结果传出来,如果不要,他就不会用。
同步:client发完一个请求后,就一直在原地等着,会被阻塞,直到nodeB (服务器端)返回了结果,client才会继续执行。
两个node之间通过请求和响应来通信的。
Server服务器会给外界提供一个服务/service, 别的node就会请求他调用这个服务,A把需要的参数发给service,就是请求service,node B收到请求就会开始处理,然后再回复A。
Srv (service简写):
类别msg文件格式。
Srv写法:
Srv文件一定要放在srv这个文件夹下。
‘---‘ 三个横杠必须写。---上面是问,下面是答。
这里问,我们定义为bool类型,为true的时候就会返回HumanPose[] 这里我们是定义为数组类型的,因为人的动作可以有很多。
HumanPose[],这个必须是一个msg文件,因为srv只能嵌套msg,不能嵌套srv,如果是srv的话,无法解析它。
修改CMakeList和.xml
因为我们自定义了msg和srv文件,所以我们一定也要相应的去修改package.xml文件和CMakeList.txt文件。
实例:
运行模拟实验性:
Roslaunch 加载环境:
[email protected]:~$ roslaunch robot_sim_demo robot_spawn.launch
rosservice显示
[email protected]:~$ rosservice list
Rosservice info 查看服务
我们随便选取一个service来查看它的信息:
[email protected]:~$ rosservice info /gazebo/delete_light
Rossrv show查看类型
现在来看看这个srv的通信方式具体是什么样的:(千万注意是rossrv,不是rosservice)
[email protected]:~$ rossrv show gazebo_msg/DeleteLight
Request只有一个参数:string(就是你要删除的灯光的名称)
返回Bool类型就是返回你是否成功了。
Roservice call 调用服务
调用service:要注意这里是rosservice,调用服务
Rosservice call ‘service’ “sting”
回到模拟图会发现图像里面的太阳没有了,被删除了,屏幕变暗了。
Tpoic VS Service
RPC:在一个进程(node)里面去调用另一个进程(node)的函数