遠程調試在Linux車機中的應用

導讀

在軟件開發過程中,調試是必不可少的環節,嵌入式操作系統的調試與桌面操作系統的調試相比有很大差別,嵌入式系統的可視化調試能力比桌面操作系統要弱一點。對於導航這種業務場景比較複雜的程序開發,可視化調試環境能讓我們業務場景開發事半功倍,也能快速定位導航業務與車機中其他模塊交互出現的問題,提高開發過程中的調試效率。

遠程調試是真機調試中最便捷的一種,開發者只需借用在PC端強大的調試器就能完成業務場景的調試。

背景

Thrift是一種接口描述語言和二進制通訊協議,它被用來定義和創建跨語言的服務,是一種RPC(遠程過程調用)通信框架,由Facebook爲“大規模跨語言服務開發”。在車機系統中,各模塊之間也可以使用Thrift通信框架進行通信。導航作爲一個單獨的爲進程提供服務的模塊,只提供導航相關的業務以及地圖渲染的能力,導航的HMI界面是車機系統中統一的操作界面,系統HMI界面與導航之間的交互接口則是通過已經定義好的接口描述語言(IDL),使用自動化工具生成本地可調用的接口,然後使用Thrift框架傳輸完成系統HMI與導航之間的通信。

 

調試手段

爲了開發過程中調試方便,我們在PC上做了一套模擬器,能在PC上進行地圖渲染。還實現了一套在PC上使用的系統HMI模擬命令發送工具,模擬工具是作爲客戶端連接導航提供的服務,這樣能在PC端模擬發送命令,幫助導航簡單業務的開發,但這種方式存在着以下弊端

  • 模擬命令工具,只能模擬簡單的業務場景,有多個交互的場景無法模擬。

  • 無法操作地圖HMI,也看不到HMI界面顯示以及過程中的反饋。

  • 無法滾動地圖,後面接了Win32上面的鼠標事件,能用鼠標實現滾動,但這種方式與車機中滾動流程不一致。 

  • PC端無法使用車機中的設備,如導航過程中沒有導航音,無法使用USB等。 

  • PC端拿不到車機中的數據,比如車身數據、GPS信號等。

調試方案優化

針對當前調試手段存在的以上問題。我們對調試方案進行了優化,我們可以藉助車機中系統HMI來與導航進行交互。實現了使用車機環境中的信號對PC端導航業務場景進行調試。主要有以下幾點功能:

1.PC端模擬器接收車機發來的信號

在該項目中,導航的相關業務都是作爲服務端向車機中其他模塊提供服務,在車機系統中,系統HMI連接導航服務的地址是固定的,我們在車機中開發了一個代理--Sandwich,主要作用是啓動導航服務,這個導航服務並不實現真正的導航業務,而是啓動了一個空服務,讓車機中其他模塊能成功建立連接,同時Sandwich作爲客戶端連接PC端模擬器提供的導航服務,PC端的導航服務真正實現導航業務,Sandwich負責接收車機發送過來的業務請求,並將請求轉發給PC端模擬器,這樣PC端模擬器就能接收到車機中的信號,收到的業務請求並做處理再將處理結果通過Thrift反饋到車機端。

這個流程我們打通了車機中信號發送到PC端模擬器,並可以將處理完的數據反饋給車機端。

  

2.PC端模擬器向車機發送信號

導航也需要連接車機中其他模塊提供的服務,如,獲取車身數據、獲取GPS定位信號,將導航語音數據發送到車機語音播放模塊等。

PC端模擬器需要作爲客戶端來連接車機中的服務,真正連接的是車機中Sandwich提供的服務,Sandwich作爲客戶端連接車機中其他模塊的服務,比如Sandwich連接Sound模塊,GPS模塊,CarData模塊等。PC端模擬器需要使用車機設備播放導航音,需要將播放內容發送給Sandwich,Sandwich收到播放內容後,再發送給車機中的Sound模塊,導航音就能播放了。PC端連接車機中其他模塊的工作原理也是一樣。

 

3. 將PC端模擬器中顯示的地圖投射到車機端顯示

實現了以上兩步,一個使用車機信號調試PC端導航程序的環境基本完成了。已經能實現車機信號與PC進行雙向接收,但是此時導航的渲染能力還是停留在PC端,車機中還只是顯示了一個系統HMI界面,無法看到導航地圖展現的效果,這樣就會帶來一個問題,一些需要強依賴地圖的操作可能就無法精準操作,比如點擊地圖上某個POI等。此時需要將PC端的展現同步到車機側。

要實現這一目的,一般我們有兩種方法:

  • 車機與PC同步渲染

車機中的導航正常運行,當導航接收到系統模塊業務請求時,先是車機導航進行處理,處理完畢後將信號轉發到PC端處理,這種方案兩端導航業務邏輯並行運行,複雜的業務場景下,兩端會同時跟車機進行交互,此時可能會產生互斥,會有兩端邏輯不同步的場景,達不到預期效果。

  • 將車機中渲染的數據投射到車機端

在這裏我們可以將PC上程序每渲染一幀地圖則將結果傳到車機端,由車機端Sandwich負責接收,當Sandwich接收到一幀地圖像素數據後,負責將此幀數據渲染到車機屏幕上,此時車機中呈現的效果跟PC端一致。在該項目中我們採用了這一方案,這種方案中,真正的導航業務邏輯是來自PC端,車機中只是一個轉發過程,所以不會存在第一種方案中的問題。

 

但在某些特定的環境下,導航描畫會很頻繁,發送給車機的數據也會很多,頻繁的數據發送可能會帶來一定的性能開銷,表現上可能會出現延遲。這裏可以使用降低圖像質量來減少圖像數據,例如,可以使用16位或者8位BMP來傳輸,還可以壓縮傳輸,這樣1920*720分辨率圖像傳輸大小能控制在30-50k左右。

 

小結

基於車機系統中Thrift通信框架,實現的這套遠程調試方案,實質是在車機中使用Sandwich程序接管車機系統中與導航有交互的全部接口處理,通過RPC通信轉發,實現了使用真實車機信號調試導航的目的。有了這套調試環境,我們甚至可以直接在真車上邊路測邊調試,跟以前的路測拿Log回來分析、重現相比,整個調試過程,簡單,便捷,直觀。大大提高了開發效率。

基於RPC通信的特性,我們還可以對調試方案再進一步優化,可以加入多客戶端調試功能,使用同一臺車機環境,不同的模塊負責人可以同時進行復雜業務場景的聯合調試。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章