近年来,机器人的智能化已经成为现代机器人发展的终极目标。随着人工智能技术发展,机器人发展的速度在不断提升,应用范围也在不断拓展至自动驾驶、服务机器人、信息机器人、无人机、农业机器人、工业机器人诸多领域。机器人系统是很多复杂算法模块的集合,如障碍物检测、行为决策、智能控制、环境识别等,机器人技术是一门跨学科、跨领域、需要许多先验知识的庞杂的学问,从零开始开发系统对技术人员要求非常高,而且工作量巨大。机器人不仅要实现基本的数据搜集与移动能力,还需要在对数据的有效分析、感知世界、实时通讯、智能思考并决策、协助或主导完成实际有效的工作等方面具备必要的技能。
笔者坚定的学习、推广、布道ROS的动力是源于失败的项目经历。笔者参与的第一个机器人项目并没有使用ROS,完全是从0开始,在经历大量的编码、测试、几经迭代后,初代机器人终究成了回忆。
图1-1 笔者参与的第一个机器人产品
ROS - Robot Operating System机器人操作系统并非传统意义的操作系统,而是在操作系统之上的一整套帮助开发者构建机器人应用的开源软件及工具集或者称之为次操作系统。它提供类似操作系统所提供的功能,包含硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间的消息传递、程序发行包管理,它也提供一些工具程序和库用于获取、建立、编写和运行多机整合的程序。从驱动程序到最先进的算法,以及强大的开发工具,ROS拥有您构建机器人项目所需的一切。作为运行于操作系统之上的框架,ROS的主要目标是为机器人研究和开发提供代码复用的支持,只需要管理与机器人相关的资源,控制机器人相关的逻辑,至于其他部分则交由操作系统来处理。
从软件架构的层面来说,ROS是一个基于消息传递的分布式的进程框架或者说是节点框架(Nodes)。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到数据包(Packages)和堆栈(Stacks)中,以便于共享和分发。ROS还支持代码库的联合系统。使得协作亦能被分发。这种从文件系统级别到社区一级的设计让独立地决定发展和实施工作成为可能。
为了顺利达成分发与协作目的,ROS框架有以下几个显著特性:
图1-2 点对点设计
图1-3 丰富的工具集
ROS系统是起源于2007年斯坦福大学人工智能实验室的项目与机器人技术公司Willow Garage的个人机器人项目(Personal Robots Program)之间的合作,最初的ROS版本主要解决了机器人各组件的通信问题。2008年之后就由Willow Garage来进行推动。2010年Willow Garage公司发布了开源机器人操作系统ROS(Robot Operating System),很快在机器人研究领域展开了学习和使用ROS的热潮。现如今ROS操作系统由Open Robotics承担主要的维护及推动工作。基于ROS标准且完善的通信机制,越来越多的机器人工具、算法集成到ROS中来,使其有了长足的发展。
图1-4 ROS历史
ROS的分支版本可以分为ROS、ROS-I以及ROS2。ROS的初衷是用于实验室与科研,它定义的原型是面向于服务机器人。因此,它有一些先天限制。例如针对于工业机械臂来说,ROS的实时性与鲁棒性并不能满足工业上的需求,因此在2013年有那么几家世界知名的机械臂厂家联合起来,开始着力对ROS进行改造,用线程代替进程,用差一点的模块化,换取系统的稳定性能与实时性能。他们把他们的版本命名为ROS-I,并制定了他们的准入门槛。ROS-I面向的是机械臂的解决方案,期望解决的问题是对于传统的焊接、塑型、喷涂等方面的现代化工艺改进,让产品线的升级改造的成本降低。尽管如此,ROS-I并不能满足大部分人的普遍性需求,解决不了落后技术带来的弊端。因此,从2015起,OSRF开始着手第二代机器人操作系统。ROS2是更符合机器人技术的发展,并且它具备更大的容量、可扩展性来容纳当下或者说未来对机器人的一些需求。
图1-5 ROS版本演进
图1-6 ROS2版本演进
尽管ROS的发展如火如荼,但其先天劣势,如实时性差、过分依赖Master主节点、严重依赖Ubuntu导致系统较为臃肿。ROS2在继承ROS优良特性的基础上解决了诸多关键问题:支持多机器人系统;支持微控制器;支持实时控制;跨系统平台支持以及填平原型与产品之间的鸿沟,缩短上市时间。
图1-7 ROS2与ROS架构对比
图1-8 ROS2通信框架
ROS2相较ROS运行更可靠,持续性更好,更节省资源,消息传递实时性更佳,因此ROS2更适合应用在工业生产环境。基于ROS2的以上特点,该框架被广泛应用与工厂AGV作业机器人、智能立体仓库、送餐及快递等服务机器人、自动驾驶、机械手智能控制等新兴智能机器人领域.
ROS2与ROS完全是独立的系统,学习ROS2并不需要ROS的基础,当然学习了ROS有了实战经验对于学习ROS2会有帮助。了解完ROS的前世今生,在下一章节我们安装ROS2系统并实现小乌龟模拟仿真。
从学习尝鲜的角度出发,选择最新的版本一定是正确的。但从产品开发的角度出发,选择稳定可靠且有较长生命周期的版本,才是不二之选。从ROS2的版本演进图中我们可以看到,Foxy是第一个长期支持的版本,我们采用这个版本进行环境搭建。
图2-1 Foxy版本Logo
本文是进行中机器人项目的开发记录笔记,因此我们直接使用产品中的主控设备Intel NUC阿特拉斯峡谷作为硬件平台搭载Ubuntu20.04作为操作系统。此款NUC性能功耗比好、接口丰富、加之体积小,完全胜任机器人控制工作。
尽管ROS2已实现跨平台,能够支持MacOS、Windows系统,但在实际工作产品中还是以Linux为主要的部署系统。此外,从目前可用的工具出发、诸多工具、算法包在Windows上使用不便,因此Linux还是优选系统。
图2-2 硬件平台
1.配置系统源服务器
安装ROS操作系统出现问题,99%是因为网络,剩余1%是因为环境及版本。
在正式安装前我们先来配置系统下载服务器。
打开软件和更新应用-下载自-中国-选择最佳服务器
图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文件
图2-4 配置源
4.安装ROS2 foxy
sudo apt update
sudo apt install ros-foxy-desktop
图2-5 安装foxy
与ROS(需要安装约2.5G的应用)相比,ROS2的应用体积要小很多,在网络畅通的情况下,很快可以安装完成。
5.安装效率工具
sudo apt install python3-argcomplete
图2-6 安装自动补齐工具
6.配置环境变量
echo “source /opt/ros/foxy/setup.bash” >> ~/.bashrc
将环境变量写入rc文件中,打开终端时可自动初始化环境变量。
图2-7 配置环境变量
7.测试
ROS2终端指令格式如下,我们在后续的章节中会用各种命令实现不同应用的控制。
ros2 run
打开两个终端,在其中一个终端输入如下命令,作为消息发送方;
ros2 run demo_nodes_cpp talker
另一个终端中,输入如下命令,作为消息接收方;
ros2 run demo_nodes_cpp listener
一切运行正常,则消息发送与消息接收对等出现。
图2-8 安装测试
海龟仿真器(Turtlesim)是ROS2中一个非常重要的入门级案例,通过海龟仿真,我们可以了解到很多ROS2的底层原理,涉及节点、话题、服务等核心概念。我们在后续章节都会以海龟仿真器为模板进行介绍。
1.安装
我们在安装ROS2选择了ros-foxy-desktop,turtlesim作为默认配套工具一并安装到系统中,我们可以通过下面的命令,检查安装是否成功。
ros2 pkg executables turtlesim
命令执行完成后,若出现如下内容,则说明安装成功。
图2-9 turtlesim安装校验
若系统中并未安装海龟模拟器,我们则通过以下命令进行安装。
sudo apt-get install ros-foxy-turtlesim
图2-10 turtlesim安装
2.启动
ros2 run turtlesim turtlesim_node
终端中输入如下命令启动仿真器。
图2-11 启动turtlesim
程序运行后,我们会看到仿真界面一只在海里游泳的海龟,应用会随机使用一个ROS2的logo作为显示海龟的位置,已经开启的系统终端中,也会显示海龟的名称及坐标。
图2-12 turtlesim仿真界面
3.让海龟动起来
我们再开启一个新终端,输入下面命令:
ros2 run turtlesim turtle_teleop_key
根据终端中提示,我们可以点击物理键盘控制海龟运动。需要注意的是,我们要让键盘控制节点一致处于激活状态。
图2-13 turtlesim运动控制
很好,我们已经成功让海龟运动起来,接下来使用如下命令查看仿真器后台到底运行了哪些功能,这些概念也会在后续章节中详细介绍。
ros2 node list
ros2 topic list
ros2 service list
ros2 action list
ros2 param list
图2-14 turtlesim后台服务
上一节中我们提到了节点(Node)、话题(Topic)、服务(Service)、参数(Parameters)以及动作(Action),这些都是ROS2系统中通信的基础概念及模型。每一个完成具体功能的模块称之为“节点”,例如控制车轮、获取雷达数据、获取视觉数据等,节点之间通过话题、服务、动作或者参数实现数据的收发。在本节中我们详细展开。
1.节点Node
节点,从本质上来说是一个可执行文件(C++或者Python)。它利用ROS2的通信网络能与其他节点进行通信(数据交互)。ROS中每一个节点应该负责一个单一的、模块化的功能。例如,一个节点用于控制电机,一个节点用于控制激光雷达。
ros2 run是启动节点的命令。
关于查看节点的命令,列出节点,及查看节点详细信息。
ros2 node list
ros2 node info <节点名称>
图2-16 ROS2节点信息
2.话题Topic
ROS2将复杂的系统分解成许多模块化的节点,话题(Topic)是ROS2通信中的重要元素,充当节点交换信息的总线,是一种发布订阅模型。如图所示:
图2-17 ROS2话题
话题通信模型有以下特点:
一个节点可以向任意数量的话题发布数据并同时订阅任意数量的话题。因为在ROS2中,所有的节点都是同一个级别。即可以实现一对多、多对一、多对多的通信模式。如图所示:
图2-18 ROS2话题一对多
关于话题的命令:
ros2 topic list #查看话题列表
ros2 topic echo#查看话题内容
ros2 topic info#查看话题详情
ros2 topic pub #发布指令
ros2 topic hz #查看话题发布周期
图2-19 ROS2话题指令
3.服务Service
之上提到的话题通信是基于订阅/发布机制的,无论有没有订阅者,发布者都会周期发布数据,这种模式适合持续数据的收发,比如传感器数据。机器人系统中还有另外一些配置性质的数据,并不需要周期处理,此时就可以用“服务”通信模型实现。服务是基于客户端/服务器模型的通信机制,服务器端只有在接收到客户端请求时才会提供反馈数据。
图2-20 ROS2服务
值得注意的是,在服务通信模型中,可以有多个客户端请求同一个服务器,但一个服务模型中,只可以存在一个服务器。
图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通信模型,但是不同之处在于,客户端可以随时取消动作。动作还提供稳定的反馈,而不是返回单一响应的服务。
图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#参数设置
例如我们查看海龟仿真器的参数,并将背景颜色由海蓝色改为天蓝色。
图2-23 ROS2设置参数
6.图形化展示
上面的内容中我们采用命令行方式实现人机交互,终端命令行具有较高的调试效率,其缺点是节点间关系没能直观呈现,rqt_graph图形化工具刚好可以弥补这一缺陷。
终端命令行输入:可以启动图形化工具,直观显示节点、话题、参数关系。
rqt_graph
图2-24 ROS2动作
至此,我们已成功安装ROS2环境,并且运行了海龟模拟器,成功让小海龟运动起来,同时我们也了解了ROS2系统的核心通信概念,ROS2系统功能强大远不止如此,我们仅完成了入门工作,也帮助我们更好的理解后续内容。
在下面的章节中,我们将介绍ROS2与OpenVINO™ 工具套件结合的利器--ros2_openvion_toolkit,我们将人工智能、深度学习引入到ROS2系统中。
英特尔 OpenVINO开发工具套件高级课程,原价99元,限时免费学习,点击立即报名https://bss.csdn.net/m/topic/intel_openvino/index/2/0?utm_source=wenzhang2