ros是linux發(fā)行版本。ROS全稱Robot Operating System,譯為機器人操作系統(tǒng);它基于Linux內(nèi)核,只能在Linux下運行。ROS提供一些標(biāo)準(zhǔn)操作系統(tǒng)服務(wù),例如硬件抽象,底層設(shè)備控制,常用功能實現(xiàn),進(jìn)程間消息以及數(shù)據(jù)包管理。ROS可以分成兩層,低層是上面描述的操作系統(tǒng)層,高層則是廣大用戶群貢獻(xiàn)的實現(xiàn)不同功能的各種軟件包,例如定位繪圖、行動規(guī)劃、感知等。
本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。
ROS定義介紹
ROS全稱Robot Operating System,譯為機器人操作系統(tǒng)。基于Linux內(nèi)核,目前只能在Linux下運行。
ROS設(shè)計者將ROS表述為“ROS = Plumbing + Tools + Capabilities + Ecosystem”,即ROS是通訊機制、工具軟件包、機器人高層技能以及機器人生態(tài)系統(tǒng)的集合體。
顧名思義,ROS是一個系統(tǒng)。它和我們用的普通操作系統(tǒng)類似,ROS將底層的機器人硬件封裝起來,也就是說,不同的機器人中包含的各種底層參數(shù),在使用ROS進(jìn)行開發(fā)的人員眼里,都是一樣的。這里還要提一下,目前ROS沒有一個可視化界面。我們所用的windows、Linux能直接看到圖像界面并操作,是因為它們有一個可視化界面,而ROS沒有。我們所謂的操作系統(tǒng),并不一定是都要有可視化界面才算的,如果有興趣的可以去看一下最早期的操作系統(tǒng),只有命令行,并沒有絢麗多彩的界面。
ROS提供一些標(biāo)準(zhǔn)操作系統(tǒng)服務(wù),例如硬件抽象,底層設(shè)備控制,常用功能實現(xiàn),進(jìn)程間消息以及數(shù)據(jù)包管理。ROS是基于一種圖狀架構(gòu),從而不同節(jié)點的進(jìn)程能接受,發(fā)布,聚合各種信息(例如傳感,控制,狀態(tài),規(guī)劃等等)。
ROS可以分成兩層,低層是上面描述的操作系統(tǒng)層,高層則是廣大用戶群貢獻(xiàn)的實現(xiàn)不同功能的各種軟件包,例如定位繪圖,行動規(guī)劃,感知,模擬等等。
ROS是一個多義詞,它還可以是一種通訊機制。在ROS開發(fā)中,用節(jié)點(Node)表示應(yīng)用程序,一個節(jié)點就是一個可執(zhí)行程序。節(jié)點之間就是通過ROS進(jìn)行通信。ROS通過節(jié)點管理器(Master)對各個節(jié)點進(jìn)行管理。至于具體的原理實現(xiàn)等后續(xù)再說。
此外,ROS還代表一系列用于機器人開發(fā)的工具包、算法、技能、平臺、生態(tài)等。
ROS的歷史。說白了,ROS就是一幫大佬在開發(fā)機器人的時候覺得比較好的東西(可以是一些好用的庫、軟件,也可以是一些思想、協(xié)議、標(biāo)準(zhǔn))匯集在一起后形成的東西。在機器人的開發(fā)中,各種各樣的機器人沒有統(tǒng)一的標(biāo)準(zhǔn),每次開發(fā)一個自己沒見過的機器人都需要重新去學(xué)習(xí)大量的東西,十分的不方便,于是,大佬們借鑒操作系統(tǒng)產(chǎn)生的思想,覺得為什么不可以給機器人也做一套系統(tǒng)來對底層進(jìn)行封裝呢?于是,ROS產(chǎn)生了。經(jīng)過歲月的打磨,ROS越來越完善,用的人也越來越多了。
如果你要問我ROS是干什么的,那你只需要知道一句話就夠了。ROS是用來做機器人或者機器臂開發(fā)的。
機器人開發(fā)的歷史中,標(biāo)準(zhǔn)化的工作還是沒有做到位。不同的機器人,所用的系統(tǒng)、程序等等都不一樣,這樣導(dǎo)致只要跨平臺,開發(fā)起來就十分的困難。為了解決這樣的問題,ROS誕生了。ROS可以通過封裝,使得底層硬件對于開發(fā)者來說變得透明,大大降低了跨平臺開發(fā)的難度。
之所以選擇ROS,上面說了那么多其實大家也應(yīng)該明白了,無非就是,用的人多,普及范圍廣。ROS所包含的領(lǐng)域、資料、功能、內(nèi)容、知識等十分豐富,不用它你想去自己編庫么?
1. ROS的性能特色
在正式學(xué)習(xí)ROS之前,先介紹ROS的幾個特性,即元操作系統(tǒng)、分布式通信機制、松耦合軟件框架、豐富的開源功能庫等,來幫大家建立一些感性的認(rèn)識。
ROS是一個機器人領(lǐng)域的元操作系統(tǒng)。也就是說,它并不是真正意義上的操作系統(tǒng),其底層的任務(wù)調(diào)度、編譯、設(shè)備驅(qū)動等還是由它的原生操作系統(tǒng)ubuntu Linux完成。
ROS實際上是運行在Ubuntu Linux上的亞操作系統(tǒng),或者說軟件框架,但提供硬件抽象、函數(shù)調(diào)用、進(jìn)程管理這些類似操作系統(tǒng)的功能,也提供用于獲取、編譯、跨平臺的函數(shù)和工具。
ROS的核心思想就是將機器人的軟件功能做成一個個節(jié)點,節(jié)點之間通過互相發(fā)送消息進(jìn)行溝通。這些節(jié)點可以部署在同一臺主機上,也可以部署在不同主機上,甚至還可以部署在互聯(lián)網(wǎng)上。ROS網(wǎng)絡(luò)通信機制中的主節(jié)點(master)負(fù)責(zé)對網(wǎng)絡(luò)中各個節(jié)點之間的通信過程進(jìn)行管理調(diào)度,同時提供一個用于配置網(wǎng)絡(luò)中全局參數(shù)的服務(wù)。
ROS是松耦合軟件框架,利用分布式通信機制實現(xiàn)節(jié)點間的進(jìn)程通信。ROS的軟件代碼以松耦合方式組織,開發(fā)過程靈活,管理維護(hù)方便。
ROS具有豐富的開源功能庫。ROS是基于BSD(Berkeley Software Distribution,伯克利軟件發(fā)行)協(xié)議的開源軟件,允許任何人修改、重用、重發(fā)布以及在商業(yè)和閉源產(chǎn)品中使用,使用ROS能夠快捷地搭建自己的機器人原型。
2. ROS的發(fā)行版本
與Linux發(fā)行版類似,ROS發(fā)行版內(nèi)置了一系列常用功能包,即將ROS系統(tǒng)打包安裝到原生系統(tǒng)中。ROS最初是基于Ubuntu系統(tǒng)開發(fā)的,ROS的發(fā)行版本名稱也和Ubuntu采用了同樣的規(guī)則,即版本名稱由兩個相同首字母的英文單詞組成,版本首字母按字母表遞增順序選取,圖1-1展示了ROS的一些主要版本。

ROS系統(tǒng)架構(gòu)
安裝完ROS后,很多朋友應(yīng)該迫不及待想立馬開始寫程序。由于ROS的架構(gòu)比較復(fù)雜,為了后面容易理解遇到的各種概念,這里先討論一下ROS的系統(tǒng)架構(gòu),好讓大家對ROS中的各種概念有全面性把控。按照官方的說法,可以分別從計算圖、文件系統(tǒng)和開源社區(qū)視角來理解ROS架構(gòu)。
1. 從計算圖視角理解ROS架構(gòu)
ROS中可執(zhí)行程序的基本單位叫節(jié)點(node),節(jié)點之間通過消息機制進(jìn)行通信,這樣就組成了一張網(wǎng)狀圖,也叫計算圖,如圖1-3所示。

節(jié)點是可執(zhí)行程序,通常也叫進(jìn)程。ROS功能包中創(chuàng)建的每個可執(zhí)行程序在被啟動加載到系統(tǒng)進(jìn)程中后,就是一個ROS節(jié)點,如圖1-3中的節(jié)點1、節(jié)點2、節(jié)點3等。
節(jié)點之間通過收發(fā)消息進(jìn)行通信,消息收發(fā)機制分為話題(topic)、服務(wù)(service)和動作(action)三種,如圖1-3中的節(jié)點2與節(jié)點3、節(jié)點2與節(jié)點5采用話題通信,節(jié)點2與節(jié)點4采用服務(wù)通信,節(jié)點1與節(jié)點2采用動作通信。計算圖中的節(jié)點、話題、服務(wù)、動作都要有唯一名稱作為標(biāo)識。
ROS利用節(jié)點將代碼和功能解耦,提高了系統(tǒng)的容錯性和可維護(hù)性。所以最好讓每個節(jié)點都具有特定的單一功能,而不是創(chuàng)建一個包羅萬象的龐大節(jié)點。如果用C++編寫節(jié)點,需要用到ROS提供的roscpp庫;如果用python編寫節(jié)點,需要用到ROS提供的rospy庫。
消息是構(gòu)成計算圖的關(guān)鍵,包括消息機制和消息類型兩部分。消息機制有話題、服務(wù)和動作三種,每種消息機制中傳遞的數(shù)據(jù)都具有特定的數(shù)據(jù)類型(即消息類型),消息類型可分為話題消息類型、服務(wù)消息類型和動作消息類型。消息機制和消息類型將在1.5節(jié)中展開講解。
數(shù)據(jù)包(rosbag)是ROS中專門用來保存和回放話題中數(shù)據(jù)的文件,可以將一些難以收集的傳感器數(shù)據(jù)用數(shù)據(jù)包錄制下來,然后反復(fù)回放來進(jìn)行算法性能調(diào)試。
參數(shù)服務(wù)器能夠為整個ROS網(wǎng)絡(luò)中的節(jié)點提供便于修改的參數(shù)。參數(shù)可以認(rèn)為是節(jié)點中可供外部修改的全局變量,有靜態(tài)參數(shù)和動態(tài)參數(shù)。靜態(tài)參數(shù)一般用于在節(jié)點啟動時設(shè)置節(jié)點工作模式;動態(tài)參數(shù)可以用于在節(jié)點運行時動態(tài)配置節(jié)點或改變節(jié)點工作狀態(tài),比如電機控制節(jié)點里的PID控制參數(shù)。
主節(jié)點負(fù)責(zé)各個節(jié)點之間通信過程的調(diào)度管理。因此主節(jié)點必須要最先啟動,可以通過roscore命令啟動。
2. 從文件系統(tǒng)視角理解ROS架構(gòu)
ROS程序的不同組件要放在不同的文件夾中,這些文件夾根據(jù)不同的功能對文件進(jìn)行組織,這就是ROS的文件系統(tǒng)結(jié)構(gòu),如圖1-4所示。

工作空間是一個包含功能包、編譯包和編譯后可執(zhí)行文件的文件夾,用戶可以根據(jù)自己的需要創(chuàng)建多個工作空間,在每個工作空間中開發(fā)不同用途的功能包。在圖1-4中,我們創(chuàng)建了一個名為catkin_ws的工作空間,其中包含src、build和devel三個文件夾。
- src文件夾放置各個功能包和配置功能包的CMake配置文件CMakeLists.txt。這里說明一下,由于ROS中的源碼采用catkin工具進(jìn)行編譯,而catkin工具又基于CMake技術(shù),所以我們在src源文件空間和各個功能包中都會見到一個CMake配置文件CMakeLists.txt,這個文件起到配置編譯的作用。
- build文件夾放置編譯CMake和catkin功能包時產(chǎn)生的緩存、配置、中間文件等。
- devel文件夾放置編譯好的可執(zhí)行程序,這些可執(zhí)行程序是不需要安裝就能直接運行的。一旦功能包源碼編譯和測試通過后,可以將這些編譯好的可執(zhí)行文件直接導(dǎo)出與其他開發(fā)人員分享。
功能包是ROS中軟件組織的基本形式,具有創(chuàng)建ROS程序的最小結(jié)構(gòu)和最少內(nèi)容,它包含ROS節(jié)點源碼、腳本、配置文件等。
i. CMakeLists.txt是功能包配置文件,用于編譯Cmake功能包編譯時的編譯配置。
ii. package.xml是功能包清單文件,用xml的標(biāo)簽格式標(biāo)記該功能包的各類相關(guān)信息,比如包的名稱、開發(fā)者信息、依賴關(guān)系等,主要是為了使功能包的安裝和分發(fā)更容易。
iii. include/
iv. msg、srv和action這三個文件夾分別用于存放非標(biāo)準(zhǔn)話題消息、服務(wù)消息和動作消息的定義文件。ROS支持用戶自定義消息通信過程中使用的消息類型。這些自定義消息不是必要的,比如程序只使用標(biāo)準(zhǔn)消息類型。
v. scripts目錄存放bash、Python等腳本文件,為非必要項。
vi. launch目錄存放節(jié)點的啟動文件,*.launch文件用于啟動一個或多個節(jié)點,在含有多個節(jié)點的大型項目中很有用,為非必要項。
vii. src目錄存放功能包節(jié)點所對應(yīng)的源代碼,一個功能包中可以有多個節(jié)點程序來完成不同的功能,每個節(jié)點程序都可以單獨運行。這里src目錄存放的是這些節(jié)點程序的源代碼,你可以按需創(chuàng)建文件夾和文件來組織源代碼,源代碼可以用C++、Python等編寫。
3. 從開源社區(qū)視角理解ROS架構(gòu)
ROS是開源軟件,各個獨立的網(wǎng)絡(luò)社區(qū)分享和貢獻(xiàn)軟件及教程,形成了強大的ROS開源社區(qū),如圖1-5所示。

ROS的發(fā)展依賴于開源和共享的軟件,這些代碼由不同的機構(gòu)共享和發(fā)布,比如github源碼共享、Ubuntu軟件倉庫發(fā)布、第三方庫等。ROS的官方wiki是重要的文檔討論社區(qū),在里面可以很方便地發(fā)布與修改相應(yīng)的文檔頁面。ROS的answer主頁里有大量ROS開發(fā)者的提問和回答,對ROS開發(fā)中遇到的各種問題的討論很活躍。
相關(guān)推薦:《Linux視頻教程》