web-dev-qa-db-ja.com

ROS KineticおよびPython3でcv_bridgeを使用できない

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が必要です。

6
Egor

あなたは正しい、あなたは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およびパッケージを再構築します。

10
hexonxons

システムに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

解決策:私がやったことがいくつかあり、問題は解決しました。

  • anacondaが使用されているため、実行可能ファイルとインクルードディレクトリは現在の仮想環境内にある必要があります。 -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 e
  • Catkin build cv_bridgeを試したところ、ビルドに問題がありました。同様の問題が発生した場合は、src以外のすべてのフォルダーを削除してください。次に、ターミナルからcatkin_makeを実行します(catkin_workspace内にいることを確認してください)。
  • 現在のワークスペースをソースsource devel/setup.bash

import cv2from cv_bridge.boost.cv_bridge_boost import getCvType

エラーなしで動作するはずです。

1
Akash Baskaran