ROS原始碼分析

2021-07-22 12:00:49 字數 1883 閱讀 9383

很久就有寫ros原始碼分析的想法。2023年最初接觸ros,當時中文資料比較少,基本只有一本紅皮的ros介紹,內容大多是對ros官方wiki的翻譯,版本也跟不上ros官方發布的速度。因此開始刷官方wiki教程。官方教程簡單形象,原理與例子結合,至今我仍然認為是入門ros的不二之選。

刷完教程後,出於工作需要(主要在ros實時性方面),開始閱讀ros的核心**。ros的**量並不大,結構也比較清楚,雖然可以用來參考學習的資料完全沒有,並且本人也非計算機專業出身,c++功底並不深,但結合實際使用效果勉強啃得動。當時覺得如果有個參考的資料,講講每個檔案是幹什麼,每個函式是什麼功能,那學習起來就方便多了。但是並沒有。

如今兩年過去了,機械人行業越來越火,ros也逐漸成為機械人軟體平台的事實標準,但依然沒有人對ros的原始碼進行分析。仔細想想,這種狀況也算是正常的,畢竟使用ros的人一般只關注ros帶來的簡單的介面、豐富的調測試工具、多語言多平台的支援以及海量開源**包,而對於ros到底如何實現這些並不關心。同時ros當前的主要受眾還是學術界,更強調新研究、新演算法的快速部署,對排程、通訊的效能並不特別關注。而國外的ros的開發者和維護者本身對ros特別熟悉,沒有必要專門花心思在介紹ros內部的實現機制上。

那麼分析ros的原始碼到底有沒有用呢?如果你是乙個ros的使用者,只是用ros的包進行學術研究和演算法驗證,那麼分析ros原始碼的用處並不大。分析ros原始碼能夠讓你更清楚ros的用法,在出現某些錯誤時能夠更快速的定位問題,但也僅此而已。對於你的目標,分析原始碼帶來的收益與付出的時間是不符的。

不過我相信,在進行ros學習的過程中,總有人有好奇心,想要知道ros到底是如何封裝node的?是如何實現topic的?是如何收發message的?或者有人像我一樣,想知道為什麼ros不能保證訊息傳輸的實時性?在存在大量節點時通訊的瓶頸在哪?

要想知道這些問題,就需要對ros的原始碼進行分析。

從今天開始,希望以後每個工作日都能有更新,把我在閱讀ros原始碼獲得的一些經驗和大家分享。一是對知識的總結和歸納,二是與其他高手交流,最後也希望能夠為剛剛接觸ros的朋友提供一點幫助。

首先,從檔案結構開始。

從groovy版本開始,ros正式引入全新的編譯工具catkin。同時被拋棄的還有「stack」的概念。我接觸ros也是在這個時間點上,因此對之前的ros檔案結構了解的也不是很深。

從引入catkin開始,ros的檔案結構沒有發生大的變化。由於ros核心原始碼也是以同樣的結構組織,因此在此進行一點簡單說明。

對於任何乙個ros package,其檔案結構如下:

src

msg(optional)

srv(optional)

launch(optional)

cmakelist.txtpackage.xml

編譯工具catkin是基於cmake實現的,因此主要的編譯選項在cmakelist.txt中進行配置。cmakelist.txt的語法與cmake完全一致,只不過增加了一些用於catkin和ros的語句。

package.xml是用來指示編譯和執行時所依賴的其它軟體包,同時儲存本軟體包的描述資訊。

在我們編寫ros程式時,必須依賴roscpp和/或rospy兩個**包,這兩個包均在ros_comm元包(meta package)中,github位址

對ros原始碼的分析從roscpp開始,整個**樹結構如下圖:

這裡面,msg目錄下是乙個log訊息檔案,srv目錄下是三個服務檔案,後兩個可以用於在執行時動態改變log列印級別,後面**涉及到時會在詳細說明。大部分**分布在include/ros和src/libros兩個目錄下,這和我們常見的專案**組織形式比較一致。

後面的大部分分析工作主要在這兩個目錄下進行。

ros原始碼編譯各種坑

記錄原始碼安裝東西遇到的各種坑及解決方案。2017.08.14 樂 1 原因 系統缺少bfl包。解決方法 安裝bfl包 sudo apt get install ros bfl kinetic indigo根據實際情況替換 2 tx2 上sudo rosdep init失敗 解決辦法 資料 在一些a...

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

思科VPP原始碼分析(dpo機制原始碼分析)

vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...