# Auto-Aim Mobile Bot — 系统架构 ## 概述 Auto-Aim Mobile Bot 是一个基于多处理器分布式架构的自动瞄准移动机器人系统。系统由四个功能模块组成,分别运行在独立的硬件平台上,通过串口和网络进行实时通信。 ## 硬件拓扑 ``` ┌──────────────────────────────────────────────────────────────────┐ │ Jetson (aarch64) │ │ ┌─────────────┐ ┌──────────────┐ ┌─────────────────────────┐ │ │ │ 工业相机 │ │ vision (ROS2)│ │ Nginx :80 │ │ │ │ (Hikrobot) │ │ - 目标检测 │ │ - 前端静态文件 │ │ │ │ │ │ - PnP 位姿 │ │ - /stream → web_video │ │ │ │ │ │ - HTTP API │ │ - /api → web_node │ │ │ └──────────────┘ └──────┬───────┘ └─────────────────────────┘ │ │ │ UART │ │ ┌────────────────┼────────────────┐ │ │ ▼ ▼ ▼ │ │ ┌─────────────┐ ┌────────────┐ ┌──────────────┐ │ │ │ Gimbal MCU │ │Chassis MCU │ │ 激光模组 │ │ │ │ (STM32H723) │ │(MSPM0G3507)│ │ (GPIO 控制) │ │ │ └──────┬──────┘ └──────┬─────┘ └──────────────┘ │ │ │ │ │ │ ┌────┴────┐ ┌────┴────┐ │ │ │DM-G6220 │ │ 左轮电机 │ │ │ │DM-J4310 │ │ 右轮电机 │ │ │ │BMI088 │ │ICM-42688│ │ │ └─────────┘ │灰度传感器 │ │ │ └─────────┘ │ └──────────────────────────────────────────────────────────────────┘ ``` ## 模块架构 ### 1. Vision (ROS2 视觉处理) — `modules/vision/` 运行在 NVIDIA Jetson 上,是整个系统的"眼睛"和"大脑"。 - **技术栈**: ROS2 Humble, Python 3, OpenCV, Microdot - **核心功能**: - Hikrobot 工业相机图像采集 - Otsu 二值化 + 轮廓层级矩形检测 - PnP 位姿估计 (SOLVEPNP_IPPE) - 激光光斑世界坐标计算 - HTTP REST API (模式切换、PID 配置、激光控制) - **串口通信**: 与云台 (921600bps) 和底盘 (115200bps) 通过定制二进制帧协议通信 - **Web 服务**: rosbridge WebSocket (9090), web_video_server (8081), Nginx (80) ### 2. Gimbal (云台控制) — `modules/gimbal/` 运行在 STM32H723ZG (Cortex-M7, 480MHz) 上,控制两轴云台实现视觉追踪。 - **技术栈**: C, FreeRTOS, STM32CubeH7 HAL, CMSIS-DSP - **核心功能**: - BMI088 IMU 姿态解算 (四元数 EKF) - DM 电机双环 PID 控制 (外环视觉PID + 内环角度PID) - 上位机串口协议解析 (0xA5/A6/A7/A8 帧) - Pub-Sub 消息总线解耦模块 - 三种工作模式: AUTO/MANUAL/DEBUG - **控制频率**: INS 1kHz, Motor 1kHz, Robot 500Hz, Daemon 100Hz ### 3. Chassis (底盘控制) — `modules/chassis/` 运行在 TI MSPM0G3507 (Cortex-M0+, 80MHz) 上,控制两轮差速底盘运动。 - **技术栈**: C, Keil MDK, TI MSPM0 SDK - **核心功能**: - 双电机 PWM 驱动 + QEI 编码器测速 - ICM-42688-P IMU 姿态解算 (Mahony AHRS) - 8 通道灰度传感器巡线 - 三环 PID 控制 (速度环 / 角度环 / 位置环) - UART 串口命令解析 (0xA6/A7/A8/A9 帧) - 三种工作模式: AUTO/MANUAL/DEBUG ### 4. Vision-Web (前端) — `modules/vision-web/` 基于 Vue 3 的 Web 前端,提供远程监控和遥控。 - **技术栈**: Vue 3, Vite, Vue Router 4, roslibjs - **页面**: - **AutoMode**: MJPEG 视频流实时预览 - **ManualMode**: WASD + 方向键键盘遥控底盘和云台 - **DebugMode**: 在线 PID 参数调节 - **通信**: rosbridge WebSocket (实时控制), HTTP REST (模式切换), MJPEG (视频流) ## 数据流 ``` ┌─────────────────────────────────────────────────────────────────┐ │ camera_node ──/camera/image_raw──► vision_node │ │ │ │ │ ┌──────────────────┼──────────────┐ │ │ ▼ ▼ ▼ │ │ /vision/target /vision/result /vision/debug │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ gimbal_node web_video_server (MJPEG) │ │ │ │ │ │ ▼ ▼ │ │ UART 0xA5 帧 浏览器 标签 │ │ │ │ │ ▼ │ │ Gimbal MCU (USART10) │ │ │ │ │ ▼ │ │ robot_cmd ──gimbal_cmd──► gimbal ──► DM Motor │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 浏览器 (Vue3) │ │ │ │ │ │ │ │ ManualMode: WASD → roslibjs → /cmd_chassis │ │ │ │ │ │ │ │ 方向键 → roslibjs → /cmd_gimbal │ │ │ │ │ │ │ │ J 键 → fetch POST /api/laser │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────┐ │ │ │ web_node (:8080) │ │ │ │ │ │ │ │ POST /api/gimbal/mode/switch → /gimbal/mode │ │ │ POST /api/chassis/mode/switch → /chassis/mode │ │ │ POST /api/laser → /laser/command │ │ │ GET/POST /api/gimbal/pidconfig → /web/gimbal_pid_config │ │ │ GET/POST /api/chassis/pidconfig → /web/chassis_pid_config │ │ └─────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ``` ## 通信协议 系统内部使用统一的二进制帧协议,帧头区分帧类型,校验和为字节累加。 ### 云台协议 (USART10, 921600bps) | 帧头 | 长度 | 方向 | 用途 | |------|------|------|------| | 0xA5 | 18B | PC→MCU | 自动追踪 (measure_x, ref_x, measure_y, ref_y) | | 0xA6 | 10B | PC→MCU | 手动控制 (yaw_vel, pitch_vel) | | 0xA7 | 3B | PC→MCU | 命令帧 (模式切换, 激光控制) | | 0xA8 | 50B | PC→MCU | PID 调参 (12 个 float) | | 0xA9 | 6B | PC→MCU | 前馈角速度 | ### 底盘协议 (UART, 115200bps) | 帧头 | 长度 | 方向 | 用途 | |------|------|------|------| | 0xA6 | 8B | PC→MCU | 手动控制 (motor_speed_base, angle_velocity) | | 0xA7 | 3B | PC→MCU | 命令帧 (模式切换) | | 0xA8 | 38B | PC→MCU | PID 调参 (9 个 float) | | 0xA9 | 6B | MCU→PC | 前馈角速度 | ### PID 控制层级 ``` 底盘: 位置环 (50Hz) ──► 角度环 (50Hz) ──► 速度环 (100Hz) 灰度传感器 IMU Yaw 编码器 云台: 视觉环 (500Hz) ──► 角度环 (1kHz) 图像测量 IMU 姿态 ``` ## 工作模式 | 模式 | 云台 | 底盘 | 说明 | |------|------|------|------| | AUTO | 视觉追踪目标 | 灰度巡线 | 全自主运行 | | MANUAL | 接收角速度指令 | 接收速度指令 | 手动遥控 | | DEBUG | 电机失能,可调参 | 电机失能,可调参 | PID 在线调试 | ## 网络端口分配 | 端口 | 服务 | 协议 | |------|------|------| | 80 | Nginx (前端 + 反代) | HTTP | | 8080 | web_node (API) | HTTP | | 8081 | web_video_server | HTTP (MJPEG) | | 9090 | rosbridge | WebSocket | ## 硬件规格 | 模块 | MCU | 主频 | Flash | RAM | 传感器 | |------|-----|------|-------|-----|--------| | Gimbal | STM32H723ZG (Cortex-M7) | 480MHz | 1MB | 128KB DTCM | BMI088 6轴 IMU | | Chassis | MSPM0G3507 (Cortex-M0+) | 80MHz | 128KB | 32KB | ICM-42688-P, 8ch 灰度 | | Vision | NVIDIA Jetson (aarch64) | — | — | — | Hikrobot 工业相机 |