【机器人】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
)
相关推荐
RAN11426760081 小时前
1.3第一个程序的介绍
开发语言·qt
blue_ice .2 小时前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发
远翔调光芯片^138287988722 小时前
ECP5702能芯科技PD取电芯片在市场上的优势有哪些?
开发语言·人工智能·单片机·嵌入式硬件·智能家居
泡海椒3 小时前
规则引擎对比:JQuick-Java vs Drools 轻量场景选型对比
java·开发语言
泡泡鱼(敲代码中)3 小时前
Python 容器类型学习笔记:列表、元组、字典、集合
开发语言·笔记·python·pycharm
2501_933670794 小时前
平台招商运营校招能力模型:数据分析、SQL与增长场景拆解
开发语言
菜鸟~noob2334 小时前
【Bonjour】华为Peerium架构深度解析:从冯·诺依曼到百万处理器“一台计算机”,附MATLAB性能仿真【含matlab代码,可直接运行】
开发语言·matlab·华为·peerium
白远山5 小时前
24小时自助健身房系统开发实战:从需求分析到完整指南
java·开发语言·数据库·数据挖掘·需求分析
wdfk_prog5 小时前
ROS教程10:从 gtest 到 rostest——Unit Test、Node 集成测试、rosbag 与 rqt 验证闭环
运维·缓存·docker·容器·ros
shmily麻瓜小菜鸡7 小时前
TDD(测试驱动开发)详解
开发语言·javascript·typescript·node.js·ecmascript