ROS2-010-通信机制补完:功能包重名和工作空间覆盖机制
2025年3月13日...大约 2 分钟
简介
在 ROS2 中编写功能包时,一般会在单个空间内进行编写与编译。但是当程序员需要经由多个工作空间进行不同的功能包的编写式,很可能会出现在不同的工作空间下将不同的功能包命名为同一个名字的情况。例如在 工作空间A 和 工作空间B 中都创建了一个名字叫 “C” 的功能包,假设该功能包里都有一个 “C_node” 节点,那么当我们新建终端并直接执行
ros2 run C C_node
时,会执行哪一个工作空间下的功能包呢?
工作空间覆盖机制
在 ROS2 中,当存在同名功能包位于不同工作空间时,执行 ros2 run C C_node
的具体行为取决于 ROS2 中的 工作空间覆盖机制。该机制由以下两个因素构成:
- 当 ROS2 尝试搜索功能包时,它会通过一个环境变量
AMENT_PREFIX_PATH
(C++ 和 Python 都使用AMENT_PREFIX_PATH
,而 Python 还需要依赖PYTHONPATH
)进行搜索。该变量记录了各个工作空间的路径,而 路径的顺序决定了其优先级,其中 后添加的路径会被优先搜索。 - 当你在特定的工作空间下执行
. install/setup.bash
,或者在任意路径位置下执行source <特定工作空间路径>/install/setup.bash
时,该特定工作空间的路径会被记录并前置到AMENT_PREFIX_PATH
内部。
因此当你在不同工作空间中出现同名功能包时,那么该功能包是否会被执行,取决于你对不同工作空间取 source
的 顺序:
如果你只在终端激活了 工作空间A或B 中的一个,ROS2 就只能找到 被激活的 工作空间中的包,此时它便会明确地执行对应的功能包。
如果你按顺序 source 两个工作空间时:
- 若 先 source A 后 source B,因为 B 的路径在
AMENT_PREFIX_PATH
中更靠前,工作空间B 的包会生效。 - 若 先 source B 后 source A:因为 A 的路径在
AMENT_PREFIX_PATH
中更靠前,工作空间A 的包会生效。
- 若 先 source A 后 source B,因为 B 的路径在
功能包重名可以用来做什么?
可以让你更加混淆。因此建议是不要这么做😅
或者你可以。。。
在给不同的功能包命名时,你可以尝试使用 “<工作空间>-<功能包名>” 的命名方式,这样就可以大概率避免不同空间内的功能包重名了☝🤓