Files

148 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Vision-Web — AimBot Web 控制前端
基于 Vue 3 的机器人远程控制前端,提供实时视频监控、手动键盘遥控和在线 PID 调参三个功能页面。
## 技术栈
| 层 | 技术 |
|----|------|
| 框架 | Vue 3.4 (Composition API, `<script setup>`) |
| 构建 | Vite 5 + pnpm |
| 路由 | Vue Router 4 (Hash 模式) |
| ROS 通信 | roslibjs → rosbridge WebSocket |
| HTTP | 原生 fetch |
| 视频流 | MJPEG (web_video_server 提供 HTTP 流) |
## 页面
| 路由 | 页面 | 说明 |
|------|------|------|
| `#/auto` | AutoMode | MJPEG 视频流,一键切换为自动模式 |
| `#/manual` | ManualMode | 键盘遥控底盘 (WASD) 和云台 (方向键),J 键控制激光 |
| `#/debug` | DebugMode | 在线 PID 参数调节,激光开关,模式切换 |
## 目录结构
```
src/
├── main.js # 入口,挂载 App + Router
├── App.vue # 根布局:顶部导航 + router-view
├── config.js # 集中配置(地址、话题、控制参数、API 端点)
├── router/index.js # Hash 路由表
├── composables/
│ └── useRosbridge.js # roslibjs 封装 Composable
└── views/
├── AutoMode.vue # 自动模式页
├── ManualMode.vue # 手动遥控页
└── DebugMode.vue # 调试模式页
```
## 架构分层
```
View 层 (views/*.vue)
- 页面 UI 与用户交互
- 调用 useRosbridge + config + fetch
Composable 层 (composables/useRosbridge.js)
- 封装 roslibjs 连接/发布/生命周期
- 暴露响应式 connected 状态
- 组件卸载时自动断开 WebSocket
Config 层 (config.js)
- 所有可配置常量集中管理
- 部署时只需修改此文件中的 IP 地址
Router 层 (router/index.js)
- Hash 路由 /auto → /manual → /debug → 重定向到 /auto
```
## config.js 配置项
| 常量 | 默认值 | 说明 |
|------|--------|------|
| `HTTP_API_BASE` | `http://192.168.0.11` | HTTP API 基础地址 |
| `ROSBRIDGE_URL` | `ws://192.168.0.11:9090` | rosbridge WebSocket |
| `MJPEG_AUTO_URL` | `...?topic=/vision/result_image&mode=auto` | 自动模式视频流 |
| `MJPEG_MANUAL_URL` | `...?topic=/vision/result_image&mode=manual` | 手动模式视频流 |
| `MJPEG_DEBUG_URL` | `...?topic=/vision/debug_image&mode=debug` | 调试模式视频流 |
| `CMD_WHEEL_TOPIC` | `/cmd_chassis` | 底盘轮速话题 |
| `CMD_GIMBAL_TOPIC` | `/cmd_gimbal` | 云台角速度话题 |
| `BASE_SPEED` | 10 | 线速度值 |
| `YAW_VELOCITY` | 5.0 | 角速度值 (度/秒) |
| `GIMBAL_PITCH_DEG_S` | 10 | 云台俯仰速率 (度/秒) |
| `GIMBAL_YAW_DEG_S` | 10 | 云台偏航速率 (度/秒) |
## 页面功能
### AutoMode(自动模式)
- MJPEG 实时视频流显示
- 两个按钮将云台和底盘切换为自动模式
- 离开页面时自动断开 MJPEG 连接 (img.src = "")
### ManualMode(手动模式)
键盘遥控,支持多键同时按下:
```
W/S — 前进/后退 (线速度 ±BASE_SPEED)
A/D — 左转/右转 (角速度 ±YAW_VELOCITY)
↑/↓ — 云台俯仰 (角速度 ±GIMBAL_PITCH_DEG_S 度/秒)
←/→ — 云台偏航 (角速度 ±GIMBAL_YAW_DEG_S 度/秒)
J — 激光开关 (e.repeat 防重发)
```
发布策略:
- requestAnimationFrame 循环,仅在速度值变化时通过 rosbridge 发布
- 无按键时自动停止循环,不发送消息
- `/cmd_chassis` 发布 `Float32MultiArray([linear, angular])`
- `/cmd_gimbal` 发布 `Twist` (angular.y=pitch, angular.z=yaw)
底盘差速解算由 ROS2 后端节点负责,前端直接发送线速度和角速度。
### DebugMode(调试模式)
在线 PID 参数调节:
- **云台 PID (4 组 × Kp/Ki/Kd):** 视觉环 Yaw/Pitch, 角度环 Yaw/Pitch
- **底盘 PID (3 组 × Kp/Ki/Kd):** 速度环, 角度环, 位置环
- 挂载时自动通过 HTTP GET 加载当前 PID 配置
- 「保存配置」按钮通过 HTTP POST 将参数写入后端并下发至 MCU
- 激光开关按钮和模式切换按钮
- rosbridge 连接状态指示器
## HTTP API
| 接口 | 方法 | 说明 | 调用位置 |
|------|------|------|----------|
| `/api/gimbal/mode/switch` | POST | 云台模式切换 | 所有页面 |
| `/api/chassis/mode/switch` | POST | 底盘模式切换 | 所有页面 |
| `/api/laser` | POST | 激光开关 | ManualMode J 键, DebugMode 按钮 |
| `/api/gimbal/pidconfig` | GET/POST | 云台 PID 读写 | DebugMode |
| `/api/chassis/pidconfig` | GET/POST | 底盘 PID 读写 | DebugMode |
## ROS 话题 (rosbridge 发布)
| 话题 | 类型 | 数据 | 使用位置 |
|------|------|------|----------|
| `/cmd_chassis` | `Float32MultiArray` | `[linear, angular]` | ManualMode |
| `/cmd_gimbal` | `geometry_msgs/Twist` | `angular.y=pitch, angular.z=yaw` | ManualMode |
## 通信架构
```
Vue3 前端
├── fetch → Nginx :80 → /api/* → web_node :8080 → ROS2 话题
├── roslibjs → rosbridge :9090 → ROS2 话题 (/cmd_chassis, /cmd_gimbal)
└── <img> → web_video_server :8081 → MJPEG 流
```
## 开发
```bash
pnpm install # 安装依赖
pnpm dev # 开发服务器 → http://localhost:5173
pnpm build # 生产构建 → dist/
pnpm preview # 预览构建产物
```
部署时将 `dist/` 目录部署至 Nginx 静态文件路径 (`/var/www/aimbot/`)。