✅ 欢迎前往《Qt+librviz开发》系列专栏查看更多内容!
⚠️ 须知:《Qt+librviz开发》专栏系列文章并非零基础入门文章!在开始学习之前,读者需要确保已经掌握以下基础知识:①C++基础;②Qt开发基础;③英语阅读能力基础(有阅读英文文档需求);《Qt+librviz开发》专栏系列文章允许读者在对Linux、ROS无任何基础及了解的前提下学习,但笔者建议有基本的了解后再来学习会更加顺利。
可参考链接:
- C++基础:面向对象程序设计(基础);
- Qt开发基础:Qt从入门到实战|传智教育_哔哩哔哩_bilibili、Qt开发;
- ROS官网:ROS - Robot Operating System
- ROS wiki:ROS维基
- ROS media:ROS 媒体(可以获取到 ROS 及其发行版本的所有 logo、海报和插画)
本文只针对《Qt+librviz开发》专栏系列文章中涉及到的专业名词和概念进行最基本的解释,不会做深入探讨。读者如果对某个概念感兴趣可以参考本文提供的参考链接或者自行搜索。
本文适用对象是使用过Windows系列操作系统的同学,撰写目标是方便读者在阅读后续文章时不会产生不必要的困惑,所以如果读者在完成本文学习的基础上阅读后续文章时还是对某个名词概念感到困惑,请务必前往本文的评论区告知笔者!
vmware 是一家提供云计算和虚拟化软件和服务的公司。它提供了多种产品和服务,包括用于云基础架构、云管理、安全性和网络的多云服务,以及用于构建和运行云原生应用程序的解决方案。
参考链接:
VMware Workstation Pro 是一款业界标准的桌面虚拟机软件,它可以在 Linux 或 Windows PC 上运行虚拟机。它具有 DirectX 11 和 OpenGL 4.3 3D 加速图形支持,“暗黑模式”用户界面、支持 Windows 11,vctl CLI 用于运行和构建容器和 Kubernetes 集群,支持最新的 Windows 和 Linux 操作系统,支持同时运行多个虚拟机。作为付费软件支持免费下载 30 天试用版。
参考链接:
VMware Workstation Player 是一款可以在 Linux 或 Windows PC 上轻松运行多个操作系统作为虚拟机的软件。它使用 VMware vSphere Hypervisor 技术提供简单且安全的本地虚拟化解决方案,可以用于教育、培训、企业桌面交付等用途。VMware Workstation Player 是免费的,它与 VMware Workstation Pro 都属于 VMware Workstation 系列产品;两者之间的比较可以参考官方商店,但最重要的区别是 VMware Workstation Player 只能同时运行一个虚拟机。
参考链接:
LTS(Long-Term Support)意为长期支持。指的是软件的特定版本被长期稳定地支持和维护。LTS 版本在发布后会获得一定的维护周期,通常为几年或更长时间。在这个维护周期内,开发者会为 LTS 版本提供安全补丁和错误修复,并确保这些版本的稳定性和兼容性。
EOL(End of Life)意为生命周期结束,指的是软件版本不再提供支持和更新的时间点
参考链接:
Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface)程序,当然也可以开发不带界面的命令行(Command User Interface)程序。
Qt 是纯 C++ 开发的,所以学好 C++ 非常有必要。当然 Qt 还存在 Python、Ruby、Perl 等脚本语言的绑定, 也就是说可以使用脚本语言开发基于 Qt 的程序。
Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智能手机系统 Android、iOS、WinPhone,嵌入式系统 QNX、VxWorks 等等。
Qt 的 LTS 版本通常会提供3年的支持时间。这意味着在这3年内,该版本会持续收到错误修复和安全更新。不过,对于某些版本,支持时间可能会延长。例如,Qt 5.15 LTS 版本的支持时间被延长到了5年。我们可以在 Qt 官方维基的主页查看 Qt 的发行版本信息。
我们可以在 Qt 的官方文档网站查看 Qt 不同发行版本的支持平台情况,比如我们可以查看 Qt 6.5 LTS 支持平台。
参考链接:
Qt Creactor 是跨平台的集成开发环境(IDE),旨在为开发者带来最好的体验。 Qt Creator 可在 Windows、Linux 和 macOS 桌面操作系统上运行,并允许开发人员在桌面、移动和嵌入式平台创建应用程序。
参考链接:
build system(构建系统)是一个软件工具或工具的集合,它使从源代码构建应用程序或软件系统的过程自动化。构建系统获取源代码和其他必要的文件,例如库和配置文件;并生成编译后的可执行文件、库或其他输出格式。
构建系统通常包括许多步骤,例如将源代码编译为目标代码,将目标代码链接到二进制可执行文件中,并将二进制文件打包成可分发的格式,例如安装程序或软件存储库的包。
构建系统还可以执行其他任务,例如运行自动化测试、生成文档和管理软件系统不同组件之间的依赖关系。
常见的构建系统包括 Make、CMake、Gradle 和 Maven。它们在软件开发中广泛使用,以自动化构建过程,并确保软件可以跨不同平台和环境一致地构建。
参考链接:
CMake 是一个开源、跨平台的设计来用于构建、测试和打包软件的系列工具。它可以自动生成用于不同平台的编译器和构建工具所需的构建文件,如 Ninja、Makefiles、Visual Studio 项目文件、Xcode 工程文件等。CMake 使用 CMakeLists.txt (组态档)文件来描述构建过程和依赖关系,然后生成所需的构建文件。
参考链接:
qmake 是一种用于 Qt 应用程序的构建系统和自动化工具,它与 CMake 类似,用于生成适用于不同平台和编译器的 Makefile 文件。你可以在任何软件项目中使用 qmake,不管它是不是用 Qt 编写的。
qmake 是 Qt 的一个组成部分,可以方便地与 Qt 应用程序一起使用。它使用 .pro 文件描述项目结构、依赖关系和构建过程,然后生成适合当前平台和编译器的 Makefile 文件,以便进行编译、链接等操作。.pro 文件支持多种配置选项,例如指定源文件、头文件、库文件、预处理器宏等等。
qmake包含支持Qt开发的附加功能,自动包括 moc 和 uic 的构建规则。
qmake还可以为Microsoft Visual studio生成项目,而不需要开发人员更改项目文件。
值得一提的是,虽然 qmake 简单易上手,但在最新的 Qt 6 中,qmake 已经不再是官方推荐的构建系统了(但仍然支持)。Qt 6 的构建系统已经移植到了 CMake,CMake 成为 Qt 6 的首选构建工具。
参考文献:
当我们使用 Qt 框架开发 GUI 应用程序时,通常需要使用 Qt 的一些辅助工具,其中包括 uic、moc、rcc。
当我们创建的 Qt 项目使用的构建系统是 CMake 时,CMakeLists.txt 内通常会包含如下几句代码以使用这些工具:
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
参考链接:
ROS 是一个开源的机器人元操作系统,提供了一般操作系统所能提供的基本服务,包括硬件抽象、低级设备控制、常用功能实现、进程之间的消息传递以及包管理。此外,它还提供了用于获取、构建、编写和跨多台计算机运行代码的工具和库。ROS 在某些方面类似于“机器人框架”,比如 Player、Orocos、CARMEN、Orca、MOOS 等。
⚠️ 需要注意的是:ROS 是机器人元操作系统,并不是计算机操作系统。ROS 并不能像 Windows 或 Linux 那样直接安装运行于计算机硬件之上。ROS 作为机器人元操作系统需要在其支持的计算机操作系统上安装
笔者入门参考书籍是由 胡春旭 编著,由 机械工业出版社 出版的 《ROS机器人开发实践》
参考链接:
ROS1 是 ROS 的最初版本,它于2007年首次发布,主要面向教育和研究领域;也是《Qt+librviz开发》专栏系列文章选择的 ROS 版本。ROS1 采用了一些传统的软件架构和通信方式,例如基于 TCP/IP 的 ROS Master 和 ROS 节点之间的通信方式。ROS1 的系统架构如下图所示:
ROS Noetic 是 ROS1 的最后一个发行版本,主要目标是为那些需要继续使用 ROS1 的开发人员/组织提供 Python3 支持。ROS Noetic 之后就没有更多的 ROS1 了。
ROS2 是 ROS 的新版本,于2015年开始开发,2017年12月8日发布第一个 ROS2 的正式版 —— Ardent Apalone,ROS2 主要面向实际的机器人应用和工业领域。ROS2 在设计上更加注重可靠性、安全性和可扩展性,采用了一些新的软件架构和通信方式,例如 DDS(Data Distribution Service,数据分发服务)通信协议和 ROS2 节点之间的直接通信方式。ROS2 的系统架构如下图所示:
参考链接:
Rolling Ridley 是 ROS2 的一个持续开发版本,该版本最初是作为 Foxy 版本的 Rolling 镜像发布。其会不断更新,当然有时也会包括破坏性的更改。它主要用于希望其软件包发布并准备好用于下一个稳定版本的 ROS2 的开发和维护人员。通常建议 ROS2 用户使用最新的稳定版本即可。
从上面 ROS1 和 ROS2 的发布版本列表我们很容易就发现,ROS 一直使用乌龟作为其吉祥物,这不禁令人感到好奇。其实这是因为 ROS 的创始人和早期员工都是软件工程师,他们大多很小的时候就开始学习编程。那时他们用的是 LOGO 语言,一种面向儿童的计算机编程语言。在 LOGO 的图形系统的虚拟世界里有一只小乌龟,编程学习者可以通过输入指令,让海龟在画面上走动。因此,那个动来动去的小海龟在所有编程学习者里,最深入人心。ROS 里面有一个 turtlesim 系统,就是受 LOGO 的海龟绘图系统启发,帮助人们学习 ROS 而设计的。
每年的5月23日是世界乌龟日,该纪念日始于2000年,由美国海龟救援组织赞助。这一天的目的是帮助人们庆祝和保护海龟和陆龟以及它们正在消失的栖息地,并鼓励人类采取行动帮助它们生存和繁荣。ROS1 和 ROS2 有许多个发行版本都是在这一天发布的(包括 ROS2 最新的 Iron Irwini)。
ROS(包括 ROS1 和 ROS2) 的发行版本也有 LTS 版本,支持周期通常为5年。比如 ROS1 的 Noetic、Melodic、Kinetic、Indigo;ROS2 的 Foxy、Humble 发行版本。
Linux 全称 GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统。其内核(Kernel)由芬兰人林纳斯﹒本纳第克特﹒托瓦兹(Linus Benedict Torvalds)于1991年10月5日首次发布。是一个基于 POSIX 的多用户、多任务、支持多线程和多CPU的操作系统。支持32位和64位硬件,能运行主要的 Unix 工具软件、应用程序和网络协议。
Linux 本身指的是操作系统内核。不过,现在人们已经习惯了用Linux 来形容整个基于 Linux 内核,并且使用 GNU 工程各种工具和应用程序的操作系统(也被称为GNU/Linux),而基于这些组件的 Linux 软件被称为 Linux 发行版。
参考链接:
Shell 中文可以称之为“壳”或者“壳层”,与“内核”(Kernel)相对应;是指“为用户提供操作界面”的软件。
参考链接:
Linux 命令是一种文本界面下的指令,是设计来使用 Shell 与内核交互的。用户可以通过 Linux 终端(当我们使用 ctrl+alt+T
打开一个 Linux 终端时,系统会自动启动一个 Shell 程序) 在命令行中输入命令,它们通常由一个命令名称和一些选项和参数组成,Shell 会将这些命令解释并传递给内核执行。
~
:在 Linux 命令中,符号 ~
代表主目录,即当前登录用户的用户目录。例如,cd ~
命令将跳转到您的主目录;#
:注释符号,在命令之前或之后出现,后面跟随注释文字,不会被执行;;
:在 shell 中,分号是担任“连续指令”功能的符号,可以在一行中依次执行多个命令;.
:在 shell 中,一个句点符号表示当前目录;..
:在 shell 中,两个句点符号表示当前目录的上一层目录;'string'
:被单引号括住的内容,将被视为单一字符串;|
:|
管道符号表示连接上一个指令的标准输出,作为下个指令的标准输入;!
:感叹号通常代表反逻辑;$
:一个常用用法是变量替换的代表符号,如果想引用一个变量,$
符号应作为前导符添加到变量名之前(更多用法还请自行搜索);&
:后台运行符,用于使命令在后台运行而不占用终端;参考链接:
在 Linux 中,当我们输入字符后,按下 tab
键,如果仅有唯一匹配,则 Shell 会自动补全以这些字符开头的 命令 / 文件名称 / 目录名称,如果不是唯一匹配,那么再按一次 tab
键,Shell 会列出所有可用匹配。这个功能被称作“Linux 命令行补全”。
Linux 的发行版有很多,比较知名的有 Ubuntu、CentOS、Debian、Fedora、RedHat、OpenSUSE、Arch Linux等;《Qt+librviz开发》专栏系列文章选择的 Linux 发行版本为 Ubuntu。
参考链接:
大多数现代的类 Unix 操作系统都提供了一种中心化的机制用来搜索和安装软件。软件通常都是存放在存储库中,并通过包的形式进行分发。处理包的工作被称为包管理。软件包管理系统是在计算机中管理软件包的工具组合。
参考链接:
Ubuntu 中文可以称之为“乌班图”,一个基于 Debian 发行版和 GNOME3 桌面环境的 Linux 操作系统。Ubuntu 是开放源代码的自由软件,这使得用户可以登录 Ubuntu 官网免费下载该软件的安装包。
参考链接:
Ubuntu 的发行版本也有 LTS 版本,自2006年以来,Ubuntu 每六个月发布一个非 LTS 版本,每两年发布一个 LTS 版本,直到现在。Ubuntu 的 LTS 版本一般是偶数年的4月份发布,比如 16.04、18.04、20.04、22.04,也是稳定的 Ubuntu 版本。Ubuntu LTS 的生命周期是5年,Ubuntu 背后的公司 Canonical 提供安全更新和补丁。5年结束后,官方还提供3年或者5年的扩展支持维护(ESM),不过这个服务是付费的,如果你是 Ubuntu 的 Member 则可以免费获得。
我们可以在 Ubuntu 官方维基网站上查看所有的 Ubuntu 发行版本列表。
gedit 是为 GNOME 桌面环境设计的一款文本编辑器,gedit 是 GNOME 的默认文本编辑器,也是 GNOME 核心应用程序的一部分,直到2022年3月 GNOME 版本42才将默认的文本编辑器更改为 GNOME Text Editor。
APT(Advanced Packaging Tools)是 Debian 及其派生的 Linux 软件包管理器,可以自动下载、配置、安装二进制或者源代码格式的软件包。在 Debian 系统中,APT 构建与 dpkg 之上,用来处理 deb 格式的软件包。
参考链接:
ROS1 平台支持官方支持的平台是 Ubuntu 平台。我们可以按照 ROS 官方推荐选择 ROS1 和对应的 Ubuntu 发行版本。
参考链接:
ROS2 平台支持我们可以前往 ROS2 各发行版本官方文档的 “Installation” 页查看,如下图是 ROS 2 Humble 的 “Installation” 页:
参考链接:
ROS 主站为 ROS 系统中的其余节点提供命名和注册服务。它跟踪发布者和订阅者的话题以及服务。主节点的作用是使各个ROS节点能够相互定位。一旦这些节点找到彼此,它们就会相互对等通信。
主站还提供参数服务器。
主站最常使用
roscore
命令运行,该命令加载 ROS 主站以及其他基本组件。ROS2 中摒弃了 ROS Master 和参数服务器,ROS2 在运行节点之前也不需要先使用
roscore
命令运行主站了。ROS2 节点之间使用一种名为 “Discovery” 的发现机制来帮助彼此建立连接。
参考链接:
ROS 节点是一个执行计算的进程。节点被组合成一个图,并使用流话题、RPC 服务和参数服务器相互通信。这些节点旨在以细粒度(fine-grained)的规模运行;一个机器人控制系统通常由许多节点组成。例如,一个节点控制激光测距仪,一个节点控制机器人的轮子电机,一个节点执行定位,一个节点执行路径规划,一个节点提供系统的图形视图,等等。
rosnode 是一个用于显示节点相关信息的命令行工具,比如罗列当前正在运行的 ROS 节点(rosnode list
)。有关如何使用此工具的文档,请参阅 rosnode。
参考链接:
ROS 话题被命名为总线,节点通过其交换消息。话题具有匿名发布/订阅语义,这将消息的产生和消费解耦。通常,节点不知道它们正在与谁通信。相反,对数据感兴趣的节点订阅相关话题;生成数据的节点发布到相关话题。一个话题可以有多个发布者和订阅者。
话题用于单向、流式的通信。需要执行远程过程调用(例如接收请求响应)的节点应该使用服务。此外还有用于维护少量状态的参数服务器。
rostopic 是一个用于与 ROS 话题交互的命令行工具。例如:
rostopic list
:罗列当前所有话题。rostopic echo /topic_name
:显示发布到“/topic_name”话题内的消息。有关更多文档,请参阅 rostopic 页面。参考链接:
发布/订阅模型是一种非常灵活的通信范式,但其多对多单向传输并不适用于 RPC 请求/回复交互,而此类交互在分布式系统中通常又是必需的。ROS 中的请求/回复是通过ROS 服务完成的,该服务由一对消息定义:一条用于请求,一条用于回复。提供服务的 ROS 节点以字符串名称提供服务,然后客户端通过发送请求消息并等待回复来调用服务。客户端库通常将这种交互呈现给程序员,就好像它是一个远程过程调用。
服务是使用 srv 文件定义的,这些文件由 ROS 客户端库编译成源代码。
客户端可以与服务建立持久连接,从而以降低对服务提供者更改的健壮性为代价实现更高的性能(说大白话就是“建立持久连接可以实现更高的性能,但连接期间如果服务提供者出现了变动,则可能会导致客户端出现问题”)。
rossrv :显示.srv数据结构的相关信息。有关如何使用此工具的文档,请参阅 rossrv。
rosservice :罗列和查询 ROS 服务。
参考链接:
ROS 节点之间的通信是通过发布ROS 消息到话题实现的。消息是一个简单的数据结构,由类型化字段组成。支持标准基元类型(整数、浮点数、布尔值等),以及基元类型的数组。消息可以包含任意嵌套的结构和数组(非常类似于 C 结构)。
节点还可以在 ROS 服务调用过程中交换请求和响应消息。这些请求和响应消息在 srv 文件中定义。
rosmsg 是一个用于显示消息相关信息的命令行工具,比如显示.msg数据结构。有关如何使用此工具的文档,请参阅 rosmsg。
参考链接:
ROS 袋子是 ROS 中用于存储 ROS 消息数据的一种文件格式。袋子 — 因其.bag扩展名而得名 — 在 ROS 中起着重要作用。并且 ROS 已经编写好了各种工具来允许用户存储,处理,分析和可视化它们。
echo
和 list
命令与 bag 文件兼容。参考链接:
ROS 参数服务器是一个共享的多变量字典,可通过网络API访问。节点在运行时可使用该服务器存储以及检索参数。由于 ROS 参数服务器不是为高性能而设计的,因此最适合用于静态、非二进制数据(例如配置参数)。它旨在全局可见,以便工具可以轻松检查系统的配置状态,并在必要时进行修改。
参数服务器是使用 XMLRPC 实现的,并在 ROS Master 内部运行,这意味着它的 API 可以通过普通的 XMLRPC 库访问。
rosparam 命令行工具允许您使用 YAML 语法在参数服务器上查询和设置参数。
参考链接:
ROS 工作空间简单来说相当于工程或者项目,编写ROS程序之前,首先需要创建ROS工作空间。它是管理和组织ROS工程项目文件的地方。
它的下层主要有四个一级目录:
文件夹名称 | 描述 |
---|---|
src | 源空间 |
build | 编译空间 |
devel | 开发空间 |
install | 安装空间 |
其中,最顶层的工作空间文件夹(可以任意命名)和 src 文件夹(必须命名为"src")是需要自己创建的;build 和 devel 文件夹由
catkin_make
命令自动创建;install 文件夹由catkin_make install
命令自动创建。
参考链接:
Catkin 是从 ROS Groovy 开始推荐使用的用于构建软件包的构建系统(build system)。Catkin 是基于 CMake 的编译构建系统,对 CMake 进行了扩展,对 ROS 这样的大体量的工程有更好的支持,同时也简化了操作。
ROS2 的软件包构建工具为 colcon。它支持多种构建系统,能够在所有主要平台(Linux、macOS、Windows)上构建任何类型的软件包(catkin、ament、CMake、Python setuptools、gradle、bazel、cargo等)。
参考链接:
- ROS2编译器colcon是个啥,比catkin好用吗? - 知乎
- A universal build tool
参考链接:
RViz 是 ROS 的一个3D可视化工具。在 RViz 中,可以使用 XML 对机器人、周围物体等任何实物进行尺寸、质量、位置、材质、关节等属性的描述,并且在界面中呈现出来,帮助开发者实现所有可检测信息的图形化显示。
RViz 本身是使用 C++ 语言编写的,使用 OGRE(开源3D图形引擎) 和 OpenGL(2D和3D图形API) 生成和渲染2D和3D图形,使用 Qt 库作为其 GUI 框架。所以如果我们想在自己的 GUI 应用程序中嵌入 RViz,使用 Qt 框架是很不错的选择。
RViz已经集成在桌面完整版的 ROS 系统当中。根据之前了解的情况,我们其实很容易就能想到 RViz 在 ROS 中也是作为一个 ROS 节点运行的。我们可以通过
rosrun rviz rviz
或rviz
命令运行 RViz 节点。
RViz的开源库,允许用户在自己的程序中使用RViz的显示及其他功能。这意味着我们可以在自己的图形用户界面(GUI)中嵌入RViz可视化窗口。
参考链接: