今天突然发现当多工作空间并存时,我的ROS的环境变量发生了比较诡异的异常,按照我之前的理解,在.bashrc文件中按顺序设定了ROS的环境变量后,ROS就会按照.bashrc中编写的环境变量来搜寻功能包,例如在.bashrc文件使用soure设定了以下的环境变量后
source /opt/ros/noetic/setup.bash
source /home/gly/Car-like-Robotic-swarm/devel/setup.bash
source /home/gly/motionplanning_ws/devel/setup.bash
source /home/gly/catkin_ws/devel/setup.bash
使用echo $ROS_PACKAGE_PATH指令打印出的路径,正常而言,应该如下所示,即在.bashrc文件中的位置越靠后,其优先级应该越高,且打印出的环境变量应该与.bashrc文件中设定的环境变量一一对应。
/home/gly/catkin_ws/src:/home/gly/motionplanning_ws/src:/home/gly/Car-like-Robotic-swarm/src:/opt/ros/noetic/share
以上是我之前的理解,但今天的测试发现,事情并非如此,使用echo $ROS_PACKAGE_PATH指令打印出的路径实际上如下所示,其优先级是混乱的,并非设定的那样。
/home/gly/motionplanning_ws/src:/home/gly/Car-like-Robotic-swarm/src:/home/gly/catkin_ws/src:/opt/ros/noetic/share
然后,我进一步在.bashrc中删除了环境变量source /home/gly/ motionplanning_ws/devel /setup.bash,只保留了剩下的三个,保存后,在新的终端打印出的环境变量如下,依然包含我已经在.bashrc文件中删除的那个环境变量,且优先级依然是最高
/home/gly/motionplanning_ws/src:/home/gly/Car-like-Robotic-swarm/src:/home/gly/catkin_ws/src:/opt/ros/noetic/share
然后,我把source /home/gly/catkin_ws/devel/setup.bash这行也删了,也就是说,此时在.bashrc文件中设定的环境变量仅剩下如下的两个:
source /opt/ros/noetic/setup.bash
source /home/gly/Car-like-Robotic-swarm/devel/setup.bash
保存后,在新的终端,再使用echo $ROS_PACKAGE_PATH指令打印ROS的环境变量时,打印结果如下,好消息是/home/gly/ motionplanning_ws/devel /setup.bash的路径终于没了,坏消息是为啥/home/gly/catkin_ws/devel/setup.bash的还在????
/home/gly/Car-like-Robotic-swarm/src:/home/gly/catkin_ws/src:/opt/ros/noetic/share
为了测试,是在执行完哪行source后发生的问题,我在每个soure后面都加了一句打印环境变量的语句,如下所示:
# ROS Noetic - 基础 ROS 安装
source /opt/ros/noetic/setup.bash
echo $ROS_PACKAGE_PATH
# Car-like Robotic Swarm 工作空间
source /home/gly/Car-like-Robotic-swarm/devel/setup.bash
echo $ROS_PACKAGE_PATH
# Motion Planning 工作空间
source /home/gly/motionplanning_ws/devel/setup.bash
echo $ROS_PACKAGE_PATH
# Catkin 工作空间
source /home/gly/catkin_ws/devel/setup.bash
echo $ROS_PACKAGE_PATH
新打开一个终端时,会显示上述打印信息,如下所示,可以发现,当执行完第二个soure后,就发生了异常,正常来说,执行完第二个source应该只有ROS安装和Car-like Robotic Swarm 工作空间的环境变量,然而却多了Catkin 工作空间的工作变量…
/opt/ros/noetic/share
/home/gly/Car-like-Robotic-swarm/src:/home/gly/catkin_ws/src:/opt/ros/noetic/share
/home/gly/motionplanning_ws/src:/home/gly/Car-like-Robotic-swarm/src:/home/gly/catkin_ws/src:/opt/ros/noetic/share
/home/gly/motionplanning_ws/src:/home/gly/Car-like-Robotic-swarm/src:/home/gly/catkin_ws/src:/opt/ros/noetic/share
找了半天,也没找到具体啥原因,暂时的解决方法是,在source指令的后面用export ROS_PACKAGE_PATH在.bashrc中按照所期望的优先级手动设定ROS环境变量的方法,如下所示
export ROS_PACKAGE_PATH=/home/gly/catkin_ws/src:/home/gly/motionplanning_ws/src:/home/gly/Car-like-Robotic-swarm/src:/opt/ros/noetic/share
如果有大佬知道上述在.bashrc中使用soure设定环境变量与实际环境变量不匹配异常的原因或者更好的解决方法,欢迎在评论区指出