ROS機器人操做系統在機器人應用領域很流行,依託代碼開源和模塊間協做等特性,給機器人開發者帶來了很大的方便。咱們的機器人「miiboo」中的大部分程序也採用ROS進行開發,因此本文就重點對ROS基礎知識進行詳細的講解,給不熟悉ROS的朋友起到一個拋磚引玉的做用。本章節主要內容:html
1.ROS是什麼node
2.ROS系統總體架構python
3.在ubuntu16.04中安裝ROS kineticnginx
6.編寫簡單的service和clientgithub
8.理解roslaunch在大型項目中的做用django
因爲ROS系統的組織架構比較複雜,簡單從一個方面來講明很難說清楚。按照ROS官方的說法,咱們能夠從3個方面來理解ROS系統總體架構,這3個方面分別是文件系統級、計算圖級、開源社區級。
若是你是剛剛接手ROS方面的開發或項目,你確定會以爲ROS中的各類概念很是奇怪,可是當你對ROS的使用熟練以後,你就以爲這些概念很好理解了。與其餘操做系統類似,一個ROS程序的不一樣組件要被放在不一樣的文件夾下,這些文件夾是根據不一樣的功能來對文件進行組織的,如圖3。
(圖3)文件系統級理解ROS架構
(1)工做空間
工做空間是一個包含功能包、可編輯源文件和編譯包的文件夾,當你想同時編譯不一樣的功能包時很是有用,而且能夠保存本地開發包。固然,用戶能夠根據本身的須要建立多個工做空間,在每一個工做空間中開發不一樣用途的功能包。不過做爲學習,咱們先以一個工做空間爲例。如圖3,咱們建立了一個名爲catkin_ws的工做空間,該工做空間下會有3個文件夾:src、build、devel。
src源文件空間:這個文件夾放置各個功能包和一個用於這些功能包的CMake配置文件CMakeLists.txt。這裏作一下說明,因爲ROS中的源碼採用catkin工具進行編譯,而catkin工具又是基於cmake技術的,因此咱們會在src源文件空間和各個功能包中都會見到一個文件CMakeLists.txt,這個文件就是起編譯配置的做用。
build編譯空間:這個文件夾放置CMake和catkin編譯功能包時產生的緩存、配置、中間文件等。
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可執行腳本文件存放目錄:這裏用於存放bash、python或其餘腳本的可執行文件。不過這個文件夾不是必要項,好比程序中不使用可執行腳本的狀況。
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_msgs、geometry_msgs、nav_msgs、actionlib_msgs),如圖5。
(圖5)ROS系統提供的經常使用標準類型的消息
不難發現std_msgs下面定義的是經ROS封裝後的最基本的數據類型,好比Bool、Char、Int16等;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/common_msgs/
(4)服務
服務是ROS中進程(節點)間的請求/響應通訊過程,服務類型是服務請求/響應的數據結構。服務類型的定義借鑑了消息類型的定義方式,因此這裏就不在贅述了。區別在於,消息數據是ROS進程(節點)間多對多廣播式通訊過程當中傳遞的信息;服務數據是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中,node1向node3發起一次請求,並獲得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>:用來錄製、播放和執行操做。
關於這些工具命令的具體使用方法,會在後面的章節中結合實例進行具體的講解。這裏只是先介紹給你們,讓你們有個概念上的瞭解,感興趣的朋友也能夠本身上網瞭解這些命令的具體用法。
ROS開源社區級的概念主要是ROS資源,即經過各個獨立的網絡社區分享ROS方面的軟件和知識。
(1)ROS發行版
ROS發行版跟Linux發行版起相似的做用,ROS發行版是內置了一系列經常使用功能包的ROS系統安裝包,能夠被直接安裝到咱們的操做系統中。如圖7,是ROS的各個發行版。
(圖7)ROS的各個發行版
(2)ROS軟件代碼庫
ROS依賴於開源或共享軟件的源代碼,這些代碼由不一樣的機構共享與發佈,好比github源碼共享,ubuntu軟件倉庫等等。如圖8,是ROS軟件代碼庫的社區組織形式。
(圖8)ROS軟件代碼庫的社區組織形式
(3)ROS文檔社區
ROS wiki是記錄有關ROS系統各類文檔的主要論壇社區,任何人均可以註冊帳戶、貢獻本身的文件、提供更正或更新、編寫教程及其餘行爲。感興趣能夠進入ROS wiki的主頁面瞧瞧http://wiki.ros.org/。
(4)ROS問答社區
ROS開發者能夠經過這個資源去提問和尋找ROS相關的答案,ROS Answer主頁面
------SLAM+語音機器人DIY系列【目錄】快速導覽------
第1章:Linux基礎
第2章:ROS入門
第3章:感知與大腦
第4章:差分底盤設計
第5章:樹莓派3開發環境搭建
第6章:SLAM建圖與自主避障導航
2.google-cartographer機器人SLAM建圖
第7章:語音交互與天然語言處理
第8章:高階拓展
2.centos7下部署Django(nginx+uwsgi+django+python3)
----------------文章將持續更新,敬請關注-----------------
若是你們對博文的相關類容感興趣,或有什麼技術疑問,歡迎加入下面的《SLAM+語音機器人DIY》QQ技術交流羣,一塊兒討論學習^_^
關於咱們:
視頻教程: