解决source多个ROS工作空间时的覆盖问题


解决source多个ROS工作空间时的覆盖问题

问题描述

在~/.zshrc或者~/.bashrc中source 了多个工作空间,但有的工作空间并没有被成功source

使用ros有时需要多个利用多个工作空间,但每打开一个终端就要source一次工作空间比较麻烦。将工作空间的setup.sh脚本写入~/.zshrc或者~/.bashrc中是一种较为方便的做法。

但有时候,有一些工作空间并不会被成功的source。在这样的情况下,roslaunch也不给自动补全,强行打出全名运行时也会报错,echo $ROS_PACKAGE_PATH 输出的信息里面也看不见那几个包。

可能的原因是因为source 的部分工作空间在写入~/.zshrc或者~/.bashrc时没有编译导致顺序错乱。

解决方法

方法一:

比较方便的解决方法是,找到~/.zshrc或者~/.bashrc中最后被source的工作空间,然后修改其devel文件夹下的setup_util.py文件,查找CMAKE_PREFIX_PATH,在其中键入缺少的工作空间的devel路径,保存退出。之后重新打开一个终端时,应该所有工作空间都会被成功source了。

以下图为例,你需要找到的是/home/lqx/catkin_workspace/catkin_drive这个工作空间。

之后,在其devel文件夹下的setup_util.py文件中查找查找CMAKE_PREFIX_PATH,找到如下图所示的部分。

在其中键入缺少的工作空间的devel路径,具体的操作如下图所示。

修改好之后,重新打开一个终端,或者在现有终端下重新source ~/.zshrc或者~/.bashrc文件即可。

检验:

可以查看roslaunch指令是否能自动补全工作空间中的包,并且能否成功的运行;

也可以检查echo $ROS_PACKAGE_PATH 指令输出的信息中是否包含你所有的工作空间。

方法二:

修改~/.zshrc或者~/.bashrc中最后被source的工作空间下的文件并不是一种很合适的方法,毕竟这个工作空间下还放着需要使用的包,对其进行修改、编译等操作难免会产生一些影响。

因此,我们可以单独建立一个工作空间专门用来管理其他所有的工作空间,我们只需要将其source指令写入~/.zshrc或者~/.bashrc即可,每一次我们想增添新的工作空间,只要修改这个工作空间的devel文件夹下的_setup_util.py就可以了。

比如这里我建了一个叫做ros_manager的工作空间,修改好_setup_util.py文件之后,写入到~/.zshrc中,把其他工作空间的source指令都注释掉即可,以后添加新的工作空间,只需要修改ros_manager的_setup_util.py文件即可。

方法三:

其实还可以将--extend参数传递给setup.sh文件,它只会添加到环境中,而不会设置环境。

在~/.zshrc或者~/.bashrc中,对应的操作是在source命令后面加上--extend

但是这可能是危险的,建议做适当的工作区链接。


文章作者: Immortalqx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Immortalqx !
评论
  目录