diff --git a/Photos/Camera.png b/Photos/Camera.png new file mode 100644 index 0000000..c79d2c0 Binary files /dev/null and b/Photos/Camera.png differ diff --git a/Photos/battery.png b/Photos/battery.png new file mode 100644 index 0000000..cf522a9 Binary files /dev/null and b/Photos/battery.png differ diff --git a/Photos/flowchart.png b/Photos/flowchart.png new file mode 100644 index 0000000..101dea5 Binary files /dev/null and b/Photos/flowchart.png differ diff --git a/Photos/model.jpg b/Photos/model.jpg new file mode 100644 index 0000000..a6f3ac1 Binary files /dev/null and b/Photos/model.jpg differ diff --git a/Photos/model_photo.png b/Photos/model_photo.png new file mode 100644 index 0000000..d3a1384 Binary files /dev/null and b/Photos/model_photo.png differ diff --git a/Photos/motor.jpg b/Photos/motor.jpg new file mode 100644 index 0000000..98a29ba Binary files /dev/null and b/Photos/motor.jpg differ diff --git a/Photos/motor_drive.jpg b/Photos/motor_drive.jpg new file mode 100644 index 0000000..ad17c86 Binary files /dev/null and b/Photos/motor_drive.jpg differ diff --git a/Photos/raspberrypi.png b/Photos/raspberrypi.png new file mode 100644 index 0000000..51a4e5d Binary files /dev/null and b/Photos/raspberrypi.png differ diff --git a/Photos/wheel.png b/Photos/wheel.png new file mode 100644 index 0000000..f464d7a Binary files /dev/null and b/Photos/wheel.png differ diff --git a/Photos/数据1.png b/Photos/数据1.png new file mode 100644 index 0000000..7a465ef Binary files /dev/null and b/Photos/数据1.png differ diff --git a/Photos/数据2.png b/Photos/数据2.png new file mode 100644 index 0000000..5f74811 Binary files /dev/null and b/Photos/数据2.png differ diff --git a/Photos/智能垃圾桶设计模型_Release_v1.0.0-1.png b/Photos/智能垃圾桶设计模型_Release_v1.0.0-1.png new file mode 100644 index 0000000..9d03e4b Binary files /dev/null and b/Photos/智能垃圾桶设计模型_Release_v1.0.0-1.png differ diff --git a/Photos/目标跟踪效果/1.1.jpg b/Photos/目标跟踪效果/1.1.jpg new file mode 100644 index 0000000..1840a81 Binary files /dev/null and b/Photos/目标跟踪效果/1.1.jpg differ diff --git a/Photos/目标跟踪效果/1.2.jpg b/Photos/目标跟踪效果/1.2.jpg new file mode 100644 index 0000000..0fd92df Binary files /dev/null and b/Photos/目标跟踪效果/1.2.jpg differ diff --git a/Photos/目标跟踪效果/1.3.jpg b/Photos/目标跟踪效果/1.3.jpg new file mode 100644 index 0000000..22440e7 Binary files /dev/null and b/Photos/目标跟踪效果/1.3.jpg differ diff --git a/Photos/目标跟踪效果/1.4.jpg b/Photos/目标跟踪效果/1.4.jpg new file mode 100644 index 0000000..ce43f09 Binary files /dev/null and b/Photos/目标跟踪效果/1.4.jpg differ diff --git a/Photos/目标跟踪效果/1.5.jpg b/Photos/目标跟踪效果/1.5.jpg new file mode 100644 index 0000000..501f4d6 Binary files /dev/null and b/Photos/目标跟踪效果/1.5.jpg differ diff --git a/Photos/目标跟踪效果/1.6.jpg b/Photos/目标跟踪效果/1.6.jpg new file mode 100644 index 0000000..2d6e869 Binary files /dev/null and b/Photos/目标跟踪效果/1.6.jpg differ diff --git a/Photos/目标跟踪效果/1.7.jpg b/Photos/目标跟踪效果/1.7.jpg new file mode 100644 index 0000000..591ad5b Binary files /dev/null and b/Photos/目标跟踪效果/1.7.jpg differ diff --git a/Photos/目标跟踪效果/1.8.jpg b/Photos/目标跟踪效果/1.8.jpg new file mode 100644 index 0000000..be7f819 Binary files /dev/null and b/Photos/目标跟踪效果/1.8.jpg differ diff --git a/Photos/目标跟踪效果/2.1.jpg b/Photos/目标跟踪效果/2.1.jpg new file mode 100644 index 0000000..18cb7f7 Binary files /dev/null and b/Photos/目标跟踪效果/2.1.jpg differ diff --git a/Photos/目标跟踪效果/2.2.jpg b/Photos/目标跟踪效果/2.2.jpg new file mode 100644 index 0000000..3599990 Binary files /dev/null and b/Photos/目标跟踪效果/2.2.jpg differ diff --git a/Photos/目标跟踪效果/2.3.jpg b/Photos/目标跟踪效果/2.3.jpg new file mode 100644 index 0000000..9ce5bef Binary files /dev/null and b/Photos/目标跟踪效果/2.3.jpg differ diff --git a/Photos/目标跟踪效果/2.4.jpg b/Photos/目标跟踪效果/2.4.jpg new file mode 100644 index 0000000..d694edd Binary files /dev/null and b/Photos/目标跟踪效果/2.4.jpg differ diff --git a/Photos/目标跟踪效果/2.5.jpg b/Photos/目标跟踪效果/2.5.jpg new file mode 100644 index 0000000..997dc37 Binary files /dev/null and b/Photos/目标跟踪效果/2.5.jpg differ diff --git a/Photos/目标跟踪效果/2.6.jpg b/Photos/目标跟踪效果/2.6.jpg new file mode 100644 index 0000000..345e7c9 Binary files /dev/null and b/Photos/目标跟踪效果/2.6.jpg differ diff --git a/Photos/目标跟踪效果/2.7.jpg b/Photos/目标跟踪效果/2.7.jpg new file mode 100644 index 0000000..639504e Binary files /dev/null and b/Photos/目标跟踪效果/2.7.jpg differ diff --git a/Photos/目标跟踪效果/2.8.jpg b/Photos/目标跟踪效果/2.8.jpg new file mode 100644 index 0000000..9e812da Binary files /dev/null and b/Photos/目标跟踪效果/2.8.jpg differ diff --git a/README.md b/README.md index 5133eda..8f732ba 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,277 @@ -# Graduation_Project +# 智能垃圾桶控制系统 -毕业设计 \ No newline at end of file +本项目是一个基于树莓派 4B 的智能垃圾桶控制系统,包含 Web 远程控制、四轮全向运动控制、路径录制与回放、摄像头目标跟踪以及自然语言控制等功能。系统后端使用 Flask 提供控制接口,前端通过浏览器完成设备操作,底层通过 PCA9685 PWM 驱动板控制四个电机运动。 + +## 功能特性 + +- Web 控制界面:支持前进、后退、左右平移、原地旋转和斜向移动。 +- 路径录制与回放:记录用户操作动作和时间戳,并保存为 JSON 轨迹文件。 +- 视觉目标跟踪:基于 OpenCV 实现运动目标检测、相机运动补偿和目标中心跟随。 +- 智能助手控制:通过自然语言指令调用智能垃圾桶运动、路径播放和路径管理功能。 +- 多输入方式:支持鼠标、触摸、语音输入和游戏手柄控制。 + +## 项目结构 + +```text +. +├── server.py # Flask Web 服务与控制接口 +├── motor.py # PCA9685 与四电机底层驱动 +├── camera.py # 摄像头目标跟踪与自动运动控制 +├── agent.py # 智能助手指令解析与动作执行 +├── index.html # Web 控制界面入口 +├── CSS/ # 页面样式文件 +├── Javascript/ # 前端交互、轨迹回放、语音和手柄控制脚本 +├── Path/ # 保存的轨迹 JSON 文件 +├── agent/skills.md # 智能助手可调用技能说明 +├── motor_test.py # 电机测试程序 +└── camera_test.py # 摄像头测试程序 +``` + +## 硬件环境 + +本项目主要面向以下硬件环境: + +- Raspberry Pi 4B +- PCA9685 PWM 驱动板 +- 四个直流电机 +- 四轮全向轮或福来轮移动底盘 +- USB 摄像头或树莓派摄像头 +- 电机供电模块 + +使用前需要在树莓派中开启 I2C 接口,并确认 PCA9685 的默认地址为 `0x60`。 + +## 软件环境 + +建议环境: + +- Python 3.8+ +- Flask +- OpenCV +- NumPy +- smbus2 +- requests +- urllib3 + +可以使用以下命令安装主要依赖: + +```bash +pip install flask opencv-python numpy smbus2 requests urllib3 +``` + +如果在树莓派上安装 OpenCV 速度较慢,可以优先使用系统软件源安装: + +```bash +sudo apt update +sudo apt install python3-opencv +``` + +## 运行方式 + +### 1. 启动 Web 控制服务 + +```bash +python server.py +``` + +默认启动地址为: + +```text +https://localhost:5443 +``` + +在局域网中访问时,可以使用树莓派的 IP 地址: + +```text +https://<树莓派IP>:5443 +``` + +服务默认使用 Flask 的临时 HTTPS 证书,浏览器首次访问时可能会提示证书不受信任,继续访问即可。 + +### 2. 修改服务端口 + +可以通过环境变量修改监听端口: + +```bash +HTTPS_PORT=5443 python server.py +``` + +Windows PowerShell 中可使用: + +```powershell +$env:HTTPS_PORT="5443" +python server.py +``` + +### 3. 运行摄像头跟踪程序 + +```bash +python camera.py +``` + +程序会打开摄像头画面,并根据目标中心与画面中心的偏差调用 `motor.py` 中的电机控制函数,实现目标跟随。 + +### 4. 测试电机 + +```bash +python motor_test.py +``` + +该脚本会依次测试前进、后退、平移、斜向移动和旋转动作。测试前请确保智能垃圾桶周围有足够空间,避免碰撞。 + +## Web 接口说明 + +### 控制接口 + +```http +POST /control +Content-Type: application/json +``` + +请求示例: + +```json +{ + "direction": "forward" +} +``` + +支持的方向包括: + +- `forward` +- `backward` +- `left` +- `right` +- `rotate_left` +- `rotate_right` +- `forward_left` +- `forward_right` +- `backward_left` +- `backward_right` +- `stop` + +### 路径管理接口 + +保存路径: + +```http +POST /save_path +``` + +列出路径: + +```http +GET /list_paths +``` + +加载路径: + +```http +GET /load_path?name=test1 +``` + +删除路径: + +```http +DELETE /delete_path +``` + +路径文件保存在 `Path/` 目录下,格式示例: + +```json +{ + "name": "test1", + "actions": [ + { + "direction": "forward", + "timestamp": 1734 + }, + { + "direction": "stop", + "timestamp": 2074 + } + ] +} +``` + +## 视觉跟踪逻辑 + +`camera.py` 采用轻量化 OpenCV 视觉处理方案,适合树莓派 4B 这类算力有限的平台。程序主要流程如下: + +1. 从摄像头读取图像,并设置分辨率为 `320x240`。 +2. 将图像转换为灰度图并进行高斯滤波。 +3. 使用特征点与光流法估计相机运动。 +4. 对上一帧进行运动补偿后与当前帧做差分。 +5. 通过阈值分割和形态学处理提取运动区域。 +6. 根据面积、长宽比、填充率和边缘位置筛选候选目标。 +7. 维护目标状态,记录目标中心、面积、边界框和速度信息。 +8. 根据目标中心与画面中心的偏差调用电机控制函数。 + +该方法没有使用 YOLO,主要原因是树莓派 4B 直接运行深度学习目标检测模型时响应速度较慢,并且 CPU、内存和发热压力较大。对于本系统而言,实时控制响应比单帧识别精度更重要,因此采用了计算量更低的传统视觉跟踪方案。 + +## 电机控制逻辑 + +`motor.py` 通过 I2C 控制 PCA9685,向不同通道输出 PWM 信号。每个电机占用两个通道,通过两个通道的 PWM 输出关系控制电机正反转和停止。 + +四个电机组合后可以实现: + +- 前进与后退 +- 左右平移 +- 左右旋转 +- 四个方向的斜向移动 +- 停止 + +如果实际运动方向与预期相反,可以根据电机接线和轮子安装方向,调整 `motor.py` 中各运动函数的正负号,或在 `server.py`、`camera.py` 中调整方向映射。 + +## 智能助手控制 + +`agent.py` 提供自然语言指令解析与执行功能。前端将用户输入发送到 `/agent_chat`,后端根据 `agent/skills.md` 中定义的技能规则调用对应动作。 + +支持示例: + +- 前进 3 秒 +- 后退 2 秒 +- 左转 1 秒 +- 停止 +- 执行路径 test1 +- 列出路径 +- 删除路径 test1 + +使用智能助手前,需要在 Web 页面中配置可用的 LLM API 地址、API Key 和模型名称。 + +## 常见问题 + +### 1. 浏览器无法打开摄像头或语音输入 + +语音输入和摄像头权限通常要求 HTTPS 或 localhost 环境。本项目默认使用 HTTPS 启动,如果浏览器提示证书不可信,需要手动选择继续访问。 + +### 2. 智能垃圾桶前后方向反了 + +这通常与电机接线、轮子安装方向或程序中的方向映射有关。可以优先检查: + +- `motor.py` 中 `forward()` 和 `backward()` 的电机正负号。 +- `server.py` 中 `/control` 对 `forward`、`backward` 的映射。 +- `camera.py` 中 `drive_to_target()` 对目标偏移方向的控制逻辑。 + +### 3. 摄像头跟踪不稳定 + +当前方法基于运动区域检测,复杂背景、光照变化、遮挡和其他运动物体都会影响识别效果。可以尝试: + +- 降低背景干扰。 +- 保持光照稳定。 +- 调整 `MIN_CONTOUR_AREA`、`MAX_CONTOUR_AREA` 和 `CONTROL_DEADZONE`。 +- 后续接入轻量化 YOLO 或硬件 AI 加速模块。 + +### 4. 路径回放存在偏移 + +当前路径回放基于时间戳记录动作,属于开环控制。电池电压、地面摩擦、电机响应差异和轮胎打滑都会造成误差。后续可以通过编码器、IMU 或视觉定位实现闭环修正。 + +## 注意事项 + +- 电机测试前请架空智能垃圾桶移动底盘或确保周围空间安全。 +- 树莓派和电机建议分开供电,避免电机启动瞬间导致树莓派掉电。 +- 如果长时间运行摄像头跟踪,建议注意树莓派温度。 +- 轨迹文件保存在 `Path/` 目录中,删除前请确认文件名称。 + +## License + +本项目用于课程设计、毕业设计或个人学习研究。若用于其他用途,请根据实际情况补充许可证说明。