跨界 · 融合 · 服務 · 創新
操作系統向下進行硬件資源管理,向上提供任務調度和通信接口。當前Ubuntu(一款Linux發行版)+ROS(Robot Operating System)已經成為機器人運行環境的事實標準,而對于無人機飛控,我們期望操作系統是實時的且高度可剪裁配置、可擴展。主流飛控的嵌入式實時內核依據軟件架構、接口標準兼容性等劃分為兩大類:類Unix如NuttX等,微內核類如FreeRTOS和uCOSii等。其中實時主要是指具備高優先級任務搶占低優先級任務的能力,調度延遲以系統時鐘量級來計。上述兩類操作系統都滿足實時要求,類Unix、微核本質是調度器,由一些線性數據結構實現對任務線程的管理;而ROS本質是多進程Socket通信中間件。
一、類Unix操作系統
PC端Unix操作系統啟動之后呈現出進程樹和文件系統樹,進程樹表達所有進程之間都具有親緣關系,而文件系統樹表達文件系統路徑之間的掛載關系。
NuttX是類Unix嵌入式實時操作系統,因為處理器架構不同,又限于資源壓力,相比于Linux,它對機制實現做了一些簡化。麻雀雖小,五臟俱全,NuttX支持8bit到64bit微處理器環境,支持POSIX/ANSI標準的任務控制、命名管道,計數信號量,信號,互斥量以及文件系統等機制,下面是NuttX架構圖:
NuttX架構圖首先, NuttX支持用戶線程和內核線程,而不具有Linux意義下的進程概念。取而代之的是NuttX線程組,包括一個主任務線程和由主線程創建的pthreads,線程組線程彼此共享資源如環境變量、文件描述符、文件流、sockets等。另外,在NuttX上有task的概念,task是一種特殊的pthread,和pthread資源共享程度相比,task有一定獨立度。對于線程/任務控制,NuttX提供了VxWorks與POSIX風格的API,實現最大程度兼容性。對于內核線程,他們相比于用戶態有內核資源訪問權限。
默認情況下,NuttX按照優先級調度,高優任務在阻塞之前獨占CPU,同優先級任務按下來先調度順序執行,NuttX任務或線程可以通過選項配置round-robin或sporadic方式調度。
除了線程與任務之外,NuttX還有一種任務執行方案,work queue:work queue是一系列需要執行的工作加入到隊列中,由一些線程來消費執行。NuttX支持三種類型work queue,包括高優內核work queue:一般用于處理中斷句柄中的延遲任務,也可用于驅動底層處理工作,因為這些任務通常是高優快速運行的;還有低優內核work queue:低優先級工作隊列更適合于處理面向應用層的工作,比如文件系統清理,內存垃圾回收,異步IO操作等;還有用戶模式work queue:同樣面向應用層,但是訪問內核資源需要系統調用增加開銷,用戶自行結合實際情況選取。
在任務同步、通信,資源互斥保護方面,NuttX支持命名管道,計數信號量,信號,共享內存等。父子關系的線程或任務之間可以用waitpid等同步,非父子關系可以用其他如命名管道等方式做同步,PX4中的uORB就是基于命名管道實現的,命名管道支持POSIX標準文件系統操作,如下介紹:
NuttX符合“一切皆文件”的哲學,接口上對外暴露Open、Close、Read、Write、Ioctl以及Poll。如設備驅動,又如命名管道。NuttX偽根文件系統是全內存的,其他或真實文件系統可以掛載到根下。NuttX設備驅動包括字符設備驅動,如常見串口驅動,模數驅動,PWM驅動,CAN驅動,正交編碼器,定時器驅動,RTC驅動,FOC(Field Oriented Control)控制交流電機驅動等。除了最常見的字符設備驅動之外,還有字符設備驅動,它們以塊為單位讀寫訪問,以及一些特殊設備驅動:SYSLOG,RAM LOG等。PX4中傳感器驅動是對字符設備的進一步開發,放在PX4-Autopilotsrcdrivers路徑中,讀者可以自行查看調用關系。
二、微內核
與類Unix相比,微核的調度、通信等機制都是獨立實現,不遵守接口標準,因此更輕量。相比于裸機編程,使用微內核,業務被模塊化可以使架構更清楚,開發者對調度和通信的實現無需過多關注。微內核代表產品包括FreeRTOS、uCOSii,以及國產RT-thread,我們以FreeRTOS為例介紹一下:
FreeRTOS支持消息隊列,用于任務間通信,本質是一段對各個任務可見的共享內存。也支持二值信號量(或互斥信號量)做資源互斥保護以及多值信號量做同步,他們的本質也是共享內存空間以及有PV語義的接口。
對中斷的響應和處理也是嵌入式編程需要關注的一個特性,在FreeRTOS中,中斷事件可以與常規task進行通信和同步。此外,微核支持臨界區來關閉調度和中斷,臨界區邏輯需要盡可能短小,以保證實時性。
內存管理方面,與NuttX一樣,對于沒有MMU的STM32F4處理器, TCB(Task Control Block)與各自的棧鏈表形式保存在扁平內存中,內存布局可以類比下圖:
微核內存管理示意圖
總地來說,對于類Unix和微核,應該沒有程序運行效率上差別,類Unix操作系統遵守協議標準,對Linux特性熟悉的可以很容易上手開發,同時可以使用KConfig剪裁配置系統功能;微核優勢在于輕量級,系統代碼占用幾K空間,比較受到國內MCU開發者青睞。當然也有裸機編程的,自己開發定時器中斷回調,完成周期任務執行,但是顯然,這樣的開發方式只適用于小規模項目。
三、ROS
ROS(Robot Operating System)從2007年誕生至今已經成為機器人操作系統事實標準,經歷過兩個主要版本ROS1和ROS2。雖然被叫做操作系統,但是ROS本質只是一個中間件,不具備原生調度硬件的能力,更不滿足實時性要求。
下面是ROS發行版與Ubuntu版本匹配情況:
下面簡單介紹一些ROS概念和用法:
包是項目的功能單元和發布單元,工作空間是包開發和運行的路徑范圍。ROS提供catkin基礎包幫助用戶做開發包的構建管理,catkin本質是CMake與一些python腳本實現的,此外,ROS也提供了一些包管理的命令行工具。
包中可以包含一個或多個可運行二進制,稱為節點。運行中的節點彼此存在消息流交互,構成圖,在ROS1中,由master節點提供名稱索引服務與消息通訊,由參數服務器提供系統參數增刪改查服務。節點之間通信采用SOCKET。ROS2干掉了master概念,節點可消息直傳,系統更魯棒。另外,ROS2構建于 Data Distribution Service(DDS)之上,因其支持多種傳輸模式,因此更適合于實時性更好的操作系統。
ROS架構 來源:《Exploring the performance of ROS2》
此外,ROS有著豐富的輔助開發工具,包括可視化工具Rviz,仿真工具gazebo。此外,ROS也有著龐大的開發者基礎,支持的功能包也涵蓋優化,控制,導航,視覺,AI等領域。如果有機會,我們后面會選取SOTA成果,對包做測評。
這篇只是簡單聊聊這兩類操作系統,并沒有事無巨細介紹,因為我還是覺得操作系統實現或開發,實操效果會更好,可以研究研究嵌入式操作系統的調度特性,內存管理,文件系統,以及ROS包開發,功能包評測來加深理解。
以上內容為高博特編輯選取的行業技術,尊重原創,如有侵權請聯系刪除。
—————— 特別關注 ——————
讓科技更好地賦能產業,“尖兵之翼”永不落幕。高博特自2006年發起、策劃、投資、組織,在相關專業機構支持下成功舉辦了最早的無人機主題會展活動——“尖兵之翼中國無人機大會暨展覽會”后持續推動無人機技術交流。高博特創新引領最早在深圳、上海、鄭州等地發起舉辦無人系統會展賽飛活動,有力促進了我國無人系統整體技術進步和產業發展。
20年來,高博特始終堅持讓科技更好地賦能產業的愿景;努力為行業企業搭建產業鏈高端交流平臺,為科技轉化為生產力服務。具體業務范圍涵蓋:信息情報、媒介傳播、會展活動、招商加盟、品牌提升、咨詢服務、產品中心等七大服務體系,長期服務于“軍轉民、民參軍、軍民融合”等國家戰略。
2023年,高博特集買、賣、租、播、展、會、賽、培于一體的新型展廳項目即將啟幕,該展廳旨在從深度對接的層面為各入駐企業一站式解決經營中面臨的各項問題,企業租、賣的產品我們來、企業需要的品牌我們筑、行業頂尖的賽會我們辦、行業急需的培訓我們辦。新的一年,高博特新模式、新服務、新平臺,必將給各一直以來支持我們的朋友帶來全新的體驗。
更期待2023年4月12日至14日,與您相約“尖兵之翼——第十三屆中國無人機大會暨展覽會”,共聚中關村科學城四季科創中心。(詳細內容可點擊“閱讀原文”)