所谓工作空间覆盖,是指不同工作空间中,存在重名的功能包的情形。
实现:
1.新建工作空间A和工作空间B,两个工作空间中都创建功能包:turtlesim
2.在~/.bashrc文件下追加当前工作空间的bash格式如下:
source /home/用户/路径/工作空间A/devel/setup.bash
source /home/用户/路径/工作空间B/devel/setup.bash
注意:在.bashrc文件中,放在文件最后的source路径语句优先级更高。
3.新开命令行:source .bashrc加载环境变量
4.查看ROS环境环境变量echo $ROS_PACKAGE_PATH
结果:自定义工作空间B:自定义空间A:系统内置空间
5.调用命令:roscd turtlesim 会进入自定义工作空间B
结论:
功能包重名时,会按照ROS_PACKAGE_PATH查找,配置在前的会优先执行
隐患:
存在安全隐患,比如当前工作空间B优先级更高,意味这当程序调用turtlesim时,不会调用工作空间A也不会调用系统内置的turtlesim,如果工作空间A在实现时有其他功能包依赖于自身的turtlesim,而按照ROS工作空间覆盖的涉及原则,那么实际执行时将会调用工作空间B的turtlesim,从而导致执行异常,出现安全隐患。
BUG说明:
当在.bashrc文件中source多个工作空间后,可能出现的情况,在ROS_PACKAGE_PATH中只包含两个工作空间,可以删除自定义工作空间的build与devel目录,重新catkin_make,然后重新载入.bashrc文件,问题解决。