单独使用OpenCV的时候遇到了之前因为安装 ROS 而导致的一些坑点。

故记录下来。

问题描述

使用了 Anaconda 的虚拟环境,并且确认已经安装过 OpenCV

运行 Python,直接 xxx(不可描述)。

1
2
3
4
Traceback (most recent call last):
File "/home/askeynil/Desktop/cv/class/1. demo.py", line 1, in <module>
import cv2 as cv
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type

若只想看解决办法,请直接点我

问题研究

  1. 查看问题
1
2
# 错误信息
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
  1. 很明显,ROS 在干坏事。

  2. 可是明明用了 Anaconda 的虚拟环境,为何会引用ROS的库,而且使用的是Python3为何会使用Python2.7里面的库。

  3. 回想ROS干过啥

  4. ~/.zshrc 中添加了一句话 source /opt/ros/kinetic/setup.zsh (我使用的是 zsh ,如果使用bash,应该是在 ~/.bashrc 中添加了 source /opt/ros/kinetic/setup.bash ,一个道理)

  5. 然后又是 Python 找库找的不对,这时候应该想到 PYTHONPATH 环境变量

解释一下, PYTHONPATH 环境变量就是 Python 去 import 的时候的搜索路径。

  1. 首先打印一下当前的 PYTHONPATH
1
2
3
echo $PYTHONPATH
# 结果如下
# /opt/ros/kinetic/lib/python2.7/dist-packages
  1. 果然,ROS就没干好事。。
  2. 解决方法
1
2
3
# 1. 在 ~/.zshrc 或 ~/.bashrc 中将 PYTHONPATH 置为空
PYTHONPATH=
# 2. 或者果断点,将 source /opt/ros/kinetic/setup.zsh 或 source /opt/ros/kinetic/setup.bash 删掉

因为我还想着使用 ROS,所以我采用了方式1,因为用了方式2,ROS肯定就用不了啦。

问题再现

使用 roscore ,出现了问题。

提示如下

1
2
3
4
Traceback (most recent call last):
File "/opt/ros/kinetic/bin/roscore", line 36, in <module>
from rosmaster.master_api import NUM_WORKERS
ImportError: No module named rosmaster.master_api

问题再探

  1. 好吧,这会轮到找不到 ROS 的依赖库了。
  2. 这可咋办,我作为一个懒人代表,不想每次使用都去注释一下。
  3. ROS 需要自己的依赖库,也就是 /opt/ros/kinetic/lib/python2.7/dist-packages 这里面的东西。
  4. 解决办法很简单,只要在 roscore 之前将它加上就行。
  5. 起初想法是写一个脚本,然后取添加 source ,感觉过于麻烦。
  6. 然后想到大名鼎鼎的 alias 命令。
  7. 然后便有了以下的解决办法。
  8. ~/.zshrc~/.bashrc 中添加如下命令:
1
alias roscore='source /opt/ros/kinetic/setup.zsh;roscore'
  1. 此后,roscore 的使用毫无问题了。
  2. 但是,新建一个终端的时候,我不可能再一次 roscore 吧,我要使用 rosrun 或者 catkin_make 怎么办?
  3. 那就都加上就好了,所以命令变成了如下的三句话:
1
2
3
alias roscore='source /opt/ros/kinetic/setup.zsh;roscore' 
alias catkin_make='source /opt/ros/kinetic/setup.zsh;catkin_make'
alias rosrun='source /opt/ros/kinetic/setup.zsh;rosrun'
  1. 大功告成。

  2. 最后,突然想到,在日常使用的时候,经常需要在 catkin_make 之后使用 source devel/setup.zsh

  3. 懒人做到底。。然后就又改成了如下三句话:

1
2
3
alias roscore='source /opt/ros/kinetic/setup.zsh;roscore' 
alias catkin_make='source /opt/ros/kinetic/setup.zsh;catkin_make;source devel/setup.zsh'
alias rosrun='source /opt/ros/kinetic/setup.zsh;rosrun'

问题又现

catkin_make --help异常

  1. 解决办法:

    删掉 alias catkin_make='source /opt/ros/kinetic/setup.zsh;catkin_make;source devel/setup.zsh' 中的 ;source devel/setup.zsh

  2. 总结:

    还是不能太偷懒啊。。。

rosrun 一直出现找不到 package

  1. 查看 PYTHONPATH 发现 rosrun 之后只有一个 PYTHONPATH
  2. 发现 source /opt/ros/kinetic/setup.zsh 会将当前工作工作空间的 PYTHONPATH 环境给删除掉,ROS很傻吊

解决办法:

删掉原本的 alias rosrun

更改命令为:

1
2
3
alias rosrun='echo $PYTHONPATH | grep -q "ros" || source /opt/ros/kinetic/setup.bash;rosrun'
# 为了以防万一,添加下面这句话
alias rossource='source /opt/ros/kinetic/setup.zsh'

总结

ROS 和 OpenCV 的坑使用以下方式就可以完美解决

  1. 删掉原本在 ~/.bashrc~/.zshrc 中的 source /opt/ros/kinetic/setup.bashsource /opt/ros/kinetic/setup.zsh

  2. ~/.bashrc~/.zshrc 中添加如下代码:(注意选择对应版本)

1
2
3
4
5
6
7
8
9
10
11
# zsh 版本
alias roscore='source /opt/ros/kinetic/setup.zsh;roscore'
alias catkin_make='echo $PYTHONPATH | grep -q "ros" || source /opt/ros/kinetic/setup.zsh;catkin_make'
alias rosrun='echo $PYTHONPATH | grep -q "ros" || source /opt/ros/kinetic/setup.zsh;rosrun'
alias rossource='source /opt/ros/kinetic/setup.zsh'

# bash 版本
alias roscore='source /opt/ros/kinetic/setup.bash;roscore'
alias catkin_make='echo $PYTHONPATH | grep -q "ros" || source /opt/ros/kinetic/setup.bash;catkin_make'
alias rosrun='echo $PYTHONPATH | grep -q "ros" || source /opt/ros/kinetic/setup.bash;rosrun'
alias rossource='source /opt/ros/kinetic/setup.bash'
  1. 万事大吉,重启终端!

评论