2009年一篇發表在ICRA開源軟件Workshop上的文章ROS: an open-source Robot Operating System( 譯文),讓ROS走入了廣大研究人員的視野。發展到今天的2019年,已經有了十年左右的歷史, ROS系統已經在越來越多的機器人系統中得到了成功的應用。雖然ROS系統目前還存在着各種各樣的問題,但在國內的機器人玩家中已經有了逐漸普及的趨勢。 本系列文章就是要管窺ROS一二。
我從2015年畢業開始接觸ROS,如果以一句話來概括它,我認為它是一個"進程間的通信框架"。借助訂閱者模式和服務器模式,用戶可以方便的開發自己的機器人應用。ROS還提供了豐富的工具, 可以方便的管理代碼,編譯執行,使得我們可以通過一堆腳本把各個相對獨立的部分整合起來,構建一個復雜的機器人系統。由於ROS是運行在Linux內核上的應用框架,對系統資源的要求較高, 而且實時性較差。此外,ROS的設計初衷是為了機器人研究人員提供一個松耦合的開發框架,在安全性方面欠缺考慮。但是,因為ROS的開放,使得它在學者和工程師中間得以流行。
網絡上已經有很多ROS的教程了,有官方的、有原創的、也有翻譯的,參差不齊。寫本系列文章並不想讓讀者有一種"又是一個ROS教程"的感覺,我還是希望能夠有一些干貨在里面的。 本系列的文章是我個人對官方教程以及相關源碼的解讀,算是我的入門筆記。內容安排如下:
- 第一部分:ROS入門。這一部分是對官方Wiki上入門教程的整理,目的是快速了解ROS能做什么,如何使用ROS系統。
- 第二部分:ROS進階。本部分進一步介紹ROS中的一些高級概念,包括如何實現一個插件系統,機器人的坐標系框架tf。
- 第三部分:機器人模型與可視化。主要是介紹ROS中用於描述機器人模型的URDF語言。
- 第四部分:Gazebo與仿真。介紹ROS系統中的一個常用的仿真系統Gazebo。
- 第五部分:Turtlebot與機器人系統。以開放平台Turtlebot的仿真過程和相關源碼分析,對上述四個部分中的內容做個總結,了解如何構建一個復雜的機器人系統。
從2017年的10月份開始斷斷續續的寫本系列的文章,到2019年1月2日完成初稿。ROS系統已經從第10版的Kinetic Kame發布到了第12版的Melodic Morenia。本打算把SLAM、導航等技術相關的包也放在這里介紹的, 但在寫第五部分的過程中發現這些內容還挺多的,而且所使用的技術未必一定在ROS系統框架下。而且將它們放在這里有點違背本系列文章作為ROS系統入門材料的初衷,所以最后決定將它們獨立出去, 只保留第五部分作為一個簡單的總結和鋪墊。
第一部分:ROS入門
按照一般寫書和文章的套路,會先寫一個介紹ROS系統的概述部分,但我們還是把這個ROS入門部分放在了最前面。主要是想讓讀者先體會一下ROS系統, 個人覺得這比上來就講ROS中的各種概念要有趣一點點。
本部分是為了快速了解ROS主要功能特性而編寫的,相關內容主要是對官方Wiki的翻譯,根據我個人的理解, 對其內容進行了一些重新的組織。暫時刪去了官方入門文章中關於ROS文件系統、roslaunch、以及數據記錄和回放的部分。
ROS的安裝和初體驗 | 目前最新版本是Lunar Loggerhead,它是官方發布的第11個版本。但是這里我們主要以第10版Kinetic Kame為例介紹各種ROS系統相關的內容。之所以選它, 是因為Kinetic是目前最新的長期維護版本(LTS),官方說法是將一直持續到2021年。 |
創建和編譯Package | Package是ROS系統中對軟件的基本組織單位,我們可以把它看做是一個可以完成某項功能的模塊。每個Package都有一個自己的目錄, 在其目錄下都一個package.xml文件描述Package的作者信息以依賴關系,和一個CMakeLists.txt記錄了Package的各種編譯和構建規則。 ROS為我們提供了catkin_create_pkg工具,可以方便快捷的創建一個Package。當然,不嫌麻煩的話我們也可以自己從頭擼一個出來。 |
ROS的Graph和Node | ROS把系統中運行的進程以及相互之間的通信關系抽象成了圖(Graph)。Node實際上就是一個獨立運行的進程,相互之間主要有Topic和Service兩種通信方式。 |
簡單的Topic發布者和訂閱者 | 我們一般都是用c++或者python作為ROS系統程序的開發語言。roscpp和rospy是兩種語言的API,通過它們我們可以請求一些ROS系統的資源和方法。 其實本文可以和下面關於msg文件的文章寫在一起的,但為了強調整個編譯和運行過程,我們還是專門寫了一節。 |
創建msg文件 | msg文件是ROS系統中Topic通信機制的基礎,通過msg文件我們自定義各種類型的消息。Topic則是一種訂閱者模式下的通信機制,由發布者發布某一Topic的消息, 訂閱者只要訂閱了該消息,就可以接受發布者廣播出來的數據。而消息的具體數據格式則是由msg文件進行描述的。 |
簡單的Service服務器和客戶端 | Service是ROS系統中Node之間的另一種主要的通信方式。它也需要一個文件來描述提供服務的接口的輸入和輸出數據,這個文件就是srv文件。 本文的例程實現了一個計算兩個數的和的服務器。 |
第二部分:ROS進階
在本部分中,我們介紹一些ROS的高級概念。其中關於插件系統和Nodelet的介紹主要是提高系統的可擴展性以及運行效率。坐標系是機器人系統中的一個核心概念, 它描述了機器人的各個部件以及與世界環境的相對關系,ROS系統提供了tf框架來解決復雜的坐標變換的問題。
Action | ROS提供了兩種基本的節點之間通信方式:發布和訂閱主題、 請求服務,它們各有優缺點。有時我們還希望能夠兼具兩種機制的特征,ROS就提供了Action機制。 本質上它仍然是一種Topic機制,只是通過actionlib進行了封裝。在服務器和客戶端之間通過goal, cancel, status, feedback, result五個主題實現Action機制。 |
錄包與回放 | ros bag |
ROS插件系統pluginlib | pluginlib為ROS應用程序提供了插件系統,使得我們可以在應用程序中針對一個基類也就是插件的接口編程。借助pluginlib我們可以動態的加載C++類型,提高了應用程序的可擴展性。 尤其對機器人中各種可以相互替換的傳感器執行器的建模和驅動實現有很大的幫助。 |
Nodelet | 為了提高需要傳輸圖像等數據量較大的消息時的系統效率,ROS提供了一種Nodelet的機制。該機制借助roscpp的優化特點,將多個模塊運行在一台機器上的一個節點中, 實現共享指針傳輸達到零內存拷貝的目的,從而提高了系統效率。 |
tf:坐標變換庫 | 這是一篇2013年發表在TePRA上介紹tf庫的文章。全面介紹了tf庫的功能和設計思想。雖然目前ROS推薦使用tf2了, 但作為tf庫設計的早期文章,我們可以了解到tf最初的設計需求和設計理念。 原文下載 |
簡單的tf廣播者和監聽者 | 機器人往往涉及到多個坐標系,如何方便高效的管理這些坐標系是關系到機器人系統能夠正常運行的關鍵問題。ROS提供了tf的工具來管理多個坐標系之間的變換關系。 |
第三部分:機器人模型與可視化
我們在做機器人控制的時候,很多時候就只有一個模型。控制實際機器人的時候,我們需要模型的各個參數來實時解算機器人的狀態; 在做機器人仿真的時候,我們不僅要計算機器人的狀態,還要能夠直觀的把機器人的形體展示出來。
本部分中,我們討論ROS中用來描述機器人模型的URDF(Unified Robot Discription Format),這是一個基於XML標記語言的描述方式。 它用link和joint標簽來描述機器人的各個布局以及它們之間的連接關系,整個機器人被表示稱為了一棵樹的形式。
URDF和機器人模型(一) | 本文介紹如何使用URDF描述一個機器人,並通過工具rviz來查看機器人的模型。 URDF不僅提供了球、圓柱、長方體等基本的形狀外,還可以加載mesh文件來展示復雜的3D模型。 |
URDF和機器人模型(二) | 機器人模型除了用於直觀的圖形顯示之外,還需要描述各個部分的質量,連接部分的摩擦、阻尼等等物理特性。此外我們還需要描述機器人的碰撞模型, 在控制實際機器人時用於判定其一個特定的姿態是否成立,在做仿真的時候用於計算各種接觸力。 |
URDF解析器 | 前兩節中,我們介紹了如何使用URDF來描述機器人的模型。但要在程序中使用模型,我們還需要能夠從描述文件中解析出機器人的各種參數。 本文中,我們介紹如何在程序中訪問機器人模型,用於實際的機器人控制當中。 |
在rviz中自由的摩擦 | 在前面幾節的文章中,我們用的都是官方教程'urdf_tutorial'中的'display.launch'文件啟動rviz並渲染機器人的。 在本文中,我們將詳細分析這個launch文件都開啟了什么node,它們都完成了什么功能。然后編寫一些C++的程序和launch文件替換掉官方教程。 |
Xacro | 大多數情況下,機器人的各個Link和Joint之間只是存在一些細微的差異。如果我們為每一個部件和關節都寫一個描述就會顯得很繁瑣,而且容易出錯。 Xacro為我們提供了三種工具可以一定程度上簡化urdf文件。這三種工具是:定義變量、數學表達式、可帶參數的宏定義。 |
第四部分:Gazebo與仿真
Gazebo最早是在2002年,由南加州大學的Andrew Howard和他的學生NateKoenig開發的。在接下來的幾年中Nate在完成他的PhD學位的同時開發着Gazebo。 在2009年,Willow公司的一個高級研究工程師JohnHsu,把ROS和PR2與Gazebo整合在一起。自此Gazebo就成為了ROS社區中的一個基本工具。 在2011年的春天,Willow Garage公司開始為Gazebo的開發提供商業支持。在2012年,開源機器人聯盟(Open Source Robotics Foundation, OSRF)從Willow Garage公司脫離出來,同時接管了Gazebo項目。
Gazebo是一個3D動力學仿真器,能夠准確的高效的模擬工作在復雜室內和室外環境的機器人。與游戲引擎類似,Gazebo提供了更真實的物理仿真, 一系列的傳感器,以及用戶和程序接口。 本部分的文章主要是對Gazebo官方教程中的Beginner和Intermediate部分的翻譯和整理, 旨在介紹Gazebo的各種特性,和基本的使用方法。
用Gazebo的GUI創建機器人 | 在本文中,我們將利用Gazebo的GUI工具,模型編輯器,來創建一個簡單的機器人。它是一個輪式的小車,有一個傳感器可以探測前方事物並跟隨它移動。 GUI工具能幫助我們實現一些簡單的模型,對於復雜的機器人使用SDF文件來描述更為方便。本文的主要目的是介紹Gazebo的GUI界面, 所以還是從模型編輯器開始我們的Gazebo之旅。 主要參考官方教程[1] [2] |
用SDF文件模擬激光雷達 | 在上一篇文章中,我們介紹了如何使用Gazebo提供的模型編輯器來創建一個機器人模型,並在仿真中使用。 個人任務這個過程是很繁瑣的,尤其是在機器人比較復雜的時候,推薦盡量使用SDF文件來描述機器人。在本文中,我們將用SDF文件來描述一個激光雷達,模擬傳感器數據, 添加Mesh文件以獲得更好的視覺體驗和更真實的仿真效果。代碼下載 |
Gazebo的仿真插件 | Gazebo通過插件(Plugin)的機制實現靈活的擴展功能。它的插件實際上是一個個的動態鏈接庫,使得我們可以通過C++接觸到Gazebo的方方面面。 而插件又是相對獨立的,開發人員可以方便共享,使用時也可以方便的插入系統或者從系統中移除。 本文在上一篇文章中實現的激光傳感器的基礎上,實現了一個插件用來控制傳感器的掃描速度。 |
通過ROS開啟Gazebo的世界 | 為了達到真實世界與仿真世界之間自如切換,我們需要研究一下如何在ROS系統中控制Gazebo以及其仿真的機器人模型。 本文中,我們介紹通過roslaunch打開仿真世界,並導入URDF描述的機器人模型。 |
Gazebo + ros_control | 到目前為止,我們的機器人還是軟軟的趴在地上。本文中,我們將具體介紹插件gazebo_ros_control,通過ros_control為機器人添加控制器來讓我們的機器人動起來。 ros_control是ROS中一種比較常用的控制器管理和實現的框架。gazebo_ros_control是Gazebo的一個插件,用來根據設定裝載合適的硬件接口和控制器。 這些設定就是在URDF文件中的<transmission>標簽中描述的內容,該標簽是URDF針對ros_control專門設計的。 |
關於Gazebo的介紹就先到這里,以后會有一個專題來講仿真。
第五部分:Turtlebot與機器人系統
Turtlebot是一款經典的小車機器人了。它是Melonee Wise和Tully Foote在2010年做出來的,是很多ROS教程的研究對象。 也是要感謝Turtlebot的開源,使得我們有了一個系統的玩具,涉及到了機器人中的控制、定位、建圖、導航等方方面面的內容,可以說是麻雀雖小五臟俱全。下面是各種Turtlebot相關的鏈接:
本部分通過Turtlebot的源碼來一窺機器人眼中的世界。主要是想了解一個移動機器人系統都有哪些組成部分,各個部分都扮演着什么樣的角色,相互之間是如何相互協調工作的, 也是以一個例子對上述內容做一個總結。因為手頭上沒有一台Turtlebot,所以本部分主要是在仿真的基礎上介紹。
Turtlebot你好! | 本文是對網絡上各種入門教程的濃縮,介紹一下仿真環境的搭建和運行。這里先跟Turtlebot打個招呼,讓它在Gazebo的世界中摩擦摩擦,之后的文章都是講Turtlebot自由摩擦背后的故事。 |
Turtlebot的描述模型 | 建立機器人模型應該是進行仿真的第一步工作,因為它將是我們以后開發算法的控制對象。本文詳細分析了Turtlebot的描述模型,以及相關描述文件的組織方式。 |
Kobuki控制插件 | Kobuki控制插件是Gazebo世界中的Turtlebot底盤與ROS的接口,我們通過該插件控制底盤運動,獲取底盤上的傳感器在仿真世界中的數據。本文詳細解析Kobuki控制插件的源碼。 |
Kinect控制插件 | Kinect是微軟出品的一款雙目/深度攝像頭,早期與XBox一起用於體感游戲風靡一時。為了在Gazebo環境中模擬Kinect,Gazebo官方為之提供了一個插件。 |
召喚Turtlebot | 本文中我們將詳細介紹召喚Turtlebot時的launch文件都做了些什么事情。 |
Turtlebot眼中的世界 | Turtlebot官方提供了在Gazebo環境下仿真建圖和定位導航的兩個demo,本文介紹運行這兩個demo的launch文件,目的是了解ROS系統是如何讓這些功能模塊運轉起來的。 至於具體的建圖算法我們將在SLAM算法主題中予以介紹。 |