【机器人】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
)
相关推荐
one3121 小时前
高精度MEMS电容式倾角传感器:原理、结构与Python三维可视化
开发语言·python
程序员小八7771 小时前
Go 语言特性
开发语言·后端·golang
INGNIGHT2 小时前
1908 · 布尔表达式求值(stack单调栈&dfs)
开发语言·c++·算法
এ慕ོ冬℘゜2 小时前
深入理解浏览器全屏 API:从 requestFullscreen 到全屏实战
开发语言·html
七夜zippoe3 小时前
DolphinDB 高可用部署实战:从容灾设计到故障自动转移
开发语言·python·高可用·容灾·dolphindb
不会就选b3 小时前
Linux之线程池(三)
linux·开发语言
棉晗榜3 小时前
C# HttpClient配置具有tls指纹发起跟浏览器一样的请求解决反爬虫防护
开发语言·爬虫·c#
l1t4 小时前
DeepSeek总结的DuckDB 如何更快地运行递归 CTE
java·开发语言·数据库·mysql·duckdb
HAPPY酷4 小时前
python的对象和方法
开发语言·python
橙露4 小时前
移动端客户端原生开发语言
开发语言