一个完整的 ROS2 QT 多线程功能包实现,包含可选 GUI 界面、发布者线程、接收者线程和参数服务器交互功能。
功能包结构
plaintext
ros2_qt_multi_thread/
├── CMakeLists.txt
├── package.xml
├── src/
│ ├── main.cpp
│ ├── main_window.cpp
│ ├── main_window.ui
│ ├── ros_node.cpp
│ ├── publisher_thread.cpp
│ ├── subscriber_thread.cpp
│ └── param_manager.cpp
└── include/
└── ros2_qt_multi_thread/
├── main_window.hpp
├── ros_node.hpp
├── publisher_thread.hpp
├── subscriber_thread.hpp
└── param_manager.hpp
核心文件实现
1. package.xml
xml
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>ros2_qt_multi_thread</name>
<version>0.0.0</version>
<description>ROS2 QT Multi-threaded Package with GUI, Publisher, Subscriber and Param Server</description>
<maintainer email="your@email.com">Your Name</maintainer>
<license>Apache-2.0</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<buildtool_depend>ament_cmake_qt</buildtool_depend>
<depend>rclcpp</depend>
<depend>std_msgs</depend>
<depend>Qt5Widgets</depend>
<depend>Qt5Core</depend>
<build_depend>ament_cmake</build_depend>
<exec_depend>rclcpp</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>Qt5Widgets</exec_depend>
<build_type>ament_cmake</build_type>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
2. CMakeLists.txt
cmake
cmake_minimum_required(VERSION 3.5)
project(ros2_qt_multi_thread)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# Qt5 配置
find_package(Qt5 COMPONENTS Widgets Core REQUIRED)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(Qt5_LIBRARIES Qt5::Widgets Qt5::Core)
# ROS2 配置
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
# 包含目录
include_directories(
include
${Qt5Widgets_INCLUDE_DIRS}
)
# 源文件
set(SOURCES
src/main.cpp
src/main_window.cpp
src/ros_node.cpp
src/publisher_thread.cpp
src/subscriber_thread.cpp
src/param_manager.cpp
)
# UI文件
set(UIS
src/main_window.ui
)
# 生成可执行文件
add_executable(${PROJECT_NAME}
${SOURCES}
${UIS}
)
# 链接库
target_link_libraries(${PROJECT_NAME}
${Qt5_LIBRARIES}
rclcpp::rclcpp
${std_msgs_TARGETS}
)
# 安装
install(TARGETS
${PROJECT_NAME}
DESTINATION lib/${PROJECT_NAME}
)
ament_package()
3. 头文件
include/ros2_qt_multi_thread/main_window.hpp
cpp
运行
#ifndef ROS2_QT_MULTI_THREAD_MAIN_WINDOW_HPP_
#define ROS2_QT_MULTI_THREAD_MAIN_WINDOW_HPP_
#include <QMainWindow>
#include <QThread>
#include <QTimer>
#include <memory>
#include "ui_main_window.h"
#include "ros_node.hpp"
#include "param_manager.hpp"
namespace ros2_qt_multi_thread
{
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(bool use_gui = true, QWidget *parent = nullptr);
~MainWindow();
void showStatusMessage(const QString &message);
void updatePublisherRate(int rate);
void updateSubscriberCount(int count);
void addSubscriberMessage(const QString &message);
public slots:
void onStartPublishClicked();
void onStopPublishClicked();
void onUpdateParamsClicked();
void onRosSpinOnce();
private:
Ui::MainWindow ui_;
bool use_gui_;
std::shared_ptr<RosNode> ros_node_;
std::unique_ptr<ParamManager> param_manager_;
QTimer *ros_timer_;
};
} // namespace ros2_qt_multi_thread
#endif // ROS2_QT_MULTI_THREAD_MAIN_WINDOW_HPP_
include/ros2_qt_multi_thread/ros_node.hpp
cpp
运行
#ifndef ROS2_QT_MULTI_THREAD_ROS_NODE_HPP_
#define ROS2_QT_MULTI_THREAD_ROS_NODE_HPP_
#include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/string.hpp>
#include <QObject>
#include <memory>
#include "publisher_thread.hpp"
#include "subscriber_thread.hpp"
#include "param_manager.hpp"
namespace ros2_qt_multi_thread
{

最低0.47元/天 解锁文章
1685

被折叠的 条评论
为什么被折叠?



