ROS(機器人操作系統(tǒng))基礎(chǔ):

一、 安裝好ROS。在搜索引擎中搜索ROS官方網(wǎng)站,然后進入網(wǎng)站查看官方安裝步驟進行安裝。

二、ROS默認的安裝目錄為“文件/其他位置/計算機/opt”,找到“ros”文件夾并打開,可以看到一個以當前安裝的ROS版本號命名的文件夾,這里面就包含所有ROS的文件,共有5個文件夾。

(1) bin文件夾中里面放置的是一些終端指令,如經(jīng)常用到的“catkin_make”“roslaunch”“rosrun”等。

(2)etc主要是用來存放“catkin”和“ros”的配置文件的文件夾。

(3)include文件夾中里面放置的是通過終端安裝的功能包里的頭文件。某個功能包中具有一些頭文件,在創(chuàng)建功能包時,如果需要依賴另一個功能包,就必須包含那個功能包的頭文件。

(4)lib文件夾中放置的是通過終端安裝的功能包里的可執(zhí)行程序,也就是功能包中的節(jié)點,運行其中的節(jié)點就可以啟動相應功能。

(5)share文件夾中放置的是通過終端安裝的功能包里的共享數(shù)據(jù),是功能包里面接口的一些具體信息。接口包含話題、服務(wù)、action等。

三、測試ROS

1) 明確了安裝的ROS版本為“noetic”,接下來我們可以通過在終端中輸入指令查看ROS版本。在終端中輸入“rosversion -d”,在終端窗口里顯示出了指令“noetic”

2)打開一個終端

(1)輸入"roscore"這條指令是啟動ROS節(jié)點管理器

(2)保持之前的終端不要關(guān)閉,打開一個新終端,輸入如下指令。rosrun turtlesim turtlesim_node
這條指令是啟動小烏龜節(jié)點,運行后彈出一個“TurtleSim”窗口,在其中心有一只靜止的小烏龜。
(3)保持之前的終端不要關(guān)閉,打開一個新的終端,輸入如下指令。
rosrun turtlesim turtle_teleop_key 這條指令是啟動鍵盤控制小烏龜移動的節(jié)點,運行后可以通過鍵盤上的方向鍵控制小烏龜在窗口內(nèi)移動并留下軌跡。

四 ros架構(gòu)

ROS架構(gòu)分為三個部分:開源社區(qū)、文件系統(tǒng)和計算圖

ROS用戶可以在通過網(wǎng)絡(luò)建立的開源社區(qū)中共享和獲取知識、代碼與算法。現(xiàn)在開源社區(qū)中的資源非常豐富,這些資源包括以下幾種。
(1)ROS Distribution:它類似于Linux發(fā)行版,是一個特定版本的所有程序包集合。
(2)ROS Wiki:它是用于記錄有關(guān)ROS信息的主要論壇,大家都可以進行注冊、登錄,分享、更正、更新和編寫教程等。
(3)ROS Repository:ROS依賴于共享開源代碼與軟件庫,不同的機構(gòu)組織能夠在這里發(fā)布或共享各自的機器人軟件或程序。
(4)ROS Answer:它是用于咨詢ROS相關(guān)問題的網(wǎng)站。

ROS文件系統(tǒng)的組織形式是一個標準化的架構(gòu),編寫的時候不要改變,以下是常用的各文件系統(tǒng)。
(1)catkin workspace:工作空間,是用戶自定義的存放工程開發(fā)相關(guān)文件的文件夾,包含3個文件夾,即src、Build、devel。
(2)src:源碼空間,用于儲存功能包、項目、克隆包等。
(3)Build:編譯空間,用于儲存CMake和catkin的緩存信息、配置信息及其他中間文件。
(4)devel:開發(fā)空間,用于儲存變異后生成的目標文件,包括頭文件、動態(tài)或靜態(tài)鏈接庫和可執(zhí)行文件等,這些都是可以直接運行的程序。

(5)Package:功能包。單個功能包稱為軟件包,多個功能包稱為堆。功能包是ROS程序的基本單元,每個功能包可以包含多個節(jié)點(進程或可執(zhí)行文件)、程序庫、腳本、配置文件及其他可以手動創(chuàng)建的東西。這些內(nèi)容可以在邏輯上被定義為一個完整的軟件模塊。
(6)CMakeList.txt:編譯規(guī)則文件,用于設(shè)定編譯規(guī)則,如源文件、依賴項和目標文件等。

(7)Manifest(Package.xml):功能包清單文件,是一個名為Package.xml的XML文件,它必須位于功能包文件夾中。它是對功能包相關(guān)信息的介紹,用于定義軟件包相關(guān)信息之間的依賴關(guān)系,如功能包名稱、版本、作者、描述(某功能的軟件包)、維護者的郵箱、許可,這些可以改也可以不改,但是格式不能出錯;這里面還包括編譯標志及對其他功能包的依賴項。注意,系統(tǒng)包的依賴關(guān)系也應該在Package.xml中聲明,當用戶需要在設(shè)備上通過源代碼來構(gòu)建包時,這一點是非常有必要的。
(8)scripts:用于儲存Python文件、Linux操作系統(tǒng)下的shell文件和其他可執(zhí)行文件。

(9)msg:在ROS框架中,節(jié)點(Node)之間通過將消息發(fā)布到話題(Topic)中來實現(xiàn)彼此的異步通信,這里的話題是一種數(shù)據(jù)結(jié)構(gòu),而消息文件的擴展名為.msg,它位于功能包msg中,即msg是用來儲存消息通信格式的文件夾。
(10)srv:ROS服務(wù)。ROS節(jié)點還可以通過系統(tǒng)服務(wù)的調(diào)用來同步交換請求(Request)和響應(Response)消息。這些交換請求和響應消息位于srv文件夾中,擴展名為.srv。
(11)include:用于儲存頭文件。
(12)src:用來儲存源文件。

(13)launch:用于儲存launch文件。launch文件的作用是一次性運行多個節(jié)點。

如果要獲得關(guān)于ROS環(huán)境中的功能包和棧的信息,如它們的路徑、依賴關(guān)系等,則需要用到ROS文件系統(tǒng)工具。它們可以幫助我們查詢ROS工作空間中的相關(guān)文件,可以簡化操作,常用的指令有如下幾個。
1)rospack 可以得到一個包的信息,rospack help指令會運行出來許多相關(guān)操作,其中find的功能是得到一個功能包的路徑。
格式:rospack find 功能包名。
實例:rospack find roscpp。
結(jié)果:/opt/ros/melodic/share/roscpp。

2)roscd可以直接進入pkg,不需要使用絕對路徑。
格式:roscd 包名。
實例:roscd roscpp。
結(jié)果:/opt/ros/melodic/share/roscpp$。
注意:roscd只會在ROS_PACKAGE_PATH 環(huán)境變量指定的路徑中查找ros包,并進入這個包,所以在使用roscd來進入一個pkg前,一定要保證pkg的路徑在ROS_PACKAGE_PATH中。

3)rosls直接列出一個包的目錄,也不需要使用絕對路徑,只需要一個包名即可。

4)Tab自動補全。對于已經(jīng)存在的文件,可以只輸入文件名的前面幾個字母,剩余部分使用“Tab”鍵補全。

ROS軟件的各功能以節(jié)點為單位獨立運行。ROS創(chuàng)建了連接所有節(jié)點的通信網(wǎng)絡(luò),通過這個網(wǎng)絡(luò),各個相互獨立的節(jié)點可以進行交互。ROS計算圖如圖所示,計算圖這一層級中包括節(jié)點、節(jié)點管理器、參數(shù)服務(wù)器、消息、主題、服務(wù)和消息記錄包

格式:rosls 包名。
實例:roscd roscpp_tutorials。
結(jié)果:cmake launch Package.xml srv。

1.節(jié)點
在ROS中,節(jié)點相當于模塊,一個機器人具有很多的功能,每個功能都可以獨立出來成為功能模塊,而節(jié)點就相當于軟件層面的功能模塊,使軟件設(shè)計更加便捷。rosrun turtlesim turtlesim_node和rosrun turtlesim turtle_teleop_key兩步,就是啟動了對應的節(jié)點。
2.節(jié)點管理器
節(jié)點管理器在ROS中扮演著管理者的角色,管理著各個節(jié)點,保證節(jié)點正常運行,節(jié)點需要先在節(jié)點管理器中進行注冊,才能融入ROS程序這個“大家庭”進行交流。“roscore”指令的作用就是啟動節(jié)點管理器。

3.參數(shù)服務(wù)器
參數(shù)服務(wù)器相當于ROS程序“大家庭”中的“家族圖書館”,是可以通過網(wǎng)絡(luò)訪問的共享字典,節(jié)點將關(guān)鍵字儲存在節(jié)點管理器中,節(jié)點使用參數(shù)服務(wù)器儲存和檢索參數(shù)。
4.消息
消息相當于ROS程序“大家庭”中各成員聯(lián)系所使用的“書信”,節(jié)點之間通過傳遞消息進行通信,每種消息都有自己嚴格的數(shù)據(jù)結(jié)構(gòu)。

5.主題
主題相當于ROS所在世界的“郵局”,可以有針對性地傳遞消息。在2.2節(jié)中已經(jīng)運行的那兩個指令的狀態(tài)基礎(chǔ)上,可以打開一個新的終端運行如下指令。
rqt_graph
運行后會彈出rqt_graph_RosGraph-rqt界面,可以看出節(jié)點“/teleop_turtle”和節(jié)點“/turtlesim”之間通過名為“/turtle1/cmd_vel”的主題進行通信。節(jié)點“/teleop_turtle”在此主題上發(fā)布按鍵輸入消息,節(jié)點“/turtlesim”訂閱此主題接收該消息。

6. 服務(wù)

服務(wù)相當于升級版的主題,相對于主題來說,服務(wù)可以進行同步消息傳遞,其基于客戶端/服務(wù)器(Client/Server)模型,包含兩個部分的通信數(shù)據(jù)類型:一個用于請求;另一個用于應答,類似于Web服務(wù)器。與主題不同的是,ROS中只允許有一個節(jié)點提供指定命名的服務(wù)。

創(chuàng)建工作空間

(1)打開終端,輸入如下指令。

mkdir -p ~/catkin_ws/src

這條指令會先在主文件夾(用戶文件夾)下創(chuàng)建一個名為“catkin_ws”的文件夾,然后在其下創(chuàng)建一個下一級的src文件夾

(2)在終端中輸入如下指令。

cd ~/catkin_ws/src

這條指令會使終端在“~/catkin_ws/src”目錄下運行

(3)在終端中輸入如下指令。
catkin_init_workspace
這條指令是初始化src文件夾,將其變?yōu)镽OS工作空間。運行后會在“src”文件夾中生成一個名為“CMakeLists.txt”的文件,此時一個最初始的ROS工作空間便創(chuàng)建成功。

要編譯工作空間,就要先回到工作空間的根目錄。
(1)在終端中輸入如下指令。
cd ~/catkin_ws/
這條指令會使終端在“~/catkin_ws”目錄下運行。catkin_ws是指自定義的工作空間名稱

(2)在終端中輸入如下指令。
catkin_make
這條指令是進行編譯的指令,編譯成功后會在“~/catkin_ws”目錄下生成“build”和“devel”兩個文件夾。“devel”文件夾中存放了編譯完成的內(nèi)容。加上“src”文件夾,此時catkin_ws文件夾下共有三個文件夾。需要注意的是,“catkin_make”如果不在工作空間文件夾下運行,則系統(tǒng)將會報錯。

(3)在終端中輸入如下指令。
catkin_init_workspace
這條指令是初始化src文件夾,將其變?yōu)镽OS工作空間。運行后會在“src”文件夾中生成一個名為“CMakeLists.txt”的文件

將工作空間添加到環(huán)境變量中可以省去每次打開終端時手動刷新的步驟,具體步驟如下。
(1)在終端中輸入如下指令。
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
該指令的意思是把“source ~/catkin_ws/devel/setup.bash”這條指令加載到“~/.bashrc”這個腳本的后面。實際上,這與直接打開.bashrc文件將“source ~/catkin_ws/devel/setup.bash”粘貼進去的結(jié)果是一樣的。這樣每次打開終端時,系統(tǒng)就會自動刷新工作空間環(huán)境。這個工作空間中的所有Package都可以在編譯后直接運行,不用再source。

(2)在終端中輸入如下指令。
source ~/.bashrc
使用該指令就可以成功將工作空間添加到環(huán)境變量中

工作空間生效后,通過指令“echo $ROS_PACKAGE_PATH”可以查看當前環(huán)境中的工作變量,在當前工作空間中運行以上指令后,會顯示創(chuàng)建的工作空間和二進制安裝的核心庫與依賴包兩個路徑(/home/robot/catkin_ws/src:/opt/ros/melodic/share)。

來源: 部分來自網(wǎng)絡(luò)