ROS2 中的工作空間類似我們常說的概念——“工程”,是我們?cè)?ROS 中開發(fā)具體項(xiàng)目的空間,所有功能包的源碼丐枉、配置、編譯都在該空間下完成掘托。
工作空間(workspace瘦锹,也叫工作區(qū))是包含 ROS 2 軟件包的目錄。在使用ROS 2之前闪盔,必須在計(jì)劃使用的終端中提供 ROS 2 安裝工作區(qū)弯院。這使 ROS 2 的軟件包可供您在該終端中使用。
您還可以選擇“overlay” –一個(gè)輔助工作區(qū)泪掀,在其中可以添加新軟件包而不會(huì)干擾正在擴(kuò)展的現(xiàn)有 ROS 2 工作區(qū)或“underlay”听绳。underlay 必須包含 overlay 中所有軟件包的依賴項(xiàng)。overlay 中的包將覆蓋 underlay 中的包异赫。也可以有多個(gè)參考 underlay 和 overlay椅挣,每個(gè)后續(xù)的 overlay 都使用其父 overlay 的包头岔。
通俗地說,我們可能會(huì)同時(shí)開發(fā)多個(gè)項(xiàng)目贴妻,就會(huì)產(chǎn)生多個(gè)工作空間切油,所以工作空間之間也有一個(gè)層次的問題蝙斜,類似于優(yōu)先級(jí)的概念名惩,比如不同工作空間中有同名的功能包,那運(yùn)行的時(shí)候是啟動(dòng)哪一個(gè)呢孕荠?ROS 默認(rèn)是啟動(dòng)最上層的工作空間( overlay)娩鹉,上層工作空間中的功能包會(huì)覆蓋(override)下層工作空間(underlay)中的同名功能包。所以有多個(gè)工作空間存在的時(shí)候稚伍,我們還需要注意設(shè)置工作空間的層次弯予。
1 Source ROS 2 environment?
工作空間的層次是通過環(huán)境變量來配置的,簡(jiǎn)單來說:下一個(gè)配置的工作空間會(huì)放到上一個(gè)配置的工作空間之上个曙。
ROS2 安裝路徑下的功能包一般會(huì)被我們?cè)O(shè)置為最下層的工作空間锈嫩,所以我們?cè)诎惭b好 ROS2 之后,一定要記得在 bashrc 中設(shè)置如下 ROS2 安裝路徑的環(huán)境變量:
$ source /opt/ros/<distro>/setup.bash
比如:
$ source /opt/ros/foxy/setup.bash
2 Create a new directory?
最佳實(shí)踐是為每個(gè)新工作空間創(chuàng)建一個(gè)新目錄垦搬。名稱無關(guān)緊要呼寸,但可以指出工作空間的用途會(huì)很有幫助。讓我們?yōu)椤伴_發(fā)工作空間”選擇目錄名稱 dev_ws
:
mkdir -p dev_ws/src
cd dev_ws/src
另一個(gè)最佳實(shí)踐是將工作空間中的所有軟件包放入 src
目錄猴贰。上面的代碼在 dev_ws
內(nèi)創(chuàng)建一個(gè) src
目錄对雪,然后導(dǎo)航到該目錄。
3 Clone a sample repo?
現(xiàn)在我們使用的終端已經(jīng) cd
到 dev_ws/src
路徑下米绕,接下來我們?cè)谶@里先放置一些示例的功能包瑟捣。您將使用的現(xiàn)有軟件包來自 ros_tutorials
存儲(chǔ)庫(kù)(on GitHub)。在 dev_ws/src
目錄中栅干,對(duì)要使用的發(fā)行版運(yùn)行以下命令:
$ git clone https://github.com/ros/ros_tutorials.git -b <distro>-devel
比如:
$ git clone https://github.com/ros/ros_tutorials.git -b foxy-devel
稍等片刻迈套, ros_tutorials
中的示例功能包就全部放到工作空間的 src
下邊啦,其中我們可以看到這些內(nèi)容:
現(xiàn)在碱鳞,您已經(jīng)在工作區(qū)中填充了一個(gè)示例程序包桑李,但這不是一個(gè)功能齊全的工作區(qū)。您需要解決依賴關(guān)系并首先構(gòu)建工作區(qū)劫笙。
4 Resolve dependencies?
在構(gòu)建工作空間之前芙扎,您需要解決程序包依賴性。您可能已經(jīng)具有所有依賴關(guān)系填大,但是最佳實(shí)踐是每次克隆時(shí)都要檢查依賴關(guān)系戒洼。您不會(huì)希望由于長(zhǎng)時(shí)間缺少依賴關(guān)系而導(dǎo)致構(gòu)建失敗。
如果允华,沒有安裝 rosdep
圈浇,可以運(yùn)行:
$ sudo apt install python-rosdep2
$ sudo rosdep init
$ rosdep update
更多細(xì)節(jié)見:rosdep wiki寥掐。
ROS2 提供了自動(dòng)化的依賴安裝方式,需要我們?cè)诠ぷ骺臻g的根目錄 dev_ws
下運(yùn)行如下命令:
$ rosdep install -i --from-path src --rosdistro <distro> -y
將 <distro>
替換為您的發(fā)行版磷蜀。
運(yùn)行之后召耘,會(huì)自動(dòng)安裝確實(shí)的依賴,如果依賴全部滿足的話褐隆,就會(huì)顯示:
這里需要注意一點(diǎn)污它,以上自動(dòng)化安裝依賴的前提是:每個(gè)功能包已經(jīng)完整的將所依賴的包和庫(kù)在 package.xml
文件中聲明。
5 Build the workspace with colcon?
接下來就可以編譯代碼啦庶弃,需要在工作空間的根目錄 dev_ws
下運(yùn)行:
$ colcon build
如果提示 colcon
沒有安裝的話衫贬,可以使用如下命令安裝:
$ sudo apt install python3-colcon-common-extensions
colcon
是 ROS2 的編譯工具,類似于 ROS1 中的 catkin歇攻。運(yùn)行之后可以看到:
colcon build
后邊還可以跟一些常用的參數(shù):
-
--packages-up-to
:編譯指定的功能包固惯,而不是整個(gè)工作空間 -
--symlink-install
:節(jié)省每次重建 python 腳本的時(shí)間 -
--event-handlers console_direct+
:在終端中顯示編譯過程中的詳細(xì)日志(否則可以在log
目錄中找到)
構(gòu)建完成后,在工作區(qū)根目錄(dev_ws
)中輸入 ls
缴守,您將看到 colcon
創(chuàng)建了新目錄:
build install log src
install
目錄是您工作區(qū)的安裝文件所在的目錄葬毫,您可以使用該目錄來獲取 overlay
。
6 Source the overlay?
接下來需要重新打開一個(gè)終端屡穗,然后來設(shè)置 dev_ws
工作空間的環(huán)境變量贴捡。
在獲取 overlay
之前培遵,非常重要的一點(diǎn)是徙硅,要打開一個(gè)新終端,與構(gòu)建工作區(qū)的終端分開渐夸。在您構(gòu)建的同一終端中 sourcing overlay
箍镜,或者在生成 overlay
的地方同樣進(jìn)行 sourced源祈,可能會(huì)造成復(fù)雜的問題。
在新終端中色迂,您的主要 ROS 2 環(huán)境作為 “underlay” source香缺,因此您可以在其“on top of”構(gòu)建 overlay:
$ source /opt/ros/<distro>/setup.bash
進(jìn)入工作空間的根目錄,接著歇僧,source
你的 overlay
:
$ . install/local_setup.bash
install
里有兩個(gè)很類似的文件:local_setup.sh
和 setup.sh
图张,前者僅會(huì)設(shè)置當(dāng)前工作空間中功能包的相關(guān)環(huán)境變量,后者還會(huì)設(shè)置該工作空間下其他底層工作空間的環(huán)境變量诈悍。
現(xiàn)在我們就可以來運(yùn)行 dev_ws
工作空間下的 turtlesim
功能包了:
ros2 run turtlesim turtlesim_node
這時(shí)會(huì)有一個(gè)問題祸轮,ROS2 安裝的路徑下有一個(gè) turtlesim
功能包,這里又有一個(gè) turtlesim
功能包侥钳,我怎么能確定現(xiàn)在運(yùn)行的就是 dev_ws
里的 turtlesim
呢适袜?
不如我們來嘗試修改下這個(gè)包,看下是否會(huì)有變化舷夺。
7 Modify the overlay?
您可以通過在 turtlesim
窗口上編輯標(biāo)題欄來修改覆蓋中的 turtlesim
苦酱。為此售貌,請(qǐng)?jiān)?~/dev_ws/src/ros_tutorials/turtlesim/src
中找到 turtle_frame.cpp
文件。用您喜歡的文本編輯器打開 turtle_frame.cpp
疫萤。
在第 52 行颂跨,您將看到函數(shù) setWindowTitle("TurtleSim")
;。將值 ”TurtleSim” 更改為“ ”MyTurtleSim”扯饶,然后保存文件恒削。
返回到您之前運(yùn)行 colcon build
的第一個(gè)終端,然后再次運(yùn)行它帝际。返回第二個(gè)終端(overlay 的 sourced)并再次運(yùn)行 turtlesim
:
$ ros2 run turtlesim turtlesim_node
沒錯(cuò)蔓同,打開的小海龜窗口中,標(biāo)題名已經(jīng)變啦蹲诀。
可見,當(dāng)前運(yùn)行的確實(shí)是dev_ws工作空間下的turtlesim包弃揽。
如果再打開一個(gè)新終端脯爪,不 source dev_ws 的環(huán)境變量,那么運(yùn)行一下命令時(shí)就不一樣啦:
$ ros2 run turtlesim turtlesim_node
您可以看到 overlay
中的修改實(shí)際上并沒有影響 underlay
中的任何內(nèi)容矿微。
所以在這里痕慢,dev_ws
是上層工作空間,ROS2 安裝路徑是下層工作空間涌矢,具體運(yùn)行哪里的包掖举,全看你在終端中如何設(shè)置環(huán)境變量了
8 總結(jié)
在本教程中,您將主要的 ROS 2 發(fā)行版安裝作為 underlay娜庇,并通過在新工作區(qū)中克隆和構(gòu)建軟件包來創(chuàng)建了 overlay塔次。如您在修改過的 turtlesim
中所看到的,overlay 位于路徑的前面名秀,并且優(yōu)先于 underlay励负。
建議使用 overlay 來處理少量程序包,因此您不必將所有內(nèi)容都放在同一工作區(qū)中匕得,而不必在每次迭代時(shí)都重建一個(gè)巨大的工作區(qū)继榆。