ROS2學習之旅(12)——創建工作空間


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則將overlayunderlay一起添加到環境中,可以同時利用這兩個工作空間。

所以,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。

對於處理少量的包,建議使用疊加,這樣就不必將所有東西都放在同一個工作區中,並在每次迭代中重新編譯一個巨大的工作區。

如果給您帶來幫助,希望能給點個關注,以后還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。
都看到這了,點個推薦再走吧~
未經允許,禁止轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM