catkin配置多工作空间-workspace_overlaying
目录
catkin配置多工作空间-workspace_overlaying
1. 问题-找不到ROS包
如果确定是多ROS多工作空间冲突导致的问题,可以直接空降到第3节:解决-catkin_overlay_ws。
最近搞ROS,为了把不同的ROS包分开管理、编译,在home目录下创建了几个catkin工作空间。
出现的问题是:执行roslaunch有些包TAB补全不出来,且有些launch文件找不到要执行的节点。当我手动source了出问题的包的工作空间的setup.bash,又重新roslaunch运行时,执行就正常了。但是每次都要手动source很麻烦,而且并没有根本解决问题。
经过分析,初步判断是~/.bashrc里source了多个catkin工作空间的setup.bash,导致有些环境变量被覆盖,最终找不到包的问题。
2. 分析-setup.bash
2.1 ROS_PACKAGE_PATH环境变量
当执行
echo $ROS_PACKAGE_PATH
时,会返回ROS查找包的路径,如果路径没有添加进来,就找不到该包。
2.2 setup.bash分析
分析catkin_ws/devel/setup.bash,一步步分析发现调用了如下文件:setup.bash==> setup.sh==> _setup_util.py。
分析_setup_util.py,在265行有
CMAKE_PREFIX_PATH = 'xxx'
如上图,这是设置CMAKE_PREFIX_PATH环境变量,而每个工作空间都以不同的值设置了该变量(与编译顺序有关)。
如果~/.bashrc里面包含了多个catkin工作空间,在source到最后一个catkin工作空间时,里面调用了相应的_setup_util.py,如果_setup_util.py里面CMAKE_PREFIX_PATH没有全部包含其它catkin工作空间路径,会覆盖前面的设置,导致找不到其它工作空间的包。
3. 解决-catkin_overlay_ws
这里给出我自己的解决思路:
1. 创建一个空catkin工作空间,我命名为catkin_overlay_ws,用于管理其它工作空间。
命令如下:
cd ~
mkdir catkin_overlay_ws
cd catkin_overlay_ws/
mkdir src
cd src/
catkin_init_workspace
cd ..
catkin_make
2.添加其它工作空间
编译该工作空间,在devel/_setup_util.py文件CMAKE_PREFIX_PATH那一行添加其它工作空间的路径,如 /home/username/catkin_roboware_ws/devel;/home/username/catkin_turtlebot3_ws/devel;等,用于负责包含其它工作空间。
这里给出根据我的工作空间改的例子:
# environment at generation time
CMAKE_PREFIX_PATH = '/home/username/cleanbot_ws/devel;/home/username/ORB_SLAM2/Examples/ROS/ORB_SLAM2/build/devel;/home/username/catkin_cleanbot_ws/devel;/home/username/catkin_roboware_ws/devel;/home/username/catkin_project_ws/devel;/home/username/catkin_turtlebot3_ws/devel;/opt/ros/kinetic'.split(';')
3. 在~/.bashrc里加入
#do not source ~/other_catkin_ws/devel/setup.bash after this
source ~/catkin_overlay_ws/devel/setup.bash
~/.bashrc仅加入该工作空间,其它工作空间不用加入。
最后,每次有新的工作空间就直接在catkin_overlay_ws/devel/_setup_util.py里添加就行了,至此多工作空间冲突就解决了。
4. 参考资料
参考http://wiki.ros.org/catkin/Tutorials/workspace_overlaying