姜 響 薛 麗 任一鳴
(湖北科技學院電子與信息工程學院 湖北 咸寧 437100)
在大學物理實驗中,測量剛體的轉動慣量是其中一個重要的實驗項目,而三線擺法又是測量轉動慣量的常用方法之一,在用三線擺法測量轉動慣量的實驗中,重要且困難的環節是測量圓盤擺動周期.傳統測量方法有秒表計時法和光電門法.秒表計時通過記錄50次擺動用時得出單次周期,但易受觀測者影響且易出現誤記現象;光電門精度提高,但仍易誤記.以上兩法均無法獲得三線擺運動圖像等信息.針對傳統方法的改進已見諸報端[1-6],但安裝傳感器、磁化三線擺等做法會對其運動帶來影響;某些傳感器受限工作原理,所得圖像僅呈周期變化,無法揭示角度或位移與時間的關系;利用Phyphox或Tracker等軟件則需熟悉其使用技巧以及不同情況下生成數據的特征,不利推廣.
鑒于以上原因,基于Python開發了一款軟件.實驗時在三線擺下盤貼上紅色標志物,攝像頭模塊接入電腦并拍攝標志物運動,在軟件內利用OpenCV將視頻轉化為一系列運動數據,利用FFT(快速傅里葉變換)和均值算法計算周期并以Matplotlib實時繪制圖像.此外基于Tkinter架構了軟件數據表格,可輔助及引導學生完成數據處理和誤差分析;基于Pygame設計了實驗仿真系統,可輔助學生學習實驗操作.
圖像處理捕捉標志物的實現主要通過OpenCV的圖像二值化及輪廓識別等功能;計算周期則通過對均值點集作逐差及分析FFT頻譜兩種方法;數據可視化則以Matplotlib交互模式將已得數據實時繪圖展示.此外因Matplotlib動態響應過長,故以多進程運行計算周期與數據可視.實現步驟如下:


圖1 原始圖像
以cvtColor函數將rgb通道改為hsv,并以inRange函數進行圖像二值化,其參數為顏色空間.以紅色為例,其hsv顏色空間為:色調156~180或0~10,飽和度43~255,明度46~255,處理后圖像如圖2所示.圖像二值化后還需適當腐蝕噪點.

圖2 二值化處理后圖像
以findContours函數識別圖像全部輪廓并將其中面積最大者視為標志物.求解該輪廓點集期望即得中心點坐標.記錄計算機實時時間并與中心點坐標組合保存.在圖像中重新繪制輪廓、標出中心點并寫入時間,并以imshow函數顯示(圖3左上角).

圖3 處理過程實拍
(2)計算周期.創建子進程并通過切片刷新共享內存向其傳遞數據.子進程中將位移均值歸零后以兩種算法計算周期.
均值算法:設置“寬度”變量.遍歷數據,判斷位移是否低于“寬度”,若是則以列表保存其對應時間.對列表中相近部分取平均獲得近似均值點集,作逐差得周期.
FFT:調用numpy.fft.fft函數,參數為位移數據,采樣周期為兩點時間差,返回值為頻譜數據.取數據實部并遍歷尋出其最大或最小值點,其頻率即為振動頻率.
(3)可視化數據.在子進程中以Matplotlib.pyplot類的ion函數啟動交互,subplot函數分配圖像區間,plot函數繪制x-t、v-t、x-v和FFT頻譜圖像,text函數顯示周期和最小分度值(圖3).
(4)結果呈現.實測標志物面積并通過一個輸入界面傳入軟件.軟件將實測面積與圖像中面積取比值并開方即得毫米單位與像素點單位的比率,進一步可得一系列擁有實際單位的數據.不啟動交互繪制最終實驗圖像,并以csv格式導出全部數據.
數據表格界面需實現輸入、提示、數據擬合等功能,以稍底層的Tkinter架構,其它操作界面以easygui架構.實驗仿真界面則以游戲庫Pygame開發.具體實現操作及仿真界面如下:
1.2.1 數據表格等操作界面
對于數據表格,創建兩個子進程并實例化窗口,在嵌套循環中生成并渲染Text控件并以StringVar變量跟蹤其輸入,組成輸入部分;以label控件顯示表格旁文字;以botton控件生成按鈕并設置command參數的關聯函數,“refresh”按鍵關聯函數中將輸入數據保存在pkl文件中以實現數據保存,“tips”按鍵關聯函數中創建頂層窗口并顯示圖片以實現提示功能.表格和提示界面如圖4所示.

圖4 數據表格和部分提示
實驗時,在data表格中填入測量數據,點擊“tips”獲取提示并在result表格中填寫計算結果.保存數據后,系統以in語句檢測數據中是否存在空字符串,若無則將字符串轉為浮點數并驗算數據處理及誤差分析結果,并以信息窗口逐個呈現.此外考慮到“驗證平行軸定理”環節有表達式[7]
(1)
實驗需以線性擬合驗證T2-d2關系及截距,實現方案:調用numpy.polyfit函數,參數為橫縱坐標及擬合方程最高次冪,函數返回擬合方程及判據系數.以plot函數繪制擬合曲線及散點.可通過判據系數及截距與理論值相對誤差驗證平行軸定理.
其它操作界面都以調用easygui庫中函數來實現.以系統主界面為例,調用choicebox函數,其choices參數為各功能名稱的字符串,即得圖5般界面.

圖5 主界面
1.2.2 仿真實驗界面
考慮Pygame底層性強,一些控件需提前繪制并架構.以箭頭按鈕和“游標卡尺”為例.對于箭頭按鈕,創建Arbutton類對象,初始參數包括窗口及箭頭指向,箭頭本體以lines方法繪制;創建set方法在窗口中渲染箭頭,參數為箭尖坐標;創建isdown和isup方法,通過檢測鼠標事件判斷箭頭按下或彈起.對于“游標卡尺”(圖6),用繪圖軟件繪制主尺和分尺,仿真時導入圖片并將兩尺上下邊緣貼合渲染,主尺按既定“待測物”參數向左移動即可模擬讀數.

圖6 游標卡尺仿真實驗
界面架構以“氣泡水準儀”和“攝像頭調整”為例.“氣泡水準儀”中,繪制并渲染3個大小顏色不同的圓充當“底座”“中心環”和“氣泡”,組成虛擬氣泡水準儀,其仿真實驗界面如圖7所示.實驗時操控一系列按鈕,“氣泡”根據按鈕事件進行移動;“攝像頭調整”(圖7)則以rectangle函數繪制長方形來模擬標志物并捕捉鍵盤w、a、s、d響應來模擬調整攝像頭操作.

圖7 氣泡水準儀與攝像頭調整實驗界面
電子天平稱量實驗中下盤質量m0以及圓環的質量m;游標卡尺測量上盤半徑r、下盤半徑R及圓環內徑d和外徑D.記錄完畢后用氣泡水準器調整三線擺上、下圓盤水平,最后卷尺測量3根擺繩繩長h.攝像頭與電腦連接,在主界面“計算擺動周期”中點擊“攝像頭實時測量數據”,進入準備界面.
紅色標志物貼于三線擺下圓盤側面,攝像頭正對標志物并且拉開一定距離,如圖8所示.

圖8 攝像頭對準紅色標志物
擺動三線擺,注意擺角盡可能小并盡量避免橫擺.調整攝像頭使之清晰呈現出標志物運動,按“Esc”鍵軟件開始記錄,生成動態圖像同時計算擺動周期等數據.待80 s后自動停止記錄,保存數據并重復多次實驗.之后放上待測物,繼續重復多次實驗.
為保證結果可對比,實驗時以軟件和秒表同時測量擺動周期.表1、表2為測量數據.

表1 其他物理量的測量結果

表2 3種不同方法測得的周期、求得的轉動慣量及其相對誤差
由上表, FFT所得轉動慣量數據的相對誤差較小.比較發現以FFT算法獲得的周期數據與其他組相比偏小,且空載圓盤轉動慣量的相對誤差明顯較大.
三線擺圓盤轉動的同時還不可避免存在橫向擺動[1].某次實驗中[x-t圖像見圖9(a)]兩種頻率相近的振動相互疊加,出現了明顯的“拍”現象.而在由傅里葉變換所生成的頻譜圖像中,兩種不同頻率的波峰(或波谷)很容易區分.如圖9(b)所示,出現了1和2兩個頻率不同的波谷.

(a)

(b)圖9 某次實驗所得系列圖像
一定條件下,三線擺圓盤轉動會與橫擺產生耦合[8],影響周期測量,可解釋空載圓盤轉動慣量相對誤差為何相比較大.
通過OpenCV采集三線擺運動數據,其改進對三線擺運動幾乎無影響,且測量結果相比而言誤差較小,更具使用價值;通過Matplotlib實現了三線擺運動的圖像化,觀察到傳統實驗難以觀察到的現象,有助于培養學生從圖像和表格中發現問題的能力.以自制數據表格進行數據處理,方便整理且實現了實驗操作全程無紙化.基于Pygame搭建的二維實驗仿真系統有助學生學習實驗操作.