一、ROS节点

节点(Node)是ROS程序的运行实例(可执行文件的实例化),也可以理解为几乎相互独立的程序,不同节点实现不同功能,节点通过ROS节点管理器(Master)注册信息,并且多个节点可同时运行。

二、ROS话题

话题(Topic)是节点之间通讯的桥梁,节点将消息发布到话题,同时也可以订阅话题以接收消息。

三、ROS通讯机制

ROS通讯采用分布式网络结构,使用基于TCP(俗称3次握手)的通信方式,实现模块间点对点的连接。其通讯方式有以下几种。

1、基于话题(Topic)的通信

①Talker(节点1)向Master(节点管理器)注册发布者的信息,包含发布消息的话题名(此处为"bar",地址为"1234"),Master会将其储存到注册列表,等待接受此话题的Listener(节点2)。

②Listener向Master注册接收者的信息,包含订阅的话题名"bar"。

③Master根据Listener订阅的话题在注册列表寻找与之匹配的话题。如果没有找到匹配的发布者,则等待发布者的加入,如果找到可以与之匹配的发布者信息,则向Listener发送Talker的地址信息"1234"。

④⑤⑥Listener接收到Talker的地址信息,就尝试向Talker发送连接许可,当Talker与Listener互相确认信息后就建立连接(3次握手)。

⑦等连接成功后,Talker才向Listener发送消息(地址为"2345")。可以发现,话题在两节点通讯之间用于相互验证身份,起到桥梁作用。

需要注意的是,这两个节点可以以任意顺序开始、结束,不会导致任何错误,他们是相互独立的。

2、基于服务(Service)的通信

服务调用(service calls)是ROS另一种通信方法。它与话题通信的区别是:服务允许Client(节点1:客户端)发送请求(request)到Server(节点2:服务器) 并获得一个响应(response),服务调用是双向的,且实现的是一对一的通信;对于话题,消息发布的节点不知道是否有其他节点订阅了这个消息,而订阅的节点也不知道是否有其他节点会发布这个消息,且同一个话题可以有很多个发布者和订阅者。

服务的描述定义了ROS中需求和响应的数据结构,同消息类型一样,服务数据类型也是由一系列域构成的。唯一的区别就在于服务数据类型分为两部分,分别表示请求和响应。

3、基于参数(Parameter)的通信

通过使用参数服务器(parameter server)来维护变量集的值,包括整数、浮点数、字符串以及其他数据类型。参数服务器允许节点主动查询所需参数的值它们适用于配置那些不会随时间频繁变更的信息。

四、ROS文件架构

ROS工作区(catkin workspace)是用来储存功能包的,创建任何程序之前都要先创建工作区,再创建功能包,功能包存放在工作区src子目录下。创建功能包后,功能包的目录下会生成两个文件,一个是package.xml清单文件,提供关于功能包的相关信息,并且定义功能包之间的依赖关系,另一个是CMakeLists.txt脚本文件,用来编译。

五、ROS开发常用工具

1、Rviz和Gazebo

Rviz是一款3D可视化工具,强调把已有的数据可视化显示。

Gazebo是3D物理仿真平台,强调的是创建一个虚拟的仿真环境。

Rviz需要已有的数据,而Gazebo可以创造数据。

我们可以在Gazebo中创建一个机器人世界,不仅可以仿真机器人的运动功能,还可以仿真机器人的传感器数据,而这些数据就可以放到Rviz中显示,所以使用gazebo的时候,经常也会和rviz配合使用。

2、rqt工具

①rqt_graph:查看节点之间的发布-订阅关系。

②rqt_plot:实时显示一个发布到某个话题上的数据变化图形。

③rqt_console:显示来自所有节点的日志消息。

④rqt_logger_level:通过图形界面设置日志级别。

3、TF坐标变换

TF是坐标变换软件包,能让用户随时间跟踪多个参考系,它使用一种树形数据结构,根据时间缓冲并维护多个参考系之间的坐标变换关系,可以帮助用户在任意时间,将点、向量等数据的坐标在两个参考系中完成坐标变换。

假设用户有若干数据,但这些数据是基于激光传感器中心表示的,这些数据是用来帮助机器人躲避障碍物的,为了实现该功能,需要TF实现从传感器到机器人中心(或别的)的坐标变换。

TF核心函数有两个:一个broadcast,把坐标变换关系发布出去;一个listener监听所有的broadcast,建立好坐标变换树方便调用。

案例教学:

https://link.zhihu.com/?target=https%3A//www.bilibili.com/video/BV12o4y1f7ZB/

Github项目链接:https://github.com/1027243334/turtlesim