单独使用OpenCV的时候遇到了之前因为安装 ROS 而导致的一些坑点。
故记录下来。
问题描述
使用了
Anaconda
的虚拟环境,并且确认已经安装过 OpenCV运行 Python,直接 xxx(不可描述)。
1 |
Traceback (most recent call last): |
若只想看解决办法,请直接点我
问题研究
- 查看问题
1 |
# 错误信息 |
-
很明显,ROS 在干坏事。
-
可是明明用了 Anaconda 的虚拟环境,为何会引用ROS的库,而且使用的是Python3为何会使用Python2.7里面的库。
-
回想ROS干过啥
-
在
~/.zshrc
中添加了一句话source /opt/ros/kinetic/setup.zsh
(我使用的是zsh
,如果使用bash
,应该是在~/.bashrc
中添加了source /opt/ros/kinetic/setup.bash
,一个道理) -
然后又是
Python
找库找的不对,这时候应该想到PYTHONPATH
环境变量
解释一下,
PYTHONPATH
环境变量就是Python
去 import 的时候的搜索路径。
- 首先打印一下当前的
PYTHONPATH
1 |
echo $PYTHONPATH |
- 果然,ROS就没干好事。。
- 解决方法
1 |
# 1. 在 ~/.zshrc 或 ~/.bashrc 中将 PYTHONPATH 置为空 |
因为我还想着使用 ROS,所以我采用了方式1,因为用了方式2,ROS肯定就用不了啦。
问题再现
使用
roscore
,出现了问题。提示如下
1 |
Traceback (most recent call last): |
问题再探
- 好吧,这会轮到找不到 ROS 的依赖库了。
- 这可咋办,我作为一个懒人代表,不想每次使用都去注释一下。
- ROS 需要自己的依赖库,也就是
/opt/ros/kinetic/lib/python2.7/dist-packages
这里面的东西。 - 解决办法很简单,只要在
roscore
之前将它加上就行。 - 起初想法是写一个脚本,然后取添加
source
,感觉过于麻烦。 - 然后想到大名鼎鼎的
alias
命令。 - 然后便有了以下的解决办法。
- 在
~/.zshrc
或~/.bashrc
中添加如下命令:
1 |
alias roscore='source /opt/ros/kinetic/setup.zsh;roscore' |
- 此后,
roscore
的使用毫无问题了。 - 但是,新建一个终端的时候,我不可能再一次
roscore
吧,我要使用rosrun
或者catkin_make
怎么办? - 那就都加上就好了,所以命令变成了如下的三句话:
1 |
alias roscore='source /opt/ros/kinetic/setup.zsh;roscore' |
-
大功告成。
-
最后,突然想到,在日常使用的时候,经常需要在
catkin_make
之后使用source devel/setup.zsh
-
懒人做到底。。然后就又改成了如下三句话:
1 |
alias roscore='source /opt/ros/kinetic/setup.zsh;roscore' |
问题又现
catkin_make --help
异常
-
解决办法:
删掉
alias catkin_make='source /opt/ros/kinetic/setup.zsh;catkin_make;source devel/setup.zsh'
中的;source devel/setup.zsh
-
总结:
还是不能太偷懒啊。。。
rosrun 一直出现找不到 package
- 查看
PYTHONPATH
发现rosrun
之后只有一个PYTHONPATH
- 发现
source /opt/ros/kinetic/setup.zsh
会将当前工作工作空间的PYTHONPATH
环境给删除掉,ROS很傻吊
解决办法:
删掉原本的 alias rosrun
更改命令为:
1 |
alias rosrun='echo $PYTHONPATH | grep -q "ros" || source /opt/ros/kinetic/setup.bash;rosrun' |
总结
ROS 和 OpenCV 的坑使用以下方式就可以完美解决
-
删掉原本在
~/.bashrc
或~/.zshrc
中的source /opt/ros/kinetic/setup.bash
或source /opt/ros/kinetic/setup.zsh
-
在
~/.bashrc
或~/.zshrc
中添加如下代码:(注意选择对应版本)
1 |
# zsh 版本 |
- 万事大吉,重启终端!