2025 電賽 C 題完整通關攻略:從單目標定到 2 cm 測距精度的全流程實戰


摘要
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 %,I2C 接口
人機交互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,…