通信架构主要包括数据的处理,过程的运行,消息的传递。
1、Node & Master
Node
最小的进程单元——节点; node——可执行文件,负责机器人某个单独的功能,每个node负责某一个单独的功能,采用分布式的方式,模块化分工的思想。
Master
通过master管理各个node
启动master和node
启动ROS命令
roscore
同时启动roscout
(负责日志输出的一个节点)和parameer server
(参数服务器,非node,存储参数配置的服务器)
启动node:
rosrun pkg_name node_name
Master、Node以及Node之间的关系
rosrun和rosnode命令
rosrun命令:
rosrun [--prefix cmd] [--debug] pkg_name node_name [ARGS]
rosnode 详细命令:
2、launch文件
机器人是一个系统工程,需要同时开启很多node,ROS提供了一个同时启动master和多个node命令:
roslaunch pkg_name file_name.launch
首先启动master,在按照launch的规则执行,roslaunch
一个启动工具,能够一次性把多个节点按照我们预先配置启动起来。
launch文件遵循XML格式:
<launch> <!--根标签-->
<node> <!--需要启动的node及其参数-->
<include> <!--包含其他launch-->
<machine> <!--指定运行的机器-->
<env-loader> <!--设置环境变量-->
<param> <!--定义参数到参数服务器-->
<rosparam> <!--启动yaml文件参数到参数服务器-->
<arg> <!--定义变量-->
<remap> <!--设定参数映射-->
<group> <!--设定命名空间-->
</launch> <!--根标签-->
理解launch文件,通过更改launch模板满足普通项目需求。
3、Topic
ROS的通信方式有四种:
- Topic主题
- Service服务
- Parameter Service 参数服务器
- Actionlib 动作库
topic是一种点对点的单项通信方式,node之间通过topic方式传递信息。
初始化过程:
首先,publisher节点和subscriber节点都要到节点管理器进行注册,然后publisher会发布topic,subscriber在master的指挥下会订阅topic,从而建立起sub-pub之间的通信。
整个过程是单向的。
Subscriber接收消息会进行处理——回调(Callback)——提前定义好一个处理函数,当有消息来时就会触发这个处理函数,函数会对消息进行处理。
topic通信属于一种异步的通信方式。
通信示例
摄像头画面的发布、处理、显示
ROS是一种分布式的结构,一个topic可以被多个节点同时发布,也可以同时被多个节点接收。
分布式系统通信的好处:扩展性好、软件复用率高。
总结
1、topic 通信方式是异步的,发送时调用publish()方法,发送完成立即返回,不用等待反馈。
2、subscriber通过回调函数的方式来处理消息。
3、topic可以同时有多个subscribers,也可以同时有多个publishers。ROS中这样的例子有:/rosout、/tf等。
操作命令
topic几种使用命令:
4、Message
Message就是topic内容的数据类型,也称之为topic的格式标准。