嵌入式的我們為什麼要學ROS

2021-01-21 酷扯兒

本文轉載自【微信公眾號:羽林君,ID:Conscience_Remains】,經微信公眾號授權轉載,如需轉載與原文作者聯繫

作者:良知猶存

前言

本來是要寫一篇STM32移植ROS的一個小lib庫,ROS一般都是需要跑在Linux上的,STM32使用就是當成一個ROS通訊的小節點,但是寫文章時間不夠,所以就簡單做一篇ROS的介紹文章,分享給嵌入式的小夥伴們。ROS現在在機器人領域會有比較多的應用,學習的人群也逐漸增多,甚至會有專門的ROS崗位進行招聘,並且普遍工資要比一般的嵌入式開發高一些。今天給大家分享一下,希望大家可以一起學習進步哈。

ROS是什麼

ROS(機器人作業系統,Robot Operating System),是專為機器人軟體開發所設計出來的一套電腦作業系統架構。它是一個開源的元級作業系統(後作業系統),提供類似於作業系統的服務,包括硬體抽象描述、底層驅動程序管理、共用功能的執行、程序間消息傳遞、程序發行包管理,它也提供一些工具和庫用於獲取、建立、編寫和執行多機融合的程序。ROS的運行架構是一種使用ROS通信模塊實現模塊間P2P的鬆耦合的網絡連接的處理架構,它執行若干種類型的通訊,包括:1.基於服務的同步RPC(遠程過程調用)通訊;2.基於Topic的異步數據流通訊,還有參數伺服器上的數據存儲。

發展目標

ROS的首要設計目標是在機器人研發領域提高代碼復用率。ROS是一種分布式處理框架(又名Nodes)。這使可執行文件能被單獨設計,並且在運行時鬆散耦合。這些過程可以封裝到數據包(Packages)和堆棧(Stacks)中,以便於共享和分發。ROS還支持代碼庫的聯合系統。使得協作亦能被分發。這種從文件系統級別到社區一級的設計讓獨立地決定發展和實施工作成為可能。上述所有功能都能由ROS的基礎工具實現。

為了實現「共享與協作」這一首要目標,人們制訂了ROS架構中的其他支援性目標:

「輕便」:ROS是設計得儘可能方便簡易。您不必替換主框架與系統,因為ROS編寫的代碼可以用於其他機器人軟體框架中。毫無疑問的,ROS更易於集成與其他機器人軟體框架。事實上ROS已完成與OpenRAVE、Orocos和Player的整合。ROS-agnostic庫:【agnostic:不可知論】建議的開發模型是使用clear的函數接口書寫ROS-agnostic庫。語言獨立性:ROS框架很容易在任何程式語言中執行。我們已經能在Python和C++中順利運行,同時添加有Lisp、Octave和Java語言庫。測試簡單:ROS有一個內建的單元/組合集測試框架,稱為「rostest」。這使得集成調試和分解調試很容易。擴展性:ROS適合於大型實時系統與大型的系統開發項目

在ROS的計算圖中,ROS的Master以一個name service的方式工作。它給ROS的節點存儲了topics和service的註冊信息。Nodes 與Master通信從而報告它們的註冊信息。當這些節點與master通信的時候,它們可以接收關於其他以註冊節點的信息並且建立與其它以註冊節點之間的聯繫。當這些註冊信息改變時Master也會回饋這些節點,同時允許節點動態創建與新節點之間的連接。

節點之間的連接是直接的;Master僅僅提供了查詢信息,就像一個DNS伺服器。節點訂閱一個topic將會要求建立一個與發布該topics的節點的連接,並且將會在同意連接協議的基礎上建立該連接。ROS裡面使用最廣的連接協議是TCPROS,這個協議使用標準的TCP/IP 接口。

這樣的架構允許解耦操作(decoupled operation),通過這種方式大型或是更為複雜的系統得以建立,其中names方式是一種行之有效的手段。names方式在ROS系統中扮演極為重要的角色:topics, services, and parameters 都有各自的names。每一個ROS客戶端庫都支持重命名,這等同於,每一個編譯成功的程序能夠以另一種形似【名字】運行。

ROS通信接口正在成為機器人軟體互操作的事實標準,也就是 說絕大部分最新的硬體驅動和最前沿的算法實現都可以在 ROS中找到。例如,在ROS的官方網頁 上有著大量的開源軟 件庫,這些軟體使用ROS通用接口,從而避免為了集成它們而 重新開發新的接口程序

ROS可以做什麼

當我們希望稍微提高一下機器人複雜度的時候,就會發現另一個需要考慮的問題,進程間通信。在我們用Windows + RTX的時候,進程間通信使用RTX提供的shared memory,不過都是比較慢的圖像處理進程向shared memory中寫數據,決策和運動控制進程讀數據。shared memory顯然並不是很好的通信方式,這裡不再多加討論。ROS則使用了一個很好的通信架構,並且是ROS整個框架的一個基礎(不論是對於ROS中的topic,service,plugin,actionlib等基礎概念還是rviz,navigation package等功能包。

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

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

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

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

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

除了ROS本身之外,世界上已經有很多非常優秀的機器人開源項目,但是ROS正逐漸將它們一一囊括在自己的範疇裡,所以你可以在ROS裡面很容易的使用這些開源項目:(這部分項目介紹文字摘自公眾號:【Nao】 一位交大的算法博士的公眾號)

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

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

Player:一款優秀的二維仿真平臺,可以用於平面移動機器人的仿真,現在在ROS裡可以直接使用。

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

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

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

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

當然,除了吸收別的優秀開源項目,ROS自己也發展出許多非常優秀的項目和庫。

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

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

Gmapping:這其實是在OpenSlam項目繼承過來的(後來發展和改動較大),利用gmapping可以實現laser-based SLAM,快速建立室內二維地圖,下圖就是gmapping建立二維地圖

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

robot_localization示意圖

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

MoveIt:這個是專注於移動機械臂運動規劃的模塊,運動規劃.

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

ROS怎麼學

Nao作者 首先,ROS版本定期更新、主要模塊有專人維護、問答區活躍、各mail lists也非常活躍、開發者非常熱衷交流分享。如果深入到ROS社區,可以學到很多東西。 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規劃控制雙臂機器人運動。 最後,就是進階階段了。我要強調一句「ROS只是一個工具",你會用ROS做SLAM並不能說明你會做SLAM。對於自己研究的內容,必須沉下心去看教材和論文,去理解每種算法背後的原理,知道如何調整算法參數、如何改進算法,最終能夠自己編寫某部分代碼,並替換ROS的相應模塊(如自己寫運動學正逆解替代KDL等)。做研究,交流非常重要。如果你改進ROS某一算法後,最好能與package的原作者交流,將自己的修改merge到原項目中,在交流中提高自己與package的水平。當然,如果對算法有疑問,也可以直接諮詢作者,ROS裡的貢獻者大都非常願意分享和交流。

此外除了一個好的學習平臺,我們還需要一個趁手的使用工具:推薦TurtleBot

TurtleBot可以說是ROS中最為重要的機器人之一,它伴隨ROS一同成長,一直都作為ROS開發前沿的機器人,幾乎每個版本的ROS測試都會以TurtleBot為主,包括ROS2也率先在TurtleBot上進行了大量測試。

所以TurtleBot是ROS支持度最好的機器人之一,可以在ROS社區中獲得大量關於TurtleBot的相關資源,很多功能包都能直接復用到我們自己的移動機器人平臺上,絕對是使用ROS開發移動機器人的重要資源。並且TurtleBot相關的國內支持平臺:創客製造網站也提供了許多詳細資料。

這就是我分享的ROS,最近也有在用ROS以及更加深入的學習ROS,有些資料大家可以添加我微信,我可以分享給大家。此外如果大家有什麼更好的思路,也歡迎分享交流哈。

—END—

相關焦點

  • ROS 2 Crystal Clemmys版本上線,歡迎廣大工程師試用並反饋
    項目團隊歡迎工程師們閱讀安裝說明和教程(https://index.ros.org/doc/ros2/),開始體驗Crystal Clemmys。ROS 2版本發展迅速,Crystal Clemmys的發布意味著我們即將告別Ardent Apalone,同時還將收回191個文件包,首次發布的Crystal版本有297個文件包。
  • 程式設計師及嵌入式的一些學習建議
    有的學生認為女生不適合做Java,適合做測試,那是大錯特錯,女生一樣會比男生強,關鍵看自已是不是有興趣去學!如果真的想在測試方面有發展,也要至少做一到兩年程式設計師再轉向測試會更有發展,試想一下連代碼都沒編過的人去做測試能有什麼前途呢!---嵌入式時代已經來臨,你還在等什麼?
  • 機器人課程系列:如何安裝ROS(Robot Operating System,機器人操作...
    這些機器人有些沒有作業系統,且硬體設計都不一樣,如果在新的項目只是想用之前設計的一部分的話,代表要重複製作,才有辦法使用到別人早就做過的東西。由於code無法維護,因此當項目時程不明確,且軟體人員離職後,新來的程式設計師還要看懂前人所留下的自閉軟體系統,等到三個月試用期一過,又離職到其他公司上班了!如此重複造輪子,PM要先跳腳,專案就要爆炸了!
  • 從安裝到做項目一步步教你ROS學習入門
    英語不太好的話可以看中文版的 也可以參見我的學習筆記 ,前期只學初級20講即可。學習完基礎20講後可以根據興趣或用途來學習其他教程,如上圖就是實時觀測工具Rviz顯示機器人的URDF(Unified Robot Description Format)模型,裡面還涉及坐標變換的TF相關知識,都需要學習對應的Tutorial來入門。當然,無從著手的話,這時候選擇一本參考書也是很不錯的,如, 。
  • 我們為什麼要學哲學
    本人經歷:初中競賽提前班,高中物化生(but政史地的學考也是全A哦)理綜269hhhhh,本科應用化學,直博藥學院化學生物學。呵呵呵呵噠噠從小我就不是非常喜歡看書,雖然老愛去圖書館捧一大摞書回家,但大多都以超期結束我和它們之間的緣分。每次看書時都喜歡邊吃邊看,總是不能十分專注,達到心流狀態。
  • 嵌入式電阻與電容
    為什麼要內置它們呢?原因是電路板表面空間的緊張。在典型的裝配中,佔總價格不到3%的元件可能會佔據電路板上40%的空間!而且情況正變得更為糟糕。我們設計的電路板要支持更多的功能、更高的時鐘速率和更低的電壓,這就要求有更多的功率和更高的電流。噪聲的預算也隨著更低的電壓而降低,同時還需要對電源分布系統進行很大的改進。這一切都需要有更多的無源器件。
  • 未成年人為什麼要學日語?
    為什麼老師會說未成年人學習日語和學習英語同樣重要,而且還要越早學習越好?今天妮醬老師就來說說我們為什麼要學日語。01未成年為什麼要學習1、為什麼要學習?2、學習才能改變命運,我們在成長過程中,沒有絕對的說需要學習多少技能才行,但是如果有條件可以對以後的人生和未來發展做一些規劃,比如學習語言和學習藝術,這些都是與自己相伴一生,長大後可以直接變成技能的本事,只有學習的越多,未來才有越多的可能,如果你不想讓自己受限,那就學習吧!
  • 機器人程序設計之如何正確入門ROS | 雷鋒網公開課
    基本上早期開發機器人大家都是各幹各的,甚至是防著彼此,生怕別人把我們的代碼、設計抄襲過去,這樣其實大家就是在重複地造輪子,進行一些底層的無聊工作。我最早接觸ROS是2009年在翻譯《嵌入式機器人學》這本書,作者託馬斯·布勞恩教授當時開發了一套RoBIOS的機器人作業系統,按照他的說法,這是最早的機器人作業系統,而且是可以嵌入式應用的。
  • 嵌入式電磁爐好嗎 嵌入式電磁爐怎麼安裝【方法介紹】
    摘要:嵌入式電磁爐是將電磁爐嵌入到廚房的檯面上,那麼嵌入式電磁爐好不好呢?嵌入式電磁爐使用起來非常方便,可用來進行煮、炸、煎、蒸、炒等各種烹調操作。具有效率高、體積小、重量輕、噪音小、省電節能、安全環保等特點。嵌入式電磁爐的安裝需要注意些什麼呢?下面小編就為您講解。
  • 中醫築基為什麼要學天文?
    直接報名築基二期請點文末閱讀原文中醫築基為什麼要學天文
  • 我們為什麼要學化學,聽聽大佬們怎麼說
    富國之策,雖不止一端,要在開闢天然富源,促進生產建設,發達國防工業,而待舉百端,皆之努力。作為新中國的化學家,要想充分利用我們的豐富資源,首先須更清楚地了解它的化學。中國掃描隧道顯微學的開拓者之一。化學對改造人類客觀世界可以發揮很大作用,但是作為個人來講最吸引我的就是它變化多端。當你感覺到它的變化多端,就會具有一種挑戰性,如果你對發生的事情無法做出非常具體判斷的時候,就會產生巨大的好奇心。
  • 嵌入式實時資料庫技術研究
    ,具有一定的數據獨立性和共享特性,運行效率較高,而且由於它避免了索引操作,比關係型資料庫模式要節省存儲空間,數據操作速度也更快。但是這種模型結構比較複雜,尤其當嵌入式系統規模增大時,其資料庫的結構變得非常龐大,可能會影響到系統的實時性能。圖3所示的是在相同數目的記錄下,關係模型和網狀模型的系統開銷比較,從圖中可以看出,網狀模型因為避免了索引操作使得其開銷要小於關係模型。
  • FMC:FeFET是嵌入式快閃記憶體的自然替代品
    在這裡,我們採訪了該公司的執行長Ali Pourkeramati,希望聽到他對新型存儲FeFET未來發展的看法。 Pourkeramati首先是讚揚氧化鉿作為鐵電材料的特性,該特性也恰好在晶圓代工廠中廣泛用作現代IC的絕緣層。他聲稱鐵電場效應電晶體(FeFET)是嵌入式快閃記憶體的自然替代品,因為後者難以擴展到28nm以上。
  • 機器人作業系統從ROS升級到ROS2 部署不再是難題
    我們如何做才能實現這樣的目標?或許ROS2可以協助我們實現這樣的目標。Joe分析,「關於ROS2,其中一個關鍵點是通信方式,通過它可以在組件之間低延時傳遞信息,可以獲得更高的服務質量,可以讓機器人彼此通信,實現協調。在這些群體行為,當其中一個機器人手持工件,而另一個機器人可以在上面工作。
  • 我們為什麼學化學?
    富國之策,雖不止一端,要在開闢天然富源,促進生產建設,發達國防工業,而待舉百端,皆須化學家之努力。作為新中國的化學家,要想充分利用我們的豐富資源,首先須更清楚地了解它的化學。中國掃描隧道顯微學的開拓者之一。我選讀化學是因為喜歡從事客觀理性的分析工作。人們總認為化學家製造汙染、毒物,其實這是一個靠化學才能正常運轉的世界。
  • PCBA與嵌入式開發
    基於PCBA板的嵌入式系統的開發嵌入式系統的開發分為嵌入式軟體開發和嵌入式硬體開發,PCBA正是嵌入式硬體開發的基礎。什麼是嵌入式系統(1) 嵌入式系統的基本介紹嵌入式系統應定義為:嵌入到對象體系中的專用計算機系統。嵌入性、專用性與計算機系統是嵌入式系統的三個基本要素。嵌入式開發就是指在嵌入式作業系統下進行開發,一般常用的系統有ucos,linux,android等。
  • 「嵌入式烤箱」嵌入式烤箱哪個品牌最好,嵌入式烤箱品牌排行榜
    對於嵌入式機種,一般建議購買50L及以上的型號,大容量既能滿足多人用餐烹飪的需求,也能更好地利用櫥櫃空間,保證良好的使用體驗。美的嵌入式烤箱的總體配置完全不輸有著傳統優勢的外資品牌,以高性價比機型「小嘿」為例,即便是售價僅2000元左右,也都配備了上下管獨立控溫和背部熱風循環功能,基礎配置相當紮實。
  • 開發崗位這麼多,為什麼選Java?你學Java了嗎-開課吧
    軟體開發可以使用的語法是非常多,但是為什麼Java被廣泛的使用呢?其他程式語言與Java相比,Java語法相對簡單,並且是很多計算機語言的基礎。提到C++語言,很多人發現在使用過程中最容易出現的錯誤就是內存管理,而java有自動垃圾回收器,不用擔心內存。
  • 李大潛院士:今天我們為什麼要學數學?怎麼學好數學?
    有很多學生特別喜歡數學,但也有不少人覺得數學很難,從而望而生畏,甚至避之唯恐不及,這不是我們希望看到的。我們希望看到的是教師付出了認真的努力,學生通過學習更加熱愛數學,愈學愈想學,對進一步學好數學充滿了熱情和渴望,但實際的情況和這個差距還比較大。這不能怪這一部分學生不是學數學的材料,從教師的角度,應該更多地認識到,我們的教學方法,包括我們所編的教材,還有很大的改進的空間和餘地。