ROS2 + Qt5 cmake的CMakeLists.txt文件配置

本文介绍了如何在ROS2Foxy环境下结合Qt5在Linux平台上创建和编译功能包。内容包括CMakeLists.txt的配置,使用rclcpp和std_msgs包,以及QtUI的集成。文章提到了在CMakeLists中设置头文件路径,处理UI和资源文件,以及链接库的步骤。

ROS2 QT实现学习笔记-1.1 功能包的创建和编译

ROS2 Foxy + Qt5 on Linux Platform

按上面两个文章配置后的目录结构

├── build
├── CMakeLists.txt
├── include
│   ├── mainwindow.h
│   └── rclcomm.h
├── package.xml
├── resource
├── src
│   ├── main.cpp
│   ├── mainwindow.cpp
│   └── rclcomm.cpp
└── ui
    └── mainwindow.ui

rclcomm.cpp和rclcomm.h是我的测试文件

 CMakeLists.txt

cmake_minimum_required(VERSION 3.8)
project(ros2_qt_demo LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

# !!! 第一个要注释掉
# set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
# ROS
# !!!ros需要的功能在这里导入
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
# QT
find_package(Qt5 COMPONENTS Widgets REQUIRED)
# find_package(<dependency> REQUIRED)

# 项目目录下的目标配置文件
file(GLOB PRO_SOURCE_DIR RELATIVE ${CMAKE_SOURCE_DIR} FOLLOW_SYMLINKS src/*.cpp)
file(GLOB PRO_UI_DIR RELATIVE ${CMAKE_SOURCE_DIR} FOLLOW_SYMLINKS ui/*.ui)
file(GLOB PRO_INCLUDE_DIR RELATIVE ${CMAKE_SOURCE_DIR} FOLLOW_SYMLINKS include/*.h *.hpp)
file(GLOB PRO_RESOURCE_DIR RELATIVE ${CMAKE_SOURCE_DIR} FOLLOW_SYMLINKS resource/*.qrc)
# include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
#搜索头文件的位置
include_directories(
       include
       ${rclcpp_INCLUDE_DIRS}# !!! 编译找不到rclcpp.hpp,要加上这个
       ${CMAKE_CURRENT_BINARY_DIR}
       ${CMAKE_CURRENT_SOURCE_DIR}
)
# include_directories(${rclcpp_INCLUDE_DIRS})
# (输出, 输入)
qt5_wrap_ui(QT_UI_HPP ${PRO_UI_DIR})
qt5_wrap_cpp(QT_MOC_HPP ${PRO_INCLUDE_DIR})
qt5_add_resources(QT_RESOUCE_HPP ${PRO_RESOURCE_DIR})

# 导入可执行的目标文件
add_executable(${PROJECT_NAME}
    ${PRO_SOURCE_DIR}
    ${PRO_INCLUDE_DIR}
    ${PRO_UI_DIR}
    ${PRO_RESOURCE_DIR}
    ${QT_UI_HPP} # UI的文件应该不需要添加在这里
    ${QT_MOC_HPP}
    ${QT_RESOUCE_HPP}
)
# !!! 编译找不到rclcpp.hpp,这里要加上${rclcpp_LIBRARIES}
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets ${rclcpp_LIBRARIES})

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # comment the line when a copyright and license is added to all source files
  set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # comment the line when this package is in a git repo and when
  # a copyright and license is added to all source files
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

TFDY/qt_ros_demo

这个是我配置后的qt_ros_demo

<think> 我们是在一个QtROS 2结合的项目中,需要在CMakeLists.txt中添加图片资源。在Qt中,图片资源通常使用.qrc文件Qt资源文件)来管理,然后在代码中通过资源路径(如":/images/icon.png")访问。在构建过程中,.qrc文件需要被编译成C++代码,以便在程序中使用。 根据引用[2]和引用[3],我们知道在CMakeLists.txt中需要链接Qt的相关库,并且使用find_package来查找Qt。同时,我们需要处理Qt的资源文件。 步骤: 1. 确保已经通过find_package加载了所需的Qt模块,至少需要Qt5Core(对于Qt6,则是Qt6Core)。因为我们可能还需要GUI模块,所以通常也会包含Qt5Gui和Qt5Widgets(根据项目需求)。 2. 使用`qt5_add_resources`(对于Qt5)或`qt_add_resources`(对于Qt6)命令将.qrc文件编译成C++代码。这个命令会生成一个.cpp文件,该文件需要被添加到可执行文件的源文件中。 但是注意,在ROS 2中,我们通常使用ament_cmake作为构建系统,并且可能使用colcon进行构建。因此,我们需要确保CMakeLists.txt符合ament_cmake的规范。 具体步骤: - 在CMakeLists.txt中,首先通过`find_package`查找Qt5(或Qt6)和ROS 2相关的包(如rclcpp等)。 - 然后,使用`qt5_add_resources`命令来添加资源文件。该命令的语法是: ``` qt5_add_resources(RESOURCE_SOURCE_FILE resource_file.qrc) ``` 其中`RESOURCE_SOURCE_FILE`是一个变量,用于存储生成的资源源文件的路径(通常是一个.cpp文件)。 - 将生成的资源源文件添加到可执行文件的源文件列表中。 示例: 假设我们有一个资源文件`images.qrc`,位于项目的`resources`目录下。 1.CMakeLists.txt中找到`find_package`部分,确保已经包含Qt5(或Qt6): ```cmake find_package(Qt5 COMPONENTS Core Widgets REQUIRED) # 根据实际需要添加组件 ``` 2. 添加资源文件: ```cmake set(RESOURCE_FILES resources/images.qrc ) qt5_add_resources(GENERATED_RESOURCE ${RESOURCE_FILES}) ``` 3. 在创建可执行目标时,将生成的资源文件(`${GENERATED_RESOURCE}`)添加到源文件列表: ```cmake add_executable(your_target src/main.cpp src/other_sources.cpp ${GENERATED_RESOURCE} ) ``` 4. 链接Qt库(如之前已经链接,则不需要重复): ```cmake target_link_libraries(your_target Qt5::Core Qt5::Widgets # ... 其他库,包括ROS 2的库 ${catkin_LIBRARIES} # 注意:在ROS 2中,通常使用ament_target_dependencies ) ``` 注意:在ROS 2中,我们通常使用`ament_target_dependencies`来链接依赖,但Qt库不是通过ament索引的,所以还是直接使用`target_link_libraries`链接Qt库。 但是,在ROS 2(Foxy及以上)中,推荐使用`ament_auto`系列命令来简化,但如果项目结构复杂,手动管理也是可以的。 另外,如果使用Qt6,命令可能为`qt6_add_resources`,并且需要先查找Qt6。 如果项目同时支持Qt5Qt6,则需要做条件判断。不过目前ROS 2 Galactic和Humble默认使用Qt5。 另外,确保在系统中安装了相应的Qt开发包,并且在CMake中能够找到它们。 示例CMakeLists.txt片段(以Qt5为例): ```cmake cmake_minimum_required(VERSION 3.5) project(your_project) # 查找依赖 find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(Qt5 COMPONENTS Core Widgets REQUIRED) # 设置资源文件 set(RESOURCE_FILES resources/images.qrc ) qt5_add_resources(GENERATED_RESOURCE ${RESOURCE_FILES}) # 创建可执行文件 add_executable(your_target src/main.cpp ${GENERATED_RESOURCE} ) # 链接库 target_link_libraries(your_target Qt5::Core Qt5::Widgets rclcpp::rclcpp ) # 安装和导出(如果需要) ament_target_dependencies(your_target rclcpp ) ament_package() ``` 注意:在ROS 2中,我们通常使用`ament_target_dependencies`来添加ROS 2的依赖,但是Qt库不是通过`ament`导出的,所以我们使用`target_link_libraries`显式链接。 另外,如果资源文件较多,可以将其放在一个变量中,然后一次性添加。 最后,确保资源文件.qrc)在正确的位置,并且其内部引用的图片文件路径正确。 关于.qrc文件的内容示例: ```xml <!DOCTYPE RCC> <RCC version="1.0"> <qresource prefix="/images"> <file>icon.png</file> <file>background.jpg</file> </qresource> </RCC> ``` 注意:这个.qrc文件与图片文件(icon.png, background.jpg)在同一个目录(resources)下。 这样,在代码中就可以使用资源路径了,例如: ```cpp QPixmap icon(":/images/icon.png"); ``` 总结: 在Qt ROS 2项目的CMakeLists.txt中添加图片资源,主要是通过`qt5_add_resources`命令将.qrc文件编译成C++文件,并将该源文件添加到可执行目标中。 如果遇到问题,确保: 1. CMake版本足够高(至少3.5,但建议3.12以上) 2. Qt5的find_package能够成功找到 3. 资源文件路径设置正确 如果使用Qt6,将上述命令中的`qt5`替换为`qt6`即可。 另外,在ROS 2的构建系统中,由于colcon会创建独立的工作空间构建环境,所以确保资源文件被正确复制到构建目录(通常,如果资源文件在包目录中,CMake会处理,但最好使用相对路径,并确保在CMakeLists.txt中正确指定路径)。 注意:在ROS 2中,我们通常将资源文件放在包目录下的`resources`目录中,然后在CMakeLists.txt中使用相对路径(相对于CMakeLists.txt所在目录)来引用。 </think>在Qt ROS 2项目的CMakeLists.txt中添加图片资源,主要通过Qt资源系统(.qrc文件)实现。以下是具体实现方法及步骤: ### 一、添加图片资源的完整流程 1. **创建资源目录** ```bash mkdir -p src/res/images # 创建资源目录 # 将图片(如logo.png)放入此目录 ``` 2. **创建.qrc资源文件** 在项目根目录创建`resources.qrc`文件: ```xml <!DOCTYPE RCC> <RCC version="1.0"> <qresource prefix="/images"> <file>src/res/images/logo.png</file> <!-- 添加更多文件 --> </qresource> </RCC> ``` 3. **修改CMakeLists.txt** ```cmake cmake_minimum_required(VERSION 3.12) project(your_project) # 查找Qt依赖[^3] find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets) # 添加资源文件[^2] set(RESOURCE_FILES resources.qrc ) # 生成资源代码 qt5_add_resources(RESOURCE_SRC ${RESOURCE_FILES}) # 创建可执行文件 add_executable(${PROJECT_NAME} src/main.cpp ${RESOURCE_SRC} # 包含生成的资源代码 ) # 链接Qt库[^2] target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Gui Qt5::Widgets ${rclcpp_LIBRARIES} ) # 安装配置ROS 2必需) install(TARGETS ${PROJECT_NAME} DESTINATION lib/${PROJECT_NAME} ) ``` ### 二、代码中使用资源 在Qt代码中通过资源路径访问: ```cpp // 示例:在QLabel显示图片 QPixmap pixmap(":/images/logo.png"); // 注意 :/ 前缀 QLabel *label = new QLabel(this); label->setPixmap(pixmap); ``` ### 三、关键注意事项 1. **路径前缀**:资源路径必须使用`:/`开头,后接.qrc中定义的prefix和文件2. **构建验证**:构建后检查生成`qrc_resources.cpp`文件是否包含图片二进制数据 3. **ROS 2安装**:确保`install()`指令正确配置,否则部署时资源不可用[^4] 4. **资源更新**:修改.qrc文件后需重新运行`colcon build`重新生成资源代码 ### 四、调试技巧 若资源加载失败: 1. 检查`qrc_resources.cpp`中是否包含目标资源 2. 使用Qt工具检查资源路径: ```cpp QFile file(":/images/logo.png"); qDebug() << "Resource exists:" << file.exists(); ``` 3. 确认`CMakeLists.txt`中`qt5_add_resources`指令正确执行 > **性能提示**:对于大型资源,建议启用资源压缩: > ```xml > <qresource prefix="/images" lang="en"> > <file compress="9">src/res/images/logo.png</file> > </qresource> > ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值