【机器人】ROS结合Qt开发上位机软件工作空间配置

前提是在linux中需要安装好Qt源码和Qt creater11.0

参考 :【C++】源码编译 Qt5.15.3|Ubuntu22.04 下 ROS 开发环境搭建-CSDN博客

Qt creater配置编译环境

因为在Qt当中使用的是Cmake,所以需要配置依赖项目

主要配置以下三项:

  • AMENT_PREFIX_PATH:告诉 ROS2 去哪里找编译好的功能包(需要包含当前工作空间和ROS)

  • CMAKE_PREFIX_PATH:CMake 找库、找头文件的路径(需要包含当前工作空间和Qt)

  • COLCON_PREFIX_PATH:colcon 编译时的依赖搜索路径(当前工作空间Install目录)

  • LD_LIBRARY_PATH:程序运行时找动态库的路径(增加Qt的lib目录)

配置结果

添加ROS功能包

在已经有了 一个含有src的工作空间后,可以在Src目录添加ROS2功能包,如下图

添加设计师界面

因为有了Qt的参与,使得ROS程序可以有GUI的界面存在,添加设计师界面

  1. 然后将cpp文件移动到功能包src目录

  2. 头文件移动到include目录

  3. ui文件移动到ui目录

最终目录结构

在src目录创建main函数,右键添加新文件即可

复制代码
├── CMakeLists.txt
├── include
│   ├── dashboard.h
│   └── looraysbot_ui
├── package.xml
├── src
│   ├── dashboard.cpp
│   └── main.cpp
└── ui
└── dashboard.ui

修改CMakelists.txt

cpp 复制代码
cmake_minimum_required(VERSION 3.8)
project(looraysbot_ui)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(Qt5 REQUIRED COMPONENTS  Core Widgets)

#Qt不是标准 C++,它要额外生成代码
set(CMAKE_AUTOMOC ON) #MOC → 处理 Q_OBJECT
set(CMAKE_AUTORCC ON) #RCC → 处理资源文件
set(CMAKE_AUTOUIC ON) #UIC → 处理 .ui → 生成 ui_xxx.h
set(CMAKE_INCLUDE_CURRENT_DIR ON) #让 Qt能找到自动生成的ui_xxx.h
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/ui) # UI文件不在 src/ 里,而在 ui/ 文件夹

include_directories(
  include #去当前项目的 include/ 文件夹 找头文件
  ${CMAKE_CURRENT_BINARY_DIR} #去 编译生成文件的目录(build 目录) 找头文件
  ${Qt5Widgets_INCLUDE_DIRS} #去 Qt 安装目录找 Qt 的头文件(find_package后返回)
  ${rclcpp_INCLUDE_DIRS} #去 ROS2安装目录找ROS2头文件(find_package后返回)
)

add_executable(looraysBot_ui
  include/dashboard.h #带Q_OBJEC的.h必须写进 CMake
  src/dashboard.cpp
  ui/dashboard.ui #.ui 文件 → 必须写进 CMake
  src/main.cpp
)

target_link_libraries(looraysBot_ui Qt5::Widgets)
ament_target_dependencies(looraysBot_ui rclcpp sensor_msgs )

install(TARGETS looraysBot_ui
    DESTINATION lib/${PROJECT_NAME})

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()

解释

  • Qt不是标准 C++,它要额外生成代码
cpp 复制代码
set(CMAKE_AUTOMOC ON) #MOC → 处理 Q_OBJECT
set(CMAKE_AUTORCC ON) #RCC → 处理资源文件
set(CMAKE_AUTOUIC ON) #UIC → 处理 .ui → 生成 ui_xxx.h
  • find_package后返回关键字的值
cpp 复制代码
find_package(rclcpp REQUIRED) → ${rclcpp_INCLUDE_DIRS} #去 ROS2安装目录找ROS2头文件
find_package(Qt5 REQUIRED COMPONENTS  Core Widgets) → ${Qt5Widgets_INCLUDE_DIRS} #去 Qt 安装目录找 Qt 的头文件
  • UI文件不在 src/ 里,而在 ui/ 文件夹
cpp 复制代码
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/ui)
  • 让 Qt能找到自动生成的ui_xxx.h
cpp 复制代码
set(CMAKE_INCLUDE_CURRENT_DIR ON)
  • 带Q_OBJEC的 和 .ui 文件,.h必须写进 CMake
cpp 复制代码
add_executable(looraysBot_ui
	include/dashboard.h #带Q_OBJEC的.h必须写进 CMake
	src/dashboard.cpp
	ui/dashboard.ui #.ui 文件 → 必须写进 CMake
	src/main.cpp
)
相关推荐
_冷眸_8 分钟前
Python 调用大模型 API:最小请求、Base URL 和 401/404 排查
开发语言·人工智能·python
niucloud-admin19 分钟前
NIUCLOUD PHP SAAS上门家政使用文档:服务保障
java·开发语言·php
熊猫钓鱼>_>1 小时前
鸿蒙 PC 三方库适配复盘:libfvad 1.0 —— 把 WebRTC VAD 做成能装进采集链路的静态库
服务器·开发语言·华为·harmonyos·openharmony·适配·鸿蒙pc
Ai-_Man1 小时前
Coze扣子还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·1024程序员节
raindayinrain1 小时前
c++设计模式
开发语言·c++·设计模式
hiahiahia1231 小时前
Streaming Model Output
开发语言·前端
熊猫钓鱼>_>2 小时前
鸿蒙PC高分屏与键鼠交互适配:DPI缩放、右键菜单一次讲清
开发语言·笔记·华为·ai编程·harmonyos·鸿蒙·鸿蒙心迹
octopus_c2 小时前
C++ 运算符重载详解 && 日期类的实现
开发语言·c++
Eiceblue2 小时前
用 Python 给 Word 文档加水印:文字、图片与批量处理
开发语言·vscode·python·word
j7~2 小时前
【C++ 面试笔记】(篇二):类与数据抽象 & STL 容器与算法
开发语言·c++·面试·stl容器和算法·类和数据抽象