基于 树莓派 + MSPM0G3507 + STM32 三处理器异构架构的激光自动瞄准系统。搭载二维无刷云台与 CSI 摄像头,通过 OpenCV 透视变换实时消除视角畸变,结合 PID 闭环控制实现对靶心的动态追踪,静态瞄准误差可达厘米级,4s 内完成自动锁定。
设计一个由自动循迹小车 + 激光瞄准模块组成的自行瞄准装置:
- 小车沿 100cm×100cm 方形轨迹自动循迹行驶(MSPM0 控制)
- 二维云台控制 405nm 激光笔瞄准 50cm 外的靶心
- 基本要求:静止/任意位置 4s 内击中靶心(误差 ≤2cm)
- 发挥部分:行驶中持续瞄准靶心、沿 6cm 圆弧画圆
| 层级 | 组件 | 职责 |
|---|---|---|
| 上位机 | Raspberry Pi 4B | OpenCV 视觉处理、目标识别、PID 瞄准算法 |
| 下位机(循迹) | TI MSPM0G3507 | 灰度传感器循迹、PID 电机控制、MPU6050 姿态角度环 |
| 下位机(云台) | STM32 | 接收角度指令、高速 PID 伺服控制、PWM 驱动无刷云台 |
| 感知 | CSI 摄像头 | 648×486 @ 30FPS,固定于云台与激光笔同轴 |
| 执行 | 二维无刷云台 + 405nm 激光笔 | 高精度角度定位、激光投射 |
| 通信 | UART 115200bps | 树莓派 → STM32 → 云台 |
感知层 控制层 执行层
┌─────────────────────┐
CSI 摄像头 ──50FPS──→│ Raspberry Pi 4B │
│ 视觉计算中心 │
│ ├─ 矩形靶标识别 │──串口指令──→ STM32 ──PWM──→ 无刷云台
│ ├─ 透视变换畸变校正 │ 云台伺服控制 激光笔
│ ├─ 靶心坐标计算 │
│ └─ PID 角度输出 │
└─────────────────────┘
┌─────────────────────┐
循迹传感器 ─灰度数据─→│ MSPM0G3507 │──PWM──→ 直流减速电机×2
│ 小车运动控制 │
MPU6050 ──姿态数据──→│ ├─ PID 循迹控制 │
│ ├─ 角度环直行校正 │
│ └─ 状态机(直行/转弯) │
└─────────────────────┘
系统的核心挑战是:小车在运动中从不同角度观察靶纸,A4 靶纸在图像中呈现为不规则的梯形,直接计算靶心坐标会引入巨大误差。
解决方案:实时透视变换
原始图像(梯形畸变)──→ 检测黑色边框4角点 ──→ getPerspectiveTransform ──→ 校正后的矩形图像
↓
云台角度指令 ←── PID控制 ←── 计算靶心偏差 ←── 逆变换回原始坐标 ←── 计算靶心位置
- 矩形检测:二值化 → 轮廓检测 → 多边形拟合(4顶点) → 面积/平行度/白色占比多重验证
- 透视校正:4角点映射到标准矩形,消除因拍摄角度产生的梯形畸变
- 靶心定位:在校正后的理想平面上计算中心,再通过逆变换映射回原始图像坐标
采用「摄像头-激光同轴」布局,激光落点在画面中固定。任务简化为:让靶心在画面中移动到激光点位置。
# 双轴独立 PID,Y轴响应更保守(重力影响)
pid_x = PID(Kp=0.0006, Ki=0.00002, Kd=0.0005)
pid_y = PID(Kp=0.0003, Ki=0.00001, Kd=0.0003)关键优化:
- 平滑控制:加权移动平均滤波,权重 [0.5, 0.3, 0.2],消除云台抖动
- 运动预测(可选):基于最近 3 帧线性预测,补偿 2 帧系统延迟
- 动态 ROI(可选):根据目标速度自适应调整搜索区域(200~400px),提升帧率
发挥部分要求小车行驶 1 圈同时激光沿 6cm 红色圆弧画圆。实现方式:
- 在透视校正后的理想平面上,以靶心为圆心生成半径 6cm 对应像素的圆周采样点
- 通过逆透视变换将采样点映射回原始图像坐标
- 小车行驶进度与圆周进度同步,云台依次追踪各采样点
下表为比赛与调试阶段的整体表现,时间/误差为多次运行的大致量级(非严格逐次计量),重在反映系统能力边界。
| 测试项目 | 要求 | 表现 |
|---|---|---|
| 基本要求(1) 自动循迹 | N=5圈, t ≤ 100s | ✅ 达标,约 90s 内完成 5 圈 |
| 基本要求(2) 任意位置瞄准 | t ≤ 2s, Dt ≤ 2cm | ✅ 达标,1~2s 锁定,误差 ~1cm 级 |
| 基本要求(3) 指定位置瞄准 | t ≤ 4s, Dt ≤ 2cm | ✅ 达标,4s 内锁定,误差 ~1cm 级 |
| 发挥(1) 行驶1圈瞄准 | t ≤ 20s, Dt ≤ 2cm | |
| 发挥(2) 行驶2圈瞄准 | t ≤ 40s, Dt ≤ 2cm | |
| 发挥(3) 画圆 | Dt ≤ 2cm |
基本要求稳定达标;发挥部分(高速动态场景)受系统延迟与 PID 追踪误差累积影响,精度尚有提升空间。
摄像头实时画面:黑色边框矩形靶标 + 同心圆,运行于 ~30 FPS
Smart-Turret-System/
├── src/ # 上位机源代码(Python,运行于树莓派)
│ ├── main.py # 主程序:摄像头控制、帧处理循环、键盘交互
│ └── modules/
│ ├── camera.py # Picamera2 摄像头配置
│ ├── rectangle.py # 矩形靶标检测(二值化+轮廓+多边形拟合)
│ ├── perspective.py # 透视变换与逆变换(畸变校正核心)
│ ├── circle.py # 圆周采样点生成(画圆功能)
│ ├── pid.py # PID 控制器
│ └── serial_send.py # UART 串口通信(低延迟优化)
├── firmware/ # 下位机源代码
│ └── mspm0_car/ # MSPM0G3507 小车控制(C语言)
│ ├── main.c # 主程序入口
│ ├── motor_encoder_control.c # 电机PID + 编码器 + 角度环(核心控制)
│ ├── bsp_motor_hallencoder.c # 电机与编码器驱动
│ ├── bsp_irtracking.c # 循迹传感器驱动
│ ├── bsp_mpu6050.c # MPU6050 姿态传感器驱动
│ └── board.c # 板级初始化
├── docs/ # 文档
│ ├── algorithm-details.md # 核心算法详解
│ └── system-architecture.drawio # 系统架构图(draw.io 格式)
├── media/ # 展示媒体
│ ├── hardware-*.jpg # 硬件实物照片 ×3
│ └── target-detection-*.jpg # 摄像头视角截图 ×3
├── .gitignore
├── requirements.txt
└── README.md
| 硬件 | 型号/规格 | 用途 |
|---|---|---|
| 上位机 | Raspberry Pi 4B | 视觉处理 & 瞄准算法 |
| 小车主控 | TI MSPM0G3507 | 循迹控制、电机PID、角度环 |
| 云台控制 | STM32 | 高速伺服 PID、PWM 生成 |
| 摄像头 | CSI 摄像头 | 648×486 @ 30FPS |
| 云台 | 轻量化二维无刷云台 | 搭载摄像头 + 激光笔 |
| 激光笔 | 405nm 蓝紫激光 (≤10mW) | 靶标投射 |
| 姿态传感器 | MPU6050 | 小车姿态角度反馈 |
| 循迹传感器 | 灰度传感器阵列 | 黑线循迹 |
| 电机 | 直流减速电机 ×2 + 编码器 | 小车驱动 |
| 底盘 | 铝合金 3轮2电机 (25×15cm) | 车体结构 |
| 电源 | 锂电池组 ×2(独立供电) | 小车电源 / 瞄准电源分离 |
# 安装 Python 依赖
pip install -r requirements.txt
# 树莓派专用库(系统级)
sudo apt install python3-picamera2 python3-libcameracd src/
python main.py| 按键 | 功能 |
|---|---|
q |
退出程序 |
s |
手动启动全图搜索 |
r |
重置云台到零位 |
p |
切换运动预测 ON/OFF |
o |
切换动态 ROI ON/OFF |
- 串口端口在
src/modules/serial_send.py中配置,默认/dev/ttyAMA0 - 摄像头分辨率和 PID 参数可在
src/main.py中调整 - 关于固件:
firmware/为队友负责的下位机代码,作为系统完整性参考收录。其中电机/编码器/MPU6050/循迹等底层驱动基于 立创开发板 官方示例改写(文件头保留原始版权声明)。该目录依赖 TI Code Composer Studio + SysConfig 生成的配置文件及 InvenSense DMP 库(未全部收录),无法独立 clone 编译,仅供阅读参考。本仓库重点在src/的上位机视觉与瞄准算法。
| 文档 | 说明 |
|---|---|
| docs/algorithm-details.md | 核心算法详解(视觉流水线、PID策略、画圆原理) |
| docs/system-architecture.drawio | 系统架构图(draw.io 打开) |
本项目为 3 人团队合作完成,我主要负责:
- 视觉算法全部设计与实现:矩形检测、透视变换畸变校正、靶心定位、画圆轨迹生成
- 瞄准控制算法:PID 参数整定、平滑控制、运动预测、动态 ROI
- 上位机软件架构:模块化设计(6 个独立模块)、串口通信优化
- 系统联调:上位机-云台通信协议、端到端瞄准精度调试
工程上系统并非完美,这里如实记录目前的边界:
- 矩形检测依赖高对比度场景:核心是固定阈值(150)二值化 + 轮廓拟合,在强光、反光或复杂背景下二值化结果会退化,鲁棒性下降。可改进为自适应阈值或加入颜色先验。
- 透视校正依赖 4 角点全部可见:一旦靶纸边框被部分遮挡或超出画面,角点检测失败、瞄准中断。后续可引入部分角点估计或多帧融合。
- 发挥部分动态精度受系统延迟制约:高速行驶下「感知→计算→串口→云台」链路存在固有延迟,纯反馈 PID 误差会累积,当前靠线性运动预测部分补偿,仍有提升空间(如卡尔曼滤波 / 前馈控制)。
- 固件部分非完全自研:
firmware/底层驱动基于立创开发板示例改写,本人主要贡献集中在上位机视觉与瞄准算法。
本项目为比赛作品,仅供学习参考。固件目录含第三方(立创开发板 / InvenSense)代码,已保留各自版权声明。





