姜 響 薛 麗 任一鳴
(湖北科技學(xué)院電子與信息工程學(xué)院 湖北 咸寧 437100)
在大學(xué)物理實(shí)驗(yàn)中,測(cè)量剛體的轉(zhuǎn)動(dòng)慣量是其中一個(gè)重要的實(shí)驗(yàn)項(xiàng)目,而三線擺法又是測(cè)量轉(zhuǎn)動(dòng)慣量的常用方法之一,在用三線擺法測(cè)量轉(zhuǎn)動(dòng)慣量的實(shí)驗(yàn)中,重要且困難的環(huán)節(jié)是測(cè)量圓盤擺動(dòng)周期.傳統(tǒng)測(cè)量方法有秒表計(jì)時(shí)法和光電門法.秒表計(jì)時(shí)通過(guò)記錄50次擺動(dòng)用時(shí)得出單次周期,但易受觀測(cè)者影響且易出現(xiàn)誤記現(xiàn)象;光電門精度提高,但仍易誤記.以上兩法均無(wú)法獲得三線擺運(yùn)動(dòng)圖像等信息.針對(duì)傳統(tǒng)方法的改進(jìn)已見(jiàn)諸報(bào)端[1-6],但安裝傳感器、磁化三線擺等做法會(huì)對(duì)其運(yùn)動(dòng)帶來(lái)影響;某些傳感器受限工作原理,所得圖像僅呈周期變化,無(wú)法揭示角度或位移與時(shí)間的關(guān)系;利用Phyphox或Tracker等軟件則需熟悉其使用技巧以及不同情況下生成數(shù)據(jù)的特征,不利推廣.
鑒于以上原因,基于Python開發(fā)了一款軟件.實(shí)驗(yàn)時(shí)在三線擺下盤貼上紅色標(biāo)志物,攝像頭模塊接入電腦并拍攝標(biāo)志物運(yùn)動(dòng),在軟件內(nèi)利用OpenCV將視頻轉(zhuǎn)化為一系列運(yùn)動(dòng)數(shù)據(jù),利用FFT(快速傅里葉變換)和均值算法計(jì)算周期并以Matplotlib實(shí)時(shí)繪制圖像.此外基于Tkinter架構(gòu)了軟件數(shù)據(jù)表格,可輔助及引導(dǎo)學(xué)生完成數(shù)據(jù)處理和誤差分析;基于Pygame設(shè)計(jì)了實(shí)驗(yàn)仿真系統(tǒng),可輔助學(xué)生學(xué)習(xí)實(shí)驗(yàn)操作.
圖像處理捕捉標(biāo)志物的實(shí)現(xiàn)主要通過(guò)OpenCV的圖像二值化及輪廓識(shí)別等功能;計(jì)算周期則通過(guò)對(duì)均值點(diǎn)集作逐差及分析FFT頻譜兩種方法;數(shù)據(jù)可視化則以Matplotlib交互模式將已得數(shù)據(jù)實(shí)時(shí)繪圖展示.此外因Matplotlib動(dòng)態(tài)響應(yīng)過(guò)長(zhǎng),故以多進(jìn)程運(yùn)行計(jì)算周期與數(shù)據(jù)可視.實(shí)現(xiàn)步驟如下:
圖1 原始圖像
以cvtColor函數(shù)將rgb通道改為hsv,并以inRange函數(shù)進(jìn)行圖像二值化,其參數(shù)為顏色空間.以紅色為例,其hsv顏色空間為:色調(diào)156~180或0~10,飽和度43~255,明度46~255,處理后圖像如圖2所示.圖像二值化后還需適當(dāng)腐蝕噪點(diǎn).
圖2 二值化處理后圖像
以findContours函數(shù)識(shí)別圖像全部輪廓并將其中面積最大者視為標(biāo)志物.求解該輪廓點(diǎn)集期望即得中心點(diǎn)坐標(biāo).記錄計(jì)算機(jī)實(shí)時(shí)時(shí)間并與中心點(diǎn)坐標(biāo)組合保存.在圖像中重新繪制輪廓、標(biāo)出中心點(diǎn)并寫入時(shí)間,并以imshow函數(shù)顯示(圖3左上角).
圖3 處理過(guò)程實(shí)拍
(2)計(jì)算周期.創(chuàng)建子進(jìn)程并通過(guò)切片刷新共享內(nèi)存向其傳遞數(shù)據(jù).子進(jìn)程中將位移均值歸零后以兩種算法計(jì)算周期.
均值算法:設(shè)置“寬度”變量.遍歷數(shù)據(jù),判斷位移是否低于“寬度”,若是則以列表保存其對(duì)應(yīng)時(shí)間.對(duì)列表中相近部分取平均獲得近似均值點(diǎn)集,作逐差得周期.
FFT:調(diào)用numpy.fft.fft函數(shù),參數(shù)為位移數(shù)據(jù),采樣周期為兩點(diǎn)時(shí)間差,返回值為頻譜數(shù)據(jù).取數(shù)據(jù)實(shí)部并遍歷尋出其最大或最小值點(diǎn),其頻率即為振動(dòng)頻率.
(3)可視化數(shù)據(jù).在子進(jìn)程中以Matplotlib.pyplot類的ion函數(shù)啟動(dòng)交互,subplot函數(shù)分配圖像區(qū)間,plot函數(shù)繪制x-t、v-t、x-v和FFT頻譜圖像,text函數(shù)顯示周期和最小分度值(圖3).
(4)結(jié)果呈現(xiàn).實(shí)測(cè)標(biāo)志物面積并通過(guò)一個(gè)輸入界面?zhèn)魅胲浖?軟件將實(shí)測(cè)面積與圖像中面積取比值并開方即得毫米單位與像素點(diǎn)單位的比率,進(jìn)一步可得一系列擁有實(shí)際單位的數(shù)據(jù).不啟動(dòng)交互繪制最終實(shí)驗(yàn)圖像,并以csv格式導(dǎo)出全部數(shù)據(jù).
數(shù)據(jù)表格界面需實(shí)現(xiàn)輸入、提示、數(shù)據(jù)擬合等功能,以稍底層的Tkinter架構(gòu),其它操作界面以easygui架構(gòu).實(shí)驗(yàn)仿真界面則以游戲庫(kù)Pygame開發(fā).具體實(shí)現(xiàn)操作及仿真界面如下:
1.2.1 數(shù)據(jù)表格等操作界面
對(duì)于數(shù)據(jù)表格,創(chuàng)建兩個(gè)子進(jìn)程并實(shí)例化窗口,在嵌套循環(huán)中生成并渲染Text控件并以StringVar變量跟蹤其輸入,組成輸入部分;以label控件顯示表格旁文字;以botton控件生成按鈕并設(shè)置command參數(shù)的關(guān)聯(lián)函數(shù),“refresh”按鍵關(guān)聯(lián)函數(shù)中將輸入數(shù)據(jù)保存在pkl文件中以實(shí)現(xiàn)數(shù)據(jù)保存,“tips”按鍵關(guān)聯(lián)函數(shù)中創(chuàng)建頂層窗口并顯示圖片以實(shí)現(xiàn)提示功能.表格和提示界面如圖4所示.
圖4 數(shù)據(jù)表格和部分提示
實(shí)驗(yàn)時(shí),在data表格中填入測(cè)量數(shù)據(jù),點(diǎn)擊“tips”獲取提示并在result表格中填寫計(jì)算結(jié)果.保存數(shù)據(jù)后,系統(tǒng)以in語(yǔ)句檢測(cè)數(shù)據(jù)中是否存在空字符串,若無(wú)則將字符串轉(zhuǎn)為浮點(diǎn)數(shù)并驗(yàn)算數(shù)據(jù)處理及誤差分析結(jié)果,并以信息窗口逐個(gè)呈現(xiàn).此外考慮到“驗(yàn)證平行軸定理”環(huán)節(jié)有表達(dá)式[7]
(1)
實(shí)驗(yàn)需以線性擬合驗(yàn)證T2-d2關(guān)系及截距,實(shí)現(xiàn)方案:調(diào)用numpy.polyfit函數(shù),參數(shù)為橫縱坐標(biāo)及擬合方程最高次冪,函數(shù)返回?cái)M合方程及判據(jù)系數(shù).以plot函數(shù)繪制擬合曲線及散點(diǎn).可通過(guò)判據(jù)系數(shù)及截距與理論值相對(duì)誤差驗(yàn)證平行軸定理.
其它操作界面都以調(diào)用easygui庫(kù)中函數(shù)來(lái)實(shí)現(xiàn).以系統(tǒng)主界面為例,調(diào)用choicebox函數(shù),其choices參數(shù)為各功能名稱的字符串,即得圖5般界面.
圖5 主界面
1.2.2 仿真實(shí)驗(yàn)界面
考慮Pygame底層性強(qiáng),一些控件需提前繪制并架構(gòu).以箭頭按鈕和“游標(biāo)卡尺”為例.對(duì)于箭頭按鈕,創(chuàng)建Arbutton類對(duì)象,初始參數(shù)包括窗口及箭頭指向,箭頭本體以lines方法繪制;創(chuàng)建set方法在窗口中渲染箭頭,參數(shù)為箭尖坐標(biāo);創(chuàng)建isdown和isup方法,通過(guò)檢測(cè)鼠標(biāo)事件判斷箭頭按下或彈起.對(duì)于“游標(biāo)卡尺”(圖6),用繪圖軟件繪制主尺和分尺,仿真時(shí)導(dǎo)入圖片并將兩尺上下邊緣貼合渲染,主尺按既定“待測(cè)物”參數(shù)向左移動(dòng)即可模擬讀數(shù).
圖6 游標(biāo)卡尺仿真實(shí)驗(yàn)
界面架構(gòu)以“氣泡水準(zhǔn)儀”和“攝像頭調(diào)整”為例.“氣泡水準(zhǔn)儀”中,繪制并渲染3個(gè)大小顏色不同的圓充當(dāng)“底座”“中心環(huán)”和“氣泡”,組成虛擬氣泡水準(zhǔn)儀,其仿真實(shí)驗(yàn)界面如圖7所示.實(shí)驗(yàn)時(shí)操控一系列按鈕,“氣泡”根據(jù)按鈕事件進(jìn)行移動(dòng);“攝像頭調(diào)整”(圖7)則以rectangle函數(shù)繪制長(zhǎng)方形來(lái)模擬標(biāo)志物并捕捉鍵盤w、a、s、d響應(yīng)來(lái)模擬調(diào)整攝像頭操作.
圖7 氣泡水準(zhǔn)儀與攝像頭調(diào)整實(shí)驗(yàn)界面
電子天平稱量實(shí)驗(yàn)中下盤質(zhì)量m0以及圓環(huán)的質(zhì)量m;游標(biāo)卡尺測(cè)量上盤半徑r、下盤半徑R及圓環(huán)內(nèi)徑d和外徑D.記錄完畢后用氣泡水準(zhǔn)器調(diào)整三線擺上、下圓盤水平,最后卷尺測(cè)量3根擺繩繩長(zhǎng)h.攝像頭與電腦連接,在主界面“計(jì)算擺動(dòng)周期”中點(diǎn)擊“攝像頭實(shí)時(shí)測(cè)量數(shù)據(jù)”,進(jìn)入準(zhǔn)備界面.
紅色標(biāo)志物貼于三線擺下圓盤側(cè)面,攝像頭正對(duì)標(biāo)志物并且拉開一定距離,如圖8所示.
圖8 攝像頭對(duì)準(zhǔn)紅色標(biāo)志物
擺動(dòng)三線擺,注意擺角盡可能小并盡量避免橫擺.調(diào)整攝像頭使之清晰呈現(xiàn)出標(biāo)志物運(yùn)動(dòng),按“Esc”鍵軟件開始記錄,生成動(dòng)態(tài)圖像同時(shí)計(jì)算擺動(dòng)周期等數(shù)據(jù).待80 s后自動(dòng)停止記錄,保存數(shù)據(jù)并重復(fù)多次實(shí)驗(yàn).之后放上待測(cè)物,繼續(xù)重復(fù)多次實(shí)驗(yàn).
為保證結(jié)果可對(duì)比,實(shí)驗(yàn)時(shí)以軟件和秒表同時(shí)測(cè)量擺動(dòng)周期.表1、表2為測(cè)量數(shù)據(jù).
表1 其他物理量的測(cè)量結(jié)果
表2 3種不同方法測(cè)得的周期、求得的轉(zhuǎn)動(dòng)慣量及其相對(duì)誤差
由上表, FFT所得轉(zhuǎn)動(dòng)慣量數(shù)據(jù)的相對(duì)誤差較小.比較發(fā)現(xiàn)以FFT算法獲得的周期數(shù)據(jù)與其他組相比偏小,且空載圓盤轉(zhuǎn)動(dòng)慣量的相對(duì)誤差明顯較大.
三線擺圓盤轉(zhuǎn)動(dòng)的同時(shí)還不可避免存在橫向擺動(dòng)[1].某次實(shí)驗(yàn)中[x-t圖像見(jiàn)圖9(a)]兩種頻率相近的振動(dòng)相互疊加,出現(xiàn)了明顯的“拍”現(xiàn)象.而在由傅里葉變換所生成的頻譜圖像中,兩種不同頻率的波峰(或波谷)很容易區(qū)分.如圖9(b)所示,出現(xiàn)了1和2兩個(gè)頻率不同的波谷.
(a)
(b)圖9 某次實(shí)驗(yàn)所得系列圖像
一定條件下,三線擺圓盤轉(zhuǎn)動(dòng)會(huì)與橫擺產(chǎn)生耦合[8],影響周期測(cè)量,可解釋空載圓盤轉(zhuǎn)動(dòng)慣量相對(duì)誤差為何相比較大.
通過(guò)OpenCV采集三線擺運(yùn)動(dòng)數(shù)據(jù),其改進(jìn)對(duì)三線擺運(yùn)動(dòng)幾乎無(wú)影響,且測(cè)量結(jié)果相比而言誤差較小,更具使用價(jià)值;通過(guò)Matplotlib實(shí)現(xiàn)了三線擺運(yùn)動(dòng)的圖像化,觀察到傳統(tǒng)實(shí)驗(yàn)難以觀察到的現(xiàn)象,有助于培養(yǎng)學(xué)生從圖像和表格中發(fā)現(xiàn)問(wèn)題的能力.以自制數(shù)據(jù)表格進(jìn)行數(shù)據(jù)處理,方便整理且實(shí)現(xiàn)了實(shí)驗(yàn)操作全程無(wú)紙化.基于Pygame搭建的二維實(shí)驗(yàn)仿真系統(tǒng)有助學(xué)生學(xué)習(xí)實(shí)驗(yàn)操作.