Ros学习Day2


这里我们要了解里面的一些概念:

1:节点(Node)—-执行单元

执行具体任务的进程,可以理解和Windows里面的可执行文件一样,并且不同节点可以使用不同的编程语言,可分布式运行在不同的主机。且节点在系统里面的名称必须是唯一的。

2:节点管理器(ROS Master)——-控制中心

为节点提供命名和注册服务,跟踪和记录话题,辅助节点相互查找,建立连接。且提供参数服务器,节点使用此服务器存储和检索运行时候的参数。在这里插入图片描述
如上图所示,一共有三个节点,摄像头节点,以及图像处理节点,还有图像显示节点。三个节点通过ROS Master被协调,

3:通信方式

通信方式有俩种:一种是异步通信,也就是话题通信。话题通信有以下俩个重要的概念:

3-1话题通信:

节点之间用来传输数据的重要总线,且使用发布/订阅模型,数据由发布者传输到订阅者,同一个话题的订阅者或者发布者可以不唯一。
消息(Message)就是话题通信传输的数据。数据具有一定的类型和数据结构。包括ROS提供的标准类型和用户自定义的类型。
使用编程语言无关的.msg文件去定义。
在这里插入图片描述
在这里插入图片描述
看上图我们可以看出摄像头节点从摄像头获得采集后的数据后,摄像头节点作为发布者,图像处理节点和图像显示节点作为订阅者获得其数据。

3-2服务通信:

服务为同步通信。使用的是客户端/服务器模型,客户端发送请求数据,服务器完成处理后返回应答数据。
与上面不同的是使用和编程语言无关的.srv文件定义请求和应答数据类型。
在这里插入图片描述

在这里插入图片描述
俩者之间的区别:如下列表格所示:

Topic Service
通信方式 异步通信 同步通信
实现原理 TCP/IP TCP/IP
通信模型 发布订阅 请求应答
多对多 多对一
接收者收到数据会回调 远程过程调用RPC服务器端的服务
应用场景 连续,高频的数据发布 偶尔调用的功能/具体的任务
激光雷达,里程计发布数据 开关传感器,拍照,逆解运算

4:参数—-全局共享字典

可以通过网络访问的共享,多变量字典。
节点使用该服务器来存储和检索运行的参数。并且适合存储静态,非二进制的配置。不适合于存储动态变化的数据。
在这里插入图片描述

5:ROS文件系统

功能包:ROS软件中的基本单元,包括节点源码,配置文件,数据定义等
功能包清单:记录功能包的基本信息,包含作者信息,许可信息,依赖选项,编译标志。
元功能包:组织多个用于同一目的的功能包。
其包含关系就是如下图:
在这里插入图片描述

6:ROS命令行工具使用(结合小海龟的例子)

运行任何Ros命令行的时候,roscore。首先运行roscore系列服务,这是使用ROS所必需的基础。
接下来我们结合小海龟这个例程去学习这个指令:运行小海龟这个节点:

rosrun turtlesim turtlesim_node

在这里插入图片描述
接下来再输入指令:

rosrun turtlesim turtle_teleop_key

用方向键控制海龟移动。接下来我们使用工具来查看之间的关系。上面例程中节点turtlesim_node和节点turtle_teleop_key通过一个ROS topic来互相通信,turtle_teleop_key节点在topic上面发布关键进程,turtlesim_node节点则订阅相同的进程来接收这些关键进程。可以利用rqt_graph工具来显示正在运行的节点和主题之间的关系。
输入指令后:rosrun rqt_graph rqt_graph 可以得到
在这里插入图片描述
可以看出节点turtle_teleop_key和节点turtlesim_node之间在turtle1/cmd_vel话题上进行通信。

rosnode list可以查看当前运行的所有节点。
在这里插入图片描述
rosnode info /turtlesim可以某个节点的具体信息:
在这里插入图片描述
rostopic list可以查看当前运行的话题信息:
在这里插入图片描述
通过命令行工具让海龟动起来:

rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0"

在这里插入图片描述
要是让海龟一直循环动起来则需要在指令添加下列参数:

rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
  x: 1.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 1.0"

10就是10hz一秒钟发布10次。
在这里插入图片描述
接下来可以输入指令查看刚才话题发布的数据类型。
在这里插入图片描述
我们也可以查看当前服务请求列表:
输入指令:rosservice list

在这里插入图片描述
也可以发布服务请求,比如在生成一只海龟。

rosservice call /spawn "x: 10.0
y: 3.0
theta: 0.0
name: 'turtle2'"

在这里插入图片描述
接下来话题记录和话题复现:
rosbag 既可以指命令行中数据包相关命令,也可以指 c++/python 的 rosbag 库。这里的 rosbag 是指前者。
rosbag 主要用于记录、回放、分析 rostopic 中的数据。它可以将指定 rostopic 中的数据记录到 .bag 后缀的数据包中,便于对其中的数据进行离线分析和处理。
对于 subscribe 某个 topic 的节点来说,它无法区分这个 topic 中的数据到底是实时获取的数据还是从 rosbag 中回放的数据。这就有助于我们基于离线数据快速重现曾经的实际场景,进行可重复、低成本的分析和调试。
在这里插入图片描述

话题记录:rosbag record -a -O cmd_record这个指令的意思就是将当前主题的内容记录一个包文件。输入后可以看到已经开始订阅,这时候我们控制键盘控制小海龟移动来记录当前的运动数据。
在这里插入图片描述
当记录的差不多时候我们关闭ctrl+c停止该进程,这时候我们发现主目录刚才记录的包的文件,
在这里插入图片描述
这时候我们可以重新开启小海龟的节点,但是不用开启键盘控制的节点,我们这时候可以开始复现小海龟刚才走的痕迹。输入话题复现指令:

rosbag play cmd_record.bag

这时候我们就能发现小海龟动了起来.
在这里插入图片描述
我们发现按照之前的动了起来。这一节的内容较多,首先要理解ROS topics、ROS nodes、ROS Messages之间的关系。目前个人的理解是:ROS topics是ROS nodes之间进行通信的枢纽,ROS messages是ROS nodes订阅和发布数据的载体。两个ROS nodes欲实现通信,则其中一个节点向ROS topic发布ROS messages,另一节点则通过订阅此topic来接收messages,两者的message类型一定要相同,而message的类型由主题确定,通过rostopic type命令可以查看topic的数据类型。


文章作者: WYW
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 WYW !
评论
 上一篇
Ros学习Day3 Ros学习Day3
今天学到了创建工作空间与功能包。具体有篇帖子总结的结构很不错,博客地址贴在这里:https://www.cnblogs.com/zhjblogs/p/15686758.html创建工作空间参考的这篇帖子以及古月老师的ROS入门21讲:htt
2022-01-03
下一篇 
Ros学习Day1 Ros学习Day1
Ros学习Day1考完研后终于有时间更新了下博客,把之前写的水的帖子给处理下,由于自己毕业设计要做一个基于Ros的小车,进行slam地图建模以及控制。跟着入门的课程是B站上的古月居老师,特此记录每天的学习记录。 首先就是要有一个操作系统去运
2022-01-01
  目录