機器人操做系統ROS | 簡介篇

一樣,從我的微信公衆號Nao(ID:qRobotics)搬運。node

前言算法

  先放一個ROS Industrial一週年剪輯視頻編程

  ROS已經發布八週年了,在國外科研機構中很是受歡迎。目前,以美國西南研究院爲首的幾位大佬開始嘗試將ROS應用在工業機器人中,上面這個視頻就是ROS-I項目一週年的進展狀況。微信

  爲了說明講清楚ROS,我就從ROS是什麼,爲何使用ROS,如何使用ROS三個方面展開。架構

△出自今年《機器人視覺與應用》課程本人制做的課件app

 

是什麼機器學習

  ROS是Robot Operating System的縮寫,本來是斯坦福大學的一個機器人項目,後來由Willow Garage公司發展,目前由OSRF(Open Source Robotics Foundation, Inc)公司維護的開源項目。編程語言

  一、首先是一個操做系統ide

  根據wikipedia定義,OS is system software that manages computer hardware and software resources and provides common services for computer programs。也就是說操做系統是用來管理計算機硬件與軟件資源,並提供一些公用的服務的系統軟件。而ROS也自稱是一個OS模塊化

△計算機OS與機器人OS對比示意圖

  如上圖所示,計算機的操做系統將計算機硬件封裝起來,而應用軟件運行在操做系統之上,不用管計算機具體應用的是什麼類型的硬件產品。這能大大提升軟件開發效率(不然你們只能都寫彙編了)。

  同理,ROS則是對機器人的硬件進行了封裝,不一樣的機器人、不一樣的傳感器,在ROS裏能夠用相同的方式表示(topic等),供上層應用程序(運動規劃等)調用。

 

  二、是一種跨平臺模塊化軟件通信機制

  ROS用節點(Node)的概念表示一個應用程序,不一樣node之間經過事先定義好格式的消息(Topic),服務(Service),動做(Action)來實現鏈接。

△ROS分佈特色

△三種通信方式的特色

  三種通信方式的優缺點可看上表,因爲不少模塊化編程工具都有相似功能,這裏就不具體展開了。

  基於這種模塊化的通信機制,開發者能夠很方便地替換、更新系統內的某些模塊;也能夠用本身編寫的節點替換ROS的個別模塊,十分適合算法開發。

  此外,ROS能夠跨平臺,在不一樣計算機、不一樣操做系統、不用編程語言、不一樣機器人上使用。

 

  三、是一系列開源工具

△幾種ROS工具示意圖:左上rqt_plot,右上rqt_graph,左下Rviz,右下TF

  如上圖所示,ROS爲開發者提供了一系列很是有用的工具,能夠大大提升咱們開發的效率。

  rqt_plot:能夠實時繪製當前任意Topic的數值曲線;

  rqt_graph:能夠繪製出各節點之間的鏈接狀態,和正在使用的Topic等;

  TF:TF是Transform的簡寫,利用它,咱們能夠實時知道各連桿座標系的位姿,也能夠求出兩個座標系的相對位置。

  Rviz:超強大的3D可視化工具,能夠顯示機器人模型、3D電影、各類文字圖標、也能夠很方便二次開發;

△在Rviz裏顯示機器人模型、3D點雲、物體模型等

△在Rviz裏也能夠實現方便交互功能

  除此以外,ROS還有不少其餘有用的開源工具等待你們探索。

 

  四、是一系列最早進的算法

△ROS包含許多先進的機器人開源項目

  除了ROS以外,世界上已經有不少很是優秀的機器人開源項目,可是ROS正逐漸將它們一一囊括在本身的範疇裏。例如:

  PS:我跟ROS的其餘幾個開發者也正在努力將LinuxCNC整合進ROS

  OROCOS:這個開源項目主要側重於機器人底層控制器的設計,包括用於計算串聯機械臂運動學數值解的KDL、貝葉斯濾波、實時控制等功能。

  OpenRave:這是在ROS以前最多人用來作運動規劃的平臺,ROS已經將其中的ikfast(計算串聯機械臂運動學解析解)等功能吸取。

  Player:一款優秀的二維仿真平臺,能夠用於平面移動機器人的仿真,如今在ROS裏能夠直接使用。

  OpenCV:大名鼎鼎的機器視覺開源項目,ROS提供了cv_bridge,能夠將OpenCV的圖片與ROS的圖片格式相互轉換。

  OMPL:如今最著名的運動規劃開源項目,已經成了MoveIt的一部分。

  Visp:一個開源視覺伺服項目,已經跟ROS完美整合。

  Gazebo:一款優秀的開源仿真平臺,能夠實現動力學仿真、傳感器仿真等,也已被ROS吸取。

△左下角gazebo,右下角Rviz

  固然,除了吸取別的優秀開源項目,ROS本身也發展出許多很是優秀的項目和庫。

  ORK:一個物體識別與位姿估計開源庫,包含LineMod等算法,但實際使用效果還不是太理想。

△LineMod識別效果

  PCL:一個開源點雲處理庫,本來是從ROS中發展起來的,後來因爲太受歡迎,爲了讓非ROS用戶也能用,就單獨立了一個PCL的項目。

  Gmapping:這實際上是在OpenSlam項目繼承過來的(後來發展和改動較大),利用gmapping能夠實現laser-based SLAM,快速創建室內二維地圖。

△gmapping創建二維地圖

  Localization:基於擴展卡爾曼濾波(EKF)和無跡卡爾曼濾波(UKF)的機器人定位算法,能夠融合各類傳感器的定位信息,得到較爲準確的定位效果。

△robot_localization示意圖

  Navigation:基於Dijkstra、A*算法(全局規劃器)和動態窗口法DWA(局部規劃器)的移動機器人路徑規劃模塊,能夠在二維地圖上實現機器人導航。

△navigation示意圖

  MoveIt:這個是專一於移動機械臂運動規劃的模塊,下次講運動規劃入門的時候再詳細介紹它。

△MoveIt對UR5進行運動規劃

  固然,除了這些最早進算法外,ROS還有各類機器人、傳感器驅動等內容。

 

  五、是一個最活躍的機器人開發交流平臺

  我的認爲,這應該是最重要的一點。除了ROS外,如今有須要其餘的項目能夠代替或者部分代替ROS的功能:OpenRave運動規劃,V-rep仿真。可是這些項目的社區遠沒有ROS活躍。

  ROS版本按期更新、主要模塊有專人維護、問答區活躍、各mail lists也很是活躍、開發者很是熱衷交流分享。若是深刻到ROS社區,能夠學到不少東西。

 

爲何

  首先,用過工業機器人的人確定知道,不一樣工業機器人的開發系統基本都不同,示教、編程方法也不一樣,一個熟練使用Motoman的工程師極可能並不會使用Kuka機械臂。就算是同種機器人,因爲固件版本的更新換代,也可能形成程序的不兼容(我在UR上就遇到過這個問題)。這就大大影響了機器人的推廣普及。

△左:不一樣機器人的示教器;右:UR固件版本不兼容

  對此,ROS能夠用統一的方式來封裝機器人(URDF模型+機器人驅動),用戶只須要在ROS中編寫應用程序,並不用關心機器人的控制方式。若是全部機器人都採用了這種方式,那麼機器人必將獲得更普遍地應用(對系統集成商的要求會下降)。
  其次,如今愈來愈多機器人廠商開始嘗試使用ROS,包括佔據最多工業市場份額的機器人四你們族和各類流行的研究型機器人;甚至有如Rethink的Baxter,只能使用ROS控制。研究機器人的若是不去學習ROS的話,之後可能就會面臨不會使用機器人的問題。

△使用ROS的機器人

  再者,機器人是一個複雜且涉及面極廣的學科,從下往上包括機械設計、電機控制、傳感器、軌跡規劃、運動學與動力學、運動規劃、機器視覺、定位導航、機器學習、高級智能等等。一個研究生基本不可能在幾年時間內掌握全部領域。

  對於一個作上層規劃的研究生,若是不用ROS的話,每每須要花費很是長時間用於搭建實驗系統,從而大大擠壓了真正用在發明新知識的時間。例如,我作運動規劃,就必須先把機械臂運動學正逆解、物體識別算法、碰撞檢測算法等完成纔有可能開始作運動規劃。造輪子的事就交給專業造輪子的人作吧。

因此,對於科研人員來講,ROS能夠幫助你快速搭建機器人軟件系統,同時其模塊化的設計可讓你方便地用本身的算法替換其中某一模塊,讓你專一於本身的研究點。

  最後,就是對於創業或者參加比賽的人來講,ROS能夠幫助你快速搭建原型樣機。原型樣機出來了,天然比只有設計說明書的人有優點。
爲防止作廣告嫌疑,創業的例子就不說了,就拿咱們去年參加的一個創業大賽來說。咱們組四我的用了不到兩個月時間完成了下面這個超市購物機器人的軟硬件設計與製做,功能包括避障、防跌、人員跟隨、藍牙校訂(跟蹤對的人)、手勢識別、商品自動計價、自動支付等。

  嗯,個人公衆號Nao(qRobotics)的頭像就是在這個項目時設計的。

△去年參加某創業大賽的做品MarketBot

 

如何

  這方面已經能夠找到不少答案了,可是學習這種東西只能靠本身多練習了,我只簡單從我我的角度給出幾個建議吧。

  首先,就是要先了解ROS的基本架構和開發方式。我我的是強烈推薦直接看ROS官網上的教程ROS/Tutorials的Beginner Level(多看幾遍),同時充分使用ROS的問答社區ROS Answers與各模塊的Mail Lists,不少基礎問題可能前人都遇到過。

  其次,在瞭解ROS的基本架構與開發方式後,就能夠有針對性地看本身所關心的部分了。如作移動機器人的同窗就去看Navigation教程;作物體識別的就去看ORK教程;作運動規劃的就去看MoveIt教程。這一步最好能跟有實際機器人練手(若是沒有的話,就用gazebo仿真)。因爲一些模塊的教程不夠清楚(如MoveIt),必定要多練習,甚至是去看部分源碼,先保證本身會用ROS實現一些功能。

  對於ROS與實際機器人的鏈接,建議仔細看看action(編寫機器人驅動package)、URDF(機器人描述文件)的教程(或者ros_control)。以下圖,我爲SDA5F機器人編寫了URDF文件,並修改了motoman_driver中的action,使得在ROS環境中用MoveIt規劃控制雙臂機器人運動。

△SDA5F雙臂機器人與其URDF模型

  最後,就是進階階段了。我要強調一句「ROS只是一個工具」,你會用ROS作SLAM並不能說明你會作SLAM。對於本身研究的內容,必須沉下心去看教材和論文,去理解每種算法背後的原理,知道如何調整算法參數、如何改進算法,最終可以本身編寫某部分代碼,並替換ROS的相應模塊(如本身寫運動學正逆解替代KDL等)。
  作研究,交流很是重要。若是你改進ROS某一算法後,最好能與package的原做者交流,將本身的修改merge到原項目中,在交流中提升本身與package的水平。固然,若是對算法有疑問,也能夠直接諮詢做者,ROS裏的貢獻者大都很是願意分享和交流。

  固然,在問別人以前,請必定要保證本身充分熟悉了官方Tutorials,而不是朝別人發一堆編譯錯誤截圖,而後問這是怎麼回事。提問的藝術真的很是重要,有時候不是對方不肯意跟你交流,而是對方不肯意手把手帶你過Tutorials

 

結尾

  不少人在爭論是否應該使用ROS、是否應該在產品上使用ROS、是否應該在工業中使用ROS。可是從我我的的角度上看,ROS對於服務機器人上層算法開發和研究而言是一個很棒的工具,做爲學術研究使用的話,能夠大大加快實驗平臺搭建過程。

  有問題和意見歡迎你們直接在下面留言

  【備註:全部帶公衆號「qRobotics」水印的圖片版權歸本人全部,未經容許,不得轉載。】

  歡迎掃描下方二維碼關注個人微信公衆號Nao(ID:qRobotics),博客會比公衆號遲推送一週左右。

相關文章
相關標籤/搜索