1. 程式人生 > >ROS學習筆記(一):建立工作空間和功能包

ROS學習筆記(一):建立工作空間和功能包

所有的ROS程式,包括我們自己開發的程式,都被組織成功能包,而ROS的功能包被存放在稱之為工作空間的目錄下。因此,在我們寫程式之前,第一步是建立一個工作空間以容納我們的功能包。其實ROS工作空間就是linux下的一個目錄,建立ROS工作空間就是建立一個linux目錄(我們建立名為catkin_ws的工作空間,當然也可以使用其它名字),只是需要按照ROS的規範在這個目錄下新增一個src的子目錄,然後執行一個ROS的命令即可。

1.建立工作空間

mkdir -p ~/catkin_ws/src

雖然這時候工作空間是空的,但是我們依然可以進行編譯:(一定要在工作空間的根目錄下

 cd ~/catkin_ws/
 catkin_make

執行完該命令後,發現工作空間catkin_ws中有三個目錄: build  devel  src
其中,src是我們建立工作空間時建立的目錄,另外兩個是執行完 catkin_make 後生成的。

src資料夾下自動生成了一個名稱為CMakeLists.txt的檔案,這個也是自動生成的,在編譯過程中有如下提示:

Creating symlink "/home/exbot/catkin_ws/src/CMakeLists.txt" pointing to "/opt/ros/indigo/share/catkin/cmake/toplevel.cmake"

build  資料夾存放編譯過程中產生的中間檔案

devel  資料夾存放的是編譯產生的可執行檔案和環境變數的設定指令碼

 為了在每次開啟終端的時候linux系統都能找該工作空間的相關檔案,我們將在.bashrc檔案中新增如下命令:

source ~/catkin_ws/devel/setup.bash

下面我們檢查環境變數是否設定成功,輸入以下命令

echo $ROS_PACKAGE_PATH

看到紅色方框的提示資訊就說明環境變數設定成功,到此,一個工作空間就建立完成了。

 2.建立功能包

建立了工作空間,接下來就可以在工作空間裡建立功能包。
建立一個新ROS功能包的命令應該在你工作空間中的src目錄下執行:

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

package-name指的是你功能包名稱,後面跟的引數功能包的依賴。

我們建立一個名稱為hello的功能包,該功能包依賴roscpp(我們原始碼用c++編寫,roscpp為我們提供必要的環境)

[email protected]:~/catkin_ws/src$ catkin_create_pkg hello roscpp

我們發現,該命令為我們建立了一個hello資料夾

並且資料夾下內容如下:

第一個配置檔案,叫做 package.xml,稱為清單檔案。清單檔案包含了功能包的名字,版本,維護者,依賴的其他的功能包等。如果我們後期想在功能包加更多的依賴,就需要修改這個檔案。

第二個檔案,叫做 CMakeLists.txt,是一個 Cmake 的指令碼檔案,Cmake 是一個符合工業標準的跨平臺編譯系統。這個檔案包含了一系列的編譯指令,包括應該生成哪種可執行檔案,需要哪些原始檔,以及在哪裡可以找到所需的標頭檔案和連結庫。當然,這個檔案表明 catkin 在內部使用了 Cmake。

我們可以用rospack命令驗證hello的一級依賴包

,看到和我們之前設定的roscpp一致。

3.編寫功能包的程式碼

我們在hello功能包的src資料夾下新建main.cpp檔案

檔案內容如下:

#include "ros/ros.h"
#include<iostream>
using namespace std;
int main(int argc, char **argv)
{
    cout<<"hello ros!"<<endl;
    return 0;


}

4.修改CMakeLists.txt檔案

我們找到hello資料夾下的CMakeLists.txt檔案,新增如下兩行:

## Declare a cpp executable
add_executable(printf_hello src/main.cpp)

即,生成printf_hello的可執行檔案,可執行檔案依賴於src/main.cpp

注:cmake的語法在次不做深入講解

5.編譯工作空間

[email protected]:~/catkin_ws$ catkin_make

編譯完成之後我們可以在devel檔案加下找到相應的可執行檔案

6.執行

啟動ros核:

[email protected]:~$ roscore

在另一個終端執行hello功能包的printf_hello功能

[email protected]:~$ rosrun hello printf_hello
hello ros!

可以看到成功打印出hello ros!

 

 

REF:

https://www.cnblogs.com/huangjianxin/p/6347416.html

https://blog.csdn.net/yake827/article/details/44564057

http://www.cnblogs.com/liuamin/p/5704281.html