【摘要】 消防車的安全檢測(cè)中經(jīng)常需要伸展至大于30米的規(guī)定工作高度,因此經(jīng)常在室外進(jìn)行安全檢測(cè),該情況下的檢測(cè)以檢驗(yàn)人員目測(cè),主觀判斷為主,無(wú)法提供進(jìn)一步的數(shù)據(jù)支持,一方面不盡客觀,不符合檢驗(yàn)要求,另一方面對(duì)檢驗(yàn)人員的專業(yè)素質(zhì)要求較高,本文旨在討論利用Unity3D配合VisualStudio開發(fā)能還原消防車工作情況的軟硬件系統(tǒng)。
【關(guān)鍵詞】 Unity3D 傳感器 三維圖像 消防車
一、前言
時(shí)至今日,三維成像技術(shù)早已在工業(yè)、科研、教育娛樂(lè)等眾多領(lǐng)域中廣泛應(yīng)用,在工業(yè)和科研中以往許多以波形、圖表、參數(shù)來(lái)顯示的現(xiàn)場(chǎng)工作狀況早已被替換成直觀的三維圖像,也使得人們對(duì)現(xiàn)場(chǎng)狀態(tài)的判斷也更加準(zhǔn)確快速。在消防車安全檢測(cè)領(lǐng)域中,由于工作狀態(tài)下的消防車工作高度經(jīng)常大于30米,很多時(shí)候,檢測(cè)人員只能通過(guò)目測(cè)來(lái)進(jìn)行檢驗(yàn)。從精確度和有效性上講這樣的方法缺陷較大。因此,本文旨在探討用傳感器和Unity3D三維圖像引擎開發(fā)一個(gè)能夠?qū)崟r(shí)反應(yīng)消防車工作臂工作狀態(tài)的軟硬件系統(tǒng)。
二、整體系統(tǒng)說(shuō)明
系統(tǒng)說(shuō)明如圖1所示。數(shù)據(jù)采集器采集陀螺儀和激光測(cè)距傳感器的參數(shù),再通過(guò)RS232發(fā)送到上位機(jī),上位機(jī)軟件將收集到的數(shù)據(jù)加工后送至Unity3D開發(fā)的三維顯示界面,與此同時(shí)將相應(yīng)的數(shù)據(jù)信息顯示在屏幕上。
2.1硬件部分
加速度計(jì)陀螺儀采用市面上常見的MPU6050模塊,數(shù)據(jù)包分為加速度包、角速度包和角度包。用于三維現(xiàn)場(chǎng)還原時(shí),主要用角度包當(dāng)中的俯仰角數(shù)據(jù),用來(lái)體現(xiàn)消費(fèi)車工作臂的抬起角度。
激光傳感器采用KAKRU公司的HPS-L1-V系列拉繩傳感器。用于三維現(xiàn)場(chǎng)還原時(shí),拉繩傳感器用來(lái)提供工作臂伸長(zhǎng)的長(zhǎng)度。返回的數(shù)據(jù)用4個(gè)字節(jié)的數(shù)據(jù)來(lái)表示長(zhǎng)度。
2.2軟件部分
軟件分為兩大部分,第一部分上位機(jī)主體,主要為軟件主界面,包括串口循環(huán)讀取模塊,數(shù)據(jù)處理模塊和參數(shù)傳遞模塊。此部分在VisualStudio中開發(fā)完成。
第二部分為Unity3D三維圖像顯示控件,主要功能為接受后臺(tái)的數(shù)據(jù)處理模塊傳遞過(guò)來(lái)的參數(shù),還原成現(xiàn)場(chǎng)的情況。此部分在Unity3D開發(fā)環(huán)境中開發(fā)完成。
2.2.1軟件主界面
1.串口循環(huán)讀取模塊
功能:由計(jì)時(shí)器(Timer)為主體,Timer每一次觸發(fā),讀取串口緩沖區(qū)的數(shù)據(jù),在解析之前,需要先進(jìn)行搜索數(shù)據(jù)包頭的操作。
搜索方法主要由依次遍歷匹配實(shí)現(xiàn),此次設(shè)計(jì)采用的硬件中,代表包頭的數(shù)據(jù)內(nèi)容為“0x55”,則搜索數(shù)據(jù)包頭操作說(shuō)明即為:將串口緩沖區(qū)的數(shù)據(jù)讀取至一個(gè)字節(jié)數(shù)組,對(duì)該數(shù)組第一位進(jìn)行判斷,若為“0x55”,則程序繼續(xù)執(zhí)行,否則對(duì)該數(shù)組下一個(gè)字節(jié)的數(shù)據(jù)進(jìn)行匹配。
由MPU6050使用說(shuō)明書可知,找到包頭之后,若包頭之后的一個(gè)字節(jié)的數(shù)據(jù)為“0x53”,則代表該包為角度包,此時(shí)數(shù)據(jù)編號(hào)為“4”和“5”的數(shù)據(jù)(即包頭之后第四和第五個(gè)字節(jié))即為角度包的高位值和低位值。
該模塊主要代碼如下(buf為字節(jié)數(shù)組,用于存儲(chǔ)串口數(shù)據(jù)):
private void timerSerialData_Tick(object sender, EventArgs e)
{serialPort1.Read(buf, 0, 66);
for (m = 0; m < 33; m++)
{if ((buf[m] == 0x55) (buf[m + 1] == 0x53))
DataAnalysis();
}}}
2.數(shù)據(jù)處理模塊
功能:該模塊主要將串口循環(huán)讀取模塊讀取到的數(shù)據(jù)進(jìn)行解析,解析出來(lái)的數(shù)據(jù)用于計(jì)算Unity3D引擎中需要顯示的各個(gè)模塊的參數(shù)。
以一組兩節(jié)工作臂的消防車為例,在空間坐標(biāo)中,假定工作臂在空間坐標(biāo)中的X正方向上抬起、放下,在已知抬起的角度a(即俯仰角)及工作臂伸長(zhǎng)的長(zhǎng)度L,即可通過(guò)簡(jiǎn)單的三角函數(shù)計(jì)算出工作臂的第一節(jié)臂和第二節(jié)臂的中心位置和姿態(tài)角度,計(jì)算方法在此不在贅述。
相關(guān)代碼如下:
變量說(shuō)明:
LA一一Scale為縮放值,即現(xiàn)實(shí)中工作臂的長(zhǎng)度換算為三維模型時(shí)的比例,LA為該縮放值下的工作臂長(zhǎng)度。
DataAnalysis();
{a = (Convert.ToInt32(buf[m + 5] << 8 | buf[m + 4])) / 32768.0* 3.1415926;
L = Convert.ToInt32((buf[m + 11] << 8 | buf[m + 10]),16);}
3.參數(shù)傳遞模塊
功能:Unity3D開發(fā)的三維模塊可以以控件的形式加載,用SendMessage方法來(lái)傳遞參數(shù),此時(shí)需要定義一個(gè)簡(jiǎn)單通訊協(xié)議,通訊協(xié)議如下:
參數(shù)按順序依次為第一節(jié)臂中心點(diǎn)位置(p_x1, p_y1, p_z1),工作臂第一節(jié)姿態(tài)角度(0 , a , 0),工作臂第二節(jié)中心點(diǎn)位置( p_x2, p_y2, p_z2)工作臂第二節(jié)姿態(tài)角度(0 , a , 0)。將參數(shù)依次放進(jìn)字符串a(chǎn)并用逗號(hào)隔開后,直接使用SendMessage即可
代碼如下:
axUnityWebPlayer1.SendMessage(“FireEngine”,“CallUnity”, a);
代碼中最后一行的”FireEngine”為Unity3D中需要調(diào)用腳本的對(duì)象,”CallUnity”為調(diào)用的腳本。
2.2.2 Unity3D三維圖像顯示控件
1.三維圖像模塊
此模塊用于三維模型顯示,在Unity3D開發(fā)平臺(tái)開發(fā),消防車的三維模型可以使用3Dmax軟件制作,在Unity3D開發(fā)平臺(tái)中加載消防車的三維模型即可。為了計(jì)算簡(jiǎn)便,我們將消防車三維模型中消防臂的底端移至場(chǎng)景中空間坐標(biāo)的(0,0,0)點(diǎn),并將消防臂朝向X軸的正方向,此時(shí)記錄下消防臂第一節(jié)臂的中心點(diǎn)在X軸上的坐標(biāo)值L1X,這個(gè)值的兩倍除以現(xiàn)實(shí)世界中消防車的工作臂長(zhǎng)度即為本文之前提到的Scale縮放值。
即 Scale= 2*L1X / (現(xiàn)實(shí)中消防車工作臂長(zhǎng)度)
之后在Unity3D中新建一個(gè)腳本,名為“CallUnity”,腳本的對(duì)象為消防車“FireEngine”。
2.參數(shù)拆包模塊
此模塊對(duì)應(yīng)2.1.3的參數(shù)傳遞模塊。SendMessage中的字符串a(chǎn)中包含所有控制參數(shù),因此先用Spilt方法分割參數(shù),然后將分割的參數(shù)由字符串類型改變?yōu)楦↑c(diǎn)型,存入數(shù)組data,代碼不在此贅述。
3.模型控制模塊
此模塊的功能主要為調(diào)用控制參數(shù)控制消防車的兩節(jié)工作臂。控制主要通過(guò)Unity3D的transform方法實(shí)現(xiàn),代碼如下(arm1、arm2分別為第一、第二節(jié)工作臂):
void OnGUI()
{
Arm1.transform.position = Vector3(data[0], data[1], data[2]);
Arm1.transform.rotation = Vector3(data[3], data[4], data[5]);
Arm2.transform.position = Vector3(data[6], data[7], data[8]);
Arm2.transform.rotation = Vector3(data[9], data[10], data[11]);
}
這段代碼每執(zhí)行一次,都會(huì)將工作臂的第一節(jié)和第二節(jié)臂的模型移動(dòng)至計(jì)算好的位置上,并調(diào)整成相應(yīng)的姿態(tài)角。因此即可實(shí)現(xiàn)現(xiàn)場(chǎng)還原。
最終三維圖像的效果如下圖:
三、總結(jié)與展望
許多消防車的工作臂頂端會(huì)連接一個(gè)工作斗,這套系統(tǒng)在工作斗上也可以安裝一個(gè)陀螺儀,采集工作斗的調(diào)平數(shù)據(jù),對(duì)該數(shù)據(jù)計(jì)算累計(jì)時(shí)間即可反應(yīng)出工作斗調(diào)平響應(yīng)時(shí)間等測(cè)試指標(biāo)。即可簡(jiǎn)化測(cè)試員在該情況下的測(cè)試工作。
該軟件系統(tǒng)可以添加數(shù)據(jù)庫(kù)功能,數(shù)據(jù)庫(kù)中存如現(xiàn)場(chǎng)采集到的數(shù)據(jù),只需簡(jiǎn)單的逐行調(diào)用即可實(shí)現(xiàn)現(xiàn)場(chǎng)情況再次重現(xiàn)的功能,為測(cè)試員重復(fù)觀察提供了極大便利。
這樣的系統(tǒng)開發(fā)簡(jiǎn)單,軟硬件成本低,且功能可以根據(jù)不同類型傳感器、用戶需求、算法實(shí)現(xiàn)不同的功能??蓱?yīng)用于諸如教學(xué),機(jī)械裝置狀況反饋等多種場(chǎng)合。