創(chuàng)建 ROS2 工作空間

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) cddev_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.shsetup.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ū)继榆。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市汁掠,隨后出現(xiàn)的幾起案子略吨,更是在濱河造成了極大的恐慌,老刑警劉巖考阱,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翠忠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡羔砾,警方通過查閱死者的電腦和手機(jī)负间,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門偶妖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人政溃,你說我怎么就攤上這事趾访。” “怎么了董虱?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵扼鞋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我愤诱,道長(zhǎng)云头,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任淫半,我火速辦了婚禮溃槐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘科吭。我一直安慰自己昏滴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布对人。 她就那樣靜靜地躺著谣殊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牺弄。 梳的紋絲不亂的頭發(fā)上姻几,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音势告,去河邊找鬼蛇捌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛培慌,可吹牛的內(nèi)容都是我干的豁陆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼吵护,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盒音!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起馅而,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤祥诽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瓮恭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雄坪,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年屯蹦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了维哈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绳姨。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阔挠,靈堂內(nèi)的尸體忽然破棺而出飘庄,到底是詐尸還是另有隱情,我是刑警寧澤购撼,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布跪削,位于F島的核電站,受9級(jí)特大地震影響迂求,放射性物質(zhì)發(fā)生泄漏碾盐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一揩局、第九天 我趴在偏房一處隱蔽的房頂上張望毫玖。 院中可真熱鬧,春花似錦谐腰、人聲如沸孕豹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至春霍,卻和暖如春砸西,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背址儒。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工芹枷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人莲趣。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓鸳慈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親喧伞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子走芋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359