【摘要】 消防車的安全檢測中經常需要伸展至大于30米的規定工作高度,因此經常在室外進行安全檢測,該情況下的檢測以檢驗人員目測,主觀判斷為主,無法提供進一步的數據支持,一方面不盡客觀,不符合檢驗要求,另一方面對檢驗人員的專業素質要求較高,本文旨在討論利用Unity3D配合VisualStudio開發能還原消防車工作情況的軟硬件系統。
【關鍵詞】 Unity3D 傳感器 三維圖像 消防車
一、前言
時至今日,三維成像技術早已在工業、科研、教育娛樂等眾多領域中廣泛應用,在工業和科研中以往許多以波形、圖表、參數來顯示的現場工作狀況早已被替換成直觀的三維圖像,也使得人們對現場狀態的判斷也更加準確快速。在消防車安全檢測領域中,由于工作狀態下的消防車工作高度經常大于30米,很多時候,檢測人員只能通過目測來進行檢驗。從精確度和有效性上講這樣的方法缺陷較大。因此,本文旨在探討用傳感器和Unity3D三維圖像引擎開發一個能夠實時反應消防車工作臂工作狀態的軟硬件系統。
二、整體系統說明
系統說明如圖1所示。數據采集器采集陀螺儀和激光測距傳感器的參數,再通過RS232發送到上位機,上位機軟件將收集到的數據加工后送至Unity3D開發的三維顯示界面,與此同時將相應的數據信息顯示在屏幕上。

2.1硬件部分
加速度計陀螺儀采用市面上常見的MPU6050模塊,數據包分為加速度包、角速度包和角度包。用于三維現場還原時,主要用角度包當中的俯仰角數據,用來體現消費車工作臂的抬起角度。
激光傳感器采用KAKRU公司的HPS-L1-V系列拉繩傳感器。用于三維現場還原時,拉繩傳感器用來提供工作臂伸長的長度。返回的數據用4個字節的數據來表示長度。
2.2軟件部分
軟件分為兩大部分,第一部分上位機主體,主要為軟件主界面,包括串口循環讀取模塊,數據處理模塊和參數傳遞模塊。此部分在VisualStudio中開發完成。
第二部分為Unity3D三維圖像顯示控件,主要功能為接受后臺的數據處理模塊傳遞過來的參數,還原成現場的情況。此部分在Unity3D開發環境中開發完成。
2.2.1軟件主界面
1.串口循環讀取模塊
功能:由計時器(Timer)為主體,Timer每一次觸發,讀取串口緩沖區的數據,在解析之前,需要先進行搜索數據包頭的操作。
搜索方法主要由依次遍歷匹配實現,此次設計采用的硬件中,代表包頭的數據內容為“0x55”,則搜索數據包頭操作說明即為:將串口緩沖區的數據讀取至一個字節數組,對該數組第一位進行判斷,若為“0x55”,則程序繼續執行,否則對該數組下一個字節的數據進行匹配。
由MPU6050使用說明書可知,找到包頭之后,若包頭之后的一個字節的數據為“0x53”,則代表該包為角度包,此時數據編號為“4”和“5”的數據(即包頭之后第四和第五個字節)即為角度包的高位值和低位值。
該模塊主要代碼如下(buf為字節數組,用于存儲串口數據):
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.數據處理模塊
功能:該模塊主要將串口循環讀取模塊讀取到的數據進行解析,解析出來的數據用于計算Unity3D引擎中需要顯示的各個模塊的參數。
以一組兩節工作臂的消防車為例,在空間坐標中,假定工作臂在空間坐標中的X正方向上抬起、放下,在已知抬起的角度a(即俯仰角)及工作臂伸長的長度L,即可通過簡單的三角函數計算出工作臂的第一節臂和第二節臂的中心位置和姿態角度,計算方法在此不在贅述。
相關代碼如下:
變量說明:
LA一一Scale為縮放值,即現實中工作臂的長度換算為三維模型時的比例,LA為該縮放值下的工作臂長度。
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.參數傳遞模塊
功能:Unity3D開發的三維模塊可以以控件的形式加載,用SendMessage方法來傳遞參數,此時需要定義一個簡單通訊協議,通訊協議如下:
參數按順序依次為第一節臂中心點位置(p_x1, p_y1, p_z1),工作臂第一節姿態角度(0 , a , 0),工作臂第二節中心點位置( p_x2, p_y2, p_z2)工作臂第二節姿態角度(0 , a , 0)。將參數依次放進字符串a并用逗號隔開后,直接使用SendMessage即可
代碼如下:
axUnityWebPlayer1.SendMessage(“FireEngine”,“CallUnity”, a);
代碼中最后一行的”FireEngine”為Unity3D中需要調用腳本的對象,”CallUnity”為調用的腳本。
2.2.2 Unity3D三維圖像顯示控件
1.三維圖像模塊
此模塊用于三維模型顯示,在Unity3D開發平臺開發,消防車的三維模型可以使用3Dmax軟件制作,在Unity3D開發平臺中加載消防車的三維模型即可。為了計算簡便,我們將消防車三維模型中消防臂的底端移至場景中空間坐標的(0,0,0)點,并將消防臂朝向X軸的正方向,此時記錄下消防臂第一節臂的中心點在X軸上的坐標值L1X,這個值的兩倍除以現實世界中消防車的工作臂長度即為本文之前提到的Scale縮放值。
即 Scale= 2*L1X / (現實中消防車工作臂長度)
之后在Unity3D中新建一個腳本,名為“CallUnity”,腳本的對象為消防車“FireEngine”。
2.參數拆包模塊
此模塊對應2.1.3的參數傳遞模塊。SendMessage中的字符串a中包含所有控制參數,因此先用Spilt方法分割參數,然后將分割的參數由字符串類型改變為浮點型,存入數組data,代碼不在此贅述。
3.模型控制模塊
此模塊的功能主要為調用控制參數控制消防車的兩節工作臂。控制主要通過Unity3D的transform方法實現,代碼如下(arm1、arm2分別為第一、第二節工作臂):
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]);
}
這段代碼每執行一次,都會將工作臂的第一節和第二節臂的模型移動至計算好的位置上,并調整成相應的姿態角。因此即可實現現場還原。
最終三維圖像的效果如下圖:

三、總結與展望
許多消防車的工作臂頂端會連接一個工作斗,這套系統在工作斗上也可以安裝一個陀螺儀,采集工作斗的調平數據,對該數據計算累計時間即可反應出工作斗調平響應時間等測試指標。即可簡化測試員在該情況下的測試工作。
該軟件系統可以添加數據庫功能,數據庫中存如現場采集到的數據,只需簡單的逐行調用即可實現現場情況再次重現的功能,為測試員重復觀察提供了極大便利。
這樣的系統開發簡單,軟硬件成本低,且功能可以根據不同類型傳感器、用戶需求、算法實現不同的功能??蓱糜谥T如教學,機械裝置狀況反饋等多種場合。