android ros 節點編寫_嵌入式的我們為什么要學ROS

9d509757c41d7020f0539e3078d2f044.png
c6b3e29faf1e3a841556322ef80a8d99.gif

前言

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

?

作者:良知猶存

轉載授權以及圍觀:歡迎添加微信公眾號:羽林君

02b1a73f4adf570dd033d47035718823.png

?

c6b3e29faf1e3a841556322ef80a8d99.gif
9d509757c41d7020f0539e3078d2f044.png
c6b3e29faf1e3a841556322ef80a8d99.gif

?

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通用接口,從而避免為了集成它們而 重新開發新的接口程序

9d509757c41d7020f0539e3078d2f044.png
c6b3e29faf1e3a841556322ef80a8d99.gif

?

ROS可以做什么

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

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

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

bfed9988e32992ba03553bbbb790f249.png

?

c6b3e29faf1e3a841556322ef80a8d99.gif

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

eec6e8711c0cf787f55dcca41e7c27cd.png

?

c6b3e29faf1e3a841556322ef80a8d99.gif

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

9927e80d216897832811b492cd6a3ac6.png

?

c6b3e29faf1e3a841556322ef80a8d99.gif

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

ed4d850dc0d45b3fcfb8c65c315b7da6.png
c6b3e29faf1e3a841556322ef80a8d99.gif

?

除了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識別效果

82be297f9e9236438631cc1ac66d9cce.png

?

c6b3e29faf1e3a841556322ef80a8d99.gif

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

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

3b2fd4c288a857e741729b44df8f6576.gif

?

c6b3e29faf1e3a841556322ef80a8d99.gif

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

robot_localization示意圖

5d92fe332b23904ba3f93c89d4b95307.png
c6b3e29faf1e3a841556322ef80a8d99.gif

?

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

e8cad76e1afc01f26574e78b1aaff4d3.gif

?

c6b3e29faf1e3a841556322ef80a8d99.gif

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

d7d11e3b74bb8e3507c9f0e1918dfe1a.gif

?

c6b3e29faf1e3a841556322ef80a8d99.gif

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

9d509757c41d7020f0539e3078d2f044.png
c6b3e29faf1e3a841556322ef80a8d99.gif

?

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

04a483075fcc3fa0b12091858764f143.png

?

c6b3e29faf1e3a841556322ef80a8d99.gif

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

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

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

END

推薦閱讀

【1】c++nullptr(空指針常量)、constexpr(常量表達式)

【2】嵌入式底層開發的軟件框架簡述 必讀
【3】CPU中的程序是怎么運行起來的
【4】C++的匿名函數(lambda表達式)
【5】階段性文章總結分析

本公眾號全部原創干貨已整理成一個目錄,回復[ 資源 ]即可獲得.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446284.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STL源碼剖析 __type_traits

traits編程 彌補了C本身的不足STL只對迭代器進行規范制定出了iterator_traits,SGI在此基礎上進一步擴展,產生了__type_traits雙下劃線的含義是這個是SGI內部使用的東西,不屬于STL標準iterator_traits 負責萃取迭代器的特性__type_traits負責萃…

java 學生成績

題目 對學生成績大于60分的,輸出“合格”。低于60分的,輸出“不合格” 代碼 使用/除法簡化代碼 package l1_switch_case;import java.util.Scanner;public class SwitchDemo2 {public static void main(String[] args) {Scanner scanner new Scanne…

STL源碼剖析 序列式容器|Vector

容器的概觀和分類 array 數組 、list 鏈表、tree樹 、stack堆棧、queue隊列、hash table散列表、set集合、map映射表根據數據在容器中的排列順序,將上述數據結構分為序列式和關聯式兩種類型SGI STL使用內縮方式來表達基層和衍生層之間的關系衍生不是派生&#xff0…

ansible 修改文件變量_Ansible Playbook中的變量與引用

Ansible是一個系列文章,我會盡量以通俗易懂、詼諧幽默的總結方式給大家呈現這些枯燥的知識點,讓學習變的有趣一些。Ansible自動化運維前言前面有說到使用playbook來搞一些復雜的功能,我們使用YAML來寫playbook,就像我們用其它語言…

java 判斷日期為第幾天

題目1 編寫程序:從鍵盤上輸入2019年的“month”和“day”,要求通過程序 輸出輸入的日期為2019年的第幾天。 代碼1 從12月往下加日期數 package l1_switch_case; import java.util.Scanner; public class SwitchDemo4 {public static void main(Strin…

STL源碼剖析 list概述

目錄 list的節點(node) list迭代器 list 的構造和內存管理 list 的元素操作 list相較于vector連續的線性空間就顯得很復雜,他的存儲空間是不連續的,好處是每次插入和刪除一個元素的時候,只需要配置或者釋放一個元素的空間 插入和刪除十分的…

vsftp不允許切換到其它目錄_IntelliJ IDEA如何對project的目錄進行篩選顯示?

如果你的項目很龐大,同一個功能用到的各種文件散落在多個文件夾,開發時切換不便,可以利用scope功能,只顯示該功能用到的文件,讓project列表十分清爽,提高開發效率。本文使用的IDEA版本為2020.1。1、打開sco…

java 年份對應的中國生肖

題目 編寫一個程序,為一個給定的年份找出其對應的中國生肖。 中國的生肖基于12年一個周期, 每年用一個動物代表: rat、ox、tiger、rabbit、dragon、snake、horse、sheep、monkey、 rooster、dog、pig。 提示:2019年:豬…

密碼學專題 對稱加密算法

一般來說,使用OpenSSL對稱加密算法有兩種方式,一種是使用API函數的方式,一種是使用OpenSSL提供的對稱加密算法指令方式。本書將介紹對稱加密算法的指令方式OpenSSL的對稱加密算法指令主要用來對數據進行加密和解密處理,輸入輸出的…

網絡防火墻單向和雙向_單向晶閘管與雙向晶閘管之間的不同之處

晶閘管是回一個可以控導點開關,能以弱電去控制強電的各種電路。晶閘管常用于整流,調壓,交直流變化,開關,調光等控制電路中。具有提交小,重量輕,耐壓高,容量大,效率高&…

java 遍歷100以內的偶數,偶數的和,偶數的個數

題目 遍歷100以內的偶數,偶數的和,偶數的個數 代碼 package l2_for; /*遍歷100以內的偶數,偶數的和,偶數的個數*/ public class ForDemo1 {public static void main(String[] args) {//方法1:int sum1 0,count10;f…

python版本切換_怎么切換python版本

展開全部 (1)分別安2113裝 python-2.7.12.amd64.msi python-3.5.2-amd64.exe (python官網下載的) 順序無所謂(為5261了看著4102方便,我把安裝路徑修改統一了1653) (2)配置…

java 打印

題目 編寫程序從1循環到150,并在每行打印一個值,另外在每個3的倍數行 上打印出“foo”,在每個5的倍數行上打印“biz”,在每個7的倍數行上打印 輸出“baz”。 代碼 package l2_for;/** 編寫程序從1循環到150,并在每行打印一個值&#xff0c…

react.lazy 路由懶加載_Vue面試題: 如何實現路由懶加載?

非懶加載import List from /components/list.vue const router new VueRouter({routes: [{ path: /list, component: List }] })方案一(常用)const List () > import(/components/list.vue) const router new VueRouter({routes: [{ path: /list, component: List }] })方…

STL源碼剖析 deque雙端隊列 概述

vector是單向開口的連續線性空間,deque是一種雙向開口的連續線性空間。deque可以在頭尾兩端分別進行元素的插入和刪除操作vector和deque的差異 1,deque允許常數時間內對于頭端元素進行插入和刪除操作2,deque沒有所謂容量(capacity)的概念&…

java 最大公約數和最小公倍數

題目 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 比如:12和20的最大公約數是4,最小公倍數是60。 說明:break關鍵字的使用 代碼一 package l2_for; //題目:輸入兩個正整數m和n,求…

python的自帶數據集_Python的Sklearn庫中的數據集

一、Sklearn介紹 scikit-learn是Python語言開發的機器學習庫,一般簡稱為sklearn,目前算是通用機器學習算法庫中實現得比較完善的庫了。其完善之處不僅在于實現的算法多,還包括大量詳盡的文檔和示例。其文檔寫得通俗易懂,完全可以當…

STL源碼剖析 stack 棧 概述->(使用deque雙端隊列 / list鏈表)作為stack的底層容器

Stack是一種先進后出的數據結構,他只有一個出口stack允許 新增元素、移除元素、取得最頂端的元素,但是無法獲得stack的內部數據,因此satck沒有遍歷行為Stack定義的完整列表 (雙端隊列作為Stack的底層容器) 將deque作為Stack的底部結構&#…

java 三位數的水仙花數

代碼 package l2_for;public class ForDemo6 {public static void main(String[] args) {for (int i 100; i <999 ; i) {int i1i/1%10;int i2i/10%10;int i3i/100%10;if (i(int)(Math.pow(i1,3)Math.pow(i2,3)Math.pow(i3,3))){System.out.print(i"\t");}}} }

python怎么實現圖像去噪_基于深度卷積神經網絡和跳躍連接的圖像去噪和超分辨...

Image Restoration Using Very Deep Convolutional Encoder-Decoder Networks with Symmetric Skip Connections作者&#xff1a;Xiao-Jiao Mao、Chunhua Shen等本文提出了一個深度的全卷積編碼-解碼框架來解決去噪和超分辨之類的圖像修復問題。網絡由多層的卷積和反卷積組成&a…