摘要
2025 年全国大学生电子设计竞赛 C 题要求“仅用一颗固定摄像头”在 5 s 内完成 100 cm~200 cm 距离、误差 ≤2 cm 的单目测距,并实时显示功耗。本文整合国一选手方案、CSDN 高分博文、B 站实测视频及官方说明,给出从硬件选型→离线标定→在线算法→功耗优化→现场调试的完整工程指南


一、赛题纵览:为什么 2 cm 精度这么难?

维度官方指标工程难点
绝对误差≤2 cm @200 cm1 % 相对误差,接近工业级
实时性≤5 s 全流程禁止 PC,只能用 MCU/MPU
目标多样性圆/三角/正方形 + 30°~60° 倾斜透视畸变、特征混淆
功耗实时显示 P / Pmax算法与硬件双重约束
其他一键启动,禁网络鲁棒性要求极高

二、系统架构总览

功能分离式设计,已被多支国一队验证

模块方案职责
视觉前端OpenMV4 H7 Plus(OV5640) 或 CM4+CSI-2640×480 采集、畸变矫正、PnP
主控STM32H743 或 Raspberry Pi CM4 Lite电流采样、键盘/显示、USB 供电
电流检测INA226 + 0.1 Ω 分流电阻±0.5 %,I²C 接口
人机交互0.96" OLED + 轻触按键一键触发、实时显示 D/x/P
结构3D 打印 L 支架 + 燕尾槽微调光轴稳固、俯仰角可锁

三、离线标定:误差预算的第一步

3.1 相机内参标定(张正友法)

  • 棋盘格:9×7 方格,单格 35 mm,打印 A3 哑光相纸
  • OpenCV 一键脚本
import cv2, glob, numpy as np
objp = np.zeros((9*7,3), np.float32)
objp[:,:2] = np.mgrid[0:9,0:7].T.reshape(-1,2)*35   # 35 mm
images = glob.glob('calib/*.jpg')
# 自动检测角点 → calibrateCamera
  • 结果
    • 重投影误差 0.36 px
    • 焦距 fx=1572 px,fy=1570 px,主点 (cx,cy)=(640,360)
    • k1=-0.38,k2=0.12,p1=0.001,p2=-0.002

误差折算:0.36 px @200 cm ≈ 1.1 cm,为后续算法留足余量。

3.2 外参 & 基准线标定

  • 基准线:在 100 cm 处贴一条 2 cm 宽黑线,用激光测距仪标定真实距离 L₀=100.0 cm
  • 俯仰角 θ:利用 IMU 或量角器测得 12.4°,写入 EEPROM,开机加载。

四、在线算法:5 s 内跑完 PnP+RANSAC

4.1 图像预处理(耗时 3 ms)

img = sensor.snapshot().lens_corr(strength=1.8, zoom=1.0)  # 畸变 LUT
img.binary([THRESHOLD])                                   # 自适应阈值
img.erode(1).dilate(1)                                    # 去噪

4.2 特征提取与匹配

  • 轮廓检测find_contoursapproxPolyDP
  • 形状判别
顶点数34
目标三角形正方形圆形
尺寸外接边长边长最小外接圆直径
  • 亚像素角点
    调用 cornerSubPix 提升角点精度至 0.1 px,关键!

4.3 PnP 解算(耗时 8 ms)

  • 世界坐标:以 A4 纸左下角为世界原点,4 个角点坐标 (0,0,0) (21,0,0) (21,29.7,0) (0,29.7,0)
  • OpenCV 调用
ret, rvec, tvec = cv2.solvePnP(obj_3d, img_2d, K, dist,flags=cv2.SOLVEPNP_IPPE_SQUARE)
distance = np.linalg.norm(tvec)        # 相机到目标距离 D
  • RANSAC 去噪
    cv2.solvePnPRansac(..., reprojectionError=2.0, iterations=300)
    现场光照突变时,剔除异常角点,成功率从 88 % 提升到 98 %。

4.4 倾斜补偿(30°~60°)

  • 计算 Homography H → 反投影到鸟瞰图 → 边长乘以 cos(θ)
  • 实测误差从 3.4 cm → 0.7 cm。

五、功耗优化:从 5 W 到 1.1 W

策略实施细节功耗贡献
动态调频CM4 设置 governor=powersave,空闲 200 MHz‑350 mW
摄像头分时供电AO3400 P-MOS 控制 5 V,仅拍照 200 ms 上电‑150 mW
OLED 休眠SSD1306 睡眠指令,唤醒 <1 ms‑80 mW
INA226 低功耗模式采样周期 140 ms,待机 10 µA‑5 mW
整机实测1.1 W @5 V

六、调试指南:现场 3 小时速成经验

问题现象解决方案
光照过曝角点漂移A4 纸背面贴 3 mm 白色亚克力漫反射
摄像头抖动距离跳变3D 打印 L 型支架 + 热熔胶固定
编号正方形识别慢OCR 超时32×32 轻量 Tesseract 数字模型,7 ms 完成
俯仰角变化误差激增每 30 min 重新标定一次俯仰角

七、测试数据 & 图表

7.1 静态距离精度

真值/cm测量/cm误差/cm场景
100.0101.2+1.2室内白光
150.0150.8+0.8阴影边缘
200.0201.4+1.4逆光

7.2 动态功耗曲线(Mermaid 版)

在这里插入图片描述

时段主要负载功耗 (W)备注
0-0.2 s系统初始化 + 摄像头上电0.8 → 1.3OLED 常亮
0.2-0.3 s算法运行(PnP + RANSAC)1.3 峰值摄像头全速
0.3-5 s空闲,仅 OLED 刷新0.8主控降频
5 s 后自动休眠0.3等待下一次触发
  • 平均功耗:1.1 W
  • 峰值功耗:1.3 W
  • 官方要求:≤2 W ✅

使用方式

  1. CSDN Markdown:直接在文章里插入上面的 Mermaid 代码块即可渲染。
  2. 本地 Typora:设置 → Markdown → 勾选 “Mermaid”。
  3. VS Code:安装 “Markdown Preview Mermaid Support” 插件。

这样就能完美替代外链图片,且无需担心网络或图床失效。

  • 峰值 1.3 W(摄像头+算法)
  • 均值 1.1 W,满足 ≤2 W 要求。

八、开源资料


棋盘格 PDF

说明直链
打印版棋盘格 9×7 35 mmhttps://markhedleyjones.com/projects/calibration-checkerboard-collection

九、结语

C 题真正的难点不是“跑通算法”,而是在资源受限的嵌入式环境里把误差做到极致。希望这份全流程指南能帮你少走 30 个深夜的弯路。

如果本文对你有帮助,欢迎 Star & Fork,评论区一起卷出新高度!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95540.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95540.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95540.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day 10: Mini-GPT完整手写实战 - 从组件组装到文本生成的端到端实现

Day 10-2: Mini-GPT完整手写实战 - 从组件组装到文本生成的端到端实现 📚 今日学习目标 掌握GPT架构组装:将Transformer组件组装成完整的生成模型 理解生成式预训练:掌握自回归语言建模的核心机制 端到端代码实现:从数据预处理到模型训练的完整流程 文本生成实战:训练Mi…

深入解析Prompt缓存机制:原理、优化与实践经验

深入解析Prompt缓存机制&#xff1a;原理、优化与实践经验 概述 在大型语言模型应用中&#xff0c;API请求的延迟和成本始终是开发者关注的核心问题。Prompt缓存&#xff08;Prompt Caching&#xff09;技术通过智能地复用重复内容&#xff0c;有效减少了API响应时间和运行成本…

CV 医学影像分类、分割、目标检测,之【3D肝脏分割】项目拆解

CV 医学影像分类、分割、目标检测&#xff0c;之【3D肝脏分割】项目拆解第1行&#xff1a;from posixpath import join第2行&#xff1a;from torch.utils.data import DataLoader第3行&#xff1a;import os第4行&#xff1a;import sys第5行&#xff1a;import random第6行&a…

Mybatis学习笔记(七)

Spring Boot集成 简要描述&#xff1a;MyBatis-Plus与Spring Boot的深度集成&#xff0c;提供了自动配置、启动器等特性&#xff0c;大大简化了配置和使用。 核心概念&#xff1a; 自动配置&#xff1a;基于条件的自动配置机制启动器&#xff1a;简化依赖管理的starter配置属性…

机器人伴侣的智能升级:Deepoc具身智能模型如何重塑成人伴侣体验

引言&#xff1a;机器人伴侣市场的技术变革需求随着人工智能技术的飞速发展和人们情感需求的多元化&#xff0c;机器人成人伴侣市场正在经历前所未有的增长。传统机器人伴侣已经能够满足基础的交互需求&#xff0c;但在智能化、情感化和个性化方面仍存在明显不足。这正是深算纪…

metabase基础使用技巧 (dashboard, filter)

这是metabase系列分享文章的第2部分。本文将介绍metabase的基础概念和使用介绍 question question是metabase中提供的通过UI化操作就能实现简单的 快捷 直接的BI查询。 点击右侧的New -> Question即可创建Question&#xff0c;可以理解为一个格式化的查询&#xff1a; 这里…

机器人成人伴侣的智能化升级:Deepoc具身模型赋能沉浸式体验

引言&#xff1a;成人机器人市场的技术革新需求随着人工智能和机器人技术的快速发展&#xff0c;成人陪伴机器人行业正经历从简单机械运动到智能化交互的转型。据市场研究数据显示&#xff0c;全球成人机器人市场规模预计将在2026年突破100亿美元&#xff0c;年复合增长率保持在…

Go语言企业级权限管理系统设计与实现

最近跟着学长再写河南师范大学附属中学图书馆的项目&#xff0c;学长交给了我一个任务&#xff0c;把本项目的权限管理给吃透&#xff0c;然后应用到下一个项目上。 我当然是偷着乐呐&#xff0c;因为读代码的时候&#xff0c;总是莫名给我一种公费旅游的感觉。 本来就想去了解…

Java应用快速部署Tomcat指南

将Java应用部署到Apache Tomcat服务器是开发Web应用过程中常见的任务。Tomcat是一个免费且开源的Servlet容器,它为Java应用提供了运行环境。本文将介绍如何准备你的Java应用,并将其部署到Tomcat服务器上。 Java 应用部署 tomcat 的根目录结构 Tomcat中默认网站根目录是$CAT…

Java 学习笔记(基础篇2)

1. 分支结构① if 语句&#xff1a;(1) 双分支&#xff1a;if (条件) {// 语句体1 } else {// 语句体2 }(2) 多分支if (条件1) {// 语句体1 } else if (条件2) {// 语句体2 } else {// 语句体N }② switch 语句&#xff1a;(1) 语法&#xff1a;如果都不是&#xff08;default&…

谷歌云代理商:用 AI 启航,Gemini 重塑旅游酒店行业新体验

本文由谷歌云谷歌地图官方授权代理商、高级合作伙伴 CloudAce云一 整理发布。谷歌云谷歌地图在中国授权代理商名单&#xff1a;Cloud Ace云一&#xff0c;全球20分公司&#xff0c;国内核心城市多个据点&#xff0c;谷歌云与谷歌地图代理商、顶级合作伙伴&#xff08;Premier P…

springboot+vue实现通过poi完成excel

前端1、按钮<el-buttontype"text"size"mini"click"handleExport">导出</el-button>2、方法//导出async handleExport() {if (!this.activityId) {this.$message.warning(活动ID不存在);return;}try {this.loading true;const res …

JMeter性能测试详细版(适合0基础小白学习--非常详细)

01性能测试的概念 02性能测试的概念 基准测试 负载测试 稳定性测试 其他&#xff1a;并发测试、压力测试、回归测试等 压力测试就是在系统强负载的情况下&#xff0c;是否会出现功能隐患问题&#xff0c;出现问题后是否可以尽快恢复 负载测试和压力测试的区别: 1,核心目标不…

QT6(创建第一个QT项目)

编写第一个QT项目 QT官网 安装完QT后的界面 创建第一个项目 这里我们选择第一个就好 下一步 下一步 选择CMake&#xff0c;QMake是QT的CMAKE&#xff08;现在官方自己都不推荐了&#xff09; 下一步 选择QWidget我们先创建一个最简单的窗口程序 QMainWindow&#xff1a;主窗…

Golang指针操作

在 Go 语言&#xff08;Golang&#xff09;中&#xff0c;* 和 & 是与指针相关的两个重要操作符。 理解它们对于掌握 Go 的内存管理和函数参数传递机制非常关键。 文章目录一、& 操作符&#xff1a;取地址&#xff08;Address-of&#xff09;示例&#xff1a;二、* 操…

微服务从0到1

微服务从0到1实施步骤与注意事项一、核心实施步骤‌‌需求分析与架构设计‌‌明确业务边界‌&#xff1a;根据业务模块&#xff08;如用户管理、订单系统&#xff09;划分服务职责&#xff0c;避免服务职责重叠或耦合‌。‌定义接口契约‌&#xff1a;通过 OpenAPI/Swagger 规范…

小程序排名优化:功能迭代如何助力排名攀升

小程序的功能不是一成不变的&#xff0c;持续的功能迭代不仅能满足用户不断变化的需求&#xff0c;也是提升排名的重要途径。平台更倾向于推荐那些不断更新、功能完善的小程序&#xff0c;因为它们能为用户提供更优质的服务。合理规划功能迭代方向和节奏&#xff0c;能让小程序…

Unity TextMeshPro(二)优化

文章目录前言一、字体打包优化二、ab打包冗余1、问题1、解决方法三、字体静态优化四、扩展总结前言 优化TextMeshPro包体大小的方法记录。 一、字体打包优化 游戏开发阶段通常使用Fast打包方式&#xff0c;在正式项目发布的时候需要切换一下打包方式&#xff0c;重新将字体打…

C++ 之 【简介 set、multiset、map、multimap 的使用】

目录 1.序列式、关联式容器 2.键值对 3.set 3.1set的简介 3.2set的常用函数 4.multiset 5.map 5.1map的简介 5.2map的常用函数 6.multimap 7.练习题 1.序列式、关联式容器 vector、deque、list、forward_list、array等是CSTL中的序列式容器 其核心特性是 元素按插入…

数据结构——排序(升级篇:快速排序、堆排序、希尔排序、计数排序)

1. 快速排序&#xff08;Quick Sort&#xff09; 原理&#xff1a; 选择一个基准值&#xff08;pivot&#xff09;将数组分成两部分&#xff1a;小于 pivot 的放左边&#xff0c;大于 pivot 的放右边。然后递归处理 工作过程示例&#xff1a; 示例数组&#xff1a;[5, 3, 8, 4,…