Skip to content

About

2025 全国电赛 E 题三处理器异构智能炮台:OpenCV 视觉 + 透视变换 + 双轴 PID 闭环(校级一等奖)

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

3 Commits

Folders and files

Repository files navigation

Smart Turret System - 基于视觉的激光自动瞄准系统

侧视图 俯视图 正面视图

基于 树莓派 + 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 循迹控制     │
                    │  ├─ 角度环直行校正   │
                    │  └─ 状态机(直行/转弯) │
                    └─────────────────────┘

核心算法

1. 目标识别与透视校正

系统的核心挑战是:小车在运动中从不同角度观察靶纸,A4 靶纸在图像中呈现为不规则的梯形,直接计算靶心坐标会引入巨大误差。

解决方案:实时透视变换

原始图像(梯形畸变)──→ 检测黑色边框4角点 ──→ getPerspectiveTransform ──→ 校正后的矩形图像
                                                                          ↓
云台角度指令 ←── PID控制 ←── 计算靶心偏差 ←── 逆变换回原始坐标 ←── 计算靶心位置
  • 矩形检测:二值化 → 轮廓检测 → 多边形拟合(4顶点) → 面积/平行度/白色占比多重验证
  • 透视校正:4角点映射到标准矩形,消除因拍摄角度产生的梯形畸变
  • 靶心定位:在校正后的理想平面上计算中心,再通过逆变换映射回原始图像坐标

2. PID 闭环瞄准控制

采用「摄像头-激光同轴」布局,激光落点在画面中固定。任务简化为:让靶心在画面中移动到激光点位置。

# 双轴独立 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),提升帧率

3. 画圆轨迹生成

发挥部分要求小车行驶 1 圈同时激光沿 6cm 红色圆弧画圆。实现方式:

  1. 在透视校正后的理想平面上,以靶心为圆心生成半径 6cm 对应像素的圆周采样点
  2. 通过逆透视变换将采样点映射回原始图像坐标
  3. 小车行驶进度与圆周进度同步,云台依次追踪各采样点

测试结果

下表为比赛与调试阶段的整体表现,时间/误差为多次运行的大致量级(非严格逐次计量),重在反映系统能力边界。

测试项目 要求 表现
基本要求(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~3cm
发挥(2) 行驶2圈瞄准 t ≤ 40s, Dt ≤ 2cm ⚠️ 基本完成,动态误差约 3cm 级
发挥(3) 画圆 Dt ≤ 2cm ⚠️ 圆弧成功闭合,误差约 3cm 级

基本要求稳定达标;发挥部分(高速动态场景)受系统延迟与 PID 追踪误差累积影响,精度尚有提升空间。

摄像头视角效果

靶标检测视角1 靶标检测视角2 靶标检测视角3

摄像头实时画面:黑色边框矩形靶标 + 同心圆,运行于 ~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-libcamera

运行

cd 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/ 底层驱动基于立创开发板示例改写,本人主要贡献集中在上位机视觉与瞄准算法。

License

本项目为比赛作品,仅供学习参考。固件目录含第三方(立创开发板 / InvenSense)代码,已保留各自版权声明。

About

2025 全国电赛 E 题三处理器异构智能炮台:OpenCV 视觉 + 透视变换 + 双轴 PID 闭环(校级一等奖)

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages