0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ROS的基本概念和系统架构 ROS的安装和简单测试

机器人技术与应用 来源:车路漫漫 2023-11-15 12:42 次阅读

作者:李慢慢

来源:微信公众号【车路漫漫】

前言:一直都觉得ROS很神秘,到底是个操作系统,仅凭称呼就让我望而却步了。但ROS和自动驾驶仿真有着千丝万缕的联系,作为仿真软件和智驾算法的数据桥梁,ROS是个绕不开的话题,所以还是得硬着头皮啃一啃。然后用大白话讲给你听,最好再做两个小栗子,那可真是功德无量了。

本文将带领大家了解ROS的核心概念,为后续学习“使用ROS框架为自动驾驶仿真平台集成被控算法”打好基础。

1、ROS简介

ROS(Robot Operating System)是一个适用于机器人的开源框架,这个框架把原本松散的零部件耦合在了一起,为它们提供了通信架构。ROS虽然叫做操作系统,但是它却要安装在如Linux这种操作系统上才能运行。它的作用只是连接真正的操作系统(如Linux)和使用者自己开发的ROS应用程序(比如自动驾驶的感知、规划、决策等模块),所以它也算是个中间件,在基于ROS的应用程序之间建立起了沟通的桥梁。

cea75f12-82cd-11ee-939d-92fbcf53809c.png

所以,简单点说, ROS就是一个分布式的通信框架,帮助程序进程之间更方便地通信。

为了更形象的理解ROS的应用,这里从别的平台找到一个非常好的科普视频,供大家学习。

2、ROS的核心概念

在正式学习ROS之前,先介绍ROS的几个特性,即元操作系统、分布式通信机制、松耦合软件框架、丰富的开源功能库等,来帮大家建立一些感性的认识。

ROS是一个机器人领域的元操作系统。也就是说,它并不是真正意义上的操作系统,其底层的任务调度、编译、设备驱动等还是由它的原生操作系统Ubuntu/Linux完成。

ROS实际上是运行在Ubuntu/Linux上的亚操作系统 ,或者说软件框架,但提供硬件抽象、函数调用、进程管理这些类似操作系统的功能,也提供用于获取、编译、跨平台的函数和工具。

ROS的核心思想就是将机器人的软件功能做成一个个节点,节点之间通过互相发送消息进行沟通。这些节点可以部署在同一台主机上,也可以部署在不同主机上,甚至还可以部署在互联网上。ROS网络通信机制中的主节点(master)负责对网络中各个节点之间的通信过程进行管理调度,同时提供一个用于配置网络中全局参数的服务。

ROS是松耦合软件框架,利用分布式通信机制实现节点间的进程通信。ROS的软件代码以松耦合方式组织,开发过程灵活,管理维护方便。

3、从ROS1到ROS2

2007年,一家名为柳树车库(Willow Garage)的机器人公司发布了ROS,ROS集开源、免费、高复用、低耦合、工具丰富等等诸多优势于一身,一经推出便迅速吸引了大量的开发者、科研人员、硬件供应商的加入,形成了稳定且多样的机器人生态,水到渠成的ROS也成为了机器人领域的主流软件框架并流行至今。

自ROS诞生的十几年来,不管是机器人相关软件、硬件还是ROS社区都发生了天翻地覆的变化,加之原本的ROS存在一些设计上的先天性缺陷,在各种内外因素叠加下,导致老ROS在许多应用场景下都已经显得力不从心了。此背景下,官方于2017正式推出了新一代机器人操作系统——ROS2(区别于老ROS,即ROS1),ROS2基于全新的设计框架,保留了ROS1的优点并改进其缺陷,以适应新时代的新需求。

ROS2是全新一代机器人操作系统,不只是功能增强的ROS1。

所以,我们还是直接就学习ROS2吧。

4、ROS的发行版本

ROS最初是基于Ubuntu系统开发的,ROS的发行版本名称也和Ubuntu采用了同样的规则,即版本名称由两个相同首字母的英文单词组成,版本首字母按字母表递增顺序选取,以下列表为ROS2各不同发布版本的简单说明。

发行版 发布日期 停止维护日期
Iron Irwini 2023 年 5 月 23 日 2024 年 11 月
Iron Irwini 2023 年 5 月 23 日 2024 年 11 月
Humble Hawksbill 2022 年 5 月 23 日 2027 年 5 月
Galactic Geochelone 2021 年 5 月 23 日 2022 年 11 月
Foxy Fitzroy 2020 年 6 月 5 日 2023 年 5 月
Eloquent Elusor 2019 年 11 月 22 日 2020 年 11 月
Dashing Diademata 2019 年 5 月 31 日 2021 年 5 月
Crystal Clemmys 2018 年 12 月 14 日 2019 年 12 月
Bouncy Bolson 2018 年 7 月 2 日 2019 年 7 月
Ardent Apalone 2017 年 12 月 8 日 2018 年 12 月

5、ROS的学习方法

要想学好以及用好ROS,需要进行大量的实践操作。因此在快速了解ROS的核心概念和编程范式后,就要结合大量的实际项目来深入理解ROS。ROS的学习资源主要有以下几个:

官网:www.ros.org

源码:github.com

Wiki:wiki.ros.org

问答:answers.ros.org

6、ROS系统架构

由于ROS的架构比较复杂,为了后面容易理解遇到的各种概念,这里先讨论一下ROS的系统架构,好让大家对ROS中的各种概念有全面性把控。按照官方的说法,可以分别从计算图文件系统开源社区视角来理解ROS架构。

6.1、从计算图视角理解ROS架构

ROS中可执行程序的基本单位叫 节点 (node),节点之间通过消息机制进行通信,这样就组成了一张网状图,也叫计算图,如下图所示。

cebe9696-82cd-11ee-939d-92fbcf53809c.png

节点是可执行程序,通常也叫进程。

ROS功能包中创建的每个可执行程序在被启动加载到系统进程中后,就是一个ROS节点,如上图中的节点1、节点2、节点3等。

节点之间通过收发消息进行通信,消息收发机制分为 话题 (topic)、 服务 (service)和 动作 (action)三种,如图1-3中的节点2与节点3、节点2与节点5采用话题通信,节点2与节点4采用服务通信,节点1与节点2采用动作通信。计算图中的节点、话题、服务、动作都要有唯一名称作为标识。

ROS利用节点将代码和功能解耦,提高了系统的容错性和可维护性。所以最好让每个节点都具有特定的单一功能,而不是创建一个包罗万象的庞大节点。如果用C++编写节点,需要用到ROS提供的roscpp库;如果用Python编写节点,需要用到ROS提供的rospy库。

主节点负责各个节点之间通信过程的调度管理。因此主节点必须要最先启动,可以通过roscore命令启动。

消息是构成计算图的关键,包括消息机制和消息类型两部分:消息机制有话题、服务和动作三种,每种消息机制中传递的数据都具有特定的数据类型(即消息类型);消息类型可分为话题消息类型、服务消息类型和动作消息类型;

数据包 (rosbag)是ROS中专门用来保存和回放话题中数据的文件,可以将一些难以收集的传感器数据用数据包录制下来,然后反复回放来进行算法性能调试。

参数服务器能够为整个ROS网络中的节点提供便于修改的参数。参数可以认为是节点中可供外部修改的全局变量,有静态参数和动态参数。静态参数一般用于在节点启动时设置节点工作模式;动态参数可以用于在节点运行时动态配置节点或改变节点工作状态,比如电机控制节点里的PID控制参数。

6.2、从文件系统视角理解ROS架构

ROS程序的不同组件要放在不同的文件夹中,这些文件夹根据不同的功能对文件进行组织,这就是ROS的文件系统结构,如下图所示。

cec705b0-82cd-11ee-939d-92fbcf53809c.png

工作空间是一个包含功能包、编译包和编译后可执行文件的文件夹,用户可以根据自己的需要创建多个工作空间,在每个工作空间中开发不同用途的功能包。在上图中,我们创建了一个名为catkin_ws的工作空间,其中包含src、build和devel三个文件夹。

src文件夹 放置各个功能包和配置功能包的CMake配置文件CMakeLists.txt。这里说明一下,由于ROS中的源码采用catkin工具进行编译,而catkin工具又基于CMake技术,所以我们在src源文件空间和各个功能包中都会见到一个CMake配置文件CMakeLists.txt,这个文件起到配置编译的作用。

build文件夹 放置编译CMake和catkin功能包时产生的缓存、配置、中间文件等。

devel文件夹 放置编译好的可执行程序,这些可执行程序是不需要安装就能直接运行的。一旦功能包源码编译和测试通过后,可以将这些编译好的可执行文件直接导出与其他开发人员分享。

功能包是ROS中软件组织的基本形式,具有创建ROS程序的最小结构和最少内容,它包含ROS节点源码、脚本、配置文件等。

CMakeLists.txt是功能包配置文件,用于编译Cmake功能包编译时的编译配置。

package.xml是功能包清单文件,用xml的标签格式标记该功能包的各类相关信息,比如包的名称、开发者信息、依赖关系等,主要是为了使功能包的安装和分发更容易。

include/是功能包头文件目录,可以把功能包程序中包含的*.h头文件放在这里。include目录之所以还要加一级路径是为了更好地区分自己定义的头文件和系统标准头文件,用实际功能包的名称替代。不过这个文件夹不是必要项,比如有些程序没有头文件。

msg、srv和action这三个文件夹分别用于存放非标准话题消息、服务消息和动作消息的定义文件。ROS支持用户自定义消息通信过程中使用的消息类型。这些自定义消息不是必要的,比如程序只使用标准消息类型。

scripts目录存放Bash、Python等脚本文件,为非必要项。

launch目录存放节点的启动文件,*.launch文件用于启动一个或多个节点,在含有多个节点的大型项目中很有用,为非必要项。

src目录存放功能包节点所对应的源代码,一个功能包中可以有多个节点程序来完成不同的功能,每个节点程序都可以单独运行。这里src目录存放的是这些节点程序的源代码,你可以按需创建文件夹和文件来组织源代码,源代码可以用C++、Python等编写。

6.3、从开源社区视角理解ROS架构

ROS是开源软件,各个独立的网络社区分享和贡献软件及教程,形成了强大的ROS开源社区,如下图所示。

ced28e12-82cd-11ee-939d-92fbcf53809c.png

ROS的发展依赖于开源和共享的软件,这些代码由不同的机构共享和发布,比如GitHub源码共享、Ubuntu软件仓库发布、第三方库等。ROS的官方wiki是重要的文档讨论社区,在里面可以很方便地发布与修改相应的文档页面。ROS的answer主页里有大量ROS开发者的提问和回答,对ROS开发中遇到的各种问题的讨论很活跃。

7、ROS的安装及测试

7.1、更新软件源

再开始安装之前,强烈建议大家更新一下系统源(很多基础环境包都将从这里下载并安装)。我这里使用了阿里的源,更新方法如下:

首先需要备份一下原始的源列表文件

sudocp-rf/etc/apt/sources.list/etc/apt/sources.list.bak

然后开始编辑源列表文件:

sudo gedit /etc/apt/sources.list

将sources.list中原本的内容都删除,然后填入以下的内容后保存:

debhttp://mirrors.aliyun.com/ubuntu/jammymainrestricteduniversemultiverse
deb-srchttp://mirrors.aliyun.com/ubuntu/jammymainrestricteduniversemultiverse
debhttp://mirrors.aliyun.com/ubuntu/jammy-securitymainrestricteduniversemultiverse
deb-srchttp://mirrors.aliyun.com/ubuntu/jammy-securitymainrestricteduniversemultiverse
debhttp://mirrors.aliyun.com/ubuntu/jammy-updatesmainrestricteduniversemultiverse
deb-srchttp://mirrors.aliyun.com/ubuntu/jammy-updatesmainrestricteduniversemultiverse
debhttp://mirrors.aliyun.com/ubuntu/jammy-proposedmainrestricteduniversemultiverse
deb-srchttp://mirrors.aliyun.com/ubuntu/jammy-proposedmainrestricteduniversemultiverse
debhttp://mirrors.aliyun.com/ubuntu/jammy-backportsmainrestricteduniversemultiverse
deb-srchttp://mirrors.aliyun.com/ubuntu/jammy-backportsmainrestricteduniversemultiverse

注意:虽然同为阿里源,但也有针对系统的不同源版本,我的Ubuntu系统是jammy版本,阿里源也应该是这个版本。然后根据这个源更新自己系统里的软件:

sudoapt-getupdate
sudoapt-getupgrade

这个过程应该要挺久,但运行完毕不应该报错才行,有任务错误请自行度娘。

然后就是根据官方的教程进行ROS2的安装。官方的安装教程链接如下:

https://docs.ros.org/en/humble/Installation.html

7.2、检查操作系统语言环境

在ROS2官方的文档中,安装ROS2之前需要首先检查操作系统语言环境。官方解释:确保你有一个支持UTF - 8的语言环境。如果你处在一个极小的环境(例如一个Docker容器)中,那么这个语言环境可能和POSIX一样是极小的。我们通过以下设定进行检验。

我们可以Ctrl+Alt+T调出终端,输入locale检查是否支持 UTF-8,若不支持,则需要继续执行下边的指令进行设置:

locale#检查是否支持UTF-8
sudoaptupdate&&sudoaptinstalllocales
sudolocale-genen_USen_US.UTF-8
sudoupdate-localeLC_ALL=en_US.UTF-8LANG=en_US.UTF-8
exportLANG=en_US.UTF-8
locale#验证设置是否正确

7.3、Ubuntu universe存储库设置与启动

在设置ROS2软件源之前,我们需要首先启动Ubuntu universe存储库,启动Ubuntu universe存储库我们可以通过打开终端通过命令行进行操作。

根据官方文档,我们可以在命令行输入下面的指令来进行Ubuntu universe存储库的启动:

sudoaptinstallsoftware-properties-common
sudoadd-apt-repositoryuniverse

7.4、设置ROS软件源

通过下面的命令,首先将ROS 2 apt存储库更新添加到系统,然后通过apt授权ROS 2的GPG密钥:

sudoaptupdate&&sudoaptinstallcurl
sudocurl-sSLhttps://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$(./etc/os-release&&echo$UBUNTU_CODENAME)main"|sudotee/etc/apt/sources.list.d/ros2.list>/dev/null

7.5、安装ROS2

设置完存储库后,首先通过下面的指令更新apt存储库缓存

sudoaptupdate

由于ROS 2建立在频繁更新的Ubuntu系统上。所以官方建议在安装新的软件包之前确保您的系统是最新的。我们可以通过下面的指令更新升级已安装的软件

sudoaptupgrade

ROS安装版本选择及安装指令:

ROS2桌面版安装(官方推荐),包括:ROS、Rviz、官方demo、教程

sudoaptinstallros-humble-desktop

ROS2基础版安装(裸机),包括:通信库、消息包、命令行工具等,但没有GUI工具。

sudoaptinstallros-humble-ros-base

这里我们安装桌面版ROS2 ,输入以下的安装指令即可:

sudoaptinstallros-humble-desktop

7.6、环境配置

官方文档给出了环境配置的方法,在终端下执行ROS2程序之前,要调用下面的命令进行环境配置,才可正确执行程序

#Replace".bash"withyourshellifyou'renotusingbash
#Possiblevaluesare:setup.bash,setup.sh,setup.zsh
source/opt/ros/humble/setup.bash

对于官方的环境配置方法,由于每次打开新的终端,都需要进行环境的配置,这降低了开发和测试的效率,为了避免每次打开新的终端都进行环境配置这个问题,我们可以将配置环境指令通过下面的指令写入 ”~/.bashrc“ 文件,那么每次新启动终端时,就不需要在手动配置环境:

#将配置环境指令通过下面的指令写入”~/.bashrc“文件
echo"source/opt/ros/humble/setup.bash">>~/.bashrc
#查看”~/.bashrc“文件
sudogedit~/.bashrc

至此,我们完成了ROS2的安装与环境配置,接下来我们进行ROS2的环境测试。

8、ROS操作系统的使用案例

8.1、案例1-talker和listener

我们需要以此打开两个终端窗口,各输入以下一条指令。

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

ros2rundemo_nodes_cpptalker

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

ros2rundemo_nodes_pylistener

如果“Hello World”字符串在两个终端中正常传输,说明通信系统没有问题。如下所示:

cee469fc-82cd-11ee-939d-92fbcf53809c.png

8.2、案例2-小乌龟

在我们安装的ROS2桌面完整版中,内置了一些案例,我们可以运行这些案例来测试ROS2的安装与配置是否正常。在这里,我们选用ROS2经典的小乌龟案例来进行演示,实操如下:

使用快捷键‘Ctrll+Alt+T’分别打开两个终端,并分别输入下面两个命令:

#启动第一个终端
#启动乌龟GUI节点界面,乌龟可以在界面中运动
ros2runturtlesimturtlesim_node
#启动第二个终端
#启动键盘控制节点,可以通过键盘控制乌龟运动
ros2runturtlesimturtle_teleop_key

运行效果的界面如下:

cef03368-82cd-11ee-939d-92fbcf53809c.png

9、结语

本文初步完成了ROS基本概念的学习,并完成了安装和简单测试。后续将继续基于ROS和Carla,完成自定义节点的设置,并集成其他平台的开源自动驾驶算法,以搭建更为完善的自动驾驶仿真测试平台,欢迎大家持续关注。

文章来源:车路漫漫

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器人
    +关注

    关注

    210

    文章

    28266

    浏览量

    206722
  • Linux
    +关注

    关注

    87

    文章

    11236

    浏览量

    209024
  • 操作系统
    +关注

    关注

    37

    文章

    6753

    浏览量

    123223
  • 自动驾驶
    +关注

    关注

    783

    文章

    13716

    浏览量

    166216
  • ROS
    ROS
    +关注

    关注

    1

    文章

    276

    浏览量

    16984

原文标题:9、结语

文章出处:【微信号:robotmagazine,微信公众号:机器人技术与应用】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    NXP的芯片安装Linux和ROS 是否可以?

    NXP的芯片安装Linux和ROS 是否可以?寻求合作目前我公司在过一个项目需要NXP芯片安装Linux和机器人操作系统ROS,请求论坛里的
    发表于 09-04 08:48

    超详细 ROS安装教程

    关于ROS(Robot OS 机器人操作系统),估计看这个博文的大兄弟之前已经都知道是啥了,我就不咋呼了...对于ROS安装,在它的官方网站: http://wiki.
    发表于 05-16 19:35

    ROS简介

    目录一、ROS简介1、什么是ROS2、ROS产生、发展和壮大的原因和意义二、在Ubuntu系统中,安装对应版本的
    发表于 12-17 08:24

    什么是ROSROS产生、发展和壮大的原因和意义

    机器人操作系统ROS)入门(嵌入式系统应用开发)一、ROS 基本问题1. 什么是 ROS2. ROS
    发表于 12-17 06:08

    制作ROS上位机小车系列

    系统安装本项目采用的系统配置为ubuntu 16.04+ROS Kinetic,采用的是工控机(大家也可以使用树莓派,这部分的安装参考博客
    发表于 01-20 07:52

    如何安装ROS

    如何安装ROS
    发表于 03-02 09:30

    在FirePrime开发板上编译安装ROS jade

      先简单介绍一下ROS吧。参考ROS百度百科,ROS即机器人操作系统,但并不是一个真正的操作系统
    发表于 07-07 11:21

    搭建ARM+ROS的硬件载体之ROS的移植及测试方法

    arm64架构)  如下所示。  下载命令如下所示,《tags》填入上图的字符串。  3. 下载ROS镜像  根据项目需求选择合适的ROS镜像,本例以kinetic-ros-core为
    发表于 03-09 13:55

    ROS教程之ROS机器人操作系统基础知识概述资料免费下载

    ROS文件系统介绍 (1)快速了解ROS文件系统概念 • 软件包集(Stack):如果你将几个具有某些功能的软件包组织在一起,那么你将会
    发表于 10-15 08:00 18次下载
    <b class='flag-5'>ROS</b>教程之<b class='flag-5'>ROS</b>机器人操作<b class='flag-5'>系统</b>基础知识概述资料免费下载

    ROS学习笔记之ROS基本概念

    ROS概念分为三个层次:文件系统层、计算图层、社区层,这些层次以及概念将会在接下来的章节介绍。 除了这三个层次的概念
    的头像 发表于 05-19 17:11 1663次阅读
    <b class='flag-5'>ROS</b>学习笔记之<b class='flag-5'>ROS</b><b class='flag-5'>基本概念</b>

    ROS1的通信架构的基础通信方式及相关概念

    ROS的通信架构ROS的灵魂所在,它包括数据处理,进程运行,消息传递等** 。这篇文章主要介绍ROS1的通信架构的基础通信方式和相关
    的头像 发表于 05-19 17:23 3391次阅读
    <b class='flag-5'>ROS</b>1的通信<b class='flag-5'>架构</b>的基础通信方式及相关<b class='flag-5'>概念</b>

    实现ARM+ROS(机器人操作系统)之运行ROS

    如何低成本搭建ARM+ROS的硬件载体?上文展示ROS部署前的筹备工作及步骤分解,本文将为大家演示ROS的移植及测试方法。
    的头像 发表于 10-10 18:15 1227次阅读
    实现ARM+<b class='flag-5'>ROS</b>(机器人操作<b class='flag-5'>系统</b>)之运行<b class='flag-5'>ROS</b>!

    ros基本概念是什么

    基本概念ROS是一个用于在不同进程间匿名的发布、订阅、传递信息的中间件。 ROS2系统的核心部分是ROS网络(
    的头像 发表于 11-27 11:21 1757次阅读

    ROS2中自带例程测试

    如果你是一个ROS2的开发者,可能对刚才我们使用的ROS2命令比较熟悉,这时你可能也会产生一个问题:我们之前也安装ROS2系统,那
    的头像 发表于 11-28 16:29 926次阅读
    <b class='flag-5'>ROS</b>2中自带例程<b class='flag-5'>测试</b>

    在TogetherROS中如何安装ROS2功能包

    ,这里我们就把ROS2必要的功能包都安装一下,让系统的功能模块更加完整。 熟悉ROS2的同学,应该对这些指令并不陌生,和ROS2官方手册中的
    的头像 发表于 12-01 16:02 947次阅读
    在TogetherROS中如何<b class='flag-5'>安装</b><b class='flag-5'>ROS</b>2功能包