SLAM+語音機器人DIY系列:(二)ROS入門——2.ROS系統總體架構

摘要                                          

ROS機器人操做系統在機器人應用領域很流行,依託代碼開源和模塊間協做等特性,給機器人開發者帶來了很大的方便。咱們的機器人「miiboo」中的大部分程序也採用ROS進行開發,因此本文就重點對ROS基礎知識進行詳細的講解,給不熟悉ROS的朋友起到一個拋磚引玉的做用。本章節主要內容:html

1.ROS是什麼node

2.ROS系統總體架構python

3.在ubuntu16.04中安裝ROS kineticnginx

4.如何編寫ROS的第一個程序hello_worldc++

5.編寫簡單的消息發佈器和訂閱器git

6.編寫簡單的service和clientgithub

7.理解tf的原理算法

8.理解roslaunch在大型項目中的做用django

9.熟練使用rviz編程

10.在實際機器人上運行ROS高級功能預覽



2.ROS系統總體架構                  

因爲ROS系統的組織架構比較複雜,簡單從一個方面來講明很難說清楚。按照ROS官方的說法,咱們能夠從3個方面來理解ROS系統總體架構,這3個方面分別是文件系統級、計算圖級、開源社區級。

2.1.從文件系統級理解ROS架構     

若是你是剛剛接手ROS方面的開發或項目,你確定會以爲ROS中的各類概念很是奇怪,可是當你對ROS的使用熟練以後,你就以爲這些概念很好理解了。與其餘操做系統類似,一個ROS程序的不一樣組件要被放在不一樣的文件夾下,這些文件夾是根據不一樣的功能來對文件進行組織的,如圖3

 

(圖3)文件系統級理解ROS架構

1)工做空間

工做空間是一個包含功能包、可編輯源文件和編譯包的文件夾,當你想同時編譯不一樣的功能包時很是有用,而且能夠保存本地開發包。固然,用戶能夠根據本身的須要建立多個工做空間,在每一個工做空間中開發不一樣用途的功能包。不過做爲學習,咱們先以一個工做空間爲例。如圖3,咱們建立了一個名爲catkin_ws的工做空間,該工做空間下會有3個文件夾:srcbuilddevel

src源文件空間:這個文件夾放置各個功能包和一個用於這些功能包的CMake配置文件CMakeLists.txt。這裏作一下說明,因爲ROS中的源碼採用catkin工具進行編譯,而catkin工具又是基於cmake技術的,因此咱們會在src源文件空間和各個功能包中都會見到一個文件CMakeLists.txt,這個文件就是起編譯配置的做用。

build編譯空間:這個文件夾放置CMakecatkin編譯功能包時產生的緩存、配置、中間文件等。

devel開發空間:這個文件夾放置編譯好的可執行程序,這些可執行程序是不須要安裝就能直接運行的。一旦功能包源碼編譯和測試經過後,能夠將這些編譯好的可執行文件直接導出與其餘開發人員分享。

2)功能包

功能包是ROS中軟件組織的基本形式,一個功能包具備用於建立ROS程序的最小結構和最少內容,它能夠包含ROS運行的進程(節點)、配置文件等。如圖3,一個功能包中主要包含這幾個文件:

CMakeLists.txt功能包配置文件:用於這個功能包cmake編譯時的配置文件。

package.xml功能包清單文件:用xml的標籤格式標記這個功能包的各種相關信息,好比包的名稱、依賴關係等。主要做用是爲了更容易的安裝和分發功能包。

include/<package_name>功能包頭文件目錄:你能夠把你的功能包程序包含的*.h頭文件放在這裏,include下之因此還要加一級路徑<package_name>是爲了更好的區分本身定義的頭文件和系統標準頭文件<package_name>用實際功能包的名稱替代。不過這個文件夾不是必要項,好比有些程序沒有頭文件的狀況。

msg非標準消息定義目錄:消息是ROS中一個進程(節點)發送到其餘進程(節點)的信息,消息類型是消息的數據結構,ROS系統提供了不少標準類型的消息能夠直接使用,若是你要使用一些非標準類型的消息,就須要本身來定義該類型的消息,並把定義的文件放在這裏。不過這個文件夾不是必要項,好比程序中只使用標準類型的消息的狀況。

srv服務類型定義目錄:服務是ROS中進程(節點)間的請求/響應通訊過程,服務類型是服務請求/響應的數據結構,服務類型的定義放在這裏。若是要調用此服務,你須要使用該功能包名稱和服務名稱。不過這個文件夾不是必要項,好比程序中不使用服務的狀況。

scripts可執行腳本文件存放目錄:這裏用於存放bashpython或其餘腳本的可執行文件。不過這個文件夾不是必要項,好比程序中不使用可執行腳本的狀況。

launch文件目錄:這裏用於存放*.launch文件,*.launch文件用於啓動ROS功能包中的一個或多個節點,在含有多個節點啓動的大型項目中頗有用。不過這個文件夾不是必要項,節點也能夠不經過launch文件啓動。

src功能包中節點源文件存放目錄:一個功能包中能夠有多個進程(節點)程序來完成不一樣的功能,每一個進程(節點)程序都是能夠單獨運行的,這裏用於存放這些進程(節點)程序的源文件,你能夠在這裏再建立文件夾和文件來按你的需求組織源文件,源文件能夠用c++、python等來書寫。

爲了建立、修改、使用功能包,ROS給咱們提供了一些實用的工具,經常使用的有下面這些工具。

rospack:用於獲取信息或在系統中查找工做空間。

catkin_create_pkg:用於在工做空間的src源空間下建立一個新的功能包。

catkin_make:用於編譯工做空間中的功能包。

rosdep:用於安裝功能包的系統依賴項。

rqt_dep:用於查看功能包的依賴關係圖。

關於這些工具命令的具體使用方法,會在後面的章節中結合實例進行具體的講解。這裏只是先介紹給你們,讓你們有個概念上的瞭解,感興趣的朋友也能夠本身上網瞭解這些命令的具體用法。

3)消息

消息是ROS中一個進程(節點)發送到其餘進程(節點)的信息,消息類型是消息的數據結構,ROS系統提供了不少標準類型的消息能夠直接使用,若是你要使用一些非標準類型的消息,就須要本身來定義該類型的消息。

ROS使用了一種精簡的消息類型描述語言來描述ROS進程(節點)發佈的數據值。經過這種描述語言對消息類型的定義,ROS能夠在不一樣的編程語言(如c++、python等)書寫的程序中使用此消息。不論是ROS系統提供的標準類型消息,仍是用戶自定義的非標準類型消息,定義文件都是以*.msg做爲擴展名。消息類型的定義分爲兩個主要部分:字段的數據類型和字段的名稱,簡單點說就是結構體中的變量類型和變量名稱。好比下面的一個示例消息定義文件example.msg的內容,如圖4,int3二、float3二、string就是字段的數據類型,id、vel、name就是字段的名稱。

(圖4)一個示例消息定義文件

在大多數狀況下,咱們均可以使用ROS系統提供的標準類型的消息來完成任務,這得益於ROS系統提供了豐富的標準類型的消息。常常用到的類型包括:基本類型(std_msgs)、通用類型(sensor_msgsgeometry_msgsnav_msgsactionlib_msgs),如圖5

5ROS系統提供的經常使用標準類型的消息

不難發現std_msgs下面定義的是經ROS封裝後的最基本的數據類型,好比BoolCharInt16等;sensor_msgs下面定義的是跟傳感器數據相關的數據類型,好比Image對應的就是攝像頭的數據類型,Imu對應的就是IMU傳感器的數據類型,LaserScan對應的就是激光雷達的數據類型,PointCloud對應的就是點雲掃描傳感器(如深度相機)的數據類型,Range對應的就是距離測量傳感器(如超聲波、紅外測距)的數據類型;geometry_msgs下定義的是跟幾何有關的數據類型,好比Pose用來描述機器人在空間的位姿,Quaternion用四元數描述空間方向,Transform用來描述不一樣座標系之間的轉移關係,Twist用來描述機器人運動時的位姿、速度等狀態信息;nav_msgs下定義的是跟機器人導航相關的數據類型,好比OccupancyGrid是柵格地圖的數據類型,Odometry是機器人經過輪式碼盤或其餘方式融合獲得的里程計的數據類型,Path是路徑規劃算法計算獲得的導航路勁的數據類型;actionlib_msgs下定義的是actionlib控制過程相關的數據類型,好比GoalID描述發送出去的導航目標的ID號,GoalStatus描述執行導航目標過程的過程狀態信息。若是想了解更多ROS系統的消息類型的細節,最好的方式是去ROS wiki看官方的文檔,連接以下:

http://wiki.ros.org/std_msgs/

http://wiki.ros.org/common_msgs/

4)服務

服務是ROS中進程(節點)間的請求/響應通訊過程,服務類型是服務請求/響應的數據結構。服務類型的定義借鑑了消息類型的定義方式,因此這裏就不在贅述了。區別在於,消息數據是ROS進程(節點)間多對多廣播式通訊過程當中傳遞的信息;服務數據是ROS進程(節點)間點對點的請求/響應通訊過程傳遞的信息。

2.2.從計算圖級理解ROS架構       

ROS會建立一個鏈接全部進程(節點)的網絡,其中的任何進程(節點)均可以訪問此網絡,並經過該網絡與其餘進程(節點)交互,獲取其餘進程(節點)發佈的信息,並將自身數據發佈到網絡上,這個計算圖網絡中的節點(node)、主題(topic)、服務(server)等都要有惟一的名稱作標識,如圖6。

(圖6)計算圖級理解ROS架構

1)節點

節點是主要的計算執行進程,功能包中建立的每一個可執行程序在被啓動加載到系統進程中後,該進程就是一個ROS節點,如圖6中的node一、node二、node3等都是節點(node)。節點都是各自獨立的可執行文件,可以經過主題(topic)、服務(server)或參數服務器(parameter server)與其餘節點通訊。ROS經過使用節點將代碼和功能解耦,提升了系統的容錯力和可維護性。因此你最好讓每個節點都具備特定的單一的功能,而不是建立一個一應俱全的大節點。節點若是用c++進行編寫,須要用到ROS提供的庫roscpp;節點若是用python進行編寫,須要用到ROS提供的庫rospy。

ROS提供了處理節點的工具,用於節點信息、狀態、可用性等的查詢操做,例如能夠用下面的命令對正在運行的節點進行操做。

rosnode info <node_name>:用於輸出當前節點信息。

rosnode kill <node_name>:用於殺死正在運行節點進程來結束節點的運行。

rosnode list:用於列出當前活動的節點。

rosnode machine <hostname>:用於列出指定計算機上運行的節點。

rosnode ping <node_name>:用於測試節點間的網絡連通性。

rosnode cleanup:用於將沒法訪問節點的註冊信息清除。

關於這些工具命令的具體使用方法,會在後面的章節中結合實例進行具體的講解。這裏只是先介紹給你們,讓你們有個概念上的瞭解,感興趣的朋友也能夠本身上網瞭解這些命令的具體用法。

2)消息

節點經過消息(message)完成彼此的溝通。消息包含一個節點發送給其餘節點的信息數據。關於消息類型的知識在前面已經講述了,這裏就再也不展開。

ROS提供了獲取消息相關信息的命令工具,這裏列舉出一些經常使用的命令,來具體看看吧。

rosmsg show <message_type>:用於顯示一條消息的字段。

rosmsg list:用於列出全部消息。

rosmsg package <package _name>:用於列出功能包的全部消息。

rosmsg packages:用於列出全部具備該消息的功能包。

rosmsg users <message_type>:用於搜索使用該消息類型的代碼文件。

rosmsg md5 <message_type>:用於顯示一條消息的MD5求和結果。

關於這些工具命令的具體使用方法,會在後面的章節中結合實例進行具體的講解。這裏只是先介紹給你們,讓你們有個概念上的瞭解,感興趣的朋友也能夠本身上網瞭解這些命令的具體用法。

(3)主題

每一個消息都必須發佈到相應的主題(topic),經過主題來實如今ROS計算圖網絡中的路由轉發。當一個節點發送數據時,咱們就說該節點正在向主題發佈消息;節點能夠經過訂閱某個主題,接收來自其餘節點的消息。經過主題進行消息路由不須要節點之間直接鏈接,這就意味着發佈者節點和訂閱者節點之間不須要知道彼此是否存在,這樣就保證了發佈者節點與訂閱者節點之間的解耦合。同一個主題能夠有多個訂閱者也能夠有多個發佈者,不過要注意必須使用不一樣的節點發布同一個主題。每一個主題都是強類型的,不論是發佈消息到主題仍是從主題中訂閱消息,發佈者和訂閱者定義的消息類型必須與主題的消息類型相匹配。

ROS提供了操做主題的命令工具,這裏列舉出一些經常使用的命令,來具體看看吧。

rostopic bw </topic_name>:用於顯示主題所使用的帶寬。

rostopic echo </topic_name>:用於將主題中的消息數據輸出到屏幕。

rostopic find <message_type>:用於按照消息類型查找主題。

rostopic hz </topic_name>:用於顯示主題的發佈頻率。

rostopic info </topic_name>:用於輸出活動主題、發佈的主題、主題訂閱者和服務的信息。

rostopic list:用於列出當前活動主題的列表。

rostopic pub </topic_name> <message_type> <args>:用於經過命令行將數據發佈到主題。

rostopic type </topic_name>:用於輸出主題中發佈的消息類型。

關於這些工具命令的具體使用方法,會在後面的章節中結合實例進行具體的講解。這裏只是先介紹給你們,讓你們有個概念上的瞭解,感興趣的朋友也能夠本身上網瞭解這些命令的具體用法。

4)服務

在一些特殊的場合,節點間須要點對點的高效率通訊並及時獲取應答,這個時候就須要用服務的方式進行交互。提供服務的節點叫服務端,向服務端發起請求並等待響應的節點叫客戶端,客戶端發起一次請求並獲得服務端的一次響應,這樣就完成了一次服務通訊過程,例如圖6中,node1node3發起一次請求,並獲得node3返回給node1的響應。服務通訊過程當中服務的數據類型須要用戶本身定義,與消息不一樣,節點並不提供標準服務類型。服務類型的定義文件都是以*.srv爲擴展名,而且被放在功能包的srv/文件夾下。

ROS提供了操做服務的命令工具,這裏列舉出一些經常使用的命令,來具體看看吧。

rosservice call </service_name> <args>:用於經過命令行參數調用服務。

rosservice find <service_type>:用於根據服務類型查詢服務。

rosservice info </service_name>:用於輸出服務信息。

rosservice list:用於列出活動服務清單。

rosservice type </service_name>:用於輸出服務類型。

rosservice uri </service_name>:用於輸出服務的ROSRPC URI。

關於這些工具命令的具體使用方法,會在後面的章節中結合實例進行具體的講解。這裏只是先介紹給你們,讓你們有個概念上的瞭解,感興趣的朋友也能夠本身上網瞭解這些命令的具體用法。

5)節點管理器

節點管理器(master)用於節點的名稱註冊和查找等,也負責設置節點間的通訊。若是在你的整個ROS系統中沒有節點管理器,就不會有節點、消息、服務之間的通訊。因爲ROS自己就是一個分佈式的網絡系統,因此你能夠在某臺計算機上運行節點管理器,在這臺計算機和其餘臺計算機上運行節點。

ROS中提供了跟節點管理器相關的命令行工具,就是roscre。

roscore:用於啓動節點管理器,這個命令會加載ROS節點管理器和其餘ROS核心組件。

關於這些工具命令的具體使用方法,會在後面的章節中結合實例進行具體的講解。這裏只是先介紹給你們,讓你們有個概念上的瞭解,感興趣的朋友也能夠本身上網瞭解這些命令的具體用法。

6)參數服務器

參數服務器(parameter server)可以使數據經過關鍵詞存儲在一個系統的核心位置。經過使用參數,就可以在節點運行時動態配置節點或改變節點的工做任務。參數服務器是可經過網絡訪問的共享的多變量字典,節點使用此服務器來存儲和檢索運行時的參數。

ROS中關於參數服務器的命令行工具,請看下面的經常使用命令。

rosparam list:用於列出參數服務器中的全部參數。

rosparam get <parameter_name>:用於獲取參數服務器中的參數值。

rosparam set <parameter_name> <value>:用於設置參數服務器中參數的值。

rosparam delete <parameter_name>:用於將參數從參數服務器中刪除。

rosparam dump <file>:用於將參數服務器的參數保存到一個文件。

rosparam load <file>:用於從文件將參數加載到參數服務器。

關於這些工具命令的具體使用方法,會在後面的章節中結合實例進行具體的講解。這裏只是先介紹給你們,讓你們有個概念上的瞭解,感興趣的朋友也能夠本身上網瞭解這些命令的具體用法。

7)消息記錄包

消息記錄包(bag)是一種用於保存和回放ROS消息數據的文件格式。消息記錄包是一種用於存儲數據的重要機制,它能夠幫助記錄一些難以收集的傳感器數據,而後經過反覆回放數據進行算法的性能開發和測試。ROS建立的消息記錄包文件以*.bag爲擴展名,經過播放、中止、後退操做該文件,能夠像實時會話同樣在ROS中再現情景,便於算法的反覆調試。

ROS提供消息記錄包相關的命令行工具,請看下面的經常使用命令。

rosbag <args>:用來錄製、播放和執行操做。

關於這些工具命令的具體使用方法,會在後面的章節中結合實例進行具體的講解。這裏只是先介紹給你們,讓你們有個概念上的瞭解,感興趣的朋友也能夠本身上網瞭解這些命令的具體用法。

2.3.從開源社區級理解ROS架構     

ROS開源社區級的概念主要是ROS資源,即經過各個獨立的網絡社區分享ROS方面的軟件和知識。

1ROS發行版

ROS發行版跟Linux發行版起相似的做用,ROS發行版是內置了一系列經常使用功能包的ROS系統安裝包,能夠被直接安裝到咱們的操做系統中。如圖7,是ROS的各個發行版。

(圖7ROS的各個發行版

2ROS軟件代碼庫

ROS依賴於開源或共享軟件的源代碼,這些代碼由不一樣的機構共享與發佈,好比github源碼共享,ubuntu軟件倉庫等等。如圖8,是ROS軟件代碼庫的社區組織形式。

8ROS軟件代碼庫的社區組織形式

3ROS文檔社區

ROS wiki是記錄有關ROS系統各類文檔的主要論壇社區,任何人均可以註冊帳戶、貢獻本身的文件、提供更正或更新、編寫教程及其餘行爲。感興趣能夠進入ROS wiki的主頁面瞧瞧http://wiki.ros.org/

4ROS問答社區

ROS開發者能夠經過這個資源去提問和尋找ROS相關的答案,ROS Answer主頁面

https://answers.ros.org/

後記                                        

------SLAM+語音機器人DIY系列【目錄】快速導覽------

第1章:Linux基礎

1.Linux簡介

2.安裝Linux發行版ubuntu系統

3.Linux命令行基礎操做

第2章:ROS入門

1.ROS是什麼

2.ROS系統總體架構

3.在ubuntu16.04中安裝ROS kinetic

4.如何編寫ROS的第一個程序hello_world

5.編寫簡單的消息發佈器和訂閱器

6.編寫簡單的service和client

7.理解tf的原理

8.理解roslaunch在大型項目中的做用

9.熟練使用rviz

10.在實際機器人上運行ROS高級功能預覽

第3章:感知與大腦

1.ydlidar-x4激光雷達

2.帶自校準九軸數據融合IMU慣性傳感器

3.輪式里程計與運動控制

4.音響麥克風與攝像頭

5.機器人大腦嵌入式主板性能對比

6.作一個能走路和對話的機器人

第4章:差分底盤設計

1.stm32主控硬件設計

2.stm32主控軟件設計

3.底盤通訊協議

4.底盤ROS驅動開發

5.底盤PID控制參數整定

6.底盤裏程計標

第5章:樹莓派3開發環境搭建

1.安裝系統ubuntu_mate_16.04

2.安裝ros-kinetic

3.裝機後一些實用軟件安裝和系統設置

4.PC端與robot端ROS網絡通訊

5.Android手機端與robot端ROS網絡通訊

6.樹莓派USB與tty串口號綁定

7.開機自啓動ROS節點

第6章:SLAM建圖與自主避障導航

1.在機器人上使用傳感器

2.google-cartographer機器人SLAM建圖

3.ros-navigation機器人自主避障導航

4.多目標點導航及任務調度

5.機器人巡航與現場監控

第7章:語音交互與天然語言處理

1.語音交互相關技術

2.機器人語音交互實現

3.天然語言處理雲計算引擎

第8章:高階拓展

1.miiboo機器人安卓手機APP開發

2.centos7下部署Django(nginx+uwsgi+django+python3)

----------------文章將持續更新,敬請關注-----------------

 

若是你們對博文的相關類容感興趣,或有什麼技術疑問,歡迎加入下面的《SLAM+語音機器人DIY》QQ技術交流羣,一塊兒討論學習^_^

關於咱們:

視頻教程:

 

https://www.bilibili.com/video/av61448040

相關文章
相關標籤/搜索