☰
2.ROS2+Qt5 小乌龟可视化控制系统
2026/9/26 6:04:12 网站建设 项目流程

一、项目概述

本项目基于ROS2 Humble与Qt5开发,实现图形化界面控制 turtlesim 小乌龟运动。项目支持手动按键实时控制与预设轨迹自动绘图。包括五角星、爱心、组合绘图等功能。

程序采用 QtmoveToThread标准多线程架构,UI界面与ROS业务逻辑线程完全分离,界面流畅不卡顿,同时支持画布清空、小乌龟重置等系统功能,是非常完整的 ROS2 人机交互综合实训项目。

二、项目功能介绍

1. 手动控制功能

  • 界面按钮控制小乌龟:上、下、左、右移动

  • 随时暂停停止运动

  • 支持一键清空画布、一键重置小乌龟初始状态

2. 自动绘图功能(核心亮点)

本项目实现纯轨迹连续连体绘图,无需抬笔、无需瞬移,通过精准的角度与距离分段控制,让小乌龟一笔连续画出多种标准几何图形:

  • 单一五角星图案绘制

  • 参数方程高精度爱心绘制

  • 几何画廊组合绘图:自动连续绘制 正方形 → 正三角形 → 正六边形 → 五角星,全程一笔连贯,形成图形展览效果

三、技术架构设计

1. 多线程架构

采用 Qt 经典moveToThread 子线程模型:

  • UI主线程:负责界面渲染、按钮事件捕捉、指令信号发送

  • ROS子线程:独立执行ROS自旋、位姿订阅、轨迹状态机运算、速度发布

通过互斥锁保护共享变量,信号槽跨线程通信,全程线程安全,无卡死、无界面冻结问题。

2. ROS消息与服务通信

  • 订阅/turtle1/pose实时获取小乌龟坐标、角度

  • 发布/turtle1/cmd_vel速度指令实现运动控制

  • 调用/clear、/reset服务实现画布管理

3. 轨迹控制原理

项目采用转向+前进双阶段状态机:

  1. 根据目标角度与当前角度差值,精准旋转对准方向

  2. 角度匹配完成后,直线前进指定距离

  3. 单段轨迹完成后自动切入下一段轨迹,实现图形无缝衔接

爱心图案采用心形线参数方程采样,拟合精度高,图形圆润标准。

4.项目文件结构

qt_turtle_draw/ ├── src/ │ ├── main.cpp │ ├── mainwindow.h/cpp // UI界面与按钮信号 │ ├── ros_node.h/cpp // ROS线程、绘图逻辑 ├── CMakeLists.txt └── package.xml

四、项目核心代码

1. mainwindow.cpp

子线程启动节点

// ========= moveToThread + started -> run 核心代码 ========= RosTurtleNode* ros_node = new RosTurtleNode; QThread* ros_thread = new QThread; ros_node->moveToThread(ros_thread); connect(this, &MainWindow::sigSendCmd, ros_node, &RosTurtleNode::setCmd, Qt::DirectConnection); // 线程启动后自动执行run() connect(ros_thread, &QThread::started, ros_node, &RosTurtleNode::run); // 线程退出时清理内存 connect(ros_node, &RosTurtleNode::destroyed, ros_thread, &QThread::quit); connect(ros_thread, &QThread::finished, ros_node, &RosTurtleNode::deleteLater); connect(ros_thread, &QThread::finished, ros_thread, &QThread::deleteLater); ros_thread->start();

2. 核心逻辑 ros_node.cpp

// 心形线参数方程:x=16sin³t, y=13cost-5cos2t-2cos3t-cos4t void RosTurtleNode::loadHeart(std::vector<Segment>& out) { std::vector<std::pair<double,double>> pts; double scale = 0.22; int N = 60; for (int i = 0; i <= N; i++) { double t = 2.0 * M_PI * i / N; double x = 16.0 * pow(sin(t), 3) * scale; double y = (13.0*cos(t) - 5.0*cos(2*t) - 2.0*cos(3*t) - cos(4*t)) * scale; pts.push_back({x, y}); } // 插入原点作为起点(乌龟当前位置即爱心中心) pts.insert(pts.begin(), {0.0, 0.0}); for (size_t i = 1; i < pts.size(); i++) { double dx = pts[i].first - pts[i-1].first; double dy = pts[i].second - pts[i-1].second; double dist = sqrt(dx*dx + dy*dy); if (dist > 0.001) { double angle = atan2(dy, dx); out.push_back({angle, dist, 0.3}); } } } // 正多边形 void RosTurtleNode::loadPolygon(std::vector<Segment>& out, int n, double side) { double angle = 0; double turn = 2.0 * M_PI / n; for (int i = 0; i < n; i++) { out.push_back({angle, side, 0.3}); angle += turn; } }

五、项目效果说明

本项目的组合绘图功能区别于普通单点图案绘制:

程序通过连续轨迹拼接,让小乌龟一笔连贯完成:正方形 → 平移过渡 → 三角形 → 平移过渡 → 六边形 → 平移过渡 → 五角星,整体呈现出几何图形展览馆的视觉效果。

全程无抬笔、无瞬移,纯靠算法规划轨迹衔接,考验轨迹插值与角度闭环控制能力。

六、编译与运行

cd ~/ros2_ws colcon build --packages-select qt_turtle_draw source install/setup.bash # 启动仿真 ros2 run turtlesim turtlesim_node # 启动Qt控制界面 ros2 run qt_turtle_draw qt_turtle_draw_node

七、项目总结

本项目整合了ROS2 消息/服务通信、Qt多线程编程、有限状态机控制、参数方程图形拟合、几何轨迹规划等多项核心知识点。

项目功能丰富、架构标准、运行稳定,既实现了基础手动操控,又实现了连续几何自动绘图。

如果需要完整源码,可以评论区留言。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询