ROS 通信机制
ROS是进程(也称为 Nodes
)的分布式框架。 这些进程甚至还可分布于不同主机协同工作,所以结点之间如何通信非常重要!
基本通信机制二:服务通信(请求响应模式)
用于偶然的、对时时性有要求、有一定逻辑处理需求的数据传输场景。
要素1: 消息的客户端(Client), 要素2: 消息的服务端(Server), 要素3: 话题名称(Service), 要素4: 数据载体(srv)
ROS Master 负责保管 Server 和 Client 注册的信息,并匹配话题相同的 Server 与 Client ,帮助 Server 与 Client 建立连接,连接建立后,Client 发送请求信息,Server 返回响应信息。

服务器实现 python
代码:
#! /usr/bin/env python
"""
服务器端实现:
1.导包
2.初始化 ROS 节点
3.创建服务对象
4.回调函数处理请求并产生响应
5.spin 函数
"""
import rospy
from srv_sum.srv import *
# 回调函数的参数是请求对象,返回值是响应对象
def doReq(req):
sum = req.num1 + req.num2
rospy.loginfo("num1 = %d, num2 = %d, sum = %d",req.num1, req.num2, sum)
resp = addintsResponse(sum) # 创建响应对象,赋值并返回
return resp
if __name__ == "__main__":
rospy.init_node("addints_server")
server = rospy.Service("AddInts",addints,doReq) # 实例化服务对象
rospy.spin()
客户端实现 python
代码:
#! /usr/bin/env python
"""
客户端实现:
1.导包
2.初始化 ROS 节点
3.创建请求对象
4.发送请求
5.接收并处理响应
优化:
加入数据的动态获取
"""
import rospy
from srv_sum.srv import *
import sys
if __name__ == "__main__":
if len(sys.argv) != 3: # 优化实现
rospy.logerr("number error")
sys.exit(1)
rospy.init_node("addInts_client")
client = rospy.ServiceProxy("AddInts",addints)
client.wait_for_service()
req = addintsRequest()
req.num1 = int(sys.argv[1]) #优化
req.num2 = int(sys.argv[2])
resp = client.call(req)
rospy.loginfo("响应结果:%d",resp.sum)
服务通信自定义 srv
- 服务消息的定义
xxx.srv
: 请求部分 + 响应部分# 客户端请求时发送的两个数字 int32 num1 int32 num2 --- # 服务器响应发送的数据 int32 sum
- 编辑配置文件
package.xml
中添加编译依赖与执行依赖
修改<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
CMakeLists.txt
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs # 需要加入 message_generation,必须有 std_msgs message_generation ## ) add_service_files( FILES xxx.srv ## ) generate_messages( DEPENDENCIES std_msgs ## )
- 编译会生成:Python 需要调用的中间文件(…/工作空间/devel/lib/python3/dist-packages/包名/srv).
- 配置 vsc:
settings.json
即可正常import
.{ "python.autoComplete.extraPaths": [ "/opt/ros/noetic/lib/python3/dist-packages", "/xxx/yyy工作空间/devel/lib/python3/dist-packages" ] }
*服务相关命令
rosservice list # 列出所有活动的服务
rosservice info srv_xxx # 打印有关服务的信息
rosservice args srv_xxx # 打印服务参数
rosservice find type_xxx # 打印特定类型的服务
rosservice type srv_xxx # 打印服务使用的数据类型
rosservice call srv_xxx # 使用提供的参数调用服务
rossrv list # 显示所有的服务
rossrv package pkg_name # 显示功能包下的服务
rossrv packages # 使用服务的所有功能包
rossrv show srv_xxx # 列出服务信息
其他相关常用命令 rosnode
:
rosnode ping /node # 测试到节点的连接状态
rosnode list # 列出活动节点
rosnode info /node # 打印节点信息
rosnode machine # 列出指定设备上节点
rosnode kill /node # 杀死某个节点
rosnode cleanup # 清除不可连接的节点(已经死亡但是被当成活着的僵尸节点)