惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
Security Latest
Security Latest
NISL@THU
NISL@THU
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
Cybersecurity and Infrastructure Security Agency CISA
Cloudbric
Cloudbric
T
Threat Research - Cisco Blogs
大猫的无限游戏
大猫的无限游戏
C
CXSECURITY Database RSS Feed - CXSecurity.com
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
雷峰网
雷峰网
C
Cisco Blogs
V
Vulnerabilities – Threatpost
S
Security Archives - TechRepublic
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
J
Java Code Geeks
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Know Your Adversary
Know Your Adversary
博客园 - 叶小钗
腾讯CDC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy International News Feed
P
Palo Alto Networks Blog
博客园_首页
V
V2EX
WordPress大学
WordPress大学
Schneier on Security
Schneier on Security
月光博客
月光博客
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News
TaoSecurity Blog
TaoSecurity Blog
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
The Cloudflare Blog
罗磊的独立博客
美团技术团队
N
News | PayPal Newsroom
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Last Week in AI
Last Week in AI
K
Kaspersky official blog
Google Online Security Blog
Google Online Security Blog
S
SegmentFault 最新的问题
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Tailwind CSS Blog

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录 2025 Python 版本性能测试 Flutter Hello World Flutter 安装环境配置 Ubuntu VMware 硬盘扩容后 SMBus Host controller not enabled 报错问题解决 Python NetworkX 教程 Docker GPU 报错 - Failed to initialize NVML Unknown Error 解决方案 Python matplotlib 图表绘制 cuda-toolkit 安装替代 Cuda 与 Cudnn Jinja2 Python 利用 docxtpl 和 Jinja2 生成基于模板的 Word 文档 Docker 实现 CPU 核心隔离 LoFTR 基于 Transformer 的特征提取匹配算法 OmniGlue 特征匹配 SuperGlue 使用图神经网络学习特征匹配 Ubuntu 下将 xlsx 文件按照 sheet 转换为 图片 Python 使用 SQLAlchemy Python FastAPI 教程 openwrt 软路由配置安装 Nav2 地图文件(PGM/YAML)规范标准 3D OBJ 模型转换为 glb 瓦片格式 Python 源码 Redis 数据库介绍 Ubuntu 22.04 内核自动升级导致 MongoDB 7.0.12 错误记录 ubuntu 20.04 安装 ROS Noetic ubuntu 18.04 安装 ROS Melodic VMware Workstation Pro 个人免费版下载、安装、使用指南 Hybrid A-star 路径规划 Reeds-Shepp 曲线 Dubins 曲线 Linux kvm 虚拟机网络不通的问题解决方法 Ubuntu 自动内存清理 BiliBili 缓存视频转 mp4 Python 求解线性规划 3D Gaussian Splatting 官方源码实践记录 ImageMagick 教程 Ubuntu 22.04 安装 Colmap 对数几率 odds Ubuntu nmcli 网络管理工具使用指南 SuperPoint 自监督深度学习特征点提取 SyncTV Music Tag Web 在线音乐信息整理工具 ncm 格式转 mp3 MusicBrainz 音乐元数据百科数据库 Ubuntu 网络流量监控工具 私人云音乐平台 Navidrome 入门 手眼标定 四元数(Quaternions) OHTTPS 实现免费自动 https 证书申请、更新、部署 ubuntu 22.04 安装 CloudCompare 单机 KVM 虚拟机冷迁移 Ubuntu 22.04 使用 mdadm 实现软 raid 小鱼 一键安装 ROS-humble Fluid -46- 基于 Simpletex API 构建公式识别页面 公式识别 API 简介 -- Simpletex 使用 Python web 部署库 waitress 3D Gaussian Splatting for Real-Time Radiance Field Rendering Ubuntu Swap 简介与空间扩展 Ubuntu 24.04 安装 forticlient Clash Verge 使用 MongoDB 7.0.17 集群 Docker 构建源码 Error code - 2013. Lost connection to MySQL server during query 问题解决 Python 日志记录库 loguru 使用指北 Python 实现 Web 日志查看服务 MySQL LOAD DATA LOCAL INFILE 极速数据加载 Image size exceeds limit of 89478485 pixels 解决方案 Docker 使用 NVIDIA GPU 驱动错误解决 阿里云 docker 镜像仓库 Ubuntu中没有wired connected的解决方案 MinIO 简介 subconverter 代理订阅格式转换 修复 node –openssl-legacy-provider is not allowed in NODE_OPTIONS 错误
ROS2
Yiwei Zhang · 2024-07-10 · via 又见苍岚

ROS2(Robot Operating System 2)是一个用于机器人软件开发的开源工具套件,由非营利组织Open Source Robotics Foundation(OSRF)维护。它是ROS(Robot Operating System,机器人操作系统)的第二个主要版本,旨在提供更好的性能、更易于使用的API和更现代的软件架构。本文记录相关内容。

背景

机器人是一种高度复杂的系统性实现,机器人设计包含了机械结构设计、机械加工、硬件设计、嵌入式软件设计、上层软件设计等诸多模块,是各种硬件与软件的有机结合,甚至可以说机器人系统是当今工业体系的集大成者。机器人体系是相当庞大的,其复杂度之高,以至于没有任何个人、组织甚至公司能够独立完成系统性的机器人研发生产任务。

那么问题随之而来:既然机器人实现如此困难,那么我们应该如何开展相关工作呢?

一种合适的策略是——合作。让机器人研发者专注于自己擅长的领域,其他模块则直接复用相关领域更专业研发团队的实现,当然自身的研究也可以被他人继续复用*。*这种基于“复用”的分工协作,遵循了不重复发明轮子的原则,显然是可以大大提高机器人的研发效率的,尤其是随着机器人硬件越来越丰富,软件库越来越庞大,这种复用性和模块化开发需求也愈发强烈。

在此大背景下,便诞生了ROS。ROS是一套机器人通用软件框架,可以提升功能模块的复用性,并且随着ROS2的推出,ROS日臻完善,是机器人软件开发的不二之选。

简介

**ROS(Robot Operating System)**是用于构建机器人应用程序的软件开发工具包。ROS是开源的,它由一组软件库和若干工具组成。包括:

  • 硬件抽象
  • 底层设备控制
  • 常用函数的实现
  • 进程间消息传递
  • 包管理
  • 用于获取、编译、编写、和跨计算机运行代码所需的工具和库函数

在机器人领域,ROS是一个标准软件平台,这个平台为开发者提供了构建机器人应用程序所需的各个功能模块,并且开发者能够以“可插拔”的方式组织各个功能模块,无论开发者的程序是用于课堂实验、科学研究、原型设计或是最终产品,ROS都提供了一站式的技术支持。ROS 的主要目标是为机器人研究和开发提供代码复用的支持。简单来说就是避免重复造轮子。

因为ROS有程序包功能包概念,类比与C++python的库的概念,这些包易于被分享和发布,而且ROS也支持一种类似于代码储存库的联合系统,这个系统也可以实现工程的协作及发布。这个设计可以使一个工程的开发和实现完全模块化,同时,所有的工程都可以被ROS的基础工具整合在一起。

另外需要注意的是,ROS虽然字面意思是机器人操作系统,但是它并非经典意义上的操作系统,更准确的讲ROS是一个 SDK(Software Development Kit)也即软件开发工具包。

ROS 的优势

ROS是构建机器人的最快捷方式!

  • 开源

    ROS一直是开源的,并且将永远是开源的,以确保全世界的爱好者、开发人员可以自由、不受限制地访问高质量、一流、功能齐全的机器人SDK。另外官方也在其他开源项目之上构建ROS,ROS会尽可能的利用并遵循开放标准(例如OMG的DDS)。

  • 免费

    官方鼓励用户对ROS做出开源贡献,也欢迎提出宝贵意见,但不干涉开发者将ROS集成进非开源软件,不反对将ROS集成进专有产品。

  • 精简

    ROS被设计为尽可能精简,易于与其他机器人软件框架集成。

  • 语言独立性

    为了支持更多应用开发和移植,ROS设计为一种语言弱相关的框架结构,中立的定义语言描述模块间的消息接口,JavaC++Python都可以进行ROS开发。

  • 多平台支持

    ROS2支持Linux、Windows和macOS以及各种嵌入式平台(通过micro-ROS)并且不同平台都已经通过了官方测试,这意味着通过ROS2可以实现开发、部署后端管理系统和用户界面的无缝衔接。分层支持模型还允许将ROS2移植到诸如实时和嵌入式操作系统等新平台上,以便在获得关注和投资时将ROS2引入和推广到这些新平台中。

  • 应用领域广泛

    ROS可以在各种机器人应用中使用,从室内到室外,从家用到汽车,从水下到太空,从消费市场到工业领域,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提供了开发机器人应用程序所需的工具、库和功能,使开发者可以将更多的时间花费在与自身业务相关的工作上。由于它还是开源的,所以开发者可以决定何时何处使用ROS,甚至还可以根据自身需求修改ROS。另外ROS是友好的,不具排他性,开发者可以在ROS和其他机器人软件框架之间自由选择,或者也可以将ROS与其他软件框架集成,以取长补短。

  • 广泛的行业支持

    业界对ROS的支持非常强大。除了在ROS上开发产品外,来自世界各地的大大小小的公司都在投入资源为ROS做出开源贡献。

  • 业界肯定

    整个机器人行业都依赖于ROS。ROS是教授机器人技术的标准,是大多数机器人研究的基础,从单个学生项目到多机构合作再到大型竞赛,ROS都占据着主导地位。世界各地不计其数的机器人内部都运行着ROS,仅在自主移动机器人 (AMR) 中,ROS就帮助创造了数十亿美元的价值。

ROS2 相比于 ROS1

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

  • 去中心化

    在ROS1中使用master节点管理调度ROS系统,这存在极大的安全隐患,一旦master节点异常退出,那么会导致整个系统的崩溃。在ROS2中采用了去中心化,各个节点之间无需通过master关联,各个节点都是等态的,可以相互发现彼此。

  • 全新通信底层实现

    秉着不重复发明轮子的原则,ROS2不再自实现通信底层,而是直接更换为DDS通信,这使得ROS2较之于ROS1无论是通信的实行性、可靠性还是连续性都有大幅度提升。

  • 操作系统支持

    ROS1仅支持Linux系统,而ROS2支持Linux、Windows、MacOS和实时操作系统RTOS,ROS2的跨平台和可移植特性为构建复杂机器人系统提供了基础。

  • 系统架构

    ROS2采用基于DDS的分布式架构,取消了ROS1中的Master节点,节点之间通过DDS进行通信,因而支持更灵活的通信机制。

  • 产品化

    ROS2不仅可以用于机器人研发阶段,还可以直接搭载在产品中,走向消费市场,这对ROS2的稳定性、强壮性也提除了巨大挑战。

  • 安全性

    ROS2引入了更多的安全机制,可以对通信进行加密和认证。

  • API升级

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

  • 编译系统

    ROS1中使用的rosbuildcatkin问题诸多,尤其是针对代码较多的大项目以及Python编写的项目,编译、链接经常会出错,ROS2对这些问题也进行了优化,重新优化后的编译系统叫做amentcolcon,它是catkin编译系统进一步演化的版本。

  • 应用场景更为广泛

    ROS1在设计之初有着天生的硬件优势以及局限性:

    • 单机;

    • 工作站级的计算资源;

    • 无实时性要求(有此类需求也可以以特殊方式满足);

    • 出色的网络连接(有线或近距离高带宽无线);

    • 主要用于学术界;

    • 灵活有余而约束不足。

    这导致了它的一些先天性缺陷,不能适应新时代的需求,比如:

    • 对多机器人编队支持欠佳;

    • 小型嵌入式平台不能很好的支持ROS;

    • 实时性差;

    • ROS之间的数据传输受网络质量影响严重;

    • 产品不易落地。

    随着ROS2的推出,上述场景的缺陷都得到很大程度的修复。

  • 大量采用新技术、新的设计理念

    随着ROS十数年的发展,大量的新技术也产生、改进、成熟并被广泛采用,ROS也开始引入并应用一些新技术,比如:

    • DDS( Data Distribution Service——数据分发服务);

    • Zeroconf;

    • ZeroMQ;

    • Redis;

    • WebSockets。

    这些新技术为ROS带来了更多的便利,比如:更少的维护成本,却有着更多的功能拓展,并且随着第三方库的升级而持续受益。

此外,ROS2还重构了API系统,改进了ROS1的API在设计上的不足。

ROS2组成体系

整个ROS生态由通信(Plumbing)、工具(Tools)、功能(Capabilities)与社区(Community)四大部分组成。

通信(Plumbing)

通信是整个ROS系统的核心实现,是ROS内置的一个消息传递系统,通常称之为middleware(中间件)或Plumbing(管道)。

在构建新的应用程序或使用与硬件交互的软件时,如何实现通信是首当其冲的问题,为此ROS提供了专门的消息传递系统,它可以管理不同节点之间的通信细节,提高开发者的工作效率。这套消息传递系统使用了“面向接口”的编程思想,可以通过清晰规范的接口,将不同模块分离,从而也将故障隔离。使得ROS系统更易于维护、扩展性更强且保证了程序的高复用性。

接口规范可以由开发者自行定义。同时为了方便使用,在ROS中也提供了许多标准的接口,这些标准接口有着广泛应用,比如:将雷达或摄像头数据传输到可视化的用户界面或是传输到定位算法模块,都会使用到标准接口。

工具(Tools)

构建机器人应用程序极具挑战性。开发者除了会遇到一些传统的软件开发问题之外,还需要通过传感器或执行器与物理世界进行异步交互。显而易见的,良好的开发工具可以提高应用程序的开发效率,在ROS中就内置了launch、调试、可视化、绘图、录制回放等一系列工具。这些工具不光可以提高开发效率,还可以在发布产品时直接包含在产品之中。

功能(Capabilities)

ROS生态系统是机器人软件的聚宝盆。无论开发者需要用于GPS的设备驱动程序、用于四足仿生机器人的步行和平衡控制器,还是用于移动机器人的地图系统,ROS都能满足你的需求。从驱动程序到算法,再到用户界面,ROS都提供了相关实现,开发者只需专注于自身应用程序即可。

ROS的目标是提供一站式的技术支持,降低构建机器人应用程序的门槛。ROS希望任何开发者都可以将自己的“创意”变为现实,而无需了解底层软件和硬件的所有内容。

ROS社区规模庞大、多样且全球化,从学生和业余爱好者到跨国公司和政府机构,各行各业的人和组织都在推动着ROS项目的发展。

该项目的社区中心和中立管家是Open Robotics,它托管共享在线服务(例如ROS官网:https://www.ros.org/),创建和管理分发版本(包括您安装的二进制包),并开发和维护大部分ROS核心软件。 Open Robotics还提供与 ROS 相关的工程服务。

ROS2 版本差异

ROS2的每个版本都有其特点和改进,主要版本有Foxy, Galactic, HumbleRolling。以下是各个版本的一些关键差异:

版本 描述 操作系统
Foxy Fitzroy 针对LTS(长期支持)版本,支持时间为3年。
引入了许多新的特性和改进,包括组件生命周期、许多新的质量等级1(Quality Level 1)的软件包以及对Windows平台的改进。
支持Ubuntu 20.04 (Focal Fossa)、macOS 10.15 (Catalina) 和 Windows 10。
Galactic Geochelone 非LTS版本,支持时间为1年。
提供了对DDS中间件的更广泛支持,例如通过引入Cyclone DDS的默认支持。
改进了跨平台兼容性,加强了许多质量等级1的软件包。
支持Ubuntu 20.04 (Focal Fossa)、macOS 10.15 (Catalina) 和 Windows 10。
Humble Hawksbill 针对LTS(长期支持)版本,支持时间为5年。
更加稳定且易于维护,包括许多新的质量等级1的软件包,以及对不同平台和体系结构的改进。
改进了安全性,引入了对DDS安全插件的支持。
支持Ubuntu 22.04 (Jammy Jellyfish)、macOS 12 (Monterey) 和 Windows 11。
Rolling Ridley 一种持续更新的开发分支,为开发者提供了最新的功能和改进。
不推荐用于生产环境,因为它可能包含尚未完全测试的新功能。

查看 ROS 版本的命令:

1
printenv ROS_DISTRO

ROS2 国内源

  • 换源:
1
2
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo vim /etc/apt/sources.list
1
2
3
4
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
  • 更新:
1
sudo apt update
  • 将 ROS 2 的源更换为了清华大学的镜像源
1
2
3
4
5
#设置新的 ROS 2 软件包源,这里我们使用清华大学的镜像源:
sudo sh -c 'echo "deb https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros2-latest.list'

#更新软件包列表:
sudo apt update

现在,您已经将 ROS 2 的软件包源更换为了清华大学的镜像源。接下来,您可以尝试重新安装 ROS 2 的相关软件包。

  • 管理密钥环keyring
1
W: https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu/dists/jammy/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#1.首先,安装 gnupg 和 gnupg-agent 软件包,以便管理密钥:
sudo apt install gnupg gnupg-agent

#2. 创建一个名为 /etc/apt/trusted.gpg.d 的目录,用于存放新的密钥环文件(如果尚未创建):
sudo mkdir -p /etc/apt/trusted.gpg.d

#3. 首先,安装 gnupg 和 gnupg-agent 软件包,以便管理密钥:
sudo apt-key --keyring /etc/apt/trusted.gpg.d/ros2-archive-keyring.gpg adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

#4 更新软件包列表:
sudo apt update

#5 升级所有可升级的软件包
sudo apt upgrade

ROS2 基本概念

ROS2 是一种面向机器人开发的软件平台,其核心是一套用于不同进程间匿名的发布、订阅、传递信息的中间件,并提供了一系列工具和库,帮助开发者构建机器人应用程序。

基本概念

下面是 ROS2 中的一些基本概念:

  • 节点(Node):节点是 ROS2 应用程序的基本组成单元。一个节点是一个可执行文件,可以包含多个话题(Topic)、服务(Service)和行为(Action)。

  • 话题(Topic):节点之间传输消息的通道。一个节点可以发布(Publish)或订阅(Subscribe)一个或多个话题。发布者(Publisher)将消息发布到话题上,订阅者(Subscriber)从话题上接收消息。

    • 单个话题数据流:

    • 多个话题数据流:

  • 服务(Service):一种基于请求/响应模式的通信方式,其中一个节点向另一个节点发送请求消息,并等待响应消息。请求者(Client)向服务端(Server)发送请求消息,服务端收到请求消息后处理并发送响应消息。

    • 单个服务数据流:

    • 多个服务数据流:

  • 行为(Action):与服务类似,但是它支持异步通信模式,即客户端可以向服务器发送请求,并继续执行其他任务。当服务器处理请求并返回结果时,客户端会收到一个通知。

  • 参数服务器(Parameter Server):ROS2 的一个分布式参数存储系统,它可以用于存储和共享应用程序参数,以便多个节点共享使用。

  • 消息(Message):ROS2 中节点之间传输的数据类型。一个消息包含一组数据字段,用于描述传输的信息。ROS2 支持多种常见的消息类型,如字符串、数值、图像等。

  • 行为客户端(Action Client):用于发送异步行为请求的 ROS2 节点。它可以向行为服务器(Action Server)发送请求,并等待响应。在等待响应的同时,节点可以继续执行其他任务。

  • 坐标系(Frame):ROS2 中用于表示物体位置和方向的概念。坐标系是一个基于三维空间的参考系,用于确定物体的位置和朝向。ROS2 提供了一些用于坐标系变换的库,以便在不同坐标系之间进行转换。

这些概念是 ROS2 中最基本的一些概念,熟练掌握它们对于理解ROS2应用程序的设计和实现非常重要。

节点和服务

ROS2 中的节点(Node)和服务(Service)是两种不同的概念,它们有不同的作用和使用方式。

节点是 ROS2 应用程序的基本组成单元,一个节点可以发布(Publish)或订阅(Subscribe)一个或多个话题(Topic),以及提供或使用服务(Service)和行为(Action)等。节点之间可以相互通信,通过话题、服务和行为来传输消息和调用函数。

服务是一种基于请求/响应模式的通信方式,其中一个节点向另一个节点发送请求消息,并等待响应消息。服务由一个服务端(Server)和一个或多个客户端(Client)组成。客户端向服务端发送请求消息,服务端收到请求消息后处理并发送响应消息。服务通常用于执行一些需要时间和计算的操作,例如传感器数据的读取和处理、运动控制命令的发送等。

区别在于,节点主要用于发布和订阅消息,以及调用行为,可以将消息发送到多个节点或者从多个节点接收消息,而服务主要用于客户端和服务端之间的请求和响应通信,只有一个客户端向一个服务端发送请求,服务端只响应该客户端的请求,服务端也只向该客户端发送响应。另外,节点通常是一直运行的,而服务只在需要的时候才被调用。

在 ROS2 应用程序中,节点和服务通常是配合使用的。节点可以发布消息来通知其他节点进行某些操作,而服务可以用于向其他节点请求某些操作。

客户端程序库

ROS2 基于客户端程序库(ROS Client Library,RCL)编程,可以使用不同语言编写的节点进行通信。在不同的编程语言中都有对应的 ROS2 客户端程序库,RCL 实现了 ROS2 的基本 API。使得不同编程语言的客户端更加容易编写,也保证了其行为更加一致。

ROS2 团队目前主要维护的是 rclcpp 和 rclpy 两个客户端程序库:

客户端程序库 描述 API 文档
rclcpp C++ 客户端程序库 https://docs.ros2.org/latest/api/rclcpp/
rclpy Python 客户端程序库 https://docs.ros2.org/latest/api/rclpy/

应用场景

目前,ROS2 广泛应用于机器人和自动化系统的开发,例如:

  • 工业自动化。用于机器人和自动化设备的控制和监控,例如生产线上的物料搬运、装配、质检等。
  • 服务机器人。用于服务机器人的开发,例如提供导航、人脸识别、语音识别、图像识别、自主探索等功能。
  • 智能交通。用于智能交通系统的开发,例如自动驾驶汽车、无人机等。
  • 医疗保健。用于医疗保健设备的开发,例如外科手术机器人、病房机器人等。
  • 农业机器人。用于农业机器人的开发,例如自动化种植、灌溉、收获等。

下面是一些运行 ROS2 的实际项目:

  • TurtleBot 3:一个基于 ROS 和 ROS2 的低成本、可扩展的移动机器人平台,用于教育、研究和开发机器人应用。
  • Open Robotics:Open Robotics 是 ROS2 的主要开发者之一,他们正在开发许多基于 ROS2 的机器人应用,例如 MARA 机器人和 Loco Positioning System
  • Apex.AIApex.AI 是一家专门从事自动驾驶软件的公司,他们使用 ROS2 作为其开发平台,开发了基于 ROS2 的自动驾驶软件 Apex.OS,并根据 ISO 26262 车辆功能安全标准获得了ASIL D 认证。
  • LG Electronics:使用 ROS2 开发智能家居和服务机器人,以提供更智能、更方便的生活体验。
  • Bosch:使用 ROS2 开发智能制造和智能交通系统。

ROS2安装

基本安装

用于操作系统 Ubuntu 22.04,其他系统参考 ROS2 安装

  • 设置编码

    1
    2
    3
    4
    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
  • 添加软件源

    1
    2
    3
    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
  • 更新源

    1
    2
    3
    sudo apt update
    # upgrade 命令谨慎使用,我在安装过程中没有执行也可以成功安装
    sudo apt upgrade
  • 安装ROS2 Desktop 版本

    推荐初学者安装的版本,因为 Desktop 版本包含了 ROS、RViz、demos、tutorials 等内容。

    1
    sudo apt install ros-humble-desktop
  • 设置环境变量

    1
    2
    echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc 
    source ~/.bashrc
  • 设置环境变量

    1
    2
    echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc 
    source ~/.bashrc

    由于我用的 zsh 上述命令会出现找不到 setup.bash 的问题,参考大神的建议,这里将 setup.bash 替换成了 setup.sh

    1
    2
    echo "source /opt/ros/humble/setup.sh" >> ~/.zshrc 
    source ~/.zshrc

测试ROS2

测试一:发布者与订阅者

在终端A中启动发布者

1
ros2 run demo_nodes_cpp talker

在终端B中启动订阅者

1
ros2 run demo_nodes_cpp listener

如下所示,若节点间正常通信则说明测试通过

测试二:海龟仿真器

接着进行经典的海龟测试,启动两个终端,分别运行如下指令:

1
2
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

将鼠标聚焦在第操作终端窗口上,然后通过键盘上的方向键,操作小海龟移动,并在屏幕上留下轨迹

1
2
3
4
5
6
> ros2 run turtlesim turtle_teleop_key
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
Use G|B|V|C|D|E|R|T keys to rotate to absolute orientations. 'F' to cancel a rotation.
'Q' to quit.

卸载

如果你想卸载 ROS 2,或者想从二进制文件安装后切换到基于源的安装,那么可以运行以下命令卸载 ROS 2。

1
sudo apt remove ~nros-humble-* && sudo apt autoremove

如果你想将 ROS 2 的软件包信息删除干净,可以执行以下命令。

1
2
3
4
5
sudo rm /etc/apt/sources.list.d/ros2.list
sudo apt update
sudo apt autoremove
# Consider upgrading for packages previously shadowed.
sudo apt upgrade

ROS2 命令行工具

本文主要介绍 ROS2 机器人操作系统的一些常用命令行工具及其使用方法,使用这些命令可以使机器人编程和调试变得更加简便。

ROS2 命令简介

ROS2 的主要命令入口是 ros2,其中又包含大量的子命令,可用于 ROS2 程序的开发和测试。下面是其中一些常用的命令及其作用:

  • ros2 run:运行 ROS2 节点或任意可执行文件。
  • ros2 launch:启动 ROS2 应用程序,可以同时启动多个节点。
  • ros2 pkg:用于操作 ROS2 软件包,包括创建 package、指定包名、编译方式、依赖项、节点名等。
  • ros2 node:用于管理 ROS2 节点,可以列出、杀死、查看节点等。
  • ros2 topic:用于管理 ROS2 话题(Topic),包括列出、发布、订阅、查看话题等。
  • ros2 service:用于管理 ROS2 服务(Service),包括列出、调用、创建、删除服务等。
  • ros2 action:用于管理 ROS2 行为(Action),包括列出、调用、取消行为等。
  • ros2 bag:用于记录和回放 ROS2 话题数据,可以将数据记录到文件中,以供后续回放和分析。
  • ros2 param:用于管理 ROS2 参数服务器,包括设置、获取、删除参数等。
  • ros2 msgros2 srv:用于查看 ROS2 消息和服务类型的定义。
  • ros2 doctor:用于检查 ROS2 环境是否正常,包括检查网络、环境变量、节点和话题等。

熟练掌握上述 ROS2 命令,可以帮助开发者对 ROS2 应用程序进行管理和监控,加快开发和调试速度。

ros2 run

ros2 run 命令用于运行 ROS2 节点或任意可执行文件。

命令语法:

1
ros2 run <package_name> <executable_name>

示例:

1
ros2 run turtlesim turtle_teleop_key

还可以在启动 ROS2 节点时指定要加载的参数文件:

1
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>

ros2 launch

ros2 launch 命令用于启动 ROS2 应用程序,可以同时启动多个节点。

命令语法:

1
ros2 launch <package_name> <launch_file_name>

示例:

1
ros2 launch launch_tutorial launch_turtlesim.launch.py

ros2 pkg

ros2 pkg 命令用于操作 ROS2 软件包,包括创建 package、指定包名、编译方式、依赖项、节点名等。有 create、executables、list、prefix、xml 共 5 个子命令。

创建软件包:

1
2
3
ros2 pkg create <package_name> --build-type <build_type> 
--node-name <node_name>
--dependencies <your_dependencies>

例如:

1
ros2 pkg create my_package --build-type ament_cmake --node-name my_node --dependencies rclcpp std_msgs sensor_msgs

选项参数说明:

  • --build-type 用于指定编程语言,ament_cmake 表示使用 C++,ament_python 表示使用 Python。
  • --node-name 用于指定节点名,也是要生成的源码文件,可以后期创建,但是手动创建需要手动配置。
  • --dependencies 用于指定依赖模块,其中 rclcpp 是 C++ 必选的,rclpy 是 Python 必选的,std_msgssensor_msgs 是我们要用的消息模块,可暂不指定,后续手动配置。

查看 ROS2 系统中所有软件包(注意:需要用 source 设置环境变量才能看到自己写的软件包)

1
ros2 pkg list

查看软件包中的可执行文件列表

1
ros2 pkg executables <package_name>

ros2 node

ros2 node 命令用于管理 ROS2 节点,包括 listinfo 两个子命令。

列出所有正在运行的节点名称:

1
ros2 node list

查看指定节点的信息:

1
ros2 node info <node_name>

ros2 topic

ros2 topic 命令用于管理 ROS2 话题(Topic),包括列出、发布、订阅、查看话题等。

该命令又包含多个子命令:

  • bw:显示话题使用的带宽;
  • delay:显示话题的延迟(基于消息头中的时间戳);
  • echo:输出指定话题的消息;
  • find:输出给定类型的可用主题列表;
  • hz:打印话题的平均发布率;
  • info:打印有关话题的信息;
  • list:输出可用的话题列表;
  • pub:向指定话题发布消息;
  • type:打印话题的类型。

例如,查看系统内所有当前活跃的话题:(-t 表示显示其类型)

1
ros2 topic list -t

查看话题的详细信息:

1
ros2 topic info <topic_name>

查看话题发布数据的速率:

1
ros2 topic hz <topic_name>

查看数据在话题上发布的情况:

1
ros2 topic echo <topic_name>

在 ROS2 中,ros2 topic echo是一个用于查看指定话题(Topic)数据的命令行工具。它可以让用户在终端上实时地查看ROS2节点之间传输的数据。

具体来说,ros2 topic echo 命令的作用是:

  1. 订阅指定话题:用户需要指定想要查看的话题名称,如ros2 topic echo /camera/depth/image_raw
  2. 显示数据:一旦订阅成功,ros2 topic echo 就会开始显示从该话题发布的数据。对于不同类型的话题,显示的数据也有所不同。例如,对于传感器数据,显示的内容通常是该传感器测量到的物理量,如距离、速度等;对于图像数据,显示的是图像的像素值等信息。
  3. 实时更新:ros2 topic echo 会持续不断地显示从话题发布的数据,直到用户手动终止该命令。在显示过程中,用户可以随时使用 CTRL-C 中断命令并退出。

通过使用 ros2 topic echo,用户可以快速地了解话题发布的数据内容,以及实时监控系统的运行状态,方便开发和调试。

直接从命令行向一个话题发布数据:

1
ros2 topic pub <topic_name> <msg_type> '<args>'

ros2 service

ros2 service 命令用于管理 ROS2 服务(Service),包括列出、调用、创建、删除服务等。使用方法与 topic 命令类似,包括以下子命令:

  • call:调用一个服务;
  • find:查找指定类型的可用服务;
  • list:列出所有可用服务;
  • type:显示服务的类型。

例如,查看系统内所有可用服务:(-t 表示显示其类型)

1
ros2 service list -t

查找使用某类消息类型的服务:

1
ros2 service find <type_name>

查看服务接收的消息类型:

1
ros2 service type <service_name>

ros2 action

ros2 action 命令用于管理 ROS2 行为(Action),包括列出、调用、取消行为等。

例如,列出系统内所有 action:

1
ros2 action list

ros2 bag

ros2 bag 命令用于记录和回放 ROS2 话题数据,可以将数据记录到文件中,以供后续回放和分析。

录制发布到某个 topic 的消息:

1
ros2 bag record <topic_name>

查看录制好的 rosbag 信息:

1
ros2 bag info <bag_file_name>

回放 rosbag:

1
ros2 bag play <bag_file_name>

ros2 param

ros2 param 命令用于管理 ROS2 参数服务器,包括设置、获取、删除参数等。

该命令又包含多个子命令:

  • delete:删除参数;
  • describe:显示参数的描述信息;
  • dump:导出一个节点的所有参数到一个 yaml 文件;
  • get:获取参数;
  • list:输出系统内所有可用参数列表;
  • load:加载参数文件到一个节点;
  • set:设置参数。

例如,查看参数及其节点归属:

1
ros2 param list

获取当前参数的值:

1
ros2 param get <node_name> <parameter_name>

在运行时间内改变参数值:

1
ros2 param set <node_name> <parameter_name> <value>

将参数导出到一个文件:

1
ros2 param dump <node_name>

学习资料

名称 链接 简介
ROS 2 官方文档 https://docs.ros.org/en/foxy/index.html 机器人操作系统(ROS)是一组用于构建机器人应用程序的软件库和工具。从驱动程序和最先进的算法到强大的开发工具,ROS 拥有您下一个机器人项目所需的开源工具。
ROS2 github https://github.com/ros2 ROS2 GitHub 主页
ROS 2 Python API https://docs.ros2.org/latest/api/rclpy/ 提供了用于与 ROS 2 交互的规范 Python API
ROS2 中文网 http://dev.ros2.fishros.com/ ROS2是用于构建机器人的第二代机器人操作系统(Robot Operating System),其包含了大量的机器人相关软件库和工具集。
ROS2中文指南 https://doc.bwbot.org/media/books/ros2.pdf ROS2是新的ROS版本。相对与旧版本更加接近工业化场景,更加稳定,同时功能也更加丰富。
ROS2 教程 https://getiot.tech/zh/ros2/ ROS 2 是 ROS 的下一代版本,为机器人领域带来了更先进的功能和更强大的性能。本教程将带你深入了解 ROS 2 机器人操作系统,探索机器人技术的最新前沿,助你在未来的机器人革命中驶向更远的未知。
ROS2入门教程 https://www.ncnynl.com/archives/201801/2250.html 专注于ROS1/ROS2机器人系统为核心的开源硬件、开源软件的整理和分享 。覆盖Turtlebot2,Turtlebot3,Turtlebot4,无人机,无人船,无人车,机械臂,嵌入式,操作系统,开发语言,Arduino,Raspberry Pi,树莓派,UAV, Pixhawk,Paparazzi等

参考资料

文章链接:
https://www.zywvvd.com/notes/tools/ros2/ros2-intr/