在寒假開始之前,我們已經(jīng)下載了ROS系統(tǒng),并且了解了一部分ROS的工作機(jī)制和基礎(chǔ)框架,現(xiàn)在我們從問題出發(fā),重新開始學(xué)習(xí)ROS基礎(chǔ)。
現(xiàn)在我們開始正式探索ROS的應(yīng)用。
一、在開始應(yīng)用ROS之前,我們需要?jiǎng)?chuàng)建工作空間:
(所有的ROS程序,包括我們自己開發(fā)的程序,都被組織成功能包,而ROS的功能包被存放在稱之為工作空間的目錄下。因此,在我們寫程序之前,第一步是創(chuàng)建一個(gè)工作空間以容納我們的功能包。)
1.創(chuàng)建ROS工作空間
? ? ROS工作空間是linux下的一個(gè)目錄,創(chuàng)建ROS工作空間就是創(chuàng)建一個(gè)linux目錄,只是需要按照ROS的規(guī)范在這個(gè)目錄下添加一個(gè)src的子目錄,然后執(zhí)行一個(gè)ROS的命令即可。
? ? 我們創(chuàng)建名為catkin_ws的工作空間,命令如下:
$mkdir -p catkin_ws/src


2.編譯工作空間
? ? 進(jìn)入到catkin_ws/src目錄下,可以看到catkin_ws和src目錄下都是空的。進(jìn)入到catkin_ws目錄下,再執(zhí)行如下命令:
$catkin_make
? ??這個(gè)命令用于構(gòu)建該工作空間,并且必須在工作空間的頂層使用catkin_make命令,這時(shí)會(huì)發(fā)現(xiàn)在catkin_ws這個(gè)目錄下多出兩個(gè)目錄“build”和“devel”。在devel目錄下,還可以看到很多setup.*sh文件。

3.設(shè)置環(huán)境變量
接下來(lái)我們輸入如下命令:
$source devel/setup.bash
此命令是在catkin_ws目錄下執(zhí)行的(即為將catkin_ws/devel目錄下的setup.bash文件掛載到ROS的文件系統(tǒng)里去,這樣當(dāng)用戶執(zhí)行一些文件系統(tǒng)的命令時(shí),就不會(huì)提示找不到該工作空間里的包或者文件了)
在ROS工作環(huán)境中不允許出現(xiàn)同名重復(fù)功能包(對(duì)于大多數(shù)用戶,確實(shí)沒有必要使用多個(gè) ROS 工作空間。但是,如果工作涉及大量的功能包,或者涉及幾個(gè)相互獨(dú)立的的項(xiàng)目,則維護(hù)數(shù)個(gè)獨(dú)立的工作空間可能是有幫助的。)
提示:在沒有設(shè)置環(huán)境變量的情況下,或者在環(huán)境配置這一環(huán)節(jié)總是出現(xiàn)bash: /opt/ros/kinetic/setup.bash: 沒有那個(gè)文件或目錄時(shí),每次新打開終端都需要:
$source ? ~/catkin_ws/devel/setup.bash
若要解決每次都要source(每次新打開一個(gè)終端都需要source)可以使用如下命令:
$gedit ~/.bashrc ?

在文件末尾添加:source ? ~/catkin_ws/devel/setup.bash(還需要?jiǎng)h除重復(fù)的多余配置,如果沒有多余項(xiàng),很有可能拼寫有問題,或者大小寫問題,格式問題
二.創(chuàng)建ROS功能包
創(chuàng)建了工作空間,接下來(lái)就可以在工作空間里創(chuàng)建功能包。
1.創(chuàng)建
功能包是一個(gè)存在于工作空間目錄src目錄下的一個(gè)目錄,這個(gè)目錄中包含一些文件或者目錄,一個(gè)功能包必須以下幾部分組成:
(1) 必須包括一個(gè)package.xml文件;
(2) 必須包括一個(gè)CMakeLists.txt文件。
在每一個(gè)功能包目錄下不允許有其它的功能包,也就是不允許功能包名字重復(fù)。
2.編譯依賴關(guān)系
在之前已經(jīng)創(chuàng)建過一個(gè)空的工作空間:catkin_ws中,可以在一個(gè)工作空間中創(chuàng)建一個(gè)功能包。在創(chuàng)建功能包時(shí)需要使用catkin_create_pkg命令。
首先進(jìn)入到目錄catkin_ws/src目錄下,創(chuàng)建一個(gè)名字為learning的功能包,它直接依賴于三個(gè)功能包:std_msgs,rospy以及roscpp,使用如下命令:
$catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
在創(chuàng)建的文件夾下可以看到package.xml和CMakeLists.txt。

catkin_create_pkg要求給出功能包的名字,及選擇性的給出所創(chuàng)建的功能包依賴于哪一個(gè)功能包,命令的使用方法如下:
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
這樣,我們的一個(gè)包功能就創(chuàng)建好了,我們可能會(huì)需要對(duì)功能包之間的依賴性做一下解釋。我們可以使用rospack命令來(lái)查看功能包之間的依賴關(guān)系(使用rospack命令的前提是已經(jīng)安裝了該命令)。
查看直接依賴關(guān)系:
$rospack depends1 beginner_tutorials
我們還可以直接在s功能包下的package.xml中查看功能包的依賴關(guān)系。使用命令:
$cd beginner_tutorials ?
$cat package.xml
在通常情況下,一個(gè)包所依賴的包又會(huì)依賴許多其它的包,稱為間接依賴。我們使用如下命令來(lái)查看rospy直接依賴的功能包:
$rospack depends1 rospy
而一個(gè)功能包可以有很多的間接依賴關(guān)系,我們可以使用命令:
$rospack depends beginner_tutorials 來(lái)查看。
3.完成
?編譯依賴性和運(yùn)行依賴性標(biāo)簽,指明了該功能包所依賴的其它功能包,如果我們?cè)谑褂胏atkin_create_pkg命令創(chuàng)建功能包的時(shí)候,沒有制定我們創(chuàng)建的功能包依賴于哪些功能包,可以手動(dòng)在添加依賴的功能包。
這樣功能包的創(chuàng)建和節(jié)點(diǎn)之間的依賴關(guān)系就清楚了。