3.2 工作空間覆蓋
場景
同一工作空間下不允許出現(xiàn)功能包重名的情況,但是當存在多個工作空間時,不同工作空間下的功能包是可以重名的,那么當功能包重名時,會調(diào)用哪一個呢?
比如:自定義工作空間A存在功能包turtlesim,自定義工作空間B也存在功能包turtlesim,當然系統(tǒng)自帶工作空間也存在turtlesim,如果調(diào)用turtlesim包,會調(diào)用哪個工作空間中的呢?
概念
所謂工作空間覆蓋,是指不同工作空間存在重名功能包時,重名功能包的調(diào)用會產(chǎn)生覆蓋的情況。
作用
沒什么用,這種情況是需要極力避免出現(xiàn)的。
演示
1.分別在不同的工作空間下創(chuàng)建turtlesim功能包。
終端下進入ws00_helloworld的src目錄,新建功能包:
ros2 pkg create turtlesim --node-name turtlesim_node
為了方便查看演示結(jié)果,將默認生成的 turtlesim_node.cpp 中的打印內(nèi)容修改為:ws00_helloworld turtlesim\n
終端下進入ws01_plumbing的src目錄,新建功能包:
ros2 pkg create turtlesim --node-name turtlesim_node
為了方便查看演示結(jié)果,將默認生成的 turtlesim_node.cpp 中的打印內(nèi)容修改為:ws01_plumbing turtlesim\n
2.在 ~/.bashrc 文件下追加如下內(nèi)容:
source /home/ros2/ws00_helloworld/install/setup.bash
source /home/ros2/ws01_plumbing/install/setup.bash
修改完畢后,保存并關(guān)閉文件。
3.新建終端,輸入如下指令:
ros2 run turtlesim turtlesim_node
輸出結(jié)果為:ws01_plumbing turtlesim
,也即執(zhí)行的是 ws01_plumbing 功能包下的 turtlesim,而 ws00_helloworld 下的 turtlesim 與內(nèi)置的 turtlesim 被覆蓋了。
原因
這與~/.bashrc中不同工作空間的setup.bash文件的加載順序有關(guān):
1.ROS2 會解析 ~/.bashrc 文件,并生成全局環(huán)境變量 AMENT_PREFIX_PATH 與 PYTHONPATH,兩個環(huán)境變量取值分別對應(yīng)了 ROS2 中 C++ 和 Python 功能包,環(huán)境變量的值由功能包名稱組成;

2.兩個變量的值的設(shè)置與 ~/.bashrc 中的 setup.bash 的配置順序有關(guān),對于自定義的工作空間而言,后配置的優(yōu)先級更高,主要表現(xiàn)在后配置的工作空間的功能包在環(huán)境變量值組成的前部,而前配置工作空間的功能包在環(huán)境變量值組成的后部分,如果更改兩個自定義工作空間在 ~/.bashrc 中的配置順序,那么變量值也將相應(yīng)更改,但是 ROS2 系統(tǒng)工作空間的配置始終處于最后。
3.調(diào)用功能包時,會按照 AMENT_PREFIX_PATH 或 PYTHONPATH 中包配置順序從前往后依次查找相關(guān)功能包,查找到功能包時會停止搜索,也即配置在前的會優(yōu)先執(zhí)行。
隱患
前面提到,工作空間覆蓋的情況是需要極力避免出現(xiàn)的,因為導致一些安全隱患:
可能會出現(xiàn)功能包調(diào)用混亂,出現(xiàn)實際調(diào)用與預(yù)期調(diào)用結(jié)果不符的情況;
即便可以通過 ~/.bashrc 來配置不同工作空間的優(yōu)先級,但是經(jīng)過測試,修改 ~/.bashrc 文件之后不一定馬上生效,還需要刪除工作空間下build與install目錄重新編譯,才能生效,這個過程繁瑣且有不確定性。
綜上,在實際工作中,需要制定明確的包命名規(guī)范,避免包重名情況。


B站有完整的ros系列教程視頻,可以觀看完整內(nèi)容ros課程ROS2理論與實踐
更多內(nèi)容將在猛獅知識星球社區(qū)更新最新課程,后續(xù)將推出更多優(yōu)質(zhì)內(nèi)容——詳情可關(guān)注猛獅集訓營公眾號和猛獅集訓營官方網(wǎng)站。