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