2
5

More than 3 years have passed since last update.

ROS環境にOpenCVをインストールする際のPython環境問題のシンプルな解決策

Last updated at Posted at 2020-04-17

はじめに

ROS Kineticの環境はPython2系を使用しており、インストールする際に各種ライブラリがインストールされ、同時にOpenCVを使用する環境が準備されます。しかしながらPython3系でOpenCVを別途インストールして使用する際に、importが通らない、となった方は非常に多いのではないでしょうか。本件の解決策は環境変数を変更したり、pyenvを導入したり、もうウンザリだから環境を独立させるためにDockerに移行したり、と様々な方法があるかと思いますが、環境を壊すことなくシンプルな解決策をご紹介させて頂きます。

環境

  • Ubuntu 16.04LTS
  • ROS Kinetic Kame
  • OpenCV 3.3.0
  • Python 2.7.12
  • Python 3.5.2

課題

課題はシンプルです。Ubuntuのデフォルトの環境にはPython2系と3系のどちらも準備されていると思いますが、ROSをインストールする際に2系にも3系にもROSのPython2系のライブラリのパスが通ってしまっていることです。

Python2系のimportのライブラリパスの確認

: ~/python  # Python2を起動

>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)
['',
 '/opt/ros/kinetic/lib/python2.7/dist-packages',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/wx-3.0-gtk2',
]

続いてPython3系のimportのライブラリパスの確認

: ~/python3  # Python3を起動

>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)
['',
 '/opt/ros/kinetic/lib/python2.7/dist-packages',  #このパスが問題箇所
 '/usr/lib/python35.zip',
 '/usr/lib/python3.5',
 '/usr/lib/python3.5/plat-x86_64-linux-gnu',
 '/usr/lib/python3.5/lib-dynload',
 '/usr/local/lib/python3.5/dist-packages',
 '/usr/lib/python3/dist-packages',]

この環境の状態でPython3でOpenCVをimportしようとすると下記のようにエラーになります。

: ~/python3  # Python3を起動

>>> import cv2  # OpenCVをimport
Traceback (mostrecent call last):
  File "<stdin>", line 1, in <module>
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type

シンプルな解決策

ROSでインストールされたデフォルトの環境を壊したくないという理由で、ROS使用用途以外のときは下記のようにPython3使用時にROSのパスだけを削除する1行を入れれば良いのではないかと考えました。

: ~/python3  # Python3を起動

>>> import sys
>>> import pprint
>>> sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')  # パスの削除
>>> pprint.pprint(sys.path)  # 削除できたか確認
['',
 '/usr/lib/python35.zip',
 '/usr/lib/python3.5',
 '/usr/lib/python3.5/plat-x86_64-linux-gnu',
 '/usr/lib/python3.5/lib-dynload',
 '/usr/local/lib/python3.5/dist-packages',
 '/usr/lib/python3/dist-packages',]
>>> import cv2  # OpenCVをimportできるか確認
>>>

エラーがなくなり問題なくOpenCVのimportができました。これでROSの環境を特に変えることなくOpenCVをPython3で使用することが可能となります。注意点としましてはこの方法は実行時だけに有効ですので、使用する際は都度この1行の追記が必要となります。様々な方法を試して、この方法が一番シンプルだということに辿り着きました。

Link

  1. Ubuntu16.04へのOpenCV 3.3.0インストールメモ
  2. Python3でopencvを使おうとしてハマった話
2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5