forked from YikaiFu-cart/acAubo
206 lines
7.0 KiB
Markdown
206 lines
7.0 KiB
Markdown
# TomatoPick 番茄采摘系统
|
||
|
||
TomatoPick 是一个面向番茄自动采摘实验的 Python 项目,集成了 Tkinter 参数界面、Intel RealSense RGB-D 相机、YOLO pose 目标检测、AUBO 机械臂控制和 AGV 移动平台控制。
|
||
|
||
当前仓库是运行端工程,核心代码集中在 `main.py`、`control.py` 和 `control_core.py`,辅助脚本位于 `tools/`。
|
||
|
||
## 项目结构
|
||
|
||
```text
|
||
TomatoPick/
|
||
├── main.py # Tkinter 图形界面入口
|
||
├── control.py # UI 与核心逻辑之间的配置转发/兼容入口
|
||
├── control_core.py # 相机、YOLO、机械臂、AGV 与采摘状态机
|
||
├── ui_settings.json # UI 参数缓存,运行后自动保存/更新
|
||
├── tools/
|
||
│ ├── realsense_record_video.py # RealSense 录制辅助脚本
|
||
│ ├── video_to_rgb_frames.py # 视频抽帧辅助脚本
|
||
│ ├── aubo_joint_position.py # AUBO 关节位置辅助脚本
|
||
│ └── 1.png # UI 相机区域背景图
|
||
└── README.md
|
||
```
|
||
|
||
## 功能概览
|
||
|
||
- 通过图形界面配置机械臂 IP、AGV IP、运行时长、YOLO 模型路径、放置位置等参数。
|
||
- 支持完整采摘流程:AGV 巡检、视觉检测、停车、精确定位、机械臂抓取、放置、回 Home、AGV 继续前进。
|
||
- 支持“视觉测试”模式,只启动 RealSense 和 YOLO 推理,不启动机械臂和 AGV,适合先调试模型与相机画面。
|
||
- 将运行日志、终端输出和相机检测画面实时显示在 UI 中。
|
||
- 通过 `ui_settings.json` 保存上一次 UI 参数,方便下次启动恢复。
|
||
|
||
## 核心文件说明
|
||
|
||
### `main.py`
|
||
|
||
图形界面入口,直接运行即可打开参数配置界面。
|
||
|
||
主要职责:
|
||
|
||
- 构建 Tkinter 主界面,包括参数区、运行日志、相机画面和终端输出。
|
||
- 读取和保存 `ui_settings.json`。
|
||
- 选择 YOLO `.pt` 模型文件和相机背景图。
|
||
- 启动完整采摘流程,内部调用 `control.main()`。
|
||
- 启动视觉测试流程,只初始化 RealSense 与 YOLO。
|
||
- 接收 `control_core.py` 推送的相机帧并叠加检测信息。
|
||
|
||
### `control.py`
|
||
|
||
兼容入口和配置桥接层。UI 或外部脚本会先修改这里的模块级参数,然后由 `_sync_config()` 同步到 `control_core.configure()`。
|
||
|
||
常用参数包括:
|
||
|
||
| 参数 | 说明 |
|
||
| --- | --- |
|
||
| `ROBOT_IP` / `ROBOT_PORT` | AUBO 机械臂连接地址 |
|
||
| `AGV_IP` / `AGV_PORT` | AGV 连接地址 |
|
||
| `AGV_SPEED_FORWARD` | AGV 前进速度 |
|
||
| `TOTAL_DURATION` | 系统总运行时长,单位秒 |
|
||
| `AGV_STOP_TIMEOUT` | AGV 停车后等待采摘的超时时间 |
|
||
| `YOLO_MODEL_PATH` | YOLO pose 模型路径,默认 `best.pt` |
|
||
| `YOLO_DETECT_CONF` | YOLO 推理置信度阈值 |
|
||
| `PICK_CONFIDENCE_THRESHOLD` | 进入采摘逻辑的目标置信度阈值 |
|
||
| `HOME_JOINTS` | 机械臂 Home 关节位 |
|
||
| `place_positions` | 番茄放置位 |
|
||
| `SCISSORS_ENABLED` | 是否启用末端剪刀/夹爪动作 |
|
||
|
||
### `control_core.py`
|
||
|
||
核心业务逻辑,负责设备连接、视觉检测、坐标转换、机械臂动作、AGV 控制和资源释放。
|
||
|
||
主要模块:
|
||
|
||
- `PlacementManager`:管理放置位。
|
||
- `DetectedTomato` / `TomatoCandidate`:保存检测目标、关键点、深度和坐标信息。
|
||
- `RobotArmController`:封装机械臂回 Home、移动到预抓取点、抓取点和放置点等动作。
|
||
- `VisionController`:封装 RealSense 采集、YOLO pose 检测、关键点筛选、深度读取、坐标转换和抓取触发。
|
||
- `AgvController`:封装 AGV 获取控制权、前进、停止和清理。
|
||
|
||
核心状态由 3 个 `threading.Event` 协调:
|
||
|
||
| 状态 | 说明 |
|
||
| --- | --- |
|
||
| `running` | 系统总运行开关 |
|
||
| `has_tomato` | 视觉线程发现候选番茄后置位,通知 AGV 停车 |
|
||
| `picking_done` | 本轮抓取放置完成后置位,允许 AGV 继续前进 |
|
||
|
||
简化流程:
|
||
|
||
```text
|
||
连接机械臂
|
||
-> 连接 AGV 并获取控制权
|
||
-> 初始化 RealSense
|
||
-> 加载 YOLO 模型
|
||
-> 启动视觉线程和 AGV 线程
|
||
-> AGV 前进巡检
|
||
-> 视觉发现成熟番茄
|
||
-> AGV 停止
|
||
-> 视觉计算采摘点和抓取角度
|
||
-> 机械臂抓取并放置
|
||
-> 机械臂返回 Home
|
||
-> AGV 继续前进
|
||
```
|
||
|
||
## 环境依赖
|
||
|
||
建议在 Windows 环境下运行,并提前安装设备 SDK。
|
||
|
||
主要 Python 依赖:
|
||
|
||
```text
|
||
opencv-python
|
||
numpy
|
||
Pillow
|
||
ultralytics
|
||
pyrealsense2
|
||
pyaubo_sdk
|
||
pyaubo_agvc_sdk
|
||
```
|
||
|
||
`tkinter`、`threading`、`ctypes`、`signal` 等为 Python 标准库或随 Python 发行版提供。
|
||
|
||
可参考安装方式:
|
||
|
||
```bash
|
||
pip install opencv-python numpy Pillow ultralytics pyrealsense2
|
||
```
|
||
|
||
`pyaubo_sdk` 和 `pyaubo_agvc_sdk` 通常需要按设备厂商提供的 SDK 包安装。
|
||
|
||
## 启动方式
|
||
|
||
### 1. 启动图形界面
|
||
|
||
推荐使用 UI 启动:
|
||
|
||
```bash
|
||
python main.py
|
||
```
|
||
|
||
界面中可执行:
|
||
|
||
- `启动程序`:运行完整采摘流程,会连接机械臂、AGV、RealSense 并加载 YOLO。
|
||
- `视觉测试`:只测试相机采集和 YOLO 检测,不启动机械臂与 AGV。
|
||
- `停止程序`:停止当前任务并释放资源。
|
||
- `保存参数`:将当前 UI 参数写入 `ui_settings.json`。
|
||
|
||
### 2. 直接启动核心流程
|
||
|
||
如果不需要 UI,也可以直接运行:
|
||
|
||
```bash
|
||
python control.py
|
||
```
|
||
|
||
这种方式会使用 `control.py` 顶部定义的默认参数,不读取 UI 输入。
|
||
|
||
## 模型文件
|
||
|
||
默认模型路径为:
|
||
|
||
```text
|
||
best.pt
|
||
```
|
||
|
||
可以将模型文件放在项目根目录,也可以在 UI 中选择任意 `.pt` 文件。使用绝对路径时,请确认路径在当前机器上存在。
|
||
|
||
当前 `ui_settings.json` 中保存的模型路径和背景图路径可能来自其他电脑或旧目录,首次运行前建议在 UI 中重新选择。
|
||
|
||
## 参数保存与传递
|
||
|
||
UI 参数传递流程:
|
||
|
||
```text
|
||
main.py
|
||
-> 保存到 ui_settings.json
|
||
-> 写入 control.py 模块变量
|
||
-> control.py 调用 _sync_config()
|
||
-> control_core.configure()
|
||
-> control_core.main()
|
||
```
|
||
|
||
因此:
|
||
|
||
- 从 UI 启动时,以界面中的参数为准。
|
||
- 直接运行 `control.py` 时,以 `control.py` 中写死的默认参数为准。
|
||
- 如果修改了 `control.py` 的默认值,需要重新启动程序才会生效。
|
||
|
||
## 运行前检查
|
||
|
||
完整流程会控制真实硬件,启动前请确认:
|
||
|
||
- AUBO 机械臂、AGV、RealSense 相机均已连接,并能被对应 SDK 访问。
|
||
- `ROBOT_IP`、`AGV_IP`、端口号与现场设备一致。
|
||
- `HOME_JOINTS`、手眼标定矩阵 `R_tc` / `T_tc`、放置位 `place_positions` 已按现场设备校准。
|
||
- YOLO 模型路径正确,且模型类别与关键点定义符合当前采摘逻辑。
|
||
- 调试视觉效果时优先使用 `视觉测试`,确认画面和检测结果稳定后再运行完整采摘流程。
|
||
|
||
## 辅助脚本
|
||
|
||
`tools/` 目录提供了一些调试脚本:
|
||
|
||
- `realsense_record_video.py`:录制 RealSense 视频。
|
||
- `video_to_rgb_frames.py`:从视频中导出 RGB 图片帧。
|
||
- `aubo_joint_position.py`:辅助读取/查看 AUBO 机械臂关节位置。
|
||
|
||
这些脚本主要用于采集数据、调试相机和校准机械臂位姿。
|