はじめに
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行の追記が必要となります。様々な方法を試して、この方法が一番シンプルだということに辿り着きました。