SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构
摘要 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
ROS機(jī)器人操作系統(tǒng)在機(jī)器人應(yīng)用領(lǐng)域很流行,依托代碼開源和模塊間協(xié)作等特性,給機(jī)器人開發(fā)者帶來了很大的方便。我們的機(jī)器人“miiboo”中的大部分程序也采用ROS進(jìn)行開發(fā),所以本文就重點(diǎn)對(duì)ROS基礎(chǔ)知識(shí)進(jìn)行詳細(xì)的講解,給不熟悉ROS的朋友起到一個(gè)拋磚引玉的作用。本章節(jié)主要內(nèi)容:
1.ROS是什么
2.ROS系統(tǒng)整體架構(gòu)
3.在ubuntu16.04中安裝ROS kinetic
4.如何編寫ROS的第一個(gè)程序hello_world
5.編寫簡(jiǎn)單的消息發(fā)布器和訂閱器
6.編寫簡(jiǎn)單的service和client
7.理解tf的原理
8.理解roslaunch在大型項(xiàng)目中的作用
9.熟練使用rviz
10.在實(shí)際機(jī)器人上運(yùn)行ROS高級(jí)功能預(yù)覽
2.ROS系統(tǒng)整體架構(gòu)??????????????????
由于ROS系統(tǒng)的組織架構(gòu)比較復(fù)雜,簡(jiǎn)單從一個(gè)方面來說明很難說清楚。按照ROS官方的說法,我們可以從3個(gè)方面來理解ROS系統(tǒng)整體架構(gòu),這3個(gè)方面分別是文件系統(tǒng)級(jí)、計(jì)算圖級(jí)、開源社區(qū)級(jí)。
2.1.從文件系統(tǒng)級(jí)理解ROS架構(gòu) ? ??
如果你是剛剛接手ROS方面的開發(fā)或項(xiàng)目,你肯定會(huì)覺得ROS中的各種概念非常奇怪,但是當(dāng)你對(duì)ROS的使用熟練之后,你就覺得這些概念很好理解了。與其他操作系統(tǒng)相似,一個(gè)ROS程序的不同組件要被放在不同的文件夾下,這些文件夾是根據(jù)不同的功能來對(duì)文件進(jìn)行組織的,如圖3。
?
(圖3)文件系統(tǒng)級(jí)理解ROS架構(gòu)
(1)工作空間
工作空間是一個(gè)包含功能包、可編輯源文件和編譯包的文件夾,當(dāng)你想同時(shí)編譯不同的功能包時(shí)非常有用,并且可以保存本地開發(fā)包。當(dāng)然,用戶可以根據(jù)自己的需要?jiǎng)?chuàng)建多個(gè)工作空間,在每個(gè)工作空間中開發(fā)不同用途的功能包。不過作為學(xué)習(xí),我們先以一個(gè)工作空間為例。如圖3,我們創(chuàng)建了一個(gè)名為catkin_ws的工作空間,該工作空間下會(huì)有3個(gè)文件夾:src、build、devel。
src源文件空間:這個(gè)文件夾放置各個(gè)功能包和一個(gè)用于這些功能包的CMake配置文件CMakeLists.txt。這里做一下說明,由于ROS中的源碼采用catkin工具進(jìn)行編譯,而catkin工具又是基于cmake技術(shù)的,所以我們會(huì)在src源文件空間和各個(gè)功能包中都會(huì)見到一個(gè)文件CMakeLists.txt,這個(gè)文件就是起編譯配置的作用。
build編譯空間:這個(gè)文件夾放置CMake和catkin編譯功能包時(shí)產(chǎn)生的緩存、配置、中間文件等。
devel開發(fā)空間:這個(gè)文件夾放置編譯好的可執(zhí)行程序,這些可執(zhí)行程序是不需要安裝就能直接運(yùn)行的。一旦功能包源碼編譯和測(cè)試通過后,可以將這些編譯好的可執(zhí)行文件直接導(dǎo)出與其他開發(fā)人員分享。
(2)功能包
功能包是ROS中軟件組織的基本形式,一個(gè)功能包具有用于創(chuàng)建ROS程序的最小結(jié)構(gòu)和最少內(nèi)容,它可以包含ROS運(yùn)行的進(jìn)程(節(jié)點(diǎn))、配置文件等。如圖3,一個(gè)功能包中主要包含這幾個(gè)文件:
CMakeLists.txt功能包配置文件:用于這個(gè)功能包cmake編譯時(shí)的配置文件。
package.xml功能包清單文件:用xml的標(biāo)簽格式標(biāo)記這個(gè)功能包的各類相關(guān)信息,比如包的名稱、依賴關(guān)系等。主要作用是為了更容易的安裝和分發(fā)功能包。
include/<package_name>功能包頭文件目錄:你可以把你的功能包程序包含的*.h頭文件放在這里,include下之所以還要加一級(jí)路徑<package_name>是為了更好的區(qū)分自己定義的頭文件和系統(tǒng)標(biāo)準(zhǔn)頭文件,<package_name>用實(shí)際功能包的名稱替代。不過這個(gè)文件夾不是必要項(xiàng),比如有些程序沒有頭文件的情況。
msg非標(biāo)準(zhǔn)消息定義目錄:消息是ROS中一個(gè)進(jìn)程(節(jié)點(diǎn))發(fā)送到其他進(jìn)程(節(jié)點(diǎn))的信息,消息類型是消息的數(shù)據(jù)結(jié)構(gòu),ROS系統(tǒng)提供了很多標(biāo)準(zhǔn)類型的消息可以直接使用,如果你要使用一些非標(biāo)準(zhǔn)類型的消息,就需要自己來定義該類型的消息,并把定義的文件放在這里。不過這個(gè)文件夾不是必要項(xiàng),比如程序中只使用標(biāo)準(zhǔn)類型的消息的情況。
srv服務(wù)類型定義目錄:服務(wù)是ROS中進(jìn)程(節(jié)點(diǎn))間的請(qǐng)求/響應(yīng)通信過程,服務(wù)類型是服務(wù)請(qǐng)求/響應(yīng)的數(shù)據(jù)結(jié)構(gòu),服務(wù)類型的定義放在這里。如果要調(diào)用此服務(wù),你需要使用該功能包名稱和服務(wù)名稱。不過這個(gè)文件夾不是必要項(xiàng),比如程序中不使用服務(wù)的情況。
scripts可執(zhí)行腳本文件存放目錄:這里用于存放bash、python或其他腳本的可執(zhí)行文件。不過這個(gè)文件夾不是必要項(xiàng),比如程序中不使用可執(zhí)行腳本的情況。
launch文件目錄:這里用于存放*.launch文件,*.launch文件用于啟動(dòng)ROS功能包中的一個(gè)或多個(gè)節(jié)點(diǎn),在含有多個(gè)節(jié)點(diǎn)啟動(dòng)的大型項(xiàng)目中很有用。不過這個(gè)文件夾不是必要項(xiàng),節(jié)點(diǎn)也可以不通過launch文件啟動(dòng)。
src功能包中節(jié)點(diǎn)源文件存放目錄:一個(gè)功能包中可以有多個(gè)進(jìn)程(節(jié)點(diǎn))程序來完成不同的功能,每個(gè)進(jìn)程(節(jié)點(diǎn))程序都是可以單獨(dú)運(yùn)行的,這里用于存放這些進(jìn)程(節(jié)點(diǎn))程序的源文件,你可以在這里再創(chuàng)建文件夾和文件來按你的需求組織源文件,源文件可以用c++、python等來書寫。
為了創(chuàng)建、修改、使用功能包,ROS給我們提供了一些實(shí)用的工具,常用的有下面這些工具。
rospack:用于獲取信息或在系統(tǒng)中查找工作空間。
catkin_create_pkg:用于在工作空間的src源空間下創(chuàng)建一個(gè)新的功能包。
catkin_make:用于編譯工作空間中的功能包。
rosdep:用于安裝功能包的系統(tǒng)依賴項(xiàng)。
rqt_dep:用于查看功能包的依賴關(guān)系圖。
關(guān)于這些工具命令的具體使用方法,會(huì)在后面的章節(jié)中結(jié)合實(shí)例進(jìn)行具體的講解。這里只是先介紹給大家,讓大家有個(gè)概念上的了解,感興趣的朋友也可以自己上網(wǎng)了解這些命令的具體用法。
(3)消息
消息是ROS中一個(gè)進(jìn)程(節(jié)點(diǎn))發(fā)送到其他進(jìn)程(節(jié)點(diǎn))的信息,消息類型是消息的數(shù)據(jù)結(jié)構(gòu),ROS系統(tǒng)提供了很多標(biāo)準(zhǔn)類型的消息可以直接使用,如果你要使用一些非標(biāo)準(zhǔn)類型的消息,就需要自己來定義該類型的消息。
ROS使用了一種精簡(jiǎn)的消息類型描述語言來描述ROS進(jìn)程(節(jié)點(diǎn))發(fā)布的數(shù)據(jù)值。通過這種描述語言對(duì)消息類型的定義,ROS可以在不同的編程語言(如c++、python等)書寫的程序中使用此消息。不管是ROS系統(tǒng)提供的標(biāo)準(zhǔn)類型消息,還是用戶自定義的非標(biāo)準(zhǔn)類型消息,定義文件都是以*.msg作為擴(kuò)展名。消息類型的定義分為兩個(gè)主要部分:字段的數(shù)據(jù)類型和字段的名稱,簡(jiǎn)單點(diǎn)說就是結(jié)構(gòu)體中的變量類型和變量名稱。比如下面的一個(gè)示例消息定義文件example.msg的內(nèi)容,如圖4,int32、float32、string就是字段的數(shù)據(jù)類型,id、vel、name就是字段的名稱。
(圖4)一個(gè)示例消息定義文件
在大多數(shù)情況下,我們都可以使用ROS系統(tǒng)提供的標(biāo)準(zhǔn)類型的消息來完成任務(wù),這得益于ROS系統(tǒng)提供了豐富的標(biāo)準(zhǔn)類型的消息。經(jīng)常用到的類型包括:基本類型(std_msgs)、通用類型(sensor_msgs、geometry_msgs、nav_msgs、actionlib_msgs),如圖5。
(圖5)ROS系統(tǒng)提供的常用標(biāo)準(zhǔn)類型的消息
不難發(fā)現(xiàn)std_msgs下面定義的是經(jīng)ROS封裝后的最基本的數(shù)據(jù)類型,比如Bool、Char、Int16等;sensor_msgs下面定義的是跟傳感器數(shù)據(jù)相關(guān)的數(shù)據(jù)類型,比如Image對(duì)應(yīng)的就是攝像頭的數(shù)據(jù)類型,Imu對(duì)應(yīng)的就是IMU傳感器的數(shù)據(jù)類型,LaserScan對(duì)應(yīng)的就是激光雷達(dá)的數(shù)據(jù)類型,PointCloud對(duì)應(yīng)的就是點(diǎn)云掃描傳感器(如深度相機(jī))的數(shù)據(jù)類型,Range對(duì)應(yīng)的就是距離測(cè)量傳感器(如超聲波、紅外測(cè)距)的數(shù)據(jù)類型;geometry_msgs下定義的是跟幾何有關(guān)的數(shù)據(jù)類型,比如Pose用來描述機(jī)器人在空間的位姿,Quaternion用四元數(shù)描述空間方向,Transform用來描述不同坐標(biāo)系之間的轉(zhuǎn)移關(guān)系,Twist用來描述機(jī)器人運(yùn)動(dòng)時(shí)的位姿、速度等狀態(tài)信息;nav_msgs下定義的是跟機(jī)器人導(dǎo)航相關(guān)的數(shù)據(jù)類型,比如OccupancyGrid是柵格地圖的數(shù)據(jù)類型,Odometry是機(jī)器人通過輪式碼盤或其他方式融合得到的里程計(jì)的數(shù)據(jù)類型,Path是路徑規(guī)劃算法計(jì)算得到的導(dǎo)航路勁的數(shù)據(jù)類型;actionlib_msgs下定義的是actionlib控制過程相關(guān)的數(shù)據(jù)類型,比如GoalID描述發(fā)送出去的導(dǎo)航目標(biāo)的ID號(hào),GoalStatus描述執(zhí)行導(dǎo)航目標(biāo)過程的過程狀態(tài)信息。如果想了解更多ROS系統(tǒng)的消息類型的細(xì)節(jié),最好的方式是去ROS wiki看官方的文檔,鏈接如下:
http://wiki.ros.org/std_msgs/
http://wiki.ros.org/common_msgs/
(4)服務(wù)
服務(wù)是ROS中進(jìn)程(節(jié)點(diǎn))間的請(qǐng)求/響應(yīng)通信過程,服務(wù)類型是服務(wù)請(qǐng)求/響應(yīng)的數(shù)據(jù)結(jié)構(gòu)。服務(wù)類型的定義借鑒了消息類型的定義方式,所以這里就不在贅述了。區(qū)別在于,消息數(shù)據(jù)是ROS進(jìn)程(節(jié)點(diǎn))間多對(duì)多廣播式通信過程中傳遞的信息;服務(wù)數(shù)據(jù)是ROS進(jìn)程(節(jié)點(diǎn))間點(diǎn)對(duì)點(diǎn)的請(qǐng)求/響應(yīng)通信過程傳遞的信息。
2.2.從計(jì)算圖級(jí)理解ROS架構(gòu) ? ? ??
ROS會(huì)創(chuàng)建一個(gè)連接所有進(jìn)程(節(jié)點(diǎn))的網(wǎng)絡(luò),其中的任何進(jìn)程(節(jié)點(diǎn))都可以訪問此網(wǎng)絡(luò),并通過該網(wǎng)絡(luò)與其他進(jìn)程(節(jié)點(diǎn))交互,獲取其他進(jìn)程(節(jié)點(diǎn))發(fā)布的信息,并將自身數(shù)據(jù)發(fā)布到網(wǎng)絡(luò)上,這個(gè)計(jì)算圖網(wǎng)絡(luò)中的節(jié)點(diǎn)(node)、主題(topic)、服務(wù)(server)等都要有唯一的名稱做標(biāo)識(shí),如圖6。
(圖6)計(jì)算圖級(jí)理解ROS架構(gòu)
(1)節(jié)點(diǎn)
節(jié)點(diǎn)是主要的計(jì)算執(zhí)行進(jìn)程,功能包中創(chuàng)建的每個(gè)可執(zhí)行程序在被啟動(dòng)加載到系統(tǒng)進(jìn)程中后,該進(jìn)程就是一個(gè)ROS節(jié)點(diǎn),如圖6中的node1、node2、node3等都是節(jié)點(diǎn)(node)。節(jié)點(diǎn)都是各自獨(dú)立的可執(zhí)行文件,能夠通過主題(topic)、服務(wù)(server)或參數(shù)服務(wù)器(parameter server)與其他節(jié)點(diǎn)通信。ROS通過使用節(jié)點(diǎn)將代碼和功能解耦,提高了系統(tǒng)的容錯(cuò)力和可維護(hù)性。所以你最好讓每一個(gè)節(jié)點(diǎn)都具有特定的單一的功能,而不是創(chuàng)建一個(gè)包羅萬象的大節(jié)點(diǎn)。節(jié)點(diǎn)如果用c++進(jìn)行編寫,需要用到ROS提供的庫roscpp;節(jié)點(diǎn)如果用python進(jìn)行編寫,需要用到ROS提供的庫rospy。
ROS提供了處理節(jié)點(diǎn)的工具,用于節(jié)點(diǎn)信息、狀態(tài)、可用性等的查詢操作,例如可以用下面的命令對(duì)正在運(yùn)行的節(jié)點(diǎn)進(jìn)行操作。
rosnode info <node_name>:用于輸出當(dāng)前節(jié)點(diǎn)信息。
rosnode kill <node_name>:用于殺死正在運(yùn)行節(jié)點(diǎn)進(jìn)程來結(jié)束節(jié)點(diǎn)的運(yùn)行。
rosnode list:用于列出當(dāng)前活動(dòng)的節(jié)點(diǎn)。
rosnode machine <hostname>:用于列出指定計(jì)算機(jī)上運(yùn)行的節(jié)點(diǎn)。
rosnode ping <node_name>:用于測(cè)試節(jié)點(diǎn)間的網(wǎng)絡(luò)連通性。
rosnode cleanup:用于將無法訪問節(jié)點(diǎn)的注冊(cè)信息清除。
關(guān)于這些工具命令的具體使用方法,會(huì)在后面的章節(jié)中結(jié)合實(shí)例進(jìn)行具體的講解。這里只是先介紹給大家,讓大家有個(gè)概念上的了解,感興趣的朋友也可以自己上網(wǎng)了解這些命令的具體用法。
(2)消息
節(jié)點(diǎn)通過消息(message)完成彼此的溝通。消息包含一個(gè)節(jié)點(diǎn)發(fā)送給其他節(jié)點(diǎn)的信息數(shù)據(jù)。關(guān)于消息類型的知識(shí)在前面已經(jīng)講述了,這里就不再展開。
ROS提供了獲取消息相關(guān)信息的命令工具,這里列舉出一些常用的命令,來具體看看吧。
rosmsg show <message_type>:用于顯示一條消息的字段。
rosmsg list:用于列出所有消息。
rosmsg package <package _name>:用于列出功能包的所有消息。
rosmsg packages:用于列出所有具有該消息的功能包。
rosmsg users <message_type>:用于搜索使用該消息類型的代碼文件。
rosmsg md5 <message_type>:用于顯示一條消息的MD5求和結(jié)果。
關(guān)于這些工具命令的具體使用方法,會(huì)在后面的章節(jié)中結(jié)合實(shí)例進(jìn)行具體的講解。這里只是先介紹給大家,讓大家有個(gè)概念上的了解,感興趣的朋友也可以自己上網(wǎng)了解這些命令的具體用法。
(3)主題
每個(gè)消息都必須發(fā)布到相應(yīng)的主題(topic),通過主題來實(shí)現(xiàn)在ROS計(jì)算圖網(wǎng)絡(luò)中的路由轉(zhuǎn)發(fā)。當(dāng)一個(gè)節(jié)點(diǎn)發(fā)送數(shù)據(jù)時(shí),我們就說該節(jié)點(diǎn)正在向主題發(fā)布消息;節(jié)點(diǎn)可以通過訂閱某個(gè)主題,接收來自其他節(jié)點(diǎn)的消息。通過主題進(jìn)行消息路由不需要節(jié)點(diǎn)之間直接連接,這就意味著發(fā)布者節(jié)點(diǎn)和訂閱者節(jié)點(diǎn)之間不需要知道彼此是否存在,這樣就保證了發(fā)布者節(jié)點(diǎn)與訂閱者節(jié)點(diǎn)之間的解耦合。同一個(gè)主題可以有多個(gè)訂閱者也可以有多個(gè)發(fā)布者,不過要注意必須使用不同的節(jié)點(diǎn)發(fā)布同一個(gè)主題。每個(gè)主題都是強(qiáng)類型的,不管是發(fā)布消息到主題還是從主題中訂閱消息,發(fā)布者和訂閱者定義的消息類型必須與主題的消息類型相匹配。
ROS提供了操作主題的命令工具,這里列舉出一些常用的命令,來具體看看吧。
rostopic bw </topic_name>:用于顯示主題所使用的帶寬。
rostopic echo </topic_name>:用于將主題中的消息數(shù)據(jù)輸出到屏幕。
rostopic find <message_type>:用于按照消息類型查找主題。
rostopic hz </topic_name>:用于顯示主題的發(fā)布頻率。
rostopic info </topic_name>:用于輸出活動(dòng)主題、發(fā)布的主題、主題訂閱者和服務(wù)的信息。
rostopic list:用于列出當(dāng)前活動(dòng)主題的列表。
rostopic pub </topic_name> <message_type> <args>:用于通過命令行將數(shù)據(jù)發(fā)布到主題。
rostopic type </topic_name>:用于輸出主題中發(fā)布的消息類型。
關(guān)于這些工具命令的具體使用方法,會(huì)在后面的章節(jié)中結(jié)合實(shí)例進(jìn)行具體的講解。這里只是先介紹給大家,讓大家有個(gè)概念上的了解,感興趣的朋友也可以自己上網(wǎng)了解這些命令的具體用法。
(4)服務(wù)
在一些特殊的場(chǎng)合,節(jié)點(diǎn)間需要點(diǎn)對(duì)點(diǎn)的高效率通信并及時(shí)獲取應(yīng)答,這個(gè)時(shí)候就需要用服務(wù)的方式進(jìn)行交互。提供服務(wù)的節(jié)點(diǎn)叫服務(wù)端,向服務(wù)端發(fā)起請(qǐng)求并等待響應(yīng)的節(jié)點(diǎn)叫客戶端,客戶端發(fā)起一次請(qǐng)求并得到服務(wù)端的一次響應(yīng),這樣就完成了一次服務(wù)通信過程,例如圖6中,node1向node3發(fā)起一次請(qǐng)求,并得到node3返回給node1的響應(yīng)。服務(wù)通信過程中服務(wù)的數(shù)據(jù)類型需要用戶自己定義,與消息不同,節(jié)點(diǎn)并不提供標(biāo)準(zhǔn)服務(wù)類型。服務(wù)類型的定義文件都是以*.srv為擴(kuò)展名,并且被放在功能包的srv/文件夾下。
ROS提供了操作服務(wù)的命令工具,這里列舉出一些常用的命令,來具體看看吧。
rosservice call </service_name> <args>:用于通過命令行參數(shù)調(diào)用服務(wù)。
rosservice find <service_type>:用于根據(jù)服務(wù)類型查詢服務(wù)。
rosservice info </service_name>:用于輸出服務(wù)信息。
rosservice list:用于列出活動(dòng)服務(wù)清單。
rosservice type </service_name>:用于輸出服務(wù)類型。
rosservice uri </service_name>:用于輸出服務(wù)的ROSRPC URI。
關(guān)于這些工具命令的具體使用方法,會(huì)在后面的章節(jié)中結(jié)合實(shí)例進(jìn)行具體的講解。這里只是先介紹給大家,讓大家有個(gè)概念上的了解,感興趣的朋友也可以自己上網(wǎng)了解這些命令的具體用法。
(5)節(jié)點(diǎn)管理器
節(jié)點(diǎn)管理器(master)用于節(jié)點(diǎn)的名稱注冊(cè)和查找等,也負(fù)責(zé)設(shè)置節(jié)點(diǎn)間的通信。如果在你的整個(gè)ROS系統(tǒng)中沒有節(jié)點(diǎn)管理器,就不會(huì)有節(jié)點(diǎn)、消息、服務(wù)之間的通信。由于ROS本身就是一個(gè)分布式的網(wǎng)絡(luò)系統(tǒng),所以你可以在某臺(tái)計(jì)算機(jī)上運(yùn)行節(jié)點(diǎn)管理器,在這臺(tái)計(jì)算機(jī)和其他臺(tái)計(jì)算機(jī)上運(yùn)行節(jié)點(diǎn)。
ROS中提供了跟節(jié)點(diǎn)管理器相關(guān)的命令行工具,就是roscre。
roscore:用于啟動(dòng)節(jié)點(diǎn)管理器,這個(gè)命令會(huì)加載ROS節(jié)點(diǎn)管理器和其他ROS核心組件。
關(guān)于這些工具命令的具體使用方法,會(huì)在后面的章節(jié)中結(jié)合實(shí)例進(jìn)行具體的講解。這里只是先介紹給大家,讓大家有個(gè)概念上的了解,感興趣的朋友也可以自己上網(wǎng)了解這些命令的具體用法。
(6)參數(shù)服務(wù)器
參數(shù)服務(wù)器(parameter server)能夠使數(shù)據(jù)通過關(guān)鍵詞存儲(chǔ)在一個(gè)系統(tǒng)的核心位置。通過使用參數(shù),就能夠在節(jié)點(diǎn)運(yùn)行時(shí)動(dòng)態(tài)配置節(jié)點(diǎn)或改變節(jié)點(diǎn)的工作任務(wù)。參數(shù)服務(wù)器是可通過網(wǎng)絡(luò)訪問的共享的多變量字典,節(jié)點(diǎn)使用此服務(wù)器來存儲(chǔ)和檢索運(yùn)行時(shí)的參數(shù)。
ROS中關(guān)于參數(shù)服務(wù)器的命令行工具,請(qǐng)看下面的常用命令。
rosparam list:用于列出參數(shù)服務(wù)器中的所有參數(shù)。
rosparam get <parameter_name>:用于獲取參數(shù)服務(wù)器中的參數(shù)值。
rosparam set <parameter_name> <value>:用于設(shè)置參數(shù)服務(wù)器中參數(shù)的值。
rosparam delete <parameter_name>:用于將參數(shù)從參數(shù)服務(wù)器中刪除。
rosparam dump <file>:用于將參數(shù)服務(wù)器的參數(shù)保存到一個(gè)文件。
rosparam load <file>:用于從文件將參數(shù)加載到參數(shù)服務(wù)器。
關(guān)于這些工具命令的具體使用方法,會(huì)在后面的章節(jié)中結(jié)合實(shí)例進(jìn)行具體的講解。這里只是先介紹給大家,讓大家有個(gè)概念上的了解,感興趣的朋友也可以自己上網(wǎng)了解這些命令的具體用法。
(7)消息記錄包
消息記錄包(bag)是一種用于保存和回放ROS消息數(shù)據(jù)的文件格式。消息記錄包是一種用于存儲(chǔ)數(shù)據(jù)的重要機(jī)制,它可以幫助記錄一些難以收集的傳感器數(shù)據(jù),然后通過反復(fù)回放數(shù)據(jù)進(jìn)行算法的性能開發(fā)和測(cè)試。ROS創(chuàng)建的消息記錄包文件以*.bag為擴(kuò)展名,通過播放、停止、后退操作該文件,可以像實(shí)時(shí)會(huì)話一樣在ROS中再現(xiàn)情景,便于算法的反復(fù)調(diào)試。
ROS提供消息記錄包相關(guān)的命令行工具,請(qǐng)看下面的常用命令。
rosbag <args>:用來錄制、播放和執(zhí)行操作。
關(guān)于這些工具命令的具體使用方法,會(huì)在后面的章節(jié)中結(jié)合實(shí)例進(jìn)行具體的講解。這里只是先介紹給大家,讓大家有個(gè)概念上的了解,感興趣的朋友也可以自己上網(wǎng)了解這些命令的具體用法。
2.3.從開源社區(qū)級(jí)理解ROS架構(gòu) ? ??
ROS開源社區(qū)級(jí)的概念主要是ROS資源,即通過各個(gè)獨(dú)立的網(wǎng)絡(luò)社區(qū)分享ROS方面的軟件和知識(shí)。
(1)ROS發(fā)行版
ROS發(fā)行版跟Linux發(fā)行版起類似的作用,ROS發(fā)行版是內(nèi)置了一系列常用功能包的ROS系統(tǒng)安裝包,可以被直接安裝到我們的操作系統(tǒng)中。如圖7,是ROS的各個(gè)發(fā)行版。
(圖7)ROS的各個(gè)發(fā)行版
(2)ROS軟件代碼庫
ROS依賴于開源或共享軟件的源代碼,這些代碼由不同的機(jī)構(gòu)共享與發(fā)布,比如github源碼共享,ubuntu軟件倉庫等等。如圖8,是ROS軟件代碼庫的社區(qū)組織形式。
(圖8)ROS軟件代碼庫的社區(qū)組織形式
(3)ROS文檔社區(qū)
ROS wiki是記錄有關(guān)ROS系統(tǒng)各種文檔的主要論壇社區(qū),任何人都可以注冊(cè)賬戶、貢獻(xiàn)自己的文件、提供更正或更新、編寫教程及其他行為。感興趣可以進(jìn)入ROS wiki的主頁面瞧瞧http://wiki.ros.org/。
(4)ROS問答社區(qū)
ROS開發(fā)者可以通過這個(gè)資源去提問和尋找ROS相關(guān)的答案,ROS Answer主頁面
https://answers.ros.org/。
后記 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
------SLAM+語音機(jī)器人DIY系列【目錄】快速導(dǎo)覽------
第1章:Linux基礎(chǔ)
1.Linux簡(jiǎn)介
2.安裝Linux發(fā)行版ubuntu系統(tǒng)
3.Linux命令行基礎(chǔ)操作
第2章:ROS入門
1.ROS是什么
2.ROS系統(tǒng)整體架構(gòu)
3.在ubuntu16.04中安裝ROS kinetic
4.如何編寫ROS的第一個(gè)程序hello_world
5.編寫簡(jiǎn)單的消息發(fā)布器和訂閱器
6.編寫簡(jiǎn)單的service和client
7.理解tf的原理
8.理解roslaunch在大型項(xiàng)目中的作用
9.熟練使用rviz
10.在實(shí)際機(jī)器人上運(yùn)行ROS高級(jí)功能預(yù)覽
第3章:感知與大腦
1.ydlidar-x4激光雷達(dá)
2.帶自校準(zhǔn)九軸數(shù)據(jù)融合IMU慣性傳感器
3.輪式里程計(jì)與運(yùn)動(dòng)控制
4.音響麥克風(fēng)與攝像頭
5.機(jī)器人大腦嵌入式主板性能對(duì)比
6.做一個(gè)能走路和對(duì)話的機(jī)器人
第4章:差分底盤設(shè)計(jì)
1.stm32主控硬件設(shè)計(jì)
2.stm32主控軟件設(shè)計(jì)
3.底盤通信協(xié)議
4.底盤ROS驅(qū)動(dòng)開發(fā)
5.底盤PID控制參數(shù)整定
6.底盤里程計(jì)標(biāo)
第5章:樹莓派3開發(fā)環(huán)境搭建
1.安裝系統(tǒng)ubuntu_mate_16.04
2.安裝ros-kinetic
3.裝機(jī)后一些實(shí)用軟件安裝和系統(tǒng)設(shè)置
4.PC端與robot端ROS網(wǎng)絡(luò)通信
5.Android手機(jī)端與robot端ROS網(wǎng)絡(luò)通信
6.樹莓派USB與tty串口號(hào)綁定
7.開機(jī)自啟動(dòng)ROS節(jié)點(diǎn)
第6章:SLAM建圖與自主避障導(dǎo)航
1.在機(jī)器人上使用傳感器
2.google-cartographer機(jī)器人SLAM建圖
3.ros-navigation機(jī)器人自主避障導(dǎo)航
4.多目標(biāo)點(diǎn)導(dǎo)航及任務(wù)調(diào)度
5.機(jī)器人巡航與現(xiàn)場(chǎng)監(jiān)控
第7章:語音交互與自然語言處理
1.語音交互相關(guān)技術(shù)
2.機(jī)器人語音交互實(shí)現(xiàn)
3.自然語言處理云計(jì)算引擎
第8章:高階拓展
1.miiboo機(jī)器人安卓手機(jī)APP開發(fā)
2.centos7下部署Django(nginx+uwsgi+django+python3)
----------------文章將持續(xù)更新,敬請(qǐng)關(guān)注-----------------
?
如果大家對(duì)博文的相關(guān)類容感興趣,或有什么技術(shù)疑問,歡迎加入下面的《SLAM+語音機(jī)器人DIY》QQ技術(shù)交流群,一起討論學(xué)習(xí)^_^
轉(zhuǎn)載于:https://www.cnblogs.com/hiram-zhang/p/10385374.html
總結(jié)
以上是生活随笔為你收集整理的SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带刺的花有哪些适合家庭养(带刺的开花植物
- 下一篇: 分享一个windows下检测硬件信息的b