ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战

一、ROS的前世今生

近年来,机器人的智能化已经成为现代机器人发展的终极目标。随着人工智能技术发展,机器人发展的速度在不断提升,应用范围也在不断拓展至自动驾驶、服务机器人、信息机器人、无人机、农业机器人、工业机器人诸多领域。机器人系统是很多复杂算法模块的集合,如障碍物检测、行为决策、智能控制、环境识别等,机器人技术是一门跨学科、跨领域、需要许多先验知识的庞杂的学问,从零开始开发系统对技术人员要求非常高,而且工作量巨大。机器人不仅要实现基本的数据搜集与移动能力,还需要在对数据的有效分析、感知世界、实时通讯、智能思考并决策、协助或主导完成实际有效的工作等方面具备必要的技能。

笔者坚定的学习、推广、布道ROS的动力是源于失败的项目经历。笔者参与的第一个机器人项目并没有使用ROS,完全是从0开始,在经历大量的编码、测试、几经迭代后,初代机器人终究成了回忆。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第1张图片

图1-1 笔者参与的第一个机器人产品

1.1 什么是ROS

ROS - Robot Operating System机器人操作系统并非传统意义的操作系统,而是在操作系统之上的一整套帮助开发者构建机器人应用的开源软件及工具集或者称之为次操作系统。它提供类似操作系统所提供的功能,包含硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间的消息传递、程序发行包管理,它也提供一些工具程序和库用于获取、建立、编写和运行多机整合的程序。从驱动程序到最先进的算法,以及强大的开发工具,ROS拥有您构建机器人项目所需的一切。作为运行于操作系统之上的框架,ROS的主要目标是为机器人研究和开发提供代码复用的支持,只需要管理与机器人相关的资源,控制机器人相关的逻辑,至于其他部分则交由操作系统来处理。

从软件架构的层面来说,ROS是一个基于消息传递的分布式的进程框架或者说是节点框架(Nodes)。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到数据包(Packages)和堆栈(Stacks)中,以便于共享和分发。ROS还支持代码库的联合系统。使得协作亦能被分发。这种从文件系统级别到社区一级的设计让独立地决定发展和实施工作成为可能。

为了顺利达成分发与协作目的,ROS框架有以下几个显著特性:

  • 1.小型化:ROS尽可能设计的很小,不封装main() 函数,这样的优势是ROS编写的代码可以轻松的在其它机器人软件平台上使用,可以轻松集成在其它机器人软件平台:ROS已经可以与OpenRAVE,Orocos和Player集成。
  • 2.点对点设计:ROS进程存在于多个不同的主机并且在运行过程中通过端对端的拓扑结构进行联系。虽然基于中心服务器的那些软件框架也可以实现多进程和多主机的优势,但是在这些框架中,当各电脑通过不同的网络进行连接时,中心数据服务器就会发生问题。ROS的点对点设计以及服务和节点管理器等机制可以分散由计算机视觉和语音识别等功能带来的实时计算压力,能够适应多机器人遇到的挑战。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第2张图片

图1-2 点对点设计

  • 3.不敏感库:首选开发模型都是用不依赖ROS的干净的库函数编写而成。可扩展:ROS可以适用于大型运行时系统和大型开发进程。
  • 4.语言独立:ROS框架可以简单地使用任何的现代编程语言实现,当下已经支持已Python、C++、 Lisp、Java 和 Lua语言
  • 5.开源开放:吸引了大量的开发者参与其中,营造了极佳的生态环境。
  • 6.工具丰富:为了管理复杂的软件框架,ROS利用了大量的小工具去编译和运行多种多样的组件,而不是构建一个庞大的开发和运行环境。此外,ROS内建一个了叫做rostest的单元、集成测试框架,可以轻松安装或卸载测试模块。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第3张图片

图1-3 丰富的工具集

1.2 ROS历史与发展

ROS系统是起源于2007年斯坦福大学人工智能实验室的项目与机器人技术公司Willow Garage的个人机器人项目(Personal Robots Program)之间的合作,最初的ROS版本主要解决了机器人各组件的通信问题。2008年之后就由Willow Garage来进行推动。2010年Willow Garage公司发布了开源机器人操作系统ROS(Robot Operating System),很快在机器人研究领域展开了学习和使用ROS的热潮。现如今ROS操作系统由Open Robotics承担主要的维护及推动工作。基于ROS标准且完善的通信机制,越来越多的机器人工具、算法集成到ROS中来,使其有了长足的发展。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第4张图片

图1-4 ROS历史

ROS的分支版本可以分为ROS、ROS-I以及ROS2。ROS的初衷是用于实验室与科研,它定义的原型是面向于服务机器人。因此,它有一些先天限制。例如针对于工业机械臂来说,ROS的实时性与鲁棒性并不能满足工业上的需求,因此在2013年有那么几家世界知名的机械臂厂家联合起来,开始着力对ROS进行改造,用线程代替进程,用差一点的模块化,换取系统的稳定性能与实时性能。他们把他们的版本命名为ROS-I,并制定了他们的准入门槛。ROS-I面向的是机械臂的解决方案,期望解决的问题是对于传统的焊接、塑型、喷涂等方面的现代化工艺改进,让产品线的升级改造的成本降低。尽管如此,ROS-I并不能满足大部分人的普遍性需求,解决不了落后技术带来的弊端。因此,从2015起,OSRF开始着手第二代机器人操作系统。ROS2是更符合机器人技术的发展,并且它具备更大的容量、可扩展性来容纳当下或者说未来对机器人的一些需求。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第5张图片

图1-5 ROS版本演进 

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第6张图片

图1-6 ROS2版本演进 

1.3 ROS2的特点

尽管ROS的发展如火如荼,但其先天劣势,如实时性差、过分依赖Master主节点、严重依赖Ubuntu导致系统较为臃肿。ROS2在继承ROS优良特性的基础上解决了诸多关键问题:支持多机器人系统;支持微控制器;支持实时控制;跨系统平台支持以及填平原型与产品之间的鸿沟,缩短上市时间。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第7张图片

图1-7 ROS2与ROS架构对比

  • 1.ROS2引入了数据分发服务(DDS)通信协议,它可以零拷贝的方式传递消息,节省了CPU和内存资源,同时增加通信的实时性;ROS2为托管启动,用户可以指定节点启动顺序;ROS2去除了ros master这个中心节点管理器,改进了ROS对master节点的高度依赖的缺点;
  • 2.ROS2为托管启动,用户可以指定节点启动顺序;
  • 3.ROS2去除了ros master这个中心节点管理器,改进了ROS对master节点的高度依赖的缺点;

1.4 ROS2 通信框架

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第8张图片

 图1-8 ROS2通信框架

  • 1.参与者(Domain Participant):一个参与者Participant就是一个容器,对应于一个使用DDS的用户,任何DDS的用户都必须通过Participant来访问全局数据空间;
  • 2.发布者(Publisher):数据发布的执行者,支持多种数据类型的发布,可以与多个数据写入器(DataWriter)相联,发布一种或多种主题(Topic)的消息;
  • 3.订阅者(Subscriber):数据订阅的执行者,支持多种数据类型的订阅,可以与多个数据读取器(DataReader)相联,订阅一种或多种主题(Topic)的消息;
  • 4.数据写入器(DataWriter):应用向发布者更新数据的对象,每个数据写入器对应一个特定的Topic,类似于ROS1中的一个消息发布者;
  • 5.数据读取器(DataReader):应用从订阅者读取数据的对象,每个数据读取器对应一个特定的Topic,类似于ROS1中的一个消息订阅者;
  • 6.主题(Topic):这个和ROS1中的Topic概念一致,一个Topic包含一个名称和一种数据结构;
  • 7.QoS Policy:Quality of Service,质量服务原则,这个模块在ROS1中可从没见过,看名称就猜测应该是负责数据质量的。QoS是DDS中非常重要的一环,控制了各方面与底层的通讯机制,主要从时间限制、可靠性、持续性、历史记录几个方面,满足用户针对不同场景的数据应用需求。

ROS2相较ROS运行更可靠,持续性更好,更节省资源,消息传递实时性更佳,因此ROS2更适合应用在工业生产环境。基于ROS2的以上特点,该框架被广泛应用与工厂AGV作业机器人、智能立体仓库、送餐及快递等服务机器人、自动驾驶、机械手智能控制等新兴智能机器人领域.

ROS2与ROS完全是独立的系统,学习ROS2并不需要ROS的基础,当然学习了ROS有了实战经验对于学习ROS2会有帮助。了解完ROS的前世今生,在下一章节我们安装ROS2系统并实现小乌龟模拟仿真。

二、ROS2环境搭建

2.1 版本选择

从学习尝鲜的角度出发,选择最新的版本一定是正确的。但从产品开发的角度出发,选择稳定可靠且有较长生命周期的版本,才是不二之选。从ROS2的版本演进图中我们可以看到,Foxy是第一个长期支持的版本,我们采用这个版本进行环境搭建。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第9张图片

图2-1 Foxy版本Logo

2.2 系统平台

本文是进行中机器人项目的开发记录笔记,因此我们直接使用产品中的主控设备Intel NUC阿特拉斯峡谷作为硬件平台搭载Ubuntu20.04作为操作系统。此款NUC性能功耗比好、接口丰富、加之体积小,完全胜任机器人控制工作。

尽管ROS2已实现跨平台,能够支持MacOS、Windows系统,但在实际工作产品中还是以Linux为主要的部署系统。此外,从目前可用的工具出发、诸多工具、算法包在Windows上使用不便,因此Linux还是优选系统。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第10张图片

图2-2 硬件平台

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第11张图片

2.3 ROS2 安装

1.配置系统源服务器

安装ROS操作系统出现问题,99%是因为网络,剩余1%是因为环境及版本。

在正式安装前我们先来配置系统下载服务器。

打开软件和更新应用-下载自-中国-选择最佳服务器

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第12张图片

图2-3 配置下载服务器

若遇到不能正常下载,可以尝试使用清华ROS2镜像,配置参考如下网址: https://mirrors.tuna.tsinghua.edu.cn/help/ros2/

2.配置环境支持UTF-8编码

sudo apt update && sudo apt install locales

sudo locale-gen en_US en_US.UTF-8

sudo update-locale LC_ALL=en_US.UTF-8.UTF-8

export.UTF-8

3.设置软件源,添加apt仓库

sudo apt update && sudo apt install curl gnupg2 lsb-release

curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

sudo sh -c 'echo "deb [arch=$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list

命令执行成功后在系统/etc/apt/source.list.d文件夹中将出现ros2-lastest.list文件

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第13张图片

图2-4 配置源

4.安装ROS2 foxy

sudo apt update

sudo apt install ros-foxy-desktop

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第14张图片

图2-5 安装foxy

与ROS(需要安装约2.5G的应用)相比,ROS2的应用体积要小很多,在网络畅通的情况下,很快可以安装完成。

5.安装效率工具

sudo apt install python3-argcomplete

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第15张图片

图2-6 安装自动补齐工具

6.配置环境变量

echo “source /opt/ros/foxy/setup.bash” >> ~/.bashrc

将环境变量写入rc文件中,打开终端时可自动初始化环境变量。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第16张图片

图2-7 配置环境变量

7.测试

ROS2终端指令格式如下,我们在后续的章节中会用各种命令实现不同应用的控制。

ros2 run 

打开两个终端,在其中一个终端输入如下命令,作为消息发送方;

ros2 run demo_nodes_cpp talker

另一个终端中,输入如下命令,作为消息接收方;

ros2 run demo_nodes_cpp listener

一切运行正常,则消息发送与消息接收对等出现。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第17张图片

图2-8 安装测试

2.4 海龟仿真器

海龟仿真器(Turtlesim)是ROS2中一个非常重要的入门级案例,通过海龟仿真,我们可以了解到很多ROS2的底层原理,涉及节点、话题、服务等核心概念。我们在后续章节都会以海龟仿真器为模板进行介绍。

1.安装

我们在安装ROS2选择了ros-foxy-desktop,turtlesim作为默认配套工具一并安装到系统中,我们可以通过下面的命令,检查安装是否成功。

ros2 pkg executables turtlesim

命令执行完成后,若出现如下内容,则说明安装成功。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第18张图片

图2-9 turtlesim安装校验

若系统中并未安装海龟模拟器,我们则通过以下命令进行安装。

sudo apt-get install ros-foxy-turtlesim

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第19张图片

图2-10 turtlesim安装

2.启动

ros2 run turtlesim turtlesim_node

终端中输入如下命令启动仿真器。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第20张图片

图2-11 启动turtlesim

程序运行后,我们会看到仿真界面一只在海里游泳的海龟,应用会随机使用一个ROS2的logo作为显示海龟的位置,已经开启的系统终端中,也会显示海龟的名称及坐标。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第21张图片

图2-12 turtlesim仿真界面

3.让海龟动起来

我们再开启一个新终端,输入下面命令:

ros2 run turtlesim turtle_teleop_key

根据终端中提示,我们可以点击物理键盘控制海龟运动。需要注意的是,我们要让键盘控制节点一致处于激活状态。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第22张图片

图2-13 turtlesim运动控制

很好,我们已经成功让海龟运动起来,接下来使用如下命令查看仿真器后台到底运行了哪些功能,这些概念也会在后续章节中详细介绍。

ros2 node list

ros2 topic list

ros2 service list

ros2 action list

ros2 param list

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第23张图片

图2-14 turtlesim后台服务

2.5 关键的通信概念及模型

上一节中我们提到了节点(Node)、话题(Topic)、服务(Service)、参数(Parameters)以及动作(Action),这些都是ROS2系统中通信的基础概念及模型。每一个完成具体功能的模块称之为“节点”,例如控制车轮、获取雷达数据、获取视觉数据等,节点之间通过话题、服务、动作或者参数实现数据的收发。在本节中我们详细展开。

1.节点Node

节点,从本质上来说是一个可执行文件(C++或者Python)。它利用ROS2的通信网络能与其他节点进行通信(数据交互)。ROS中每一个节点应该负责一个单一的、模块化的功能。例如,一个节点用于控制电机,一个节点用于控制激光雷达。

ros2 run是启动节点的命令。

关于查看节点的命令,列出节点,及查看节点详细信息。

ros2 node list

ros2 node info <节点名称>

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第24张图片

图2-16 ROS2节点信息

2.话题Topic

ROS2将复杂的系统分解成许多模块化的节点,话题(Topic)是ROS2通信中的重要元素,充当节点交换信息的总线,是一种发布订阅模型。如图所示:

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第25张图片

图2-17 ROS2话题

话题通信模型有以下特点:

  • 1.话题名字是关键,发布订阅接口类型要相同,发布的是字符串,接受也要用字符串来接收;
  • 2.同一节点可以订阅多个话题,同时也可以发布多个话题;
  • 3.同一个话题可以有多个发布者;

一个节点可以向任意数量的话题发布数据并同时订阅任意数量的话题。因为在ROS2中,所有的节点都是同一个级别。即可以实现一对多、多对一、多对多的通信模式。如图所示:

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第26张图片

图2-18 ROS2话题一对多

关于话题的命令:

ros2 topic list  #查看话题列表

ros2 topic echo#查看话题内容

ros2 topic info#查看话题详情

ros2 topic pub  #发布指令

ros2 topic hz   #查看话题发布周期

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第27张图片

图2-19 ROS2话题指令

3.服务Service

之上提到的话题通信是基于订阅/发布机制的,无论有没有订阅者,发布者都会周期发布数据,这种模式适合持续数据的收发,比如传感器数据。机器人系统中还有另外一些配置性质的数据,并不需要周期处理,此时就可以用“服务”通信模型实现。服务是基于客户端/服务器模型的通信机制,服务器端只有在接收到客户端请求时才会提供反馈数据。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第28张图片

图2-20 ROS2服务

值得注意的是,在服务通信模型中,可以有多个客户端请求同一个服务器,但一个服务模型中,只可以存在一个服务器。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第29张图片

图2-21 ROS2服务

关于服务的指令:

ros2 service list  #查看服务列表

ros2 service info#查看服务详情

ros2 service type#查看服务的类型

ros2 service find   #查找特定类型的服务

ros2 service call         #通过终端发送服务请求

4.动作Action

“动作”是ROS2中用于长时间运行任务的一种通信类型,例如我们要让机械臂抓取一个物体,我们不仅要发出指令,还需要获取机械臂的实时反馈,在这种场景下我们就需要“动作”类型。“动作”主要由三部分组成:目标(goal)、反馈(feedback)以及结果(result)。动作通信建立在话题和服务之上,类似与服务的C/S通信模型,但是不同之处在于,客户端可以随时取消动作。动作还提供稳定的反馈,而不是返回单一响应的服务。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第30张图片

图2-22 ROS2动作

关于服务的指令:

ros2 action list  #查看动作列表

ros2 action info#查看动作详情

ros2 action send_goal#发送动作请求

5.参数Parameter

参数也是ROS2中很重要的一个概念,其主要作用是对节点功能进行配置。在ROS2中,每个节点都有自己的参数,这些参数可以用整型数、浮点数、布尔型数、字符串和列表来描述。

关于服务的指令:

ros2 param list  #查看参数列表

ros2 param info#查看某节点的参数详情

ros2 param set#参数设置

ros2 param get#参数设置

ros2 param dump#参数设置

例如我们查看海龟仿真器的参数,并将背景颜色由海蓝色改为天蓝色。

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第31张图片

图2-23 ROS2设置参数

6.图形化展示

上面的内容中我们采用命令行方式实现人机交互,终端命令行具有较高的调试效率,其缺点是节点间关系没能直观呈现,rqt_graph图形化工具刚好可以弥补这一缺陷。

终端命令行输入:可以启动图形化工具,直观显示节点、话题、参数关系。

rqt_graph

ROS2+OpenVINO 实践教程 - 上篇 | 开发者实战_第32张图片

图2-24 ROS2动作

至此,我们已成功安装ROS2环境,并且运行了海龟模拟器,成功让小海龟运动起来,同时我们也了解了ROS2系统的核心通信概念,ROS2系统功能强大远不止如此,我们仅完成了入门工作,也帮助我们更好的理解后续内容。

在下面的章节中,我们将介绍ROS2与OpenVINO™ 工具套件结合的利器--ros2_openvion_toolkit,我们将人工智能、深度学习引入到ROS2系统中。


英特尔 OpenVINO开发工具套件高级课程,原价99元,限时免费学习,点击立即报名icon-default.png?t=M276https://bss.csdn.net/m/topic/intel_openvino/index/2/0?utm_source=wenzhang2

你可能感兴趣的:(OpenVINO,opencv,人工智能)