終於有人把ROS機器人操作系統講明白了


終於有人把ROS機器人操作系統講明白了

導讀:機器人是多專業知識交叉的學科,通常涉及傳感器、驅動程序、多機通信、機械結構、算法等,為了更高效地進行機器人的研究和開發,選擇一個通用的開發框架非常必要,ROS(Robot Operating System,機器人操作系統)就是流行的框架之一。

溫馨提示

本篇文章已經收錄在我最新出版的書籍《機器人SLAM導航核心技術與實戰》,感興趣的讀者可以購買紙質書籍來進行更加深入和系統性的學習,購買鏈接如下:

本文將帶領大家了解和使用ROS,掌握ROS的核心概念,為后續學習打好基礎。

01 ROS簡介
可能很多初學者聽到機器人操作系統,就被“操作系統”幾個字嚇住了。其實簡單點說,ROS就是一個分布式的通信框架,幫助程序進程之間更方便地通信。


一個機器人通常包含多個部件,每個部件都有配套的控制程序,以實現機器人的運動與視聽功能等。那么要協調一個機器人中的這些部件,或者協調由多個機器人組成的機器人集群,怎么辦呢?這時就需要讓分散的部件能夠互相通信,在多機器人集群中,這些分散的部件還分散在不同的機器人上。解決這種分布式通信問題正是ROS的設計初衷。


隨着越來越多的人參與ROS開發及源碼貢獻,社區涌現出大量的第三方工具和實用開源軟件包,使ROS變成現在的樣子。


一個經常讓初學者困惑的地方是,學會了ROS就是學會機器人開發了嗎?當然不是,嚴格意義上講ROS只是一套通信框架而已,機器人中的各種算法和應用程序依然是用C++、Python等常見編程語言進行開發的。


1. ROS的性能特色
在正式學習ROS之前,先介紹ROS的幾個特性,即元操作系統、分布式通信機制、松耦合軟件框架、豐富的開源功能庫等,來幫大家建立一些感性的認識。


ROS是一個機器人領域的元操作系統。也就是說,它並不是真正意義上的操作系統,其底層的任務調度、編譯、設備驅動等還是由它的原生操作系統Ubuntu Linux完成。


ROS實際上是運行在Ubuntu Linux上的亞操作系統,或者說軟件框架,但提供硬件抽象、函數調用、進程管理這些類似操作系統的功能,也提供用於獲取、編譯、跨平台的函數和工具。


ROS的核心思想就是將機器人的軟件功能做成一個個節點,節點之間通過互相發送消息進行溝通。這些節點可以部署在同一台主機上,也可以部署在不同主機上,甚至還可以部署在互聯網上。ROS網絡通信機制中的主節點(master)負責對網絡中各個節點之間的通信過程進行管理調度,同時提供一個用於配置網絡中全局參數的服務。


ROS是松耦合軟件框架,利用分布式通信機制實現節點間的進程通信。ROS的軟件代碼以松耦合方式組織,開發過程靈活,管理維護方便。


ROS具有豐富的開源功能庫。ROS是基於BSD(Berkeley Software Distribution,伯克利軟件發行)協議的開源軟件,允許任何人修改、重用、重發布以及在商業和閉源產品中使用,使用ROS能夠快捷地搭建自己的機器人原型。
2. ROS的發行版本
Linux發行版類似,ROS發行版內置了一系列常用功能包,即將ROS系統打包安裝到原生系統中。ROS最初是基於Ubuntu系統開發的,ROS的發行版本名稱也和Ubuntu采用了同樣的規則,即版本名稱由兩個相同首字母的英文單詞組成,版本首字母按字母表遞增順序選取,圖1-1展示了ROS的一些主要版本。

▲圖1-1 ROS的主要版本
3. ROS的學習方法
要想學好以及用好ROS,需要進行大量的實踐操作。因此在快速了解ROS的核心概念和編程范式后,就要結合大量的實際項目來深入理解ROS。學會用正確的方式解決問題,能幫你更快地提高能力。ROS的學習資源主要有以下幾個。

  • 官網:www.ros.org
  • 源碼:github.com
  • Wikiwiki.ros.org
  • 問答:answers.ros.org

02 ROS系統架構
安裝完ROS后,很多朋友應該迫不及待想立馬開始寫程序。由於ROS的架構比較復雜,為了后面容易理解遇到的各種概念,這里先討論一下ROS的系統架構,好讓大家對ROS中的各種概念有全面性把控。按照官方的說法,可以分別從計算圖文件系統開源社區視角來理解ROS架構。


1. 從計算圖視角理解ROS架構
ROS中可執行程序的基本單位叫節點node),節點之間通過消息機制進行通信,這樣就組成了一張網狀圖,也叫計算圖,如圖1-3所示。

▲圖1-3 ROS的計算圖結構
節點是可執行程序,通常也叫進程。ROS功能包中創建的每個可執行程序在被啟動加載到系統進程中后,就是一個ROS節點,如圖1-3中的節點1、節點2、節點3等。


節點之間通過收發消息進行通信,消息收發機制分為話題topic)、服務service)和動作action)三種,如圖1-3中的節點2與節點3、節點2與節點5采用話題通信,節點2與節點4采用服務通信,節點1與節點2采用動作通信。計算圖中的節點、話題、服務、動作都要有唯一名稱作為標識。


ROS利用節點將代碼和功能解耦,提高了系統的容錯性和可維護性。所以最好讓每個節點都具有特定的單一功能,而不是創建一個包羅萬象的龐大節點。如果用C++編寫節點,需要用到ROS提供的roscpp庫;如果用Python編寫節點,需要用到ROS提供的rospy庫。


消息是構成計算圖的關鍵,包括消息機制和消息類型兩部分。消息機制有話題、服務和動作三種,每種消息機制中傳遞的數據都具有特定的數據類型(即消息類型),消息類型可分為話題消息類型、服務消息類型和動作消息類型。消息機制和消息類型將在1.5節中展開講解。


數據包rosbag)是ROS中專門用來保存和回放話題中數據的文件,可以將一些難以收集的傳感器數據用數據包錄制下來,然后反復回放來進行算法性能調試。


參數服務器能夠為整個ROS網絡中的節點提供便於修改的參數。參數可以認為是節點中可供外部修改的全局變量,有靜態參數和動態參數。靜態參數一般用於在節點啟動時設置節點工作模式;動態參數可以用於在節點運行時動態配置節點或改變節點工作狀態,比如電機控制節點里的PID控制參數。


主節點負責各個節點之間通信過程的調度管理。因此主節點必須要最先啟動,可以通過roscore命令啟動。


2. 從文件系統視角理解ROS架構
ROS程序的不同組件要放在不同的文件夾中,這些文件夾根據不同的功能對文件進行組織,這就是ROS的文件系統結構,如圖1-4所示。


▲圖1-4 ROS的文件系統結構
工作空間是一個包含功能包、編譯包和編譯后可執行文件的文件夾,用戶可以根據自己的需要創建多個工作空間,在每個工作空間中開發不同用途的功能包。在圖1-4中,我們創建了一個名為catkin_ws的工作空間,其中包含src、build和devel三個文件夾。

  • src文件夾放置各個功能包和配置功能包的CMake配置文件CMakeLists.txt。這里說明一下,由於ROS中的源碼采用catkin工具進行編譯,而catkin工具又基於CMake技術,所以我們在src源文件空間和各個功能包中都會見到一個CMake配置文件CMakeLists.txt,這個文件起到配置編譯的作用。
  • build文件夾放置編譯CMakecatkin功能包時產生的緩存、配置、中間文件等。
  • devel文件夾放置編譯好的可執行程序,這些可執行程序是不需要安裝就能直接運行的。一旦功能包源碼編譯和測試通過后,可以將這些編譯好的可執行文件直接導出與其他開發人員分享。


功能包是ROS中軟件組織的基本形式,具有創建ROS程序的最小結構和最少內容,它包含ROS節點源碼、腳本、配置文件等。

  1. CMakeLists.txt是功能包配置文件,用於編譯Cmake功能包編譯時的編譯配置。
  2. package.xml是功能包清單文件,用xml的標簽格式標記該功能包的各類相關信息,比如包的名稱、開發者信息、依賴關系等,主要是為了使功能包的安裝和分發更容易。
  3. include/<pkg_name>是功能包頭文件目錄,可以把功能包程序中包含的*.h頭文件放在這里。include目錄之所以還要加一級路徑<pkg_name>是為了更好地區分自己定義的頭文件和系統標准頭文件,<pkg_name>用實際功能包的名稱替代。不過這個文件夾不是必要項,比如有些程序沒有頭文件。
  4. msgsrvaction這三個文件夾分別用於存放非標准話題消息、服務消息和動作消息的定義文件。ROS支持用戶自定義消息通信過程中使用的消息類型。這些自定義消息不是必要的,比如程序只使用標准消息類型。
  5. scripts目錄存放BashPython等腳本文件,為非必要項。
  6. launch目錄存放節點的啟動文件,*.launch文件用於啟動一個或多個節點,在含有多個節點的大型項目中很有用,為非必要項。
  7. src目錄存放功能包節點所對應的源代碼,一個功能包中可以有多個節點程序來完成不同的功能,每個節點程序都可以單獨運行。這里src目錄存放的是這些節點程序的源代碼,你可以按需創建文件夾和文件來組織源代碼,源代碼可以用C++Python等編寫。


3. 從開源社區視角理解ROS架構
ROS是開源軟件,各個獨立的網絡社區分享和貢獻軟件及教程,形成了強大的ROS開源社區,如圖1-5所示。


▲圖1-5 ROS的開源社區結構
ROS的發展依賴於開源和共享的軟件,這些代碼由不同的機構共享和發布,比如GitHub源碼共享、Ubuntu軟件倉庫發布、第三方庫等。ROS的官方wiki是重要的文檔討論社區,在里面可以很方便地發布與修改相應的文檔頁面。ROS的answer主頁里有大量ROS開發者的提問和回答,對ROS開發中遇到的各種問題的討論很活躍。

參考文獻

[1] 張虎,機器人SLAM導航核心技術與實戰[M]. 機械工業出版社,2022.

 

 

 

前言
編程基礎篇
第1章 ROS入門必備知識
1.1 ROS簡介 2
1.1.1 ROS的性能特色 2
1.1.2 ROS的發行版本 3
1.1.3 ROS的學習方法 3
1.2 ROS開發環境的搭建 3
1.2.1 ROS的安裝 4
1.2.2 ROS文件的組織方式 4
1.2.3 ROS網絡通信配置 5
1.2.4 集成開發工具 5
1.3 ROS系統架構 5
1.3.1 從計算圖視角理解ROS架構 6
1.3.2 從文件系統視角理解ROS架構 7
1.3.3 從開源社區視角理解ROS架構 8
1.4 ROS調試工具 8
1.4.1 命令行工具 9
1.4.2 可視化工具 9
1.5 ROS節點通信 10
1.5.1 話題通信方式 12
1.5.2 服務通信方式 15
1.5.3 動作通信方式 19
1.6 ROS的其他重要概念 25
1.7 ROS 2.0展望 28
1.8 本章小結 28
第2章 C++編程范式
2.1 C++工程的組織結構 29
2.1.1 C++工程的一般組織結構 29
2.1.2 C++工程在機器人中的組織結構 29
2.2 C++代碼的編譯方法 30
2.2.1 使用g++編譯代碼 31
2.2.2 使用make編譯代碼 32
2.2.3 使用CMake編譯代碼 32
2.3 C++編程風格指南 33
2.4 本章小結 34
第3章 OpenCV圖像處理
3.1 認識圖像數據 35
3.1.1 獲取圖像數據 35
3.1.2 訪問圖像數據 36
3.2 圖像濾波 37
3.2.1 線性濾波 37
3.2.2 非線性濾波 38
3.2.3 形態學濾波 39
3.3 圖像變換 40
3.3.1 射影變換 40
3.3.2 霍夫變換 42
3.3.3 邊緣檢測 42
3.3.4 直方圖均衡 43
3.4 圖像特征點提取 44
3.4.1 SIFT特征點 44
3.4.2 SURF特征點 50
3.4.3 ORB特征點 52
3.5 本章小結 54
硬件基礎篇
第4章 機器人傳感器
4.1 慣性測量單元 56
4.1.1 工作原理 56
4.1.2 原始數據采集 60
4.1.3 參數標定 65
4.1.4 數據濾波 73
4.1.5 姿態融合 75
4.2 激光雷達 91
4.2.1 工作原理 92
4.2.2 性能參數 94
4.2.3 數據處理 96
4.3 相機 100
4.3.1 單目相機 101
4.3.2 雙目相機 107
4.3.3 RGB-D相機 109
4.4 帶編碼器的減速電機 111
4.4.1 電機 111
4.4.2 電機驅動電路 112
4.4.3 電機控制主板 113
4.4.4 輪式里程計 117
4.5 本章小結 118
第5章 機器人主機
5.1 X86與ARM主機對比 119
5.2 ARM主機樹莓派3B+ 120
5.2.1 安裝Ubuntu MATE 18.04 120
5.2.2 安裝ROS melodic 122
5.2.3 裝機軟件與系統設置 122
5.3 ARM主機RK3399 127
5.4 ARM主機Jetson-tx2 128
5.5 分布式架構主機 129
5.5.1 ROS網絡通信 130
5.5.2 機器人程序的遠程開發 130
5.6 本章小結 131
第6章 機器人底盤
6.1 底盤運動學模型 132
6.1.1 兩輪差速模型 132
6.1.2 四輪差速模型 136
6.1.3 阿克曼模型 140
6.1.4 全向模型 144
6.1.5 其他模型 148
6.2 底盤性能指標 148
6.2.1 載重能力 148
6.2.2 動力性能 148
6.2.3 控制精度 150
6.2.4 里程計精度 150
6.3 典型機器人底盤搭建 151
6.3.1 底盤運動學模型選擇 152
6.3.2 傳感器選擇 152
6.3.3 主機選擇 153
6.4 本章小結 155
SLAM篇
第7章 SLAM中的數學基礎
7.1 SLAM發展簡史 158
7.1.1 數據關聯、收斂和一致性 160
7.1.2 SLAM的基本理論 161
7.2 SLAM中的概率理論 163
7.2.1 狀態估計問題 164
7.2.2 概率運動模型 166
7.2.3 概率觀測模型 171
7.2.4 概率圖模型 173
7.3 估計理論 182
7.3.1 估計量的性質 182
7.3.2 估計量的構建 183
7.3.3 各估計量對比 190
7.4 基於貝葉斯網絡的狀態估計 193
7.4.1 貝葉斯估計 194
7.4.2 參數化實現 196
7.4.3 非參數化實現 202
7.5 基於因子圖的狀態估計 206
7.5.1 非線性最小二乘估計 206
7.5.2 直接求解方法 206
7.5.3 優化方法 208
7.5.4 各優化方法對比 218
7.5.5 常用優化工具 219
7.6 典型SLAM算法 221
7.7 本章小結 221
第8章 激光SLAM系統
8.1 Gmapping算法 223
8.1.1 原理分析 223
8.1.2 源碼解讀 228
8.1.3 安裝與運行 233
8.2 Cartographer算法 240
8.2.1 原理分析 240
8.2.2 源碼解讀 247
8.2.3 安裝與運行 258
8.3 LOAM算法 266
8.3.1 原理分析 266
8.3.2 源碼解讀 267
8.3.3 安裝與運行 270
8.4 本章小結 270
第9章 視覺SLAM系統
9.1 ORB-SLAM2算法 274
9.1.1 原理分析 274
9.1.2 源碼解讀 310
9.1.3 安裝與運行 319
9.1.4 拓展 327
9.2 LSD-SLAM算法 329
9.2.1 原理分析 329
9.2.2 源碼解讀 334
9.2.3 安裝與運行 337
9.3 SVO算法 338
9.3.1 原理分析 338
9.3.2 源碼解讀 341
9.4 本章小結 341
第10章 其他SLAM系統
10.1 RTABMAP算法 344
10.1.1 原理分析 344
10.1.2 源碼解讀 351
10.1.3 安裝與運行 357
10.2 VINS算法 362
10.2.1 原理分析 364
10.2.2 源碼解讀 373
10.2.3 安裝與運行 376
10.3 機器學習與SLAM 379
10.3.1 機器學習 379
10.3.2 CNN-SLAM算法 411
10.3.3 DeepVO算法 413
10.4 本章小結 414
自主導航篇
第11章 自主導航中的數學基礎
11.1 自主導航 418
11.2 環境感知 420
11.2.1 實時定位 420
11.2.2 環境建模 421
11.2.3 語義理解 422
11.3 路徑規划 422
11.3.1 常見的路徑規划算法 423
11.3.2 帶約束的路徑規划算法 430
11.3.3 覆蓋的路徑規划算法 434
11.4 運動控制 435
11.4.1 基於PID的運動控制 437
11.4.2 基於MPC的運動控制 438
11.4.3 基於強化學習的運動控制 441
11.5 強化學習與自主導航 442
11.5.1 強化學習 443
11.5.2 基於強化學習的自主導航 465
11.6 本章小結 467
第12章 典型自主導航系統
12.1 ros-navigation導航系統 470
12.1.1 原理分析 470
12.1.2 源碼解讀 475
12.1.3 安裝與運行 479
12.1.4 路徑規划改進 492
12.1.5 環境探索 496
12.2 riskrrt導航系統 498
12.3 autoware導航系統 499
12.4 導航系統面臨的一些挑戰 500
12.5 本章小結 500
第13章 機器人SLAM導航綜合實戰
13.1 運行機器人上的傳感器 502
13.1.1 運行底盤的ROS驅動 503
13.1.2 運行激光雷達的ROS驅動 503
13.1.3 運行IMU的ROS驅動 504
13.1.4 運行相機的ROS驅動 504
13.1.5 運行底盤的urdf模型 505
13.1.6 傳感器一鍵啟動 506
13.2 運行SLAM建圖功能 506
13.2.1 運行激光SLAM建圖功能 507
13.2.2 運行視覺SLAM建圖功能 508
13.2.3 運行激光與視覺聯合建圖功能 508
13.3 運行自主導航 509
13.4 基於自主導航的應用 510
13.5 本章小結 511
附錄A Linux與SLAM性能優化的探討
附錄B 習題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM