在 Qt Creator 上创建 ROS 项目并新建/导入 ROS 包

0、引言

⚠️ 在开始之前,您需要确保您已经为 Qt 配置好了 ROS 开发环境了。如果您还没有配置好,可以参考这篇文章

本文将着手探讨如何在 Qt Creator 上编辑 ROS 项目(工作空间)。

1、本教程使用到的相关软件或产品

  1. Ubuntu 20.04.6 LTS
  2. ROS Noetic Ninjemys LTS
  3. Qt 6.2.4 LTS
  4. Qt Creator 10.0.1

2、在带有 ROS 插件的 Qt Creator 中编辑 ROS 项目

2.1、Qt Creator 新建 ROS 工程

  1. 在(零)基础概念篇介绍 ROS 工作空间 时曾说过 “最顶层的工作空间文件夹(可以任意命名)和 src 文件夹(必须命名为"src")是需要自己创建的”。那么我们先创建如下的文件目录:

    workspace           #在用户目录(~)新建一个“workspace”专门用于存放ROS工作空间
    └── catkin_ws1      #这是ROS工作空间文件夹,名字自拟└── src         #创建一个一级目录“src”文件夹
    

    在这里插入图片描述

  2. 文件目录创建完成后,打开 Qt Creator,点击左上角 “文件”==>“New Project” 新建项目,在 “其他项目” 分区中找到 “ROS Workspace” 新建一个 ROS 工作空间:
    在这里插入图片描述

  3. 在弹出的对话框中,我们需要为项目命名并选择工作空间的路径,随后点击下一步:
    在这里插入图片描述

    描述
    NameQt Creator 中 ROS 项目显示的名字,建议与我们创建的工作空间文件夹名称保持一致
    DistributionROS 发行版路径
    Build System构建系统。不出意外的话有三个可选项:①CatkinMake(就是 Catkin);②CatkinTools;③Colcon;任选一个即可,它们都可以用来构建和管理 ROS 软件包,笔者直接按默认使用 CatkinTools(当然最稳妥的还是选择第一个 —— CatkinMake)
    Workspace Path工作空间目录
  4. 下一步来到“汇总”页面,如果不打算添加到版本控制系统的话就可以直接点击 “完成” 了:
    在这里插入图片描述

    可以看到,创建 ROS 项目只会添加后缀为 .workspaceXML 文件,这个文件包含了 Qt Creator 中用于管理 ROS 工作空间的配置信息和设置,可以用于在 Qt Creator 中方便地打开和编辑 ROS 工作空间

    💬 XML 文件不一定要用 .xml 作为文件后缀,文件后缀名只是一种帮助用户和计算机识别文件类型的方式,它并不影响文件的内容或格式。因此,XML文件可以使用任何后缀名,只要它遵循XML语法规则即可。同理,同为轻量级标记语言的 JSONYAMLTOML 也是如此

  5. 创建 ROS 项目完成后,可以看到如下图所示的目录结构:
    在这里插入图片描述

    • 可以看到 .workspace 文件内容其实很简单:一是指定了 ROS 发行版的文件路径;二是指定了默认的构建系统为我们刚才选择的 CatkinTools。

    • 刚才我们选择构建系统是用一个下拉框选择的,而下拉框中的每一项都是有索引的,从0开始。我们选择的 CatkinTools 是第二项(索引为1)。

    • 完成 ROS 项目创建后,如果我们此时关闭该项目,则可以看到除了 .workspace 文件,Qt Creator 还会自动创建一个与 .workspace 文件同名的后缀为 .workspace.userXML 文件,用于存储与 ROS 工作空间相关的用户特定设置和配置。
      在这里插入图片描述

    • .workspace.user 文件只包含用户的设置,而不包含 Qt Creator 用于管理 ROS 工作空间的配置信息。因此,如果我们想分享 ROS 项目,只需要分享 .workspace 文件,而不需要分享 .workspace.user 文件。

2.2、Qt Creator 创建的 ROS 工程导入现有 ROS 软件包

如果您还没有现成的 ROS 包,您可以前往笔者的 Github 仓库下载。
下载下来的压缩包解压后可以把文件夹名称中的“-master”删除

在这里插入图片描述

  1. 由于我们创建 ROS 工程时选择的构建系统是 CatkinTools,Ubuntu 20.04 没有自带这个工具,我们需要先下载安装它:

    1. 首先同步源:

      sudo apt-get update
      
    2. 然后安装 catkin_tools 包:

      sudo apt-get install python3-catkin-tools
      
  2. 此外由于我们现有的 ROS 包用到了 ROS 的地图服务(map_server)包,但 ROS Noetic 并没有自带这个包,我们需要先安装这个包:

    1. 首先同步源:

      sudo apt-get update
      
    2. 然后安装 map_server 包:

      sudo apt-get install ros-noetic-map-server
      
  3. 安装完 map_server,还是接着新建 ROS 工程的内容。ROS 工程创建完成后,我们前往 ROS 工程的 src 文件夹下粘贴我们现有的 ROS 包:
    在这里插入图片描述
    随后回到 Qt Creator,关闭并重新打开项目,Qt Creator 会花一点时间自动构建该软件包,耐心等待即可,完成后如下图所示:
    在这里插入图片描述

  4. 接着前往 “项目”>“构建和运行”>“运行”==>“执行档” 指定软件的可执行文件所在路径:
    在这里插入图片描述

    可执行文件一般在 “devel”(开发空间)>“lib>(与我们导入的 ROS 包同名的那个文件夹)下。

    以本文提供的 ROS 包为例,可执行文件的绝对路径为:
    /home/xjy/workspace/catkin_ws1/devel/lib/qviz_demo/qviz_demo

  5. 在(零)基础概念篇介绍 ROS Master 时曾介绍过“ROS Master 为 ROS 系统中的其余节点提供命名和注册服务”(在 ROS 中,一个应用程序进程表现为一个 ROS Node)。所以在运行我们的 ROS 软件之前,我们需要先启动 ROS Master:
    在 Ubuntu 桌面使用 ctrl+alt+T 快捷键打开一个终端,然后使用 roscore 命令启动 ROS Master,如下图所示:
    在这里插入图片描述

  6. 完成后,就可以愉快地运行我们的 ROS 软件啦~
    在这里插入图片描述
    (由于我们是在本机上运行的 roscore,所以这里我们 ROS Master 的地址即回环地址)

2.3、Qt Creator 创建的 ROS 工程新建 ROS 软件包

如果我们没有现有的 ROS 软件包,那么这个时候可能就需要我们自己新建软件包了。使用 ros_qtc_plugin 插件新建 ROS 包只会添加两个文件:CMakeLists.txtpackage.xml这也是任何 ROS 功能包都必须包含的两个文件。其中 CMakeLists.txt 文件用于描述构建过程和依赖关系等内容;package.xml 用于描述软件包的名称、版本号、描述信息、邮件地址、作者、许可证以及其他 catkin 包依赖关系等内容。

由于笔者水平及时间有限,就并没有研究如何从新建一个 ROS 软件包到添加各种源码并成功运行的全过程;这里仅演示如何新建 ROS 包,更多内容还请感兴趣的读者自行摸索了。

  1. 由于我们创建 ROS 工程时选择的构建系统是 CatkinTools,Ubuntu 20.04 没有自带这个工具,我们需要先下载安装它:

    1. 首先同步源:

      sudo apt-get update
      
    2. 然后安装 catkin_tools 包:

      sudo apt-get install python3-catkin-tools
      
  2. ROS 工程创建完成后,我们右击项目名称,点击 “添加新文件”:
    在这里插入图片描述
    (或者左上角 “文件(F)”==>“New File”)

  3. 选择 ROS 分类下的 Package 添加即可:
    在这里插入图片描述

  4. 在 “Package Details” 页面,除了包名称(Name)是必填项,其他所有项都是默认填写有内容或者可忽略不填(后续有需求随时可在 CMakeLists.txtpackage.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 工具时显示出来。
  5. 下面是一个 “Package Details” 页面填写完成的实例展示:
    在这里插入图片描述

  6. 填写完成后,点击 “下一步(N)”。可以确认新建 ROS 包只会添加两个文件(CMakeLists.txtpackage.xml):
    在这里插入图片描述

  7. 点击“完成(F)” 即可成功向 ROS 工程添加一个新建的 ROS 软件包。完成后如下图所示:
    在这里插入图片描述

  8. 完成后,右击项目名称,点击“重新构建”:
    在这里插入图片描述

  9. 稍等片刻就可以看到项目构建成功的提示,说明我们新建的 ROS 软件包是没有任何问题的:
    在这里插入图片描述

2.4、在 ROS 软件包中使用 Qt 组件

既然是在 Qt Creator 中编辑 ROS 项目,那怎么能够对在 ROS 软件包使用 Qt 组件不感兴趣呢?♪(´▽`)

下面介绍在 ROS 项目中如何添加对 Qt 各种各样的组件的引用,以便使用这些组件。如果您想要使用 Qt 框架开发基于 ROS 的桌面应用程序,那么请勿错过 2.4 小节。🥰

  1. 让我们紧接着 2.3 小节 的内容继续。新建 ROS 软件包并构建成功后,我们点击“项目”==>“构建”,找到 Build Environment 构建环境:
    在这里插入图片描述

  2. 可以看到 ROS 项目是重新设置了 CMAKE_PREFIX_PATH 的:
    在这里插入图片描述

    什么是 CMAKE_PREFIX_PATH

  3. 点击该环境变量,选中其值,并点击右方的“Edit”:
    在这里插入图片描述

  4. 在弹出的对话框中点击“添加”:
    在这里插入图片描述

  5. 找到 Qt 组件库所在目录(在 Qt 的安装目录下),点击“打开”:
    在这里插入图片描述

  6. 可以看到路径列表中已经添加了 Qt 组件库所在路径了,点击右下方“确定(O)”以保存更改:
    在这里插入图片描述

  7. 完成后可以看到 CMAKE_PREFIX_PATH 中已经成功添加了我们新增的路径了:
    在这里插入图片描述

  8. 回到 ROS 软件包的 CMakeLists.txt 文件,接下来我们可以尝试查找一个 Qt 组件。在 CMakeLists.txt 文件中的适当位置添加下方命令即可:

    # 查找 Qt6 的 Charts 组件
    find_package(Qt6Charts REQUIRED)
    
  9. 保存更改,随后右击项目名称,点击“重新构建”:
    在这里插入图片描述

  10. 构建成功!说明 CMake 已经成功找到该 Qt 组件啦~:
    在这里插入图片描述

  11. 后续小伙伴们就能在项目中愉快地使用各种 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)
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV学习(4.2) 图像的几何变换

1.目标 学习将不同的几何变换应用到图像上,如平移、旋转、仿射变换等。你会看到这些函数: cv.getPerspectiveTransform 2.缩放 缩放是调整图片的大小。 OpenCV 使用 cv.resize() 函数进行调整。可以手动指定图像的大小,也可以指定比例因子。可以使用不…

【Vue】小黑记事本

文章目录 一、需求说明二、思路分析三、代码实现 一、需求说明 拆分基础组件渲染待办任务添加任务删除任务底部合计 和 清空功能持久化存储 二、思路分析 拆分基础组件 咱们可以把小黑记事本原有的结构拆成三部分内容:头部(TodoHeader)、列…

基于semantic_kernel的ChatMD系统

问答系统需求文档 一、项目概述 本项目旨在开发一个能够上传 MD 文件,并基于 MD内容进行问答互动的系统。用户可以上传 MD文件,系统将解析 MD内容,并允许用户通过对话框进行问答互动,获取有关 MD文件内容的信息。 二、功能需求…

保研面试408复习 8——计算机网络(浏览器http)、离散数学(平面图)、操作系统、数据结构

文章目录 一、计算机网络1、从在浏览器输入网址到页面显示的过程1. 输入网址2. DNS 解析3. 建立TCP连接4. 发送HTTP请求5. 服务器处理请求并响应6. 浏览器处理响应7. 页面渲染 二、离散数学一、平面图1、平面图性质2、Kuratowski定理 三、操作系统四、数据结构 一、计算机网络 …

IDCF五周年专场—【研发效能·创享大会】圆满落幕!

2024 年5 月25 日,【研发效能创享大会】—IDCF五周年专场在北京希尔顿欢朋酒店(大红门)成功举办!本次大会旨在为社区成员提供一个学习与交流的平台,分享技术经验,交流行业见解,促进技术合作与创…

【Java基础】线程的五大状态

新建状态 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。 就绪状态 当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中&#xff…

景深技术在AI绘画中的魔法:为数字艺术注入新维度

引言: 在人工智能(AI)的浪潮中,绘画艺术领域迎来了革命性的变革。AI绘画不仅改变了创作过程,还为艺术家和设计师提供了前所未有的工具。其中,景深技术作为一种重要的视觉处理手段,在AI绘画中的应…

告别繁琐,Xinstall一键解决App代理结算难题!

在移动互联网的浪潮中,App的推广和运营成为了众多企业和开发者关注的焦点。然而,随着App市场的日益竞争,代理结算的复杂性和繁琐性成为了许多推广者头疼的问题。为了解决这个问题,Xinstall凭借其专业的技术和丰富的服务经验&#…

Modebus通信协议 温控器示例

目录 1 指令解释 2 获取动态的CRC 3 crc在线验证 4 16进制正负温度互转 4.2 16进制转温度 4.2 温度转16进制 5 完整工具类 最近安卓工作接了很多硬件,其他的都是发个固定指令,比较有代表性就是温控器和打印机自定义内容所以这个记录接入示例&…

为什么没有输出九九乘法表?

下面的程序本来想输出九九乘法表到屏幕上&#xff0c;为什么没有输出呢&#xff1f;怎样修改&#xff1f; <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>我的HTML练习</title> …

新火种AI|倒反天罡!美国名校斯坦福AI团队抄袭中国大模型

作者&#xff1a;一号 编辑&#xff1a;美美 中国大模型被抄袭&#xff0c;怎么不算是某种层面上的国际认可呢&#xff1f; 5月29日&#xff0c;斯坦福大学的一个AI研究团队发布了一个名为「Llama3V」的模型&#xff0c;号称只要 500 美元就能训练出一个 SOTA 多模态模型&am…

知识库系统:从认识到搭建

在这个信息过载的时代&#xff0c;企业越来越需要一个集中的知识库系统来促进员工协作和解决问题。本文跟着LookLook同学一起来探讨搭建高效知识库系统的所有注意事项和知识库系统的最佳推荐。 | 什么是知识库系统 知识库系统是一种软件或工具&#xff0c;旨在填补组织内的知识…

超越传统AI 新型多智能体系统MESA,探索效率大幅提升

探索多智能体强化学习的协同元探索 —— MESA 算法深度解读在多智能体强化学习&#xff08;MARL&#xff09;的征途中&#xff0c;如何高效探索以发现最优策略一直是研究者们面临的挑战。特别是在稀疏奖励的环境中&#xff0c;这一问题变得更加棘手。《MESA: Cooperative Meta-…

用扫描书籍的功能扫描文档是扫描件吗?

当使用扫描书籍的功能来扫描文档时&#xff0c;产生的结果通常被称为“扫描件”或“扫描图像”。这里的“扫描”一词指的是通过扫描仪或具有扫描功能的设备&#xff08;如一些高端打印机、多功能一体机等&#xff09;将纸质文档转换为数字图像的过程。 扫描件通常是高清晰度的…

关于phpstorm创建类和方法时带描述注释

展示效果&#xff1a; 1、使用phpstorm创建类文件时自带注释及注释编辑 步骤1&#xff1a; 步骤二&#xff1a; 内容&#xff1a; <?php /** * Desc: * author guowei * datetime $DATE $TIME */ #if (${NAMESPACE}) namespace ${NAMESPACE}; #end class ${NAM…

计算机网络 —— 数据链路层(以太网)

计算机网络 —— 数据链路层&#xff08;以太网&#xff09; 什么是以太网以太网传输介质和拓扑结构的发展传输介质的发展&#xff1a;拓扑结构的发展&#xff1a; 10BASE-T 以太网适配器和MAC地址适配器&#xff08;Adapter&#xff09;MAC地址适配器与MAC地址的关系 MAC帧以太…

使用Java进行网络采集:代理IP与参数传递详解

在Java编程语言中&#xff0c;参数传递机制是一个常见的讨论话题。理解这一点对于编写高效且无错误的Java代码至关重要。本文将探讨Java的参数传递机制&#xff0c;解析其究竟是“按引用传递”还是“按值传递”&#xff0c;并结合网络爬虫技术的实例&#xff0c;展示如何在实际…

【机器学习】机器学习与推荐系统在电子商务中的融合应用与性能优化新探索

文章目录 引言机器学习与推荐系统的基本概念机器学习概述监督学习无监督学习强化学习 推荐系统概述基于内容的推荐协同过滤混合推荐 机器学习与推荐系统的融合应用用户行为分析数据预处理特征工程 模型训练与评估模型训练模型评估 个性化推荐基于用户的协同过滤基于商品的协同过…

【Git教程】(二十)外包长历史记录 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 外包长历史记录 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 外包项目历史3.2 链接到当前活动版本库 Git 版本库会随着时间积累越来越大&#xff0c;会影响它的内存管理效率。通常在版本库中只有源 代码文件情况下&#xff0c;这点效率影响可以忽略不计。在现…

WSDM 2023 推荐系统相关论文整理(三)

WSDM 2023的论文录用结果已出&#xff0c;推荐系统相关的论文方向包含序列推荐&#xff0c;点击率估计等领域&#xff0c;涵盖图学习&#xff0c;对比学习&#xff0c;因果推断&#xff0c;知识蒸馏等技术&#xff0c;累计包含近四十篇论文&#xff0c;下文列举了部分论文的标题…