0、引言
⚠️ 在开始之前,您需要确保您已经为 Qt 配置好了 ROS 开发环境了。如果您还没有配置好,可以参考这篇文章
本文将着手探讨如何在 Qt Creator 上编辑 ROS 项目(工作空间)。
1、本教程使用到的相关软件或产品
- Ubuntu 20.04.6 LTS
- ROS Noetic Ninjemys LTS
- Qt 6.2.4 LTS
- Qt Creator 10.0.1
2、在带有 ROS 插件的 Qt Creator 中编辑 ROS 项目
2.1、Qt Creator 新建 ROS 工程
-
在(零)基础概念篇介绍 ROS 工作空间 时曾说过 “最顶层的工作空间文件夹(可以任意命名)和 src 文件夹(必须命名为"src")是需要自己创建的”。那么我们先创建如下的文件目录:
workspace #在用户目录(~)新建一个“workspace”专门用于存放ROS工作空间 └── catkin_ws1 #这是ROS工作空间文件夹,名字自拟 └── src #创建一个一级目录“src”文件夹
-
文件目录创建完成后,打开 Qt Creator,点击左上角 “文件”==>“New Project” 新建项目,在 “其他项目” 分区中找到 “ROS Workspace” 新建一个 ROS 工作空间:
-
在弹出的对话框中,我们需要为项目命名并选择工作空间的路径,随后点击下一步:
项 描述 Name Qt Creator 中 ROS 项目显示的名字,建议与我们创建的工作空间文件夹名称保持一致 Distribution ROS 发行版路径 Build System 构建系统。不出意外的话有三个可选项:①CatkinMake(就是 Catkin);②CatkinTools;③Colcon;任选一个即可,它们都可以用来构建和管理 ROS 软件包,笔者直接按默认使用 CatkinTools(当然最稳妥的还是选择第一个 —— CatkinMake) Workspace Path 工作空间目录 -
下一步来到“汇总”页面,如果不打算添加到版本控制系统的话就可以直接点击 “完成” 了:
可以看到,创建 ROS 项目只会添加后缀为 .workspace 的 XML 文件,这个文件包含了 Qt Creator 中用于管理 ROS 工作空间的配置信息和设置,可以用于在 Qt Creator 中方便地打开和编辑 ROS 工作空间。
💬 XML 文件不一定要用 .xml 作为文件后缀,文件后缀名只是一种帮助用户和计算机识别文件类型的方式,它并不影响文件的内容或格式。因此,XML文件可以使用任何后缀名,只要它遵循XML语法规则即可。同理,同为轻量级标记语言的 JSON、YAML、TOML 也是如此
-
创建 ROS 项目完成后,可以看到如下图所示的目录结构:
-
可以看到 .workspace 文件内容其实很简单:一是指定了 ROS 发行版的文件路径;二是指定了默认的构建系统为我们刚才选择的 CatkinTools。
-
刚才我们选择构建系统是用一个下拉框选择的,而下拉框中的每一项都是有索引的,从0开始。我们选择的 CatkinTools 是第二项(索引为1)。
-
完成 ROS 项目创建后,如果我们此时关闭该项目,则可以看到除了 .workspace 文件,Qt Creator 还会自动创建一个与 .workspace 文件同名的后缀为 .workspace.user 的 XML 文件,用于存储与 ROS 工作空间相关的用户特定设置和配置。
-
.workspace.user 文件只包含用户的设置,而不包含 Qt Creator 用于管理 ROS 工作空间的配置信息。因此,如果我们想分享 ROS 项目,只需要分享 .workspace 文件,而不需要分享 .workspace.user 文件。
-
2.2、Qt Creator 创建的 ROS 工程导入现有 ROS 软件包
如果您还没有现成的 ROS 包,您可以前往笔者的 Github 仓库下载。
(下载下来的压缩包解压后可以把文件夹名称中的“-master”删除)
-
由于我们创建 ROS 工程时选择的构建系统是 CatkinTools,Ubuntu 20.04 没有自带这个工具,我们需要先下载安装它:
-
首先同步源:
sudo apt-get update
-
然后安装 catkin_tools 包:
sudo apt-get install python3-catkin-tools
-
-
此外由于我们现有的 ROS 包用到了 ROS 的地图服务(map_server)包,但 ROS Noetic 并没有自带这个包,我们需要先安装这个包:
-
首先同步源:
sudo apt-get update
-
然后安装 map_server 包:
sudo apt-get install ros-noetic-map-server
-
-
安装完 map_server,还是接着新建 ROS 工程的内容。ROS 工程创建完成后,我们前往 ROS 工程的 src 文件夹下粘贴我们现有的 ROS 包:
随后回到 Qt Creator,关闭并重新打开项目,Qt Creator 会花一点时间自动构建该软件包,耐心等待即可,完成后如下图所示: -
接着前往 “项目”>“构建和运行”>“运行”==>“执行档” 指定软件的可执行文件所在路径:
可执行文件一般在 “devel”(开发空间)>“lib”>(与我们导入的 ROS 包同名的那个文件夹)下。
以本文提供的 ROS 包为例,可执行文件的绝对路径为:
/home/xjy/workspace/catkin_ws1/devel/lib/qviz_demo/qviz_demo
-
在(零)基础概念篇介绍 ROS Master 时曾介绍过“ROS Master 为 ROS 系统中的其余节点提供命名和注册服务”(在 ROS 中,一个应用程序进程表现为一个 ROS Node)。所以在运行我们的 ROS 软件之前,我们需要先启动 ROS Master:
在 Ubuntu 桌面使用ctrl+alt+T
快捷键打开一个终端,然后使用roscore
命令启动 ROS Master,如下图所示: -
完成后,就可以愉快地运行我们的 ROS 软件啦~
(由于我们是在本机上运行的roscore
,所以这里我们 ROS Master 的地址即回环地址)
2.3、Qt Creator 创建的 ROS 工程新建 ROS 软件包
如果我们没有现有的 ROS 软件包,那么这个时候可能就需要我们自己新建软件包了。使用 ros_qtc_plugin 插件新建 ROS 包只会添加两个文件:CMakeLists.txt 和 package.xml,这也是任何 ROS 功能包都必须包含的两个文件。其中 CMakeLists.txt 文件用于描述构建过程和依赖关系等内容;package.xml 用于描述软件包的名称、版本号、描述信息、邮件地址、作者、许可证以及其他 catkin 包依赖关系等内容。
由于笔者水平及时间有限,就并没有研究如何从新建一个 ROS 软件包到添加各种源码并成功运行的全过程;这里仅演示如何新建 ROS 包,更多内容还请感兴趣的读者自行摸索了。
-
由于我们创建 ROS 工程时选择的构建系统是 CatkinTools,Ubuntu 20.04 没有自带这个工具,我们需要先下载安装它:
-
首先同步源:
sudo apt-get update
-
然后安装 catkin_tools 包:
sudo apt-get install python3-catkin-tools
-
-
ROS 工程创建完成后,我们右击项目名称,点击 “添加新文件”:
(或者左上角 “文件(F)”==>“New File”) -
选择 ROS 分类下的 Package 添加即可:
-
在 “Package Details” 页面,除了包名称(Name)是必填项,其他所有项都是默认填写有内容或者可忽略不填(后续有需求随时可在 CMakeLists.txt 或 package.xml 内手动添加相应内容):
- Name:软件包名称,ROS 约定软件包名称应是小写字母 + 下划线(_)分割单词的格式。ROS 软件包名称是其在 ROS 系统中的唯一标识符,因此请确保使用唯一的名称。
- Path:软件包的路径,指定软件包的存储位置。通常,ROS 软件包被存储在ROS 工作空间的 src 目录下。
- Version:软件包的版本号,用于标识软件包的不同版本。ROS 软件包版本号通常采用 Semantic Versioning 规范,即 major.minor.patch(主版本号.次版本号.修订号)格式。
- License:软件包的许可证类型,用于说明软件包的使用和分发条款。如果对许可证不太了解,可以参考:什么是License?许可证?协议?都有哪些License? - 知乎。
- Dependencies/Catkin:ROS 软件包依赖的其他 ROS 软件包的名称,通常在这一栏我们需要填写对
roscpp
的依赖以使用 ROS 的 C++ 接口。如果想要添加多个依赖,可以使用英文逗号(,)或者空格隔开。 - Dependencies/System:ROS 软件包依赖的系统库的名称,通常这一栏可以不填。
- Dependencies/Boost:ROS 软件包依赖的 Boost 库的名称(Boost 是一个开源的、免费的 C++ 库集合,包含了大量的高质量、可重用的代码库。Boost 库覆盖了广泛的 C++ 编程领域,包括容器、日期时间、算法、数值计算、多线程、文件系统、正则表达式等方面),通常这一栏可以不填。
- Description:ROS 软件包的简要描述,通常包括软件包的用途、功能、特性等。这些信息将在软件包的 package.xml 文件中被包含,并在使用
rospack
命令或者其他 ROS 工具时显示出来。
-
下面是一个 “Package Details” 页面填写完成的实例展示:
-
填写完成后,点击 “下一步(N)”。可以确认新建 ROS 包只会添加两个文件(CMakeLists.txt 和 package.xml):
-
点击“完成(F)” 即可成功向 ROS 工程添加一个新建的 ROS 软件包。完成后如下图所示:
-
完成后,右击项目名称,点击“重新构建”:
-
稍等片刻就可以看到项目构建成功的提示,说明我们新建的 ROS 软件包是没有任何问题的:
2.4、在 ROS 软件包中使用 Qt 组件
既然是在 Qt Creator 中编辑 ROS 项目,那怎么能够对在 ROS 软件包使用 Qt 组件不感兴趣呢?♪(´▽`)
下面介绍在 ROS 项目中如何添加对 Qt 各种各样的组件的引用,以便使用这些组件。如果您想要使用 Qt 框架开发基于 ROS 的桌面应用程序,那么请勿错过 2.4 小节。🥰
-
让我们紧接着 2.3 小节 的内容继续。新建 ROS 软件包并构建成功后,我们点击“项目”==>“构建”,找到
Build Environment
构建环境: -
可以看到 ROS 项目是重新设置了 CMAKE_PREFIX_PATH 的:
什么是 CMAKE_PREFIX_PATH?
-
点击该环境变量,选中其值,并点击右方的“Edit”:
-
在弹出的对话框中点击“添加”:
-
找到 Qt 组件库所在目录(在 Qt 的安装目录下),点击“打开”:
-
可以看到路径列表中已经添加了 Qt 组件库所在路径了,点击右下方“确定(O)”以保存更改:
-
完成后可以看到 CMAKE_PREFIX_PATH 中已经成功添加了我们新增的路径了:
-
回到 ROS 软件包的 CMakeLists.txt 文件,接下来我们可以尝试查找一个 Qt 组件。在 CMakeLists.txt 文件中的适当位置添加下方命令即可:
# 查找 Qt6 的 Charts 组件 find_package(Qt6Charts REQUIRED)
-
保存更改,随后右击项目名称,点击“重新构建”:
-
构建成功!说明 CMake 已经成功找到该 Qt 组件啦~:
-
后续小伙伴们就能在项目中愉快地使用各种 Qt 组件了,只需要在 CMakeLists.txt 中通过
target_link_libraries
命令将模块链接到目标项目即可。例如:# 向项目添加可执行文件(仅作演示,毕竟我们新建的 ROS 软件包中并没有 main.cpp 源文件) add_executable(${PROJECT_NAME}_node main.cpp) # 将 Qt6 Charts 模块链接到目标 target_link_libraries(${PROJECT_NAME}_node Qt6::Charts)