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


同樣,從個人微信公眾號Nao(ID:qRobotics)搬運。

前言

  先放一個ROS Industrial一周年剪輯視頻

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

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

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

 

是什么

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

  1、首先是一個操作系統

  根據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等),供上層應用程序(運動規划等)調用。

 

  2、是一種跨平台模塊化軟件通訊機制

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

△ROS分布特點

△三種通訊方式的特點

  三種通訊方式的優缺點可看上表,由於很多模塊化編程工具都有類似功能,這里就不具體展開了。

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

  此外,ROS可以跨平台,在不同計算機、不同操作系統、不用編程語言、不同機器人上使用。

 

  3、是一系列開源工具

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

  如上圖所示,ROS為開發者提供了一系列非常有用的工具,可以大大提高我們開發的效率。

  rqt_plot:可以實時繪制當前任意Topic的數值曲線;

  rqt_graph:可以繪制出各節點之間的連接狀態,和正在使用的Topic等;

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

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

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

△在Rviz里也可以實現方便交互功能

  除此之外,ROS還有很多其他有用的開源工具等待大家探索。

 

  4、是一系列最先進的算法

△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還有各種機器人、傳感器驅動等內容。

 

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

  個人認為,這應該是最重要的一點。除了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),博客會比公眾號遲推送一周左右。


免責聲明!

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



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