在Linux車(chē)機(jī)中如何進(jìn)行遠(yuǎn)程調(diào)試
導(dǎo)讀
調(diào)試是軟件開(kāi)發(fā)中必不可少的環(huán)節(jié)。 調(diào)試集成操作系統(tǒng)與調(diào)試桌面操作系統(tǒng)非常不同。 內(nèi)置系統(tǒng)的視覺(jué)調(diào)試功能比桌面操作系統(tǒng)的視覺(jué)調(diào)試功能稍低。 對(duì)于具有復(fù)雜業(yè)務(wù)場(chǎng)景(例如導(dǎo)航)的程序的開(kāi)發(fā),我們可以使用可視化調(diào)試環(huán)境以較少的精力開(kāi)發(fā)業(yè)務(wù)場(chǎng)景,快速定位在業(yè)務(wù)之間的交互中出現(xiàn)的問(wèn)題。 導(dǎo)航和其他車(chē)輛模塊,以及開(kāi)發(fā)過(guò)程中的調(diào)試效率。 提高。
遠(yuǎn)程調(diào)試是真機(jī)調(diào)試中最便捷的一種,開(kāi)發(fā)者只需借用在PC端強(qiáng)大的調(diào)試器就能完成業(yè)務(wù)場(chǎng)景的調(diào)試。
背景
Thrift是一種接口描述語(yǔ)言和二進(jìn)制通訊協(xié)議,它被用來(lái)定義和創(chuàng)建跨語(yǔ)言的服務(wù),是一種RPC(遠(yuǎn)程過(guò)程調(diào)用)通信框架,由Facebook為“大規(guī)模跨語(yǔ)言服務(wù)開(kāi)發(fā)”。在車(chē)機(jī)系統(tǒng)中,各模塊之間也可以使用Thrift通信框架進(jìn)行通信。導(dǎo)航作為一個(gè)單獨(dú)的為進(jìn)程提供服務(wù)的模塊,只提供導(dǎo)航相關(guān)的業(yè)務(wù)以及地圖渲染的能力,導(dǎo)航的HMI界面是車(chē)機(jī)系統(tǒng)中統(tǒng)一的操作界面,系統(tǒng)HMI界面與導(dǎo)航之間的交互接口則是通過(guò)已經(jīng)定義好的接口描述語(yǔ)言(IDL),使用自動(dòng)化工具生成本地可調(diào)用的接口,然后使用Thrift框架傳輸完成系統(tǒng)HMI與導(dǎo)航之間的通信。
調(diào)試手段
為了開(kāi)發(fā)過(guò)程中調(diào)試方便,我們?cè)赑C上做了一套模擬器,能在PC上進(jìn)行地圖渲染。還實(shí)現(xiàn)了一套在PC上使用的系統(tǒng)HMI模擬命令發(fā)送工具,模擬工具是作為客戶(hù)端連接導(dǎo)航提供的服務(wù),這樣能在PC端模擬發(fā)送命令,幫助導(dǎo)航簡(jiǎn)單業(yè)務(wù)的開(kāi)發(fā),但這種方式存在著以下弊端:
模擬命令工具,只能模擬簡(jiǎn)單的業(yè)務(wù)場(chǎng)景,有多個(gè)交互的場(chǎng)景無(wú)法模擬。
無(wú)法操作地圖HMI,也看不到HMI界面顯示以及過(guò)程中的反饋。
無(wú)法滾動(dòng)地圖,后面接了Win32上面的鼠標(biāo)事件,能用鼠標(biāo)實(shí)現(xiàn)滾動(dòng),但這種方式與車(chē)機(jī)中滾動(dòng)流程不一致。
PC端無(wú)法使用車(chē)機(jī)中的設(shè)備,如導(dǎo)航過(guò)程中沒(méi)有導(dǎo)航音,無(wú)法使用USB等。
PC端拿不到車(chē)機(jī)中的數(shù)據(jù),比如車(chē)身數(shù)據(jù)、GPS信號(hào)等。
調(diào)試方案優(yōu)化
針對(duì)當(dāng)前調(diào)試手段存在的以上問(wèn)題。我們對(duì)調(diào)試方案進(jìn)行了優(yōu)化,我們可以借助車(chē)機(jī)中系統(tǒng)HMI來(lái)與導(dǎo)航進(jìn)行交互。實(shí)現(xiàn)了使用車(chē)機(jī)環(huán)境中的信號(hào)對(duì)PC端導(dǎo)航業(yè)務(wù)場(chǎng)景進(jìn)行調(diào)試。主要有以下幾點(diǎn)功能:
1.PC端模擬器接收車(chē)機(jī)發(fā)來(lái)的信號(hào)
在該項(xiàng)目中,導(dǎo)航的相關(guān)業(yè)務(wù)都是作為服務(wù)端向車(chē)機(jī)中其他模塊提供服務(wù),在車(chē)機(jī)系統(tǒng)中,系統(tǒng)HMI連接導(dǎo)航服務(wù)的地址是固定的,我們?cè)谲?chē)機(jī)中開(kāi)發(fā)了一個(gè)代理--Sandwich,主要作用是啟動(dòng)導(dǎo)航服務(wù),這個(gè)導(dǎo)航服務(wù)并不實(shí)現(xiàn)真正的導(dǎo)航業(yè)務(wù),而是啟動(dòng)了一個(gè)空服務(wù),讓車(chē)機(jī)中其他模塊能成功建立連接,同時(shí)Sandwich作為客戶(hù)端連接PC端模擬器提供的導(dǎo)航服務(wù),PC端的導(dǎo)航服務(wù)真正實(shí)現(xiàn)導(dǎo)航業(yè)務(wù),Sandwich負(fù)責(zé)接收車(chē)機(jī)發(fā)送過(guò)來(lái)的業(yè)務(wù)請(qǐng)求,并將請(qǐng)求轉(zhuǎn)發(fā)給PC端模擬器,這樣PC端模擬器就能接收到車(chē)機(jī)中的信號(hào),收到的業(yè)務(wù)請(qǐng)求并做處理再將處理結(jié)果通過(guò)Thrift反饋到車(chē)機(jī)端。
這個(gè)流程我們打通了車(chē)機(jī)中信號(hào)發(fā)送到PC端模擬器,并可以將處理完的數(shù)據(jù)反饋給車(chē)機(jī)端。
2.PC端模擬器向車(chē)機(jī)發(fā)送信號(hào)
導(dǎo)航也需要連接車(chē)機(jī)中其他模塊提供的服務(wù),如,獲取車(chē)身數(shù)據(jù)、獲取GPS定位信號(hào),將導(dǎo)航語(yǔ)音數(shù)據(jù)發(fā)送到車(chē)機(jī)語(yǔ)音播放模塊等。
PC端模擬器需要作為客戶(hù)端來(lái)連接車(chē)機(jī)中的服務(wù),真正連接的是車(chē)機(jī)中Sandwich提供的服務(wù),Sandwich作為客戶(hù)端連接車(chē)機(jī)中其他模塊的服務(wù),比如Sandwich連接Sound模塊,GPS模塊,CarData模塊等。PC端模擬器需要使用車(chē)機(jī)設(shè)備播放導(dǎo)航音,需要將播放內(nèi)容發(fā)送給Sandwich,Sandwich收到播放內(nèi)容后,再發(fā)送給車(chē)機(jī)中的Sound模塊,導(dǎo)航音就能播放了。PC端連接車(chē)機(jī)中其他模塊的工作原理也是一樣。
3. 將PC端模擬器中顯示的地圖投射到車(chē)機(jī)端顯示
實(shí)現(xiàn)了以上兩步,一個(gè)使用車(chē)機(jī)信號(hào)調(diào)試PC端導(dǎo)航程序的環(huán)境基本完成了。已經(jīng)能實(shí)現(xiàn)車(chē)機(jī)信號(hào)與PC進(jìn)行雙向接收,但是此時(shí)導(dǎo)航的渲染能力還是停留在PC端,車(chē)機(jī)中還只是顯示了一個(gè)系統(tǒng)HMI界面,無(wú)法看到導(dǎo)航地圖展現(xiàn)的效果,這樣就會(huì)帶來(lái)一個(gè)問(wèn)題,一些需要強(qiáng)依賴(lài)地圖的操作可能就無(wú)法精準(zhǔn)操作,比如點(diǎn)擊地圖上某個(gè)POI等。此時(shí)需要將PC端的展現(xiàn)同步到車(chē)機(jī)側(cè)。
要實(shí)現(xiàn)這一目的,一般我們有兩種方法:
車(chē)機(jī)與PC同步渲染
車(chē)機(jī)中的導(dǎo)航正常運(yùn)行,當(dāng)導(dǎo)航接收到系統(tǒng)模塊業(yè)務(wù)請(qǐng)求時(shí),先是車(chē)機(jī)導(dǎo)航進(jìn)行處理,處理完畢后將信號(hào)轉(zhuǎn)發(fā)到PC端處理,這種方案兩端導(dǎo)航業(yè)務(wù)邏輯并行運(yùn)行,復(fù)雜的業(yè)務(wù)場(chǎng)景下,兩端會(huì)同時(shí)跟車(chē)機(jī)進(jìn)行交互,此時(shí)可能會(huì)產(chǎn)生互斥,會(huì)有兩端邏輯不同步的場(chǎng)景,達(dá)不到預(yù)期效果。
將車(chē)機(jī)中渲染的數(shù)據(jù)投射到車(chē)機(jī)端
在這里我們可以將PC上程序每渲染一幀地圖則將結(jié)果傳到車(chē)機(jī)端,由車(chē)機(jī)端Sandwich負(fù)責(zé)接收,當(dāng)Sandwich接收到一幀地圖像素?cái)?shù)據(jù)后,負(fù)責(zé)將此幀數(shù)據(jù)渲染到車(chē)機(jī)屏幕上,此時(shí)車(chē)機(jī)中呈現(xiàn)的效果跟PC端一致。在該項(xiàng)目中我們采用了這一方案,這種方案中,真正的導(dǎo)航業(yè)務(wù)邏輯是來(lái)自PC端,車(chē)機(jī)中只是一個(gè)轉(zhuǎn)發(fā)過(guò)程,所以不會(huì)存在第一種方案中的問(wèn)題。
但在某些特定的環(huán)境下,導(dǎo)航描畫(huà)會(huì)很頻繁,發(fā)送給車(chē)機(jī)的數(shù)據(jù)也會(huì)很多,頻繁的數(shù)據(jù)發(fā)送可能會(huì)帶來(lái)一定的性能開(kāi)銷(xiāo),表現(xiàn)上可能會(huì)出現(xiàn)延遲。這里可以使用降低圖像質(zhì)量來(lái)減少圖像數(shù)據(jù),例如,可以使用16位或者8位BMP來(lái)傳輸,還可以壓縮傳輸,這樣1920*720分辨率圖像傳輸大小能控制在30-50k左右。
小結(jié)
基于車(chē)機(jī)系統(tǒng)中Thrift通信框架,實(shí)現(xiàn)的這套遠(yuǎn)程調(diào)試方案,實(shí)質(zhì)是在車(chē)機(jī)中使用Sandwich程序接管車(chē)機(jī)系統(tǒng)中與導(dǎo)航有交互的全部接口處理,通過(guò)RPC通信轉(zhuǎn)發(fā),實(shí)現(xiàn)了使用真實(shí)車(chē)機(jī)信號(hào)調(diào)試導(dǎo)航的目的。有了這套調(diào)試環(huán)境,我們甚至可以直接在真車(chē)上邊路測(cè)邊調(diào)試,跟以前的路測(cè)拿Log回來(lái)分析、重現(xiàn)相比,整個(gè)調(diào)試過(guò)程,簡(jiǎn)單,便捷,直觀(guān)。大大提高了開(kāi)發(fā)效率。
基于RPC通信的特性,我們還可以對(duì)調(diào)試方案再進(jìn)一步優(yōu)化,可以加入多客戶(hù)端調(diào)試功能,使用同一臺(tái)車(chē)機(jī)環(huán)境,不同的模塊負(fù)責(zé)人可以同時(shí)進(jìn)行復(fù)雜業(yè)務(wù)場(chǎng)景的聯(lián)合調(diào)試。