一、ROS节点
1.1 ROS计算图
计算图(Computation Graph)是一个由ROS进程组成的点对点网络,它们能够共同处理数据。ROS的基本计算图概念有节点(Nodes)、主节点(Master)、参数服务器(Parameter Server)、消息(Messages)、服务(Services)、话题(Topics)和袋(Bags),它们都以不同的方式向图(Graph)提供数据。
- 节点(Nodes): 节点是一个可执行文件,它可以通过ROS来与其他节点进行通信。
- 消息(Messages): 订阅或发布话题时所使用的ROS数据类型。
- 话题(Topics): 节点可以将消息发布到话题,或通过订阅话题来接收消息。
- 主节点(Master): ROS的命名服务,例如帮助节点发现彼此。
- rosout: 在ROS中相当于stdout/stderr(标准输出/标准错误)。
- roscore: 主节点 + rosout + 参数服务器(会在以后介绍)
1.2 节点
节点是ROS软件包中的一个可执行文件。 ROS节点使用ROS客户端库与其他节点通信。节点可以发布或订阅话题,也可以提供或使用服务。
客户端库: ROS客户端库可以让用不同编程语言编写的节点进行相互通信
- rospy = Python客户端库
- roscpp = C++客户端库
1.3 节点相关操作指令
1.3.1 roscore
- 作用: roscore运行一个master+rosout+参数服务器,是运行所有ROS程序前首先要运行的命令。
- 用法:
roscore
- 注:
- 如果roscore运行后没有初始化,很有可能是网络配置的问题。
- 如果roscore不能初始化并提示缺少权限,可能是因为~/.ros目录属于root用户(只有root用户才能访问),可以用以下命令递归地更改该目录的所有权:
bash sudo chown -R <your_username> ~/.ros
1.3.2 rosnode
- 作用: rosnode显示当前正在运行的ROS节点信息
- 用法:
rosnode list :列出启动的节点 rosnode info /rosout(某节点) :返回的是某个指定节点的信息。 rosnode ping my_turtle(某节点):测试某节点的是否正常
- 注:
- 当打开一个新的终端时,环境将会重置,~/.bashrc文件将会生效。如果你在运行rosnode等命令时出现一些问题,那么可能需要将一些环境设置文件添加到 ~/.bashrc或手动source一下。
1.3.3 rosrun
- 作用: 用包名直接运行软件包内的节点(而不需要知道包的路径)。
- 用法:
rosrun [package_name] [node_name]
二、ROS话题
2.1 话题通信理论模型
话题通信实现模型涉及到三个角色:
- ROS Master (管理者): 负责保管 Talker 和 Listener 注册的信息,并匹配话题相同的 Talker 与 Listener,帮助 Talker 与 Listener 建立连接
- Talker (发布者): Talker 发布消息
- Listener (订阅者): Listener 订阅消息
流程实现步骤:
- Talker注册:Talker启动后,会通过RPC在 ROS Master 中注册自身信息,其中包含所发布消息的话题名称。ROS Master 会将节点的注册信息加入到注册表中。
- Listener注册:Listener启动后,也会通过RPC在 ROS Master 中注册自身信息,包含需要订阅消息的话题名。ROS Master 会将节点的注册信息加入到注册表中。
- ROS Master实现信息匹配:ROS Master 会根据注册表中的信息匹配Talker 和 Listener,并通过 RPC 向 Listener 发送 Talker 的 RPC 地址信息。
- Listener向Talker发送请求:Listener 根据接收到的 RPC 地址,通过 RPC 向 Talker 发送连接请求,传输订阅的话题名称、消息类型以及通信协议(TCP/UDP)。
- Talker确认请求:Talker 接收到 Listener 的请求后,也是通过 RPC 向 Listener 确认连接信息,并发送自身的 TCP 地址信息。
- Listener与Talker件里连接:Listener 根据步骤4 返回的消息使用 TCP 与 Talker 建立网络连接。
- Talker向Listener发送消息:连接建立后,Talker 开始向 Listener 发布消息。
注:
- 上述实现流程中,前五步使用的 RPC协议,最后两步使用的是 TCP 协议
- Talker 与 Listener 的启动无先后顺序要求
- Talker 与 Listener 都可以有多个
- Talker 与 Listener 连接建立后,不再需要 ROS Master。也即,即便关闭ROS Master,Talker 与
Listern 照常通信。
2.2 话题相关操作指令
2.2.1 rostopic
- 作用: 获取ROS话题的信息。
- 用法:
rostopic echo [topic]:显示在topic话题上发布的数据。 rostopic list -v(选项):列出当前已被订阅和发布的所有话题。 -v:会列出所有发布和订阅的主题及其类型的详细信息。 rostopic type [topic]:来查看topic话题的消息类型。 rostopic pub [topic] [msg_type] [args]:向topic话题中发送具体msg_type类型、具体args参数的的数据 rostopic hz [topic]:查看topic话题中数据的发布速率
2.3 ROS消息
话题的通信是通过节点间发送ROS消息实现的。为了使发布者和订阅者进行通信,发布者和订阅者必须发送和接收相同类型的消息。 所以ROS中的话题与消息,就好比生活中的水管和水。发布者与订阅者先通过水管
(话题)进行连接,随后开通水流(发送消息)。
- ROS消息查看指令:
rosmsg show 消息:查看消息的详细信息
三、ROS服务
3.1 服务通信理论模型
服务通信中模型涉及到三个角色:
- ROS master(管理者):保管 Server 和 Client 注册的信息,并匹配话题相同的 Server 与 Client ,帮助 Server 与 Client 建立连接
- Server(服务端):Client 发送请求信息
- Client(客户端):Client 发送请求信息
流程实现步骤:
- Server注册:Server 启动后,会通过RPC在 ROS Master 中注册自身信息,其中包含提供的服务的名称。ROS Master 会将节点的注册信息加入到注册表中。
- Client注册:Client 启动后,也会通过RPC在 ROS Master 中注册自身信息,包含需要请求的服务的名称。ROS Master 会将节点的注册信息加入到注册表中。
- ROS Master实现信息匹配:ROS Master 会根据注册表中的信息匹配Server和 Client,并通过 RPC 向 Client 发送 Server 的 TCP 地址信息。
- Client发送请求:Client 根据步骤2 响应的信息,使用 TCP 与 Server 建立网络连接,并发送请求数据。
- Server发送响应:Server 接收、解析请求的数据,并产生响应结果返回给 Client。
注:
- 客户端请求被处理时,需要保证服务器已经启动;
- 服务端和客户端都可以存在多个。
3.2 服务相关操作指令
3.2.1 rosservice
- 作用: 获取服务信息
- 用法:
rosservice list:查看启动的所有服务 rosservice type [service]:输出service服务的类型 rosservice type /spawn | rossrv show:查看/spawn服务的rossrv show信息 rosservice call [service] [args]:用给定的args参数调用service服务 rosservice find [service] 按服务的类型查找服务 rosservice uri 输出服务的ROSRPC uri
四、ROS参数服务器
4.1 参数服务器理论模型
参数服务器中模型涉及到三个角色:
- ROS Master (管理者) :公共容器保存参数
- Talker (参数设置者) :向容器中设置参数
- Listener (参数调用者):获取参数
流程实现步骤:
- Talker 设置参数:Talker 通过 RPC 向参数服务器发送参数(包括参数名与参数值),ROS Master 将参数保存到参数列表中。
- Listener 获取参数:Listener 通过 RPC 向参数服务器发送参数查找请求,请求中包含要查找的参数名。
- ROS Master 向 Listener 发送参数值:OS Master 根据步骤2请求提供的参数名查找参数值,并将查询结果通过 RPC 发送给 Listener。
参数可使用数据类型:
32-bit integers | booleans | strings |
---|---|---|
doubles | iso8601 dates | base64-encoded binary data |
字典 | lists |
注意:参数服务器不是为高性能而设计的,因此最好用于存储静态的非二进制的简单数据
4.2 参数服务器相关操作指令
4.2.1 rosparam
- 作用:能让我们在ROS参数服务器上存储和操作数据
- 用法:
rosparam set [param_name] [value]:设置参数 rosparam get [param_name]:获取参数 rosparam load [file_name] [namespace]:从文件中加载参数,还可以对文件重命名。 rosparam dump [file_name] [namespace]:向文件中转储参数 rosparam delete [param_name]:删除参数 rosparam list:查看参数服务器所有参数