天天看点

catkin配置多工作空间-workspace_overlayingcatkin配置多工作空间-workspace_overlaying1. 问题-找不到ROS包2. 分析-setup.bash3. 解决-catkin_overlay_ws4. 参考资料

catkin配置多工作空间-workspace_overlaying

目录

catkin配置多工作空间-workspace_overlaying

1. 问题-找不到ROS包

2. 分析-setup.bash

2.1 ROS_PACKAGE_PATH环境变量

2.2 setup.bash分析

3. 解决-catkin_overlay_ws

4. 参考资料

1. 问题-找不到ROS包

如果确定是多ROS多工作空间冲突导致的问题,可以直接空降到第3节:解决-catkin_overlay_ws。

最近搞ROS,为了把不同的ROS包分开管理、编译,在home目录下创建了几个catkin工作空间。

catkin配置多工作空间-workspace_overlayingcatkin配置多工作空间-workspace_overlaying1. 问题-找不到ROS包2. 分析-setup.bash3. 解决-catkin_overlay_ws4. 参考资料

出现的问题是:执行roslaunch有些包TAB补全不出来,且有些launch文件找不到要执行的节点。当我手动source了出问题的包的工作空间的setup.bash,又重新roslaunch运行时,执行就正常了。但是每次都要手动source很麻烦,而且并没有根本解决问题。

经过分析,初步判断是~/.bashrc里source了多个catkin工作空间的setup.bash,导致有些环境变量被覆盖,最终找不到包的问题。

catkin配置多工作空间-workspace_overlayingcatkin配置多工作空间-workspace_overlaying1. 问题-找不到ROS包2. 分析-setup.bash3. 解决-catkin_overlay_ws4. 参考资料

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'
           
catkin配置多工作空间-workspace_overlayingcatkin配置多工作空间-workspace_overlaying1. 问题-找不到ROS包2. 分析-setup.bash3. 解决-catkin_overlay_ws4. 参考资料

如上图,这是设置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