写点什么

ROS2:从初识到深入,探索机器人操作系统的进化之路

作者:梦笔生花
  • 2024-11-10
    四川
  • 本文字数:3377 字

    阅读完需:约 11 分钟

ROS2:从初识到深入,探索机器人操作系统的进化之路

前言

最近开始接触到基于 DDS 的这个系统,是在稚晖君的机器人项目中了解和认识到。于是便开始自己买书学习起来,感觉挺有意思的,但是只是单纯的看书籍,总会显得枯燥无味,于是自己又开始在网上找了一些视频教程结合书籍一起来看,便让我对 ROS 系统有了更深的认识和理解。

ROS 的发展历程

ROS 诞生于 2007 年的斯坦福大学,这是早期 PR2 机器人的原型,这个项目很快被一家商业公司 Willow Garage 看中,类似现在的风险投资一样,他们投了一大笔钱给这群年轻人,PR2 机器人在资本的助推下成功诞生。

2010 年,随着 PR2 机器人的发布,其中的软件正式确定了名称,就叫做机器人操作系统,Robot Operating System,简称为 ROS。

2014 年起,ROS 跟随 Ubuntu 系统,每两年推出一个长期支持版,每个版本支持五年时间,这标志着 ROS 的成熟,也让 ROS 加快了普及的步伐。

在 2022 年 5 月底,迎来了 ROS2 第一个长期支持版——ROS2 Humble,ROS2 已经成熟,我们也进入了一个全新的 ROS2 时代。

提高机器人软件复用率,这个目标简单来讲就是不要重新造轮子

围绕这个核心目标,ROS 在自身的设计上也尽量做到了模块化,由通信机制、开发工具、应用功能、生态系统四大部分组成。

ROS 的相关社区

ROS 全球社区有几个重要网站:

  • answers.ros.org:这是一个 ROS 问答网站,大家可以在上边提出任何关于 ROS 的问题,全球很多开发者都很乐意回答我们的问题;

  • wiki.ros.org,这是 ROS 的维基百科,记录了 ROS 教程和各种功能包的使用;

  • discourse.ros.org,这是 ROS 论坛,关于 ROS 开发的新鲜事都可以在这里发表和查看,比如 ROS 的活动、新功能包的发布等等。

  • index.ros.org,是 ROS 各种资源的一个索引网站;

  • packages.ros.org,是 ROS 功能包存储的数据库。

ROS 与 ROS2 的对比

ROS 最早的设计目标就是开发这样一款 PR2 家庭服务机器人,这款机器人绝大部分时间都是独立工作,为了让他具备充足的能力:

它搭载了工作站级别的计算平台和各种先进的通信设备,不用担忧算力不够,有足够的实力支持各种复杂的实时运算和处理;由于是单兵作战,通信绝大部分都自己内部完成,那就可以用有线连接,保证了良好的网络连接,没有丢数据或者黑客入侵的风险;这台机器人最终虽然小批量生产,但是由于高昂的成本和售价,也只能用于学术研究。

随着 ROS 的普及,应用 ROS 的机器人类型已经和 PR2 机器人有了天翻地覆的问题,也并不具备 PR2 这样的条件,那原本针对 PR2 设计的软件框架,就会出现一些问题,比如:要在资源有限的嵌入式系统中运行;要在有干扰的地方保证通信的可靠性;要做成产品走向市场,甚至用在自动驾驶汽车和航天机器人上。

类似的问题不断涌现,致使更加适合各种机器人应用的新一代 ROS2 顺势而生。

其具备以下优势:

  1. 多机器人系统:未来机器人一定不会是独立的个体,机器人和机器人之间也需要通信和协作,ROS2 为多机器人系统的应用提供了标准方法和通信机制。

  2. 跨平台:机器人应用场景不同,使用的控制平台也会有很大差异,比如自动驾驶汽车中的算力性能肯定比 AMR 机器人强很多,为了让所有机器人都可以运行 ROS2,ROS2 可以跨平台运行于 Linux、Windows、MacOS、RTOS,甚至是没有任何系统的微控制器(MCU)上,这样我们就不用纠结自己的控制器能不能用 ROS 了。

  3. 实时性:机器人运动控制和很多行为策略要求机器人具备实时性,比如机器人要可靠得在 100ms 内发现前方的行人,或者稳定的在 1ms 周期内完成运动学、动力学的解算,ROS2 为类似这样的实时性需求提供了基本保障。

  4. 网络连接:无论在怎样的网络环境下,ROS2 都可以尽量保障机器人大量数据的完整性和安全性,比如在 wifi 信号不好的时候数据也要尽力发送过去,在有黑客入侵风险的场景下要对数据进行加密解密。

  5. 产品化:,大量机器人已经走向我们的生活,未来还会越来越多,ROS2 不仅可以用于机器人研发阶段,还可以直接搭载在产品中,走向消费市场,这对 ROS2 的稳定性、强壮性也提除了巨大挑战。

  6. 项目管理:机器人开发是一个复杂的系统工程,设计、开发、调试、测试、部署等全流程的项目管理工具和机制,也会在 ROS2 中体现,更方便我们去开发一款机器人。

ROS2 推翻了 ROS,全部进行了重构。


  • 系统架构进行了颠覆性的变化,ROS1 中所有节点都需要在节点管理器 ROS Master 的管理下进行工作,一旦 Master 出现问题,系统就面临宕机的风险,ROS2 实现了真正的分布式,不再有 Master 这个角色,借助一种全新的通信框架 DDS,为所有节点的通信提供可靠保障。

  • 软件 API 进行了重新设计,ROS1 原有的接口已经无法满足需求,ROS2 结合 C++最新标准和 Python3 语言特性,设计了更具通用性的 API,虽然导致原有 ROS1 的代码无法直接在 ROS2 中运行,但是尽量保留了类似的使用方法,同时提供了大量移植的说明。

  • 编译系统进行了升级,ROS1 中使用的 rosbuild 和 catkin 问题诸多,尤其是针对代码较多的大项目以及 Python 编写的项目,编译、链接经常会出错,ROS2 对这些问题也进行了优化,重新优化后的编译系统叫做 ament 和 colcon。

DDS 的介绍

DDS 其实是物联网中广泛应用的一种通信协议,类似于我们常听说的 5G 通信一样,DDS 是一个国际标准,能够实现该标准的软件系统并不是唯一的,所以我们可以选择多个厂家提供的 DDS 系统,比如这里的 OpenSplice、FastRTPS,还有更多厂家提供的,每一家的性能不同,适用的场景也不同。

不过这就带来一个问题,每个 DDS 厂家的软件接口肯定是不一样的,如果我们按照某一家的接口写完了程序,想要切换其他厂家的 DDS,不是要重新写代码么?这当然不符合 ROS 提高软件复用率的目标。

为了解决这个问题,ROS2 设计了一个 ROS Middleware,简称 RMW,也就是指定一个标准的接口,比如如何发数据,如何收数据,数据的各种属性如何配置,都定义好了,如果厂家想要接入 ROS 社区,就得按照这个标准写一个适配的接口,把自家的 DDS 给移植过来,这样就把问题交给了最熟悉自家 DDS 的厂商。对于我们这些用户来讲,某一个 DDS 用的不爽,只要安装另一个,然后做一个简单的配置,程序一行的都不用改,轻松更换底层的通信系统。

总之,DDS 的加入,让 ROS2 系统更加稳定,也更加灵活,当然复杂度也会高一些。这样,我们不用再纠结 ROS 的通信系统是否稳定、该如何优化等问题,更多精力都可以放在其他三个部分,专注优化我们的机器人应用功能。

主要的核心概念:

ROS2 的安装

目前手上用的是 ubuntu20.04 版本的 PC,因而不是用最新版本的 ROS2,但安装的方法都是一摸一样的。

1.设置编码

$ 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 LANG=en_US.UTF-8 $ export LANG=en_US.UTF-8
复制代码

2.添加源

$ sudo apt update && sudo apt install curl gnupg lsb-release $ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg $ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
复制代码

在安装和配置 ROS 的过程中遇到类似这样的报错:

curl: (7) Failed to connect to raw.githubusercontent.com port 443 after 16 ms: Connection refused

就自己改一下 host

sudo vi /etc/hosts

3.安装 ROS

$ sudo apt update$ sudo apt upgrade$ sudo apt install ros-foxy-desktop
复制代码

4.设置环境变量

$ source /opt/ros/foxy/setup.bash$ echo " source /opt/ros/foxy/setup.bash" >> ~/.bashrc 
复制代码

至此,ROS2 就已经在系统中安装好了。

ROS2 的测试

先试试 ROS2 底层通信系统 DDS 是否正常

启动第一个终端,通过以下命令启动一个数据的发布者节点:

$ ros2 run demo_nodes_cpp talker

启动第二个终端,通过以下命令启动一个数据的订阅者节点:

$ ros2 run demo_nodes_py listener

看到一直报 hello world 就说明成功了。

ROS 的命令行

想要运行 ROS2 中某个节点,我们可以使用 ros2 run 命令进行操作

ros2 run turtlesim turtlesim_node

查看节点信息

ros2 node list

如果对某一个节点感兴趣,加上一个 info 子命令

ros2 node info /turtlesim

查看话题信息

ros2 topic list

看到某一个话题中的消息数据,加上 echo 子命令试一试

ros2 topic echo /turtle1/pose

构建开发环境

目前我都是用的 vscode,推荐以下插件使用:

  1. Python 插件

  2. C++插件

  3. CMake 插件

  4. vscode-icons

  5. ROS

  6. Msg Language Support

  7. URDF

  8. Markdown All in One

发布于: 刚刚阅读数: 6
用户头像

梦笔生花

关注

凡事预则立,不预则废! 2022-06-01 加入

某公司芯片AE工程师,嵌入式开发工程师,InfoQ签约作者,阿里云专家博主,华为云·云享专家,51CTO专家博主,腾讯云社区优秀共创官。

评论

发布
暂无评论
ROS2:从初识到深入,探索机器人操作系统的进化之路_机器人_梦笔生花_InfoQ写作社区