ROS Indigoとpython3を搭載したUbuntu 14.04にコンピュータービジョンプロジェクトがあり、ROSキネティックスを搭載したUbuntu 16.04に移動する必要がありました。ここで私は複数の問題に遭遇しました:
1)opencvをインストールしましたが、python3にインポートできませんでした。エラーメッセージは次のとおりです。
Traceback (most recent call last):
File "test.py", line 2, in <module>
import cv2
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so:
undefined symbol: PyCObject_Type
私が見つけたのは、cv2.soの名前を変更するだけです
cd /opt/ros/kinetic/lib/python2.7/dist-packages/
Sudo mv cv2.so cv2_ros.so
次に、cv2をインポートして使用することができました
2)次に、rospyをインポートできませんでしたが、python3-catkin-pkg-modulesとpython3-rospkg-modulesをインストールすると問題が解決しました
3)最後に私はcv_bridgeで問題に遭遇しました:
[ERROR] [1520780674.845066]: bad callback: <bound method ViewsBuffer.update of <__main__.ViewsBuffer object at 0x7f5f45a07f28>>
Traceback (most recent call last):
File "/opt/ros/kinetic/lib/python2.7/dist-packages/rospy/topics.py", line 750, in _invoke_callback
cb(msg)
File "test.py", line 48, in update
im = self.bridge.imgmsg_to_cv2(im, "bgr8")
File "/opt/ros/kinetic/lib/python2.7/dist-packages/cv_bridge/core.py", line 163, in imgmsg_to_cv2
dtype, n_channels = self.encoding_to_dtype_with_channels(img_msg.encoding)
File "/opt/ros/kinetic/lib/python2.7/dist-packages/cv_bridge/core.py", line 99, in encoding_to_dtype_with_channels
return self.cvtype2_to_dtype_with_channels(self.encoding_to_cvtype2(encoding))
File "/opt/ros/kinetic/lib/python2.7/dist-packages/cv_bridge/core.py", line 91, in encoding_to_cvtype2
from cv_bridge.boost.cv_bridge_boost import getCvType
ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)
問題はcv_bridge_boost.soファイルにあると思います。 https://github.com/ros-perception/vision_opencv からcv_bridgeもビルドしようとしましたが、自動的にpython2.7用にビルドされます。CMakeLists.txtを少し変更して指定しましたそこにはpython3がありますが、CMakeListsの経験はあまりないので機能しませんでした。また、cv_bridgeモジュールをプロジェクトフォルダーにコピーしようとしましたが、あまり変化せず、そのcv_bridge_boost.soファイルをポイントしています。もう1つ言及すべきことは、cv_bridgeがpython2.7で正常に動作することですが、私のプロジェクトにはpython3.5が必要です。
あなたは正しい、あなたはpython3でcv_bridgeを構築するべきです。
あなたは合格でそれを行うことができます
-DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.5m -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so
cmakeへの引数。または、catkinを使用してパッケージをビルドしている場合は、次の手順を実行できます。
# `python-catkin-tools` is needed for catkin tool
# `python3-dev` and `python3-catkin-pkg-modules` is needed to build cv_bridge
# `python3-numpy` and `python3-yaml` is cv_bridge dependencies
# `ros-kinetic-cv-bridge` is needed to install a lot of cv_bridge deps. Probaply you already have it installed.
Sudo apt-get install python-catkin-tools python3-dev python3-catkin-pkg-modules python3-numpy python3-yaml ros-kinetic-cv-bridge
# Create catkin workspace
mkdir catkin_workspace
cd catkin_workspace
catkin init
# Instruct catkin to set cmake variables
catkin config -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.5m -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so
# Instruct catkin to install built packages into install place. It is $CATKIN_WORKSPACE/install folder
catkin config --install
# Clone cv_bridge src
git clone https://github.com/ros-perception/vision_opencv.git src/vision_opencv
# Find version of cv_bridge in your repository
apt-cache show ros-kinetic-cv-bridge | grep Version
Version: 1.12.8-0xenial-20180416-143935-0800
# Checkout right version in git repo. In our case it is 1.12.8
cd src/vision_opencv/
git checkout 1.12.8
cd ../../
# Build
catkin build cv_bridge
# Extend environment with new package
source install/setup.bash --extend
そして
$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from cv_bridge.boost.cv_bridge_boost import getCvType
>>>
次のエラーが発生した場合
CMake Error at /usr/share/cmake-3.5/Modules/FindBoost.cmake:1677 (message):
Unable to find the requested Boost libraries.
Boost version: 1.58.0
Boost include path: /usr/include
Could not find the following Boost libraries:
boost_python3
No Boost libraries were found. You may need to set BOOST_LIBRARYDIR to the
directory containing Boost libraries or BOOST_ROOT to the location of
Boost.
Call Stack (most recent call first):
CMakeLists.txt:11 (find_package)
これは、CMakeがlibboost_python3.soライブラリを見つけようとするためですが、ubuntuではlibboost_python-py35.so
(/usr/lib/x86_64-linux-gnu/libboost_python-py35.so
)なので、行を変更する必要があります
find_package(Boost REQUIRED python3)
に
find_package(Boost REQUIRED python-py35)
ファイルsrc/vision_opencv/cv_bridge/CMakeLists.txt
およびパッケージを再構築します。
システムにanaconda3がインストールされていて、cv_bridgeを使用しているときに同様の問題が発生します。 catkin build cv_bridge
を使用してビルドしようとすると、エラーがスローされます。私はcondaのpython3.7を使用しています。私のcatkin cofigコマンドは:
catkin config -DPYTHON_EXECUTABLE=/home/akashbaskaran/anaconda3/bin/python3 -DPYTHON_INCLUDE_DIR=/home/akashbaskaran/anaconda3/include/python3.7m -DPYTHON_LIBRARY=/home/akashbaskaran/anaconda3/lib/libpython3.7m.so
解決策:私がやったことがいくつかあり、問題は解決しました。
-DPYTHON_EXECUTABLE=/home/akashbaskaran/anaconda3/envs/tf/bin/python3.6 -DPYTHON_INCLUDE_DIR=/home/akashbaskaran/anaconda3/envs/tf/include/python3.6m -DPYTHON_LIBRARY=/home/akashbaskaran/anaconda3/envs/tf/lib/libpython3.6m.so
esource devel/setup.bash
今import cv2
from cv_bridge.boost.cv_bridge_boost import getCvType
エラーなしで動作するはずです。