. C* f. e( C1 t/ S. V8 c1 M7 e" w, v! V. m) x! j# g1 d% d$ @. h
#初期试探 1 h5 P, r7 _. N A, P2 Z拿到题目后,反复读了题目。首先队内结合网上资料形成了两种方案,原理相同就是利用光信号到达的强度来定位。两者差距在于算法不同而已,一种利用计算得出位置,另一种就是经过测量得到一种位置与光强对应的表,然后通过查表得到位置。: `& [0 B Q# I. B6 q# R
##方法0 y0 t; q1 u2 |1 _; W' I
产生三个不同频率的方波作为信号驱动三个LED灯发亮,然后再用光电二极管接收。(这里光电二极管、光电三极管、光敏电阻都考虑过。我们的光电三极管识别角度太小,光敏电阻形状不规整,容易造成旋转不对称不利于计算和精度的实现)。接收到的信号经过FFT(快速傅里叶变换)将频率幅度信息还原回来,就像下图8 t4 i- _6 V2 g/ n, Z! f
) C' l7 b7 i: U; F& }; K$ | 7 ?4 ]; W& ]) x! E) T. R这是我做过的最漂亮的一次,之后做的是后都有很大的杂波。(最后发现这个应该不是我们的实验数据而是直接用三个正弦波叠加做的fft,orz)* H8 y5 c1 P* |( X5 B
2 E0 }$ u6 B! I# B7 t% Y- R) q, f( n# [# w
我们想通过不同频段对应幅度与距离的关系,确定LED距离传感器(光电二极管)的位置从而实现定位。 & K. Y) U# _5 U5 u3 X( Y% S, a8 Z& Z' N D8 |* h* x/ C 国赛----可见光室内定位 + D$ l6 ~3 ~7 @- f! ~8 F2 L5 r 1 H1 e1 ^+ B! x9 \5 s; {7 D- q% Q1 u! X% {6 f
但这些是在极度理想的情况下,事实上灯的亮度很难保证是一个定值,这种装置也不一定具有旋转对称性(距离相同,不同方位强度可能不同),二极管以及发光装置都存在这一定程度的不对称性。' H) b4 o. j4 }, W4 Q( F) `
根据实际的测试发现,FFT的结果有很大的抖动,相同的测试环境下幅值甚至会有30%的差别,当然这里有一些是我们自身做的不到位,但是这种方法经过实验证明精度十分的堪忧。于是我们舍弃了这种方法。+ j1 F f, k* w) r) J+ o. w1 z. p
1 X4 ]; g8 E. k3 {% M% }
#最终方案----摄像头定位 $ A3 X& a' r( M6 E5 M) W$ i; |上一个方法我们尝试了接近了两天,最后抛弃了。于是我们的时间仅剩下了一天半,我们有先见之明提前买了摄像头当我们宣布上一个方案死亡时,我们就去尝试了摄像头的方案 摄像头是openmv 附带一个F7的芯片作为处理器,内部跑Python代码。3 W% W9 p, h2 y: T( H: @
1 g' H" r& y7 c ) n2 e- {2 m, p H+ M2 Y剩下的就是算法 6 P% ^/ R+ t* P A, d; g##算法% h7 |) e2 _ y5 ~5 _( c
核心是定位到光源的位置。然后自己(传感器)的位置就是图像中心的位置,已知三个点的位置和自已与三个点的相对位置,剩下的计算就不难了。5 `7 o: |% W, |4 `" ?, y
0 t( `7 S" \0 n5 Q
##障碍 4 x7 z6 c/ m9 C; o7 _+ g6 }当然实际上不可能只有这么简单,但也不难克服 & A7 t! Y7 {1 Z( l [我们的方案是,让摄像头的方向固定,然后利用算法,消除一些固定不准确造成的误差+ H- u' d8 C- q7 b; q2 U' P# w
1. 摄像头旋转造成的误差* \1 ~3 T2 E4 k
2. 摄像头位置不水平造成的误差: L/ J, \9 w% \$ {2 K
3. 摄像头没有拍到全部光源,特殊情况的处理 6 c% F+ }* T9 f4. 外界光源的干扰& P3 h2 U+ f1 H, \2 R( O; a