白 鵬,周 崟,張 銳,王 浩
(山西省自動化研究所,山西 太原 030012)
與其他的測量手段相比較,激光具有能量集中,不易受電磁波干擾的優(yōu)點,廣泛的應用于遙感遙測,土木建設(shè),市政施工,軍事國防等領(lǐng)域。并且激光測距儀相較于其他測距儀器體積更加小巧,重量更加輕便,是一種高精度的測距手段。本文闡述了一種激光測距的原理,并且利用C#語言在Visual Studio平臺上編寫了測距的上位機軟件。經(jīng)過實際的效果驗證,上位機軟件可準確地反應激光傳感器的測量數(shù)值,波形顯示模塊可將測距數(shù)值實時顯示,給工程測距人員較為直觀的圖形展示。
目前,小型的激光測距傳感器普遍采用相位法測量距離。相位式激光測距也稱連續(xù)波激光測距[1]。測量時首先由激光傳感器的發(fā)射系統(tǒng)發(fā)出連續(xù)的光波,經(jīng)調(diào)制后發(fā)射至被測目標,由被測目標返射回的回波激光信號經(jīng)一定時間的延遲后進入接收系統(tǒng),激光信號傳導至光電探測器,再由解調(diào)器對延遲信號進行解調(diào),并將解調(diào)之后的信號送到相位差比較模塊中進行計算,最終得到相位差值[2],如圖1所示。
圖1 激光測距原理圖
被測量的距離可以根據(jù)相位差得到,見式(1) :
(1)
其中,C為真空光速;f為調(diào)制頻率。調(diào)制波在空中傳播的時間為t,t可由式(2)計算得到:
(2)
其中,φ=2πN1+2πΔN1,N1為調(diào)制波傳播的整數(shù)周期數(shù),ΔN1為調(diào)制波傳播的非整數(shù)周期數(shù)。那么被測距離D就可表示為式(3):
(3)
L稱為半波長,也叫做激光測距的測尺長度[3]。通常,只有在波長小于測尺長的情況下,有唯一解。所以在實際應用中一般選擇幾個測尺的長度作為參照。而且利用相位法測量時,為得到較高的測量精度,須選用高頻激光信號作為測量源。
本文使用Hyperson公司的HPS-167系列的激光測距傳感器,該傳感器具有測距精度高、反應迅速等特點,在測距工程上被廣泛的使用。在實際的使用中,常常需要把激光傳感器掛載到載具上(例如汽車的倒車雷達),需要較長的信號傳輸線路,但傳感器的RS232接口的傳輸電壓通常較低,在長距離傳輸時信號衰減比較明顯,所以往往將傳感器的RS232接口轉(zhuǎn)接為傳輸電壓較高的RS485傳輸,以保證信號在傳輸過程中的穩(wěn)定,具體的硬件框圖如圖2。
圖2 激光測距硬件框圖
本程序主要有四個模塊,分別是串口收發(fā)設(shè)置模塊、距離數(shù)字顯示模塊、聲音提示模塊、測距波形顯示模塊。下面對這四個模塊具體介紹。
串口接收模塊的功能是對上位機接口的參數(shù)的初始化,規(guī)定了傳輸?shù)牟ㄌ芈省⒋谔柕鹊?。程序使用了C#中的GetPortNames函數(shù)[4,5],自動獲取插在工控機上設(shè)備的串口號。代碼如下:
string[] lsSignalPort1 = SerialPort.GetPortNames();
comSerialPort.Text = lsSignalPort1[0];
距離數(shù)字顯示模塊是上位機界面的核心部分,程序?qū)⒋趥魅氲臄?shù)據(jù)保存至voDis對象的ovDistance屬性中。程序片段如下:
public static void UpdateCarInfo(JudgementDis voDis, OrgSignalModel voOrgSignalData)
{
if (voOrgSignalData != null)
{
voDis.ovDistance = voOrgSignalData.Distance;
}
}
由于頁面的數(shù)據(jù)更新占用主線程,所以還需要進行跨線程的委托,代碼片段如下:
private void UpdateCarInfoDelegate()
{
this.Invoke(new CarInvokeDelegate(UpdateCarInfo));
}
為實現(xiàn)頁面數(shù)字的動態(tài)更新,在程序中定義了一個采樣間隔可設(shè)定的定時器,每間隔一定的周期執(zhí)行定時器函數(shù),更新激光測距數(shù)據(jù),具體定時器代碼如下:
//計時器初始設(shè)置
int liInterval = Convert.ToInt32(this.comSampleRate.Text);
moDataRecTimer = new Timer();
moDataRecTimer.Interval = liInterval;
moDataRecTimer.Elapsed+= new System.Timers.ElapsedEventHandler(moDataRecTimer_Elapsed);
在實際的項目中往往不僅需要直觀的數(shù)字顯示,還需要聲音的提示報警。為此,本程序設(shè)計了聲音提示模塊。該模塊的最小接近距離可以人工設(shè)定,當被測距離小于最小設(shè)定距離時,就會發(fā)出“叮叮”的報警聲提示用戶。代碼片段如下:
//初始化聲音播放器
moSoundPlayer = new System.Media.SoundPlayer();
moPlaylist = new List
由于聲音提示是在后臺操作,需要向程序中添加一個BackgroundWorker控件[6],并向DoWork屬性中添加代碼段,主要代碼段如下:
string lsSoundPackage = string.IsNullOrEmpty(moComSetModel.SoundPackage) ? "Sound" : moComSetModel.SoundPackage;
while (moPlaylist.Count != 0)
{
string lsSoundPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, lsSoundPackage + "" + moPlaylist[0] + ".wav");
moPlaylist.RemoveAt(0)
moSoundPlayer.SoundLocation = lsSoundPath;
moSoundPlayer.PlaySync();
}
軟件中還編寫了波形顯示模塊,方便工程人員查看測距趨勢。測距模塊采用Visual Studio 的Chart控件,利用數(shù)據(jù)隊列與定時器配合,不斷地向Chart控件中添加數(shù)據(jù),實現(xiàn)波形按時間流動的效果??傮w的軟件界面如圖3所示。
圖3 激光測距總體軟件界面
基于C#編寫的激光測距上位機程序可實現(xiàn)距離的快速捕獲與顯示,界面友好,操作性強,能實現(xiàn)基本的數(shù)據(jù)采集與存儲;對簡單的工程測量與實驗室的實驗過程數(shù)據(jù)采集方面有一定的參考和借鑒價值。
[1] 肖彬.激光測距方法探討[J].地理空間信息,2010,8(4):162-164.
[2] 李秀華,莊新,宋立明.激光測距技術(shù)探究[J].長春工程學院學報(自然科學版),2012,13(4):39-41.
[3] 李密,宋影松,虞靜,等.高精度激光脈沖測距技術(shù)[J].紅外與激光工程,2011,40(8):1469-1473.
[4] (美)沃森.C#入門經(jīng)典[M].北京:清華大學出版社,2006.
[5] (美)SimonRobinson,(美)ChristianNagel.C#高級編程[M].北京:清華大學出版社,2005.
[6] AndersHejlsberg,Scott Wiltamath, Peter Golde.C#編程語言詳解[M].張曉坤,譚立平,車樹良,譯.北京:電子工業(yè)出版社,2004.