遠端除錯在Linux車機中的應用

amap_tech發表於2020-08-28

導讀

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

遠端除錯是真機除錯中最便捷的一種,開發者只需借用在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通訊的特性,我們還可以對除錯方案再進一步優化,可以加入多客戶端除錯功能,使用同一臺車機環境,不同的模組負責人可以同時進行復雜業務場景的聯合除錯。

 

 

相關文章