reformatting

This commit is contained in:
Brunsmeier
2026-05-21 14:05:06 +08:00
parent a4796d070a
commit b1b17ba9f5
19 changed files with 0 additions and 0 deletions

254
README.md Normal file
View File

@ -0,0 +1,254 @@
# TomatoPick 番茄采摘系统
TomatoPick 是一个面向番茄自动采摘实验的 Python 运行端项目。项目集成 Tkinter 参数界面、Intel RealSense RGB-D 相机、YOLO pose 检测、AUBO 机械臂控制和 AGV 移动平台控制,用于完成“巡检、发现番茄、停车、定位、抓取、放置、继续巡检”的闭环流程。
当前仓库的主要入口是:
- `main.py`:图形界面入口,推荐日常调试和运行使用。
- `control.py`:兼容入口和配置桥接层,负责把 UI 或外部脚本设置的参数同步给核心逻辑。
- `control_core.py`设备连接、视觉检测、坐标转换、机械臂动作、AGV 控制和采摘状态机。
## 项目结构
```text
TomatoPick/
├── main.py # Tkinter 图形界面入口
├── control.py # UI 与核心逻辑之间的配置转发/兼容入口
├── control_core.py # RealSense、YOLO、机械臂、AGV 与采摘状态机
├── start_tomatopick.bat # Windows 双击启动脚本
├── ui_settings.json # UI 参数缓存,运行后会保存/更新
├── models/ # YOLO 模型文件
│ ├── best.pt
│ ├── V1.0_s.pt
│ ├── V2.0_s.pt
│ ├── V2.1_s.pt
│ └── yolo11n-pose.pt
├── tools/
│ ├── pip_install.txt # 依赖安装命令参考
│ ├── 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 巡检、视觉检测、AGV 停车、深度定位、机械臂抓取、放置、回 Home、AGV 继续前进。
- 支持“视觉测试”模式,只启动 RealSense 和 YOLO 推理,不连接机械臂和 AGV适合先调试模型与相机画面。
- 在 UI 中实时显示运行日志、终端输出和相机检测画面。
- 通过 `ui_settings.json` 保存上一次 UI 参数,便于下次启动恢复。
## 核心流程
完整流程由 `control_core.main()` 启动,内部会依次完成:
```text
连接机械臂
-> 机械臂尽量回到 Home
-> 连接 AGV 并获取控制权
-> 初始化 RealSense
-> 加载 YOLO pose 模型
-> 启动视觉线程和 AGV 线程
-> AGV 前进巡检
-> 视觉发现候选番茄后通知 AGV 停车
-> 视觉计算采摘点、深度和抓取角度
-> 机械臂抓取并放置
-> 机械臂返回 Home
-> AGV 继续巡检
```
线程间主要通过 3 个事件协作:
| 状态 | 说明 |
| --- | --- |
| `running` | 系统总运行开关 |
| `has_tomato` | 视觉线程发现候选番茄后置位,通知 AGV 停车 |
| `picking_done` | 本轮抓取放置完成后置位,允许系统进入下一轮巡检 |
## 环境依赖
建议在 Windows 环境下运行,并提前安装 RealSense、AUBO 机械臂和 AGV 所需 SDK。
主要 Python 依赖包括:
```text
Pillow
opencv-python
numpy
pyrealsense2
pyaubo_sdk
pyaubo_agvc_sdk
ultralytics
```
`tkinter``threading``ctypes``signal` 等为 Python 标准库或随 Python 发行版提供。
可以参考 `tools/pip_install.txt` 安装依赖。CPU 环境示例:
```bash
python -m pip install pillow==11.2.1 opencv-python==4.10.0.84 numpy==2.0.0 pyrealsense2==2.55.1.6486 pyaubo_agvc_sdk==0.2.0 pyaubo_sdk==0.24.1 ultralytics==8.3.112 -i https://pypi.tuna.tsinghua.edu.cn/simple
```
如需 GPU 版本 PyTorch请先按本机 CUDA 版本安装 `torch``torchvision``torchaudio`,再安装其余依赖。
## 启动方式
### 1. 启动图形界面
推荐使用 UI 启动:
```bash
python main.py
```
Windows 下也可以直接双击项目根目录中的:
```text
start_tomatopick.bat
```
该脚本会先自动切换到脚本所在目录,再执行 `python main.py`。因此把整个项目移动到其他目录或其他电脑后,只要 `start_tomatopick.bat` 仍和 `main.py` 在同一目录,就不需要手动修改项目路径。
如果需要桌面入口,可以自行在桌面创建快捷方式,并把目标指向 `start_tomatopick.bat`
## PyInstaller 打包
本项目已经附带 PyInstaller 配置文件:
- `TomatoPick.spec`
- `build_windows_exe.bat`
- `build_linux.sh`
打包时会一起带上:
- `models/` 下的 YOLO 模型文件
- `tools/1.png` 背景图
- `ultralytics` 的运行数据
- `pyrealsense2``pyaubo_sdk``pyaubo_agvc_sdk` 的动态库
### Windows 打包 exe
需要在 Windows 机器上执行PyInstaller 不能在 Linux 上直接交叉生成可运行的 Windows `.exe`
```bat
build_windows_exe.bat
```
生成结果:
```text
dist\TomatoPick\TomatoPick.exe
```
### Linux 打包可执行文件
在 Linux 上执行:
```bash
chmod +x build_linux.sh
./build_linux.sh
```
生成结果:
```text
dist/TomatoPick/TomatoPick
```
### 打包后资源路径说明
- 默认模型路径已调整为 `models/best.pt`
- 背景图会优先在打包资源目录中查找 `tools/1.png`
- `ui_settings.json` 在打包后会保存到可执行文件所在目录,而不是 PyInstaller 的临时解包目录
界面中主要按钮:
- `启动程序`运行完整采摘流程会连接机械臂、AGV、RealSense 并加载 YOLO。
- `视觉测试`:只测试相机采集和 YOLO 检测,不启动机械臂和 AGV。
- `停止程序`:停止当前任务并释放资源。
- `保存参数`:将当前 UI 参数写入 `ui_settings.json`,并同步到运行中的配置入口。
- `保存位置`:保存当前放置位姿 `[x, y, z, roll, pitch, yaw]`
### 2. 直接启动核心流程
如果不需要 UI也可以直接运行
```bash
python control.py
```
这种方式使用 `control.py` 顶部定义的默认参数,不读取 UI 输入。
## 参数说明
`control.py` 是当前项目的主要可调参数入口。常用参数如下:
| 参数 | 说明 |
| --- | --- |
| `ROBOT_IP` / `ROBOT_PORT` | AUBO 机械臂连接地址 |
| `AGV_IP` / `AGV_PORT` | AGV 连接地址 |
| `AGV_SPEED_FORWARD` | AGV 前进速度 |
| `AGV_SPEED_STOP` | 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` | 番茄放置位姿列表,当前 UI 使用第一个放置位 |
| `SCISSORS_ENABLED` | 是否启用末端剪刀/夹爪动作 |
UI 参数传递链路:
```text
main.py
-> 保存到 ui_settings.json
-> 写入 control.py 模块变量
-> control.py 调用 _sync_config()
-> control_core.configure()
-> control_core.main()
```
因此:
- 从 UI 启动时,以界面中的参数为准。
- 直接运行 `control.py` 时,以 `control.py` 中的默认参数为准。
- `ui_settings.json` 中的模型路径和背景图路径可能来自其他电脑或旧目录,首次运行前建议在 UI 中重新选择。
## 模型文件
项目默认模型路径为:
```text
best.pt
```
仓库中的 `models/` 目录已包含多份 `.pt` 模型。可以将目标模型放在项目根目录并使用 `best.pt`,也可以在 UI 中选择 `models/` 下或其他位置的 `.pt` 文件。
当前视觉逻辑使用 YOLO pose 的关键点:
- 第 0 个关键点:采摘点 `cutpoint`
- 第 1 个关键点:方向端点 `endpoint`
模型类别、关键点顺序和训练定义需要与上述逻辑一致。
## 运行前检查
完整采摘流程会控制真实硬件。启动前请确认:
- 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 机械臂关节位置。
- `pip_install.txt`:依赖安装命令参考。