个人项目:QT应用程序,目标检测+机械臂抓取(附下载链接)
视觉机械臂抓取应用程序
需求分析
软件目标:通过摄像头对目标物体进行检测,控制机械臂完成抓取或实时渲染仿真机械臂抓取以及相关信息
功能需求:
视觉模块:通过OpenCV打开摄像头读取视频帧保存并渲染至QLabel上
机械臂控制模块:接收并转换检测坐标,发送机械臂控制指令
通信模块:通过通信协议(具体看机械臂支持)实现与机械臂的连接。定义相关指令,根据指令数据完成机械臂控制
应用程序界面:
①视频窗口显示
②上位机控制,提供虚拟机械臂渲染按钮弹出渲染子窗口
其他需求:
日志数据模块:读取记录各个模块的重要数据信息,提供对应接口显示在上位机信息窗口
多线程设计:
视觉模块线程独立运行,如果开始检测则要与机械臂控制线程同步。
通信模块需要异步运行,持续与机械臂保持通信
虚拟渲染线程如果有机械臂连接则要状态同步
概要设计
主应用窗口分为画面显示和上位机两个子窗口。仿真系统虚拟机械臂渲染作为子窗口可选择
数据结构:
抓取目标数据结构(struct GraspTarget):包含物体的位置、大小、形状等信息。
机械臂状态结构(ArmStatus):记录机械臂的关节位置、状态(空闲/忙碌)、当前动作等信息。
图像帧数据结构(struct ImageFrame):存储从摄像头获取的图像帧、处理后的图像数据。
通信协议结构(struct CommunicationPacket):描述上位机与机械臂之间通信时使用的消息格式
日志记录数据结构 (LogEntry)
各个模块通过这些数据结构进行流通
详细设计
TODO:二级结构图对应的功能流程图
视觉模块
视觉模块主要读取摄像头的图像帧并保存,如果需要检测则处理图像帧
功能开发
TODO:
视觉模块(Vision类实现)
属性:
使用OpenCV打开摄像头并保存图像帧
循环缓冲区类FrameBuffer:通过双端队列实现,用于存储一段时间的图像帧
方法:
测试
维护与扩展
单例模式(Singleton Pattern):
日志类使用饿汉式。简单直接,而且线程安全。在应用程序启动时就可靠地存在的情况下,饿汉式可以保证在多线程环境下的安全性,避免了多线程竞争条件的处理。
工厂模式(Factory Pattern):
可以用于创建不同的对象,例如基于虚拟机械臂或现实机械臂的控制器对象。根据不同的硬件状态(是否连接到真实机械臂),工厂模式可以动态创建正确的控制器对象。
观察者模式(Observer Pattern):
适合用于机械臂状态变化的通知。你的系统可能需要多个模块同时接收机械臂状态的变化,例如视觉模块需要知道抓取是否成功,应用程序界面也需要同步显示信息。
策略模式(Strategy Pattern):
可以在抓取策略或目标检测算法的切换上应用。不同类型的物体可能需要不同的检测或抓取策略,策略模式可以让你灵活切换这些算法而不影响系统的其他部分。
生产者-消费者模式:
你已经在解码和渲染数据同步中使用了这种模式,它同样适用于在抓取任务中不同模块间的数据流,如视觉模块与机械臂控制模块的协调。
适配器模式(Adapter Pattern):
当你需要将不同的硬件接口(虚拟和真实机械臂)整合到统一的接口中时,可以使用适配器模式,确保系统使用相同的接口与不同的机械臂进行通信。
视觉机械臂抓取应用程序
架构设计
1. 硬件设计
-
机械臂
-
摄像头
-
计算单元:
- PC系统-图像处理、路径规划和控制算法
- 通信接口(主要):需要通信接口(如GPIO、UART、USB、Ethernet于连接控制器、传感器和机械臂的各个模块
2. 固件设计(次要)厂商提供
- 固件主要负责硬件的底层控制和初始化:机械臂控制固件:负责机械臂电机的精确控制,包括关节的运动、转动角度的校准等。
- 传感器驱动程序:摄像头、深度传感器和力传感器的驱动程序,用于获取传感器数据并与上层软件进行交互。固件通常存储在控制板上,确保传感器能通过标准协议(如 I2C、SPI、Ethernet)与系统通信。
- 实时系统固件:如果需要实时操作(例如抓取高动态物体),可以考虑使用实时操作系统(RTOS)来管理任务调度、传感器数据采集和机械臂控制。
3. 软件设计(主要)
负责抓取任务的高层逻辑实现。主要功能包括视觉处理、路径规划、控制算法以及用户交互。
- 视觉处理模块:
- 使用 OpenCV、 PyTorch 来进行图像处理和物体检测,实现物体分类、定位、姿态估计等功能。
- 用户界面(UI)
- 上位机开发:通过 Qt来设计控制界面,用户通过界面输入任务、观察抓取过程,或手动控制机械臂。
- 通信模块:负责摄像头、机械臂、控制单元之间的数据通信。可以通过 TCP/IP 或 UDP 实现不同设备之间的数据交互。
项目结构
-
- 摄像头读取和目标检测—Camera 类(摄像头)、ObjectDetector 类(目标检测)
- 通过 OpenCV 轻松捕获摄像头图像流,并进行预处理(如图像缩放、颜色转换等)
- 目标检测算法:直接作为模块部署
- 摄像头读取和目标检测—Camera 类(摄像头)、ObjectDetector 类(目标检测)
-
- 机械臂监控与控制—RobotArmController 类(械臂的通信和控制)
-
通信接口:使用 Qt 的 QSerialPort、QTcpSocket 等类进行通信机械臂的状态监控:接收机械臂的传感器数据或状态反馈,实时显示在上位机界面上 Qt 的 QCustomPlot 或 QTableWidget 实现图形化展示机械臂的位置信息、速度等参数。
-
运动控制:定义命令集(如移动到指定位置、抓取物体等),将其通过信号与槽机制发送到控制模块,然后通过通信接口下发给机械臂
-
- 机械臂监控与控制—RobotArmController 类(械臂的通信和控制)
-
- 虚拟机械臂集成–VirtualArmSimulator 类
- 使用 OpenGL 或 Qt 3D 来创建一个机械臂的 3D 模型,并通过模拟的控制逻辑实现机械臂的虚拟操作。
- 虚拟机械臂集成–VirtualArmSimulator 类
-
-
项目集成和功能扩展–GraspingSystem 类(核心逻辑类,负责管理摄像头、目标检测和机械臂控制之间的交互)
-
前端 (Qt GUI):
摄像头实时监控区域。
机械臂位置、状态信息显示。
控制面板(控制机械臂移动、抓取等操作)。
虚拟机械臂 3D 模拟。 -
后端:
目标检测模块:基于 OpenCV 和 YOLO 目标检测。 机械臂控制模块:通过串口/TCP 与机械臂通信,发送控制命令。 虚拟机械臂模块:通过 OpenGL/Qt 3D 渲染机械臂,模拟其运动。 多线程处理:为了确保界面流畅、摄像头采集、目标检测和机械臂控制可以并行进行,可以使用 Qt 的 QThread 进行多线程处理,分离各个模块。 数据记录与分析:抓取任务的执行结果可以通过日志记录保存,并且可以将数据存储到文件或数据库中,便于后续分析和优化。
-
-
-
- MainWindow 类 (Qt UI)–负责 GUI 的交互,显示摄像头图像、目标检测结果,并提供控制机械臂的按钮
项目开发
-
日志相关
qDebug():用于输出调试信息。 qInfo():用于输出一般的日志信息。 qWarning():用于输出警告信息。 qCritical():用于输出严重错误信息。 qFatal():用于输出致命错误信息,并会终止程序。 可以将不同类型重定向
-
MainWindow 类 (Qt UI)–负责 GUI 的交互,显示摄像头图像、目标检测结果,并提供控制机械臂的按钮
-
-
摄像头读取和目标检测—Camera 类(摄像头)、ObjectDetector 类(目标检测)
Camera 类:直接用QCamera实现
ObjectDetector 类:基本功能: 模型加载:从文件中加载预训练的目标检测模型 图像预处理:将输入图像转换为模型可以接受的格式 推理:将预处理后的图像输入模型,得到检测结果 后处理:解析模型输出,筛选出置信度高的目标,并进行非极大值抑制 (NMS) 来去除重叠框 绘制结果:将检测框绘制在原图上并显示/保存结果
-
机械臂监控与控制—RobotArmController 类(械臂的通信和控制)
-
虚拟机械臂集成–VirtualArmSimulator 类
-
项目集成和功能扩展–GraspingSystem 类(核心逻辑类,负责管理摄像头、目标检测和机械臂控制之间的交互)
-
-