初识ROS
??需要用到ROS,就來學學ROS。作為小白一個,文章難免出錯,請各位海涵。幫我多多指錯。這篇文章的目的是讓新手對于ROS有個簡單的認識,講的基本都是概念上的東西。希望這篇文章能夠解釋清楚以下幾個問題:
??1.ROS是什么/ROS能干什么?
??2.ROS的基礎結構是什么?
??3.ROS部分專有名詞的解釋:ROS節點(node)、節點管理器(master)、參數服務器(parameter server)、消息(message)、話題(topic)、服務(service)、消息記錄包(bag)
1.ROS是什么/ROS能干什么?
??ROS全稱是Robot Operating System,也就是機器人操作系統。從字面上就知道是幫助我們操作機器人的。但和Linux這種底層的os不同,ROS是基于底層os的,也就是在Linux之上,可以理解成在Linux之上做了封裝以便于可以直接調用那些用于操作機器人的各種包。ROS的有幾個版本,對應的也有不同的Linux環境(網上一查都有,不是重點,在此不再贅述。不過筆者用的是kinetic對應的就是ubuntu16.04啦~)。
??那ROS有什么好處呢?為什么要用ROS呢?這要從ROS的設計目標談起:ROS便于機器人研發中的代碼復用,是一種分布式的進程框架,核心在于可以同步或者異步傳遞消息數據的中間件框架。簡單點兒說就是ROS的模塊性和復用性特別好,這樣開發者就可以專注于主邏輯的設計。也有點兒像拼積木(積木塊已經被造好)。我覺得另一個優勢是:ROS使用簡化的類型描述語言描述ros發布的數據,通過這種描述語言,ros可以使用多種編程語言(C++ PYTHON java matlab)編寫不同節點,實現節點間的通信(不局限于一種,可太棒了!)
??對于ROS能干什么?其實我覺得就是用來開發機器人吧。現在各種機器人無論是UAV、UGV其實都是基于ROS上在做開發滴。要想讓robot做點兒個性化的事情,ROS應該是要學滴。而且ROS現在已經被認定為了一個標準(好消息:開源!)。
2.ROS的基礎結構是什么?
??先不關與ROS具體有什么,先從宏觀上給它打個樣兒。ROS的體系結構大致有三部分:ROS文件系統、ROS計算圖、ROS社區
??ROS文件系統:文件系統其實就是ROS文件的組織結構,了解了文件系統就會知道程序執行到哪步時調用了哪個文件。文件系統有很多基礎性的概念:package、manifest。
??ROS計算圖:計算圖相當于ROS運行的機制,包括節點如何通信等等。有的地方也叫做計算網絡,所有節點都可以連入這個網絡中進行通信。我覺得這個是ROS的最核心部分吧。設計的概念包括:node、master、message、topic、service
??ROS社區:很少看到有把社區放在架構里面的,但ROS目前看來像一個完全開源的東西。開源項目就需要社區去維護,可能最開始設計定下的基調就是這樣吧。
(上文提到了很多概念,我在下文都會一一解釋)
3.ROS概念解釋(按照結構劃分說了)
package(功能包)
??package其實可以算組織ROS代碼的一個基本單位。ROS中package更多指的是代碼包。如果說最大的應該算workspace(工作空間),工作空間內包括代碼空間(src,放實現應用的主要代碼可以是cpp/py),編譯空間(build,主要是編譯環境catkin_make之后基本不用管),開發空間(devel,保存編譯完的包),安裝空間(install,這個通過命令生成以后基本用不到了)。package也就是代碼空間下的一個基本單位。一個應用對應于一個package。ROS利用package實現模塊性和復用性
??package的結構如下圖(因為只是介紹基本概念,所以就不詳細說各個文件的作用了~)
??圖源:ROS學習筆記(一) ROS文件系統_我本傲驕的博客-CSDN博客
manifest
??全稱叫package manifest,為package之間提供依賴性。其中保存的是package的一些基本信息:版本、維護者、依賴選項、編譯標志等等。落實到具體文件就是package里面那個package.xml
metapackage(元功能包)
??metapackage是比package高一個級別的概念,是package的集合。以前也叫stack,現在以及廢棄
metapackage manifest
??這個比manifest高一個級別,功能類似于manifest,只不過是針對于metapackage
node(節點)
??ROS整體上是一個分布式的架構,也就是有很多個節點組成。或許也可以說成ROS的基本動作執行單位,可以為節點分配任務。同一個workspace下不能有同名節點(這樣無法確定),但不同工作空間下可以有同名節點
作為一個整體,節點之間也要有相互的協作。ROS有自己的通信機制,下面介紹一下:
??ROS的通信手段有兩種:消息傳遞、服務調用
message(消息)/topic(主題)
??message就對應于消息傳遞,但消息不能直接就傳過去。要借助載體:也就是topic(可以理解為管道)。如果一個節點想發送消息,就要選擇一個topic(這個topic可以是自己創造的或者是別人創造的),選topic發message這個動作就是pulish(發布)。如果想接受消息,也要通過topic。而這個動作叫做subscribe(訂閱)。兩個節點根據動作,分別稱為publisher和subscriber。
server(服務)
??server對應于服務調用,不過server受眾小一點兒。單指兩個節點之間。服務調用的流程是:client節點發送request給server節點,server節點執行處理后,發送response給client節點
??那消息傳遞和服務調用有什么區別呢?
????1)服務調用實現一對一,消息傳遞實現多對多。服務調用只是兩方之間,消息傳遞中同一個topic可以有多個發布者和多個訂閱者(也有一個限制:兩個發布者發布的同名消息,類型必須一致)
????2)服務調用(雙向),消息傳遞(單向)。服務中發送方會等待接收方的response,而消息傳遞中發布者發送完就不再管這個消息了——單向傳輸系統(有點兒像計網中TCP和UDP,其實在ROS中叫rostcp/rosudp)
????3)服務調用是同步的,消息傳遞是異步的。所以在消息傳遞過程中常常設置隊列作為緩沖區來調節發送速率。
????4)topic常用于數據傳輸,而service常用于邏輯處理。
master(節點管理器)
??節點多了總要有個頭兒,master就是負責管理所有節點。它會掌管與各個節點之間有關的topic、service信息列表。雖然說有管理者,但通信時消息直接從發布節點到訂閱節點,中間不經過節點管理器。ROS參數服務器是節點管理器的一部分,所有節點都可訪問修改數據(數據/配置信息)。所有例子中先roscore一下,啟動的就是master。但如果兩個節點已經通過master建立了聯系,并開始進行了通信。這時關掉master是不會影響兩個節點的通信的。master只在建立連接時起到作用。
bag(消息記錄包)
??一個包是ROS中用于存儲ROS 消息數據的文件格式。即保存和回放ROS消息數據的文件格式。包的擴展名為.bag。當使用復雜機器人時,采集數據較為繁瑣。就可以通過bag保存一次數據,后面的仿真時可以回放bag中的數據達到同樣的目的。
??這里解釋一個例子:判斷ros是否安裝成功都會使用一個小烏龜移動的例子,那為什么小海龜可以移動呢?這個過程是這樣的:
/teleop_turtle 節點會以消息的形式將這些運動控制命令發布到 話題/turtle1/cmd_vel; 與此同時,因為turtlesim_node 訂閱了該話題,因此它會接收到這個些消息,控制海龜按照該預定的速度移動
參考資料:
ROS入門學習 - coding-for-self - 博客園(cnblogs.com)
ROS核心概念、工作空間 和 功能包。ROS學習資源_Bruce’s blog-CSDN博客
因作者水平有限,如果錯誤之處,請在下方評論區指出,謝謝!
總結
- 上一篇: 编译原理绪论
- 下一篇: 树:二叉树的非递归遍历算法