ROS簡介

ROS的全名是Robot Operating System,即機器人操作系統。雖然名字裏有個“操作系統”,但它並不是獨立的操作系統,而要依賴於宿主系統之上。這個宿主系統通常是Ubuntu,因爲它在Ubuntu有現成的軟件倉庫,但是事實上只要是Linux/Unix都可以從源代碼編譯安裝。

因此,ROS其實是運行在PC上的一套便於機器人開發的機制,它通常用作上位機(例如用於Parrot AR.Drone四軸飛行器時),也可以搭載在機器人上作爲主控(例如Turtlebot機器人使用了搭載ROS的筆記本電腦作爲主控)。

由於優秀的中文資料本來就少,何況ROS一直在迭代,有的情況變化很大,因此,還是強烈建議通過ROS官方網站的英文文檔來學習ROS。相關學習資料和操作步驟附在文末。本文目的只是爲入門提供一點知識儲備。斜體內容可安全跳過,回頭再看也不遲。

ROS運行機制

ROS內核

ROS內核(roscore)是ROS運行的基礎,它裏面有參數服務器(parameter server)。一個運行中的ROS有且僅有一個ROS內核,ROS上的一切都依賴於這個內核。

ROS底層的通信是通過HTTP完成的,因此ROS內核本質上是一個HTTP服務器,它的地址一般是http://localhost:11311/ ,即本機的11311端口。當需要連接到另一臺計算機上運行的ROS時,只要連上該機的11311端口即可。

節點

節點(node)是ROS運行的基本單位,每個節點通常執行整個系統的一小部分功能,比如發送機器人位姿信息、發送控制信息、執行一定的計算任務等。

一個機器人的運行,依賴於節點彼此之間的協作。因此,有人說ROS是分佈式的。

節點之間的通信,依靠消息(message)和服務(service)。

消息

通常,ROS系統中有若干主題(topic)。每個節點可以對主題進行訂閱(subscribe)操作,也可以對主題進行發佈(publish)操作。節點可以向某個主題發佈消息,然後訂閱了該主題的節點就會自動收到消息。

消息是有類型的。一類消息可以由一些基本數據結構組成。例如,表示姿態的Pose類型消息,就由6個64位浮點數組成,分別代表三維空間中姿態的六個參數。消息類型的定義寫在msg文件裏,格式很簡單,十分類似C語言中變量的定義。具體請參考官方文檔。

服務

服務是節點之間除消息以外的另一種通信方式。每個節點都可以創建服務。其它節點可以向該服務發出一個請求(request),負責這個服務的節點就要相應地返回一個應答(response)。

消息與服務的不同之處,在於服務必須是一對一的,一問一答,可靠性很高。消息則可以多對多,相比之下更公共。至於完成某項通信究竟用誰更好,還要結合具體情況來看。

服務也和消息一樣,是有類型的。服務類型的定義寫在srv文件裏,格式與表示消息類型的msg文件類似,只不過要分別描述請求的類型和應答的類型。具體請參考官方文檔。

數據和文件結構

以下這些東西是ROS在你硬盤上的樣子。這裏用catkin工作空間來講解。

包集

ROS的那些包集(package)裏包含了ROS運行所需要的資源,比如程序、消息和服務的類型定義等。

一個包集裏包含一個package.xml文件,這個文件描述了這個包集的基本信息。如果是源碼包,通常還有個CMakeLists.txt文件,這個文件提供編譯和安裝包集時需要的信息,比如有哪些文件需要編譯、程序要調用哪些庫等。

包集編譯時,所有的消息類型、服務類型的C++和Python庫都會重新生成,C++代碼會重新編譯,其它一些在CMakeLists.txt規定的任務都會執行。

當你在包集裏新建一個C++文件時,請記得修改CMakeLists.txt;當你在包集裏新建一個msg文件時,請記得修改CMakeLists.txt;當你在包集裏新建一個srv文件時,請記得修改CMakeLists.txt;當你在包集裏新建一個Python文件時,不必修改CMakeLists.txt。詳見官方文檔。

程序

ROS支持用C++和Python來寫程序,相關的包集叫做roscpp 和rospy。當修改C++文件時,要編譯整個包集;Python則不必。

ROS裏運行的節點都是由程序創建的。一個包集裏可以有很多個程序,但它們未必都包含節點,也有可能是其它工具,例如某個文件格式轉換的工具。

消息類型與服務類型

這些就是之前提到的msg文件和srv文件。包集每次編譯時,會生成它們對應的C++頭文件和Python模塊,編程時可方便地調用它們。

launch文件

當需要有很多節點同時啓動時,一個個啓動它們會比較累,這時如果寫一個launch文件把這些節點都包括進去,那麼只要啓動一個launch文件,就相當於把這些節點都啓動了。

(bag)是ROS用來記錄運行期間消息的格式。記錄完以後,隨時可以重放這些消息。我們可以用它來記錄機器人運行時傳感器的數據,留待運行結束以後分析。

ROS常用包集

這些不是ROS所必需的,但在實際中會經常用到。

TF

提供基本的位姿在不同座標系中變換功能,例如某個點相對於各關節的座標等,真的非常基本。

Actionlib

控制機器人時,消息和服務不能滿足要求,還要有一種新的通信方式——動作(action)。動作類似於服務,但是節點在向服務發出請求後,會在接下來一段時間內獲得一系列反饋信息,直到動作完成纔會收到應答。

std_msgs和common_msgs

這裏的std_msgs定義了一系列基本的消息類型,如字符串等;而common_msgs定義了一系列常用消息類型,例如姿態、傳感器數據等。

URDF機器人模型

ROS裏的機器人模型通常用URDF來描述。URDF包集會自動解析URDF文件,並轉爲程序可讀的格式,供ROS其它節點使用。URDF是在ROS中描述一個機器人最方便的方式。

Rviz

ROS三維仿真工具,除了機器人本身,ROS的很多東西都可以在這裏仿真,例如TF、點雲等。

RQT

這是ROS很多圖形界面的一個集合,它們會輸出各種用於調試、診斷的信息。例如將傳感器數據畫到座標裏(rqt_plot)、繪製所有節點與消息的關係圖(rqt_graph)等,共計不少於10種。

Moveit!

ROS最著名的用於運動規劃(motion planning)的庫。它可以爲機器人的動作生成路徑。

與各種庫相連接的橋

很多常用的庫,如果要連接到ROS裏,可以使用(bridge)。像OpenCV這樣的常用庫,它的橋已經有人開發好了,可以直接安裝到ROS。

當然也可以挑戰一下自己寫一個橋。

如何學習?

Nootrix發佈有安裝了ROS的Ubuntu虛擬機。如果你沒有Linux系統的話,可以裝個VirtualBox虛擬機跑。

ROS版本還是最新的Indigo Igloo爲宜。上一個版本Hydro的教程也可以使用,但是代碼未必通用。

再次強調一遍,要想學好ROS,請務必參照官方英文文檔

入門可以從文檔的Tutorial部分開始,一點一點照着tutorial來,學完基本的以後再把常用包集的tutorial也刷一遍,這樣差不多就會了。

對於特定的包集,最好的辦法是找到它在ROS的網頁,上面一般會有文檔或鏈接。

遇到問題的話,請仔細查看相關庫的文檔,如無結果可用搜索引擎搜一搜自己遇到的問題,還是不行的話,可以到官方的問答站搜索問題或提問。

不過真要學好的話,最好還是用它來做一個機器人項目吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章