前言
本文主要记录学习ROS过程的相关内容,本文没有示例程序和命令行,下一篇会给出实例。
发展历程
机器人编程
什么是机器人编程?
机器人拥有传感器和传动器(电动机)和一个计算单元的机器,机器人程序设计便是为机器人大脑编写程序的过程。
机器人编程特性
- 线程化,机器人拥有多个传感器和作动器,我们可能需要兼容多线程编程的语言来实现在不同的线程中使用不同的传感器和作动器,这就是所谓的多任务。各个线程相互通信,以便交换数据,感知环境。
- 面向对象编程,面向对象编程语言可以使程序更加模块化,可以被复制重用,代码维护也更容易。有助于机器人开发。
- 底层设备控制,如GPIO、引脚、串口、USB、SPI和I2C
- 简便
- 进程间通信,为了实现传感器和传动器之间的相互通信,我们可以使用多线程架构模型(如ROS)
- 性能和节省计算资源
- 开发社区知识
- 第三方库的可用性
为什么使用ROS
- ROS提供以下功能:
- 进程间消息传递功能。
- 类操作系统
- 支持高级编程语言
- 通用算法支持如SLAM(即时定位和地图构建)A*(路径规划算法)
- 大量命令行,工具,模拟器。可以进行数据可视化。
ROS通信机制及各概念
接下来让我们看一下ROS中的两个程序是如何通信的。
两个程序分别被标记为节点1和节点2。当程序启动时,节点就会和名为ROS Master的ROS节点通信,节点将所有信息发给ROS Master,包括它发送的消息类型,本节点路由信息等,发送信息的节点称为发布节点(Publisher),接收信息的节点称为订阅节点(Subscriber)ROS Master拥有在计算机上正在运行的所有发送节点和接收节点的信息。如果节点1发送某个名为S的数据,节点2正好订阅了此消息,那么ROS Master就向两个节点广播彼此的节点信息,帮助它们建立连接,这样两个节点就可以相互通信了。
消息:ROS节点彼此间相互传递不同类型的数据,读者可以自己定义消息类型。ROS的消息支持标准的数据类型(整型、浮点型、布尔型等),还包括数组、结构体、自定义的数据类型等等。
话题:消息通过一种类似于数据总线媒介传播称之为话题。
ROS节点:使用 ROS API进行运算的进程。
ROS Master:连接ROS节点的媒介程序,
如果一个ROS节点想通过话题广播信息,那么发送消息至话题即可。
形象类比
这里可以进行类比
话题相当于我们微信群,里面的每个人相当于一个节点,这些人都加入了这个群,等同于都订阅了这个话题,在这个群里发消息和别人通信传递信息。话题的名称相当于群名
ROS master相当于一个手机管家,他管着手机不让你轻易玩,你每次想要发送消息时必须要找管家要手机。
而节点对应安卓系统的软件,每个节点可以实现不同的功能,包能够将各个有联系的节点打包起来成一个类似文件夹的东西,在ROS中下载都是以包的形式下载。
包:
ROS程序包:是ROS软件的独立单元,又称之为“原子单元”。所有的源代码、数据文件、生成文件、依赖包和其他文件都放在程序包中。
下图是典型的程序包文件夹
ROS元包:记录服务于同一应用的一组程序包的相关代码,只提供分组功能。
包清单:XML文件,涵盖了ROS程序包的所有基本信息,包括程序包的名称,描述,作者,依赖包。
消息记录包:消息记录包是一种用于保存和回放 ROS 消息数据的格式。消息记录包是检索传感器数据的重要机制,这些数据虽然很难收集,但是对于发展和测试算法很有必要。
ROS代码库:共享同一个版本控制系统一组ROS程序包的集合。
ROS服务:具有请求/应答机制,服务是一种根据客户节点的请求进行服务响应的功能,能够处理服务请求的节点称为服务节点,而请求服务的节点称为客户节点。与话题不同,服务是一次性消息通信。因此,当服务的请求和响应完成时,两个连接的节点将被断开。服务通常被用作请求机器人执行特定操作时使用的命令,或者用于根据特定条件需要产生事件的节点。
ROS参数服务器:指的是和ROS Master 一起运行的一个程序,可以存储不同的参数。
参数:就相当于一个多变量全局共享可访问的字典
话题和服务区别的讨论
Topic 发布一个消息后,就直接去执行后面的程序;而Service 调用一个服务,会一直等待结果。