workspace(工作空間)是包含ROS2 packages(包)的文件夾。在使用ROS 2之前,有必要在終端中source一下ROS 2的安裝工作區,這樣就可以在該終端中使用ROS 2的軟件包。
還可以source一個“overlay”(一個次級工作區,在這里可以添加新的包,而不會干擾正在擴展的現有ROS 2工作區),或者“underlay”。underlay必須包含overlay中所有包的依賴關系。overlay中的包將覆蓋underlay中的包,也可以有多個overlay和underlay,每個連續的overlay使用其父underlay的包。
1.Source ROS2環境
在本例中,主要的ROS2的安裝文件為underlay(請記住,一個underlay不一定是主要的ROS2安裝文件)。
將ROS2添加到環境變量中,可以參考:配置ROS2環境
2.創建一個新文件夾
在工程項目中最好的做法就是,為每個新工作空間創建一個新文件夾。名稱並不重要,但是用它來表示工作區的用途是很有幫助的。創建文件夾名為dev_ws
(development workspace):
mkdir -p ~/dev_ws/src
cd ~/dev_ws/src
另一個實踐經驗是將工作空間中的任何包放到src
目錄下。上面的代碼在dev_ws
中創建了一個src
目錄,然后進入其中。
3.Clone一個簡單項目
現在使用來自ros_tutorials
存儲庫(repo)中現有的包對工作空間進行了解,以后會創建自己的包。
在dev_ws/src
目錄下,執行以下命令:
git clone https://github.com/ros/ros_tutorials.git -b foxy-devel
現在工作空間中克隆了ros_tutorials
,查看dev_ws/src
的內容,將看到新的ros_tutorials
目錄。
要查看ros_tutorials
中的包,輸入以下命令:
ls ros_tutorials
終端返回:
roscpp_tutorials rospy_tutorials ros_tutorials turtlesim
忽略前三個包,turtlesim
是這個倉庫中唯一一個真正的ROS2包。
現在已經使用示例包填充了工作區,但它還不是功能齊全的工作空間,需要首先解析依賴項並編譯工作空間。
4.解析依賴
在編譯工作空間之前,需要解析包依賴項。可能已經擁有了所有依賴項,但是實踐經驗告訴我們最好是在每次克隆時檢查依賴項。這樣不會在長時間的等待之后,由於缺少依賴項而導致編譯失敗。
在工作空間空間(dev_ws
)的根目錄下,運行以下命令:
rosdep install -i --from-path src --rosdistro foxy -y
如果已經擁有了所有依賴項,控制台將返回:
#All required rosdeps installed successfully
包在package.xml
文件中聲明它們的依賴關系,此命令遍歷這些聲明,並安裝缺少的依賴。
5.使用colcon編譯工作空間
在工作空間的根目錄下(dev_ws
),可以使用以下命令編譯包:
colcon build
此時,終端返回:
Starting >>> turtlesim
[Processing: turtlesim]
Finished <<< turtlesim [50.5s]
Summary: 1 package finished [50.7s]
注意:
colcon build
有許多有用的參數:
-
--packages-up-to
構建你想要的包,加上它的所有依賴項,但不是整個工作空間(節省時間) -
--symlink-install
使你在每次調整python腳本時都不必重新編譯 -
--event-handlers console_direct+
在編譯時顯示控制台輸出(同樣可以在log
目錄中找到)
一旦編譯完成,在工作空間根目錄(~/dev_ws
)下輸入ls
(顯示所有內容),會發現colcon
創建了新的文件夾:
build install log src
install
目錄里面包含工作空間的配置文件,可以使用它來source ‘overlay’。
6.source overlay
在source overlay之前,打開一個新的終端,與編譯工作空間的終端分開,這是非常重要的。在編譯的同一終端中source overlay,或者類似地在已經source overlay的終端中編譯,這可能會產生復雜的問題。
在新終端中,將ROS 2環境作為“underlay”,這樣就可以在它之上構建“overlay”:
source /opt/ros/foxy/setup.bash
找到工作空間根目錄:
cd ~/dev_ws
在根目錄下,source overlay:
. install/local_setup.bash
注意:
source overlay的local_setup
僅僅將overlay中可用的包添加到環境中,setup
則將overlay
和underlay
一起添加到環境中,可以同時利用這兩個工作空間。
所以,source ROS2的安裝目錄的setup
,然后source dev_ws
中的overlay的local_setup
,與直接source dev_ws
中的setup
是一樣的,因為它包含了underlay。
現在可以在overlay環境中,運行turtlesim
:
ros2 run turtlesim turtlesim_node
但是怎么才能知道這是運行的overlay turtlesim,而不是主安裝的turlesim ?
可以在overlay中修改turtlesim,這樣就可以看到效果了:
-
可以在overlay中修改和重建包(與underlay區分)。
-
overlay優先於underlay。
7.修改overlay
可以通過編輯turtlesim窗口的標題欄來修改overlay。為此,在~/dev_ws/src/ros_tutorials/turtlesim/src
中找到turtle_frame.cpp
文件。使用文本編輯器打開turtle_frame.cpp
。
在52行,可以看到函數setWindowTitle("TurtleSim");
,將TurtleSim
修改為MyturtleSim
,並保存,然后使用colcon build
重新編譯。

返回到第二個終端(source overlay的)並再次運行turtlesim
:
ros2 run turtlesim turtlesim_node
將會看到turtlesim
窗口的標題欄現在顯示為“MyTurtleSim”。

盡管ROS2安裝環境在此終端已經source過了,但是dev_ws
環境的overlay優先於underlay的內容。
要檢查underlay是否仍然完整,打開一個全新的終端,並只source ROS2的安裝環境。再次運行turtlesim:
ros2 run turtlesim turtlesim_node

可以看到,對overlay的修改實際上並沒有影響到underlay的任何東西。
8.總結
在本例中,將ROS2的安裝環境作為underlay,並通過在新的工作空間中克隆和編譯包來創建一個overlay,overlay優先於underlay。
對於處理少量的包,建議使用疊加,這樣就不必將所有東西都放在同一個工作區中,並在每次迭代中重新編譯一個巨大的工作區。
如果給您帶來幫助,希望能給點個關注,以后還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。
都看到這了,點個推薦再走吧~
未經允許,禁止轉載。