【机器人】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
)
相关推荐
代码中介商11 小时前
C++左值与右值:核心判断法则详解
开发语言·c++
JAVA96511 小时前
JAVA面试-并发篇 05-并发包AQS队列实现原理是什么
java·开发语言·面试
kobesdu12 小时前
【ROS2实战笔记-24】ROS2 Launch 实用技巧:条件逻辑与节点动态生成
笔记·ros·slam
Halo_tjn12 小时前
反射与设计模式1
java·开发语言·算法
珊瑚里的鱼12 小时前
手撕单例模式中的饿汉模式和懒汉模式,懒汉模式还要再多加一个C++11版本的
开发语言·c++·单例模式
_不会dp不改名_13 小时前
python-opencv环境搭建
开发语言·python·opencv
HappyAcmen13 小时前
9.复盘API全套流程
开发语言·python
charlie11451419113 小时前
通用GUI编程技术——图形渲染实战(四十五)——D3D12资源与堆管理:从上传到驻留
开发语言·3d·图形渲染·win32
不会C语言的男孩13 小时前
C++ Primer 第12章:动态内存
开发语言·c++