1. 程式人生 > >ubuntu16.04下ROS作業系統學習(四 / 一)ROS基礎-工作空間

ubuntu16.04下ROS作業系統學習(四 / 一)ROS基礎-工作空間

主要知識點:

1.src、build、devel、install各資料夾的功能介紹。

2.建立工作空間(建立資料夾,初始化工作空間)、編譯工作空間、設定環境變數,檢查環境變數

(echo $ROS_PACKAGE_PATH)

3.建立功能包:catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

4.編譯功能包、工作空間的覆蓋。

1.建立工作空間

工作空間(workspace)是一個存放工程開發相關檔案的資料夾。

src:程式碼空間(Source Space)。放置功能包原始碼的程式碼空間。

build:編譯空間(Build Space)。放置在編譯過程當中產生的一些功能檔案。

devel:開發空間(Development Space)。放置的是編譯完成之後的可執行檔案,環境變數配置的一些指令碼。

install:安裝空間(Install Space)。與devel類似,在ros2裡面將其合成了一個資料夾。

接下來我們實際操作一下,建立一個工作空間。

a.建立工作空間

建立一個名字為catkin_ws,在其資料夾內建立src資料夾放置功能包原始碼:

mkdir -p ~/catkin_ws/src

之後進入src資料夾下面,將其初始化為ROS工作空間:

cd ~/catkin_ws/src
catkin_init_workspace

之後的話會看到一個簡單的日誌回覆。然後在這個src資料夾下面會有一個CmakeLists檔案。這個檔案會告訴系統,這個檔案是一個ROS的工作空間。

之後的話我們就可以去編譯這個工作空間。

b.編譯工作空間

編譯是在工作空間的根目錄下的,所以我們需要cd到工作空間的根目錄下面對其進行編譯

cd ..
catkin_make

上面的source activate kinetic命令是由於我的ROS裝在anaconda裡面,如果你沒有裝anaconda的話,可以直接忽略這個命令,然後,我的電腦報了一個錯誤:

是由於我們缺少包的原因,我們需要安裝一下:

pip install catkin_pkg

之後再執行:

catkin_make

如果沒有報錯的話,就說明安裝成功了。之後在我們的src目錄下面就會生成兩個資料夾build和devel。build檔案裡面是編譯過程當中產生的中間檔案;devel裡面是編譯過程當中產生的一些可執行檔案和一些環境變數設定的指令碼。

我們接下來需要設定環境變數。

c.設定環境變數

因為我們需要在之後的學習過程當中需要linux系統知道我們功能包的位置,所以我們要設定環境變數,告訴系統功能包在哪裡。這些路徑的設定都是通過環境變數設定的。我們可以通過命令source來對其進行設定。

source devel/setup.bash

如果你使用的終端是zsh的話,那麼你需要選擇setup.zsh檔案。這樣的話我們的系統就會知道功能包是放在哪個資料夾下面的。

但是上述命令只是在當前終端裡面會生效,如果我們新開啟一個終端的話,這個環境變數依然會找不到。如果我們需要系統每次新開啟一個終端都能找到相應的路徑的話,我們需要將上述命令放入到終端的配置檔案裡面去。命令如下:

gedit ~/.bashrc

我們將會開啟一個新的介面,在介面的最下面新增下面這句話:

source ~/catkin_ws/devel/setup.bash

之後儲存退出就可以啦。使用以下命令使其在當前終端中生效:

source ~/.bashrc

我們接下來檢查環境變數是否存在。

d.檢查環境變數

我們新開啟一個終端,輸入以下命令檢查環境變數:

echo $ROS_PACKAGE_PATH

可以看到其生成了兩個路徑,一個是我們剛剛建立的功能包的路徑,一個是ROS安裝完成之後預設的一個工作空間路徑。

我們接下來就可以在我們建立的工作空間下做具體的工作。

2.建立功能包

一個功能包就是我們實現機器人一個具體功能的單元。我們在功能包裡面能夠去建立具體的程式碼。建立功能包的命令格式如下所示:

catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

所表達的意思就是使用catkin_create_pkg,後面接上功能包的名字,還有此功能包依賴的其他一些功能包(這個可以有多個或者沒有)。

建立功能包的命令要求我們在src檔案目錄下面去進行。

上述命令的意思就是建立一個名字叫做learning_communication的功能包,依賴三個功能包,一個叫做std_msgs:是ROS給我們定義好的一些標準的資料結構。rospy是ROS給我們提供的一系列的python介面。roscpp是ROS給我們提供的c++的程式設計介面。

進入我們剛剛建立的功能包裡面,我們可以看到一些檔案。在src裡面是我們功能包裡面一些具體的程式碼。incluude裡面放置的是一些標頭檔案。最重要的是CMakeList.txt和package.xml檔案。這兩個檔案是所有功能包都必須具備的檔案。CMakeList.txt裡面是我們編譯這個功能包的編譯選項。package.xml放置的是描述這個功能包的一些具體資訊。像名字,版本號等一些具體資訊,還有這個功能包會具體依賴哪些功能包。

如果後期我們需要加一些功能包的依賴的話,我們都是在這個地方對其進行修改的。接下來我們我們需要編譯這個功能包。

2.編譯功能包

我們首先需要退出到工作空間目錄裡面,然後對其進行編譯:

catkin_make

由於我們之前已經將我們的環境變數寫入到檔案當中去了,所以這裡不用再次設定環境變量了。

這裡還有要注意的一點是:在同一個工作空間下,不允許存在同名功能包的。不同工作空間下,允許存在同名功能包的

既然存在同名的功能包,那麼我們的ROS將會以什麼樣的順序去查詢呢?

我們首先檢視一下ROS的環境變數,env是檢視系統整個的環境變數,我們通過grep就能夠檢視只與ros有關的環境變數。

其中的:

ROS_PACKAGE_PATH=/home/zhiqianghe/catkin_ws/src:/opt/ros/kinetic/share

就是我們功能包會去查詢的路徑。當我們執行某個功能包的時候,我們會從上述這個路徑依次向後查詢。新設定的路徑在ROS_PACKAGE_PATH中的最前端。