幫助中心
這里有最新的使用文檔和教程
ROS的工作空間overlay機制
官方的介紹請見,Overlaying with catkin workspaces,以下系自己理解,有誤請指正。
Overlaying refers to building and using a ROS package from source on top of an existing version of that same package. In this way your new or modified version of the package "overlays" the installed one.
覆蓋是指在同一個包的現有版本之上從源代碼構建和使用 ROS 包。這樣,您的新版本或修改版本的軟件包“覆蓋”了已安裝的版本。
簡單來說,就是允許存在不同版本的ROS Package。
單層覆蓋
通常情況下,使用apt
安裝的ROS二進制包會在/opt/ros/<distro>/
下,不能進行源碼更改。此時需要修改功能,只能從源碼重新編譯。
以catkin_ws
為例,使用
|
$catkin_make |
會打印
-- This workspace overlays: /opt/ros/noetic
即/opt/ros/noetic
中的ROS包會被catkin_ws中的同名包覆蓋掉,下次使用ros相關工具調用使用的就是catkin_ws中源碼編譯的版本。
多層覆蓋
涉及到多工作空間時,會在.bashrc
中添加source ${workspace}/devel/setup.bash
。可能會有同名包出現在多個工作空間,且各不相同。首先推薦是,按照工程劃分工作空間,每次只source某一個工作空間,這樣不容易出問題。
如果非要同時source多個工作空間,那么順序上,在.bashrc
中排在后面的工作空間會覆蓋掉前面的工作空間。
|
source /opt/ros/noetic/setup.bash |
|
source ~/1_ws/devel/setup.bash #工作空間1 |
|
source ~/2_ws/devel/setup.bash #工作空間2 |
|
source ~/3_ws/devel/setup.bash #工作空間3 |
|
|
|
#如果出現同名包,rosrun時會使用工作空間3的 |
|
在環境變量上,前面的會覆蓋掉后面的
|
$echo $ROS_PACKAGE_PATH |
|
/home/user/catkin_ws/src:/opt/ros/noetic/share |
容易出的問題
寫在前面,如果而非要多層覆蓋,那么建議按順序修改編譯。如果出現問題,首先查找多個工作空間下的同名包是否被依賴,根據實際需要修改.bashrc中的工作空間順序,調整覆蓋順序,重新按順序編譯一般可以解決
按順序多層覆蓋,同時不按順序修改和編譯,容易導致同名依賴出現問題。根據舉例
|
1_ws/ |
|
src/ |
|
package_1 |
|
package_2 # depends on package_a |
|
devel/ |
|
... |
|
2_ws/ |
|
src/ |
|
package_1 |
|
devel/ |
|
... |
先有1_ws
,package_2
依賴package_1
,正常編譯。新增2_ws
,其中刪減了某個頭文件的package_1
覆蓋1_ws
中的package_1
。此時package_2
依賴的是1_ws中的
還是2_ws
中的?
這時新搞一個工作空間,再次依賴package_1
,依賴的是那個?
如果再有一個package_3
,同時依賴package_2
和package_1
,分別依賴的是哪個?
這時候再修改編譯pacakge_1
或package_2
呢,對pacakge_3
的有什么影響?
我反正是不知道。混亂的情況有無數種,我們不需要理清混亂的規律,從源頭好好規劃避免混亂才是解決問題的方式。