3.2 ROS基本概念
早期,斯坦福大学的机器人技术研究人员发现,针对机器人的软件原型设计是一项繁重的编程任务,因为这必须从头开始为每个项目编写代码。曾经有一段时间,如C++和Python之类的编程语言被用于机器人技术,这是事实,需要大量的精力构建每个软件以提供机器人级别的功能,例如导航或操作。
这不仅是代码可重用性问题,而且还涉及在机器人技术中的工作方式。在过程编程中,程序的典型流程将一步一步执行,见图3-1。
图 3-1
该程序执行的任务是将多个图像组合为一个图像,这很容易推断出来。从机器人角度来看,这样工作的主要缺点是,如果某些步骤执行失败,则该过程将无法继续进行,因此无法交付结果,即合成图像。如果使用机器人的类比,这意味着如果机器人的一个手臂不能正常工作(例如驱动肘部的关节断裂),将一个轻型物体(例如,一本纸质书)从一个地方运输到另一个地方的人形机器人可能会失败。类人动物肯定应该能够使用另一只手臂完成任务。这就是ROS所做的!
让我们看如下的ROS图示例。
3.2.1 ROS图
此图对ROS来说,相比过程编程而言就像是工作流程图一样,见图3-2。
图 3-2
在图3-2中,每个圆圈(称为节点(node))代表一个独立程序(可以用Python、Java、C++、Ruby、Node.js或任何其他ROS已实现的编程语言来编写)。它们之间的连接(称为边(edge))代表信息的交换。箭头方向背后的含义是显而易见的:数据发布的节点是箭头开始的节点,而接收节点是箭头指向的节点。出现在边附近的单词被ROS称为主题(topic),它们构成了流经节点之间交换信息的通道。当节点需要使用主题信息时,可以通过订阅它进行操作,并且此操作会向图中添加一个新的箭头,从发布者(针对该主题的数据)指向订阅节点。
那么,从机器人的角度来看,此图有什么作用?请注意,GoPiGo3是经典的差动驱动机器人,每个车轮都可以独立转动,并且传感器(例如,距离传感器)为机器人提供有关移动时障碍物远近的信息,见图3-3。
图 3-3
图片来自Dexter Industries:https://32414320wji53mwwch1u68ce-wpengine.netdna-ssl.com/wp-content/uploads/2017/05/GPG3_FullServoDistanceGoogly_1-800x800.jpg
因此,可能有读者已经猜到在前面的ROS图中,节点L_servo
是控制左伺服电动机(通过旋转车轮)的程序,而节点R_servo
对应右轮。
所述sensor
节点获取来自距离传感器数值,并通过连接它的边,即通过使用主题/sharp_data
使得数值对control
节点可用。控制节点可以利用它的信息来实现一些功能。例如,当GoPiGo3遇到障碍时,决策程序可以旋转机器人,直到找到没有障碍物的方向。旋转可以通过节点向L_servo
和R_Servo
节点发送速度相反的命令来实现。
这些信号是流过图的相应边的信号:左伺服主题/speed_left
或与另一个对应的/speed_right
。在ROS程序中,control
节点在/speed_left
主题中发布了用于左伺服电动机的命令。
3.2.2 roscore
roscore是必须启动的第一个强制性节点,从而使ROS环境可以运行。这样,每个节点都可以通过订阅发布的主题查找其他任何节点。roscore还管理数据库中的ROS参数——定义机器人配置的值。因此,如果roscore进程死亡,则主节点将发生故障,并且机器人将停止工作。可能会猜到,单点故障是分布式计算框架(例如ROS)的明显限制。因此,ROS2解决了此问题,并且运行的软件不再需要主节点。节点之间的通信依赖于实时系统的数据分发服务(Data Distribution Service,DDS)架构。
机器人编程与编写软件应用程序有何不同?在机器人技术中,专注于应用程序的顶层功能,并集成了他人编写的预制软件。
并非机器人技术中的所有软件都遵循此类方法。事实上,考虑到多种用途,选择了ROS,因为它的理念适合实践中学习的方法。
这些软件由分组为节点的代码块组成,形成了所谓的ROS软件包(ROS package)。几个相关的节点构成一个ROS软件包,该软件包提供特定的功能,例如,使用摄像头进行图像目标识别。
3.2.3 工作空间和catkin
ROS中的工作空间是用于编译和运行软件的隔离环境。通常使用不同的工作空间管理不同的项目。工作空间将包含项目所需的所有ROS软件包。
从物理上讲,它是主目录中的一个文件夹,其中包含应用程序的所有特定文件,将工作空间部署到另一台预装有ROS的计算机上将可以正常工作,并且与原始计算机上的工作相同。
与工作空间概念紧密相关的是catkin,它是ROS的编译系统,结合了CMake宏和Python脚本以提供CMake常规工作流以上的功能。至此,每当在工作空间中包含新软件包时,就可以使用此工具编译软件。catkin的深入概念解释见http://wiki.ros.org/catkin/conceptual_overview。