web-dev-qa-db-fra.com

Impossible d'utiliser cv_bridge avec ROS Kinetic et Python3

J'avais un projet de vision par ordinateur sur Ubuntu 14.04 avec ROS Indigo et python3, puis j'ai dû passer sur Ubuntu 16.04 avec ROS kinetic. Ici, je suis tombé sur plusieurs problèmes:

1) J'ai installé opencv, mais je n'ai pas pu l'importer en python3, le message d'erreur était:

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

Ce que j'ai compris, c'est simplement renommer cv2.so

cd /opt/ros/kinetic/lib/python2.7/dist-packages/
Sudo mv cv2.so cv2_ros.so

Ensuite, j'ai pu importer cv2 et l'utiliser

2) Ensuite, je n'ai pas pu importer rospy, mais l'installation des modules python3-catkin-pkg-modules et python3-rospkg-modules a résolu ce problème.

3) Enfin, j'ai rencontré un problème avec cv_bridge, il dit:

[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)

Je crois que le problème se trouve dans le fichier cv_bridge_boost.so. J'ai également essayé de construire cv_bridge à partir de https://github.com/ros-perception/vision_opencv , mais il construit automatiquement pour python2.7, j'essayais de modifier CMakeLists.txt un peu pour spécifier python3 là-bas, mais je n'ai pas beaucoup d'expérience avec CMakeLists, donc cela n'a pas fonctionné. J'ai également essayé de copier le module cv_bridge dans mon dossier de projet, mais cela n'a pas beaucoup changé et il pointe toujours sur ce fichier cv_bridge_boost.so. Une autre chose à mentionner est que cv_bridge fonctionne bien avec python2.7, mais mon projet nécessite python3.5.

6
Egor

Vous avez raison, vous devez construire cv_bridge avec python3.

Vous pouvez le faire en passant

-DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.5m -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so

args à cmake. Ou, si vous utilisez catkin pour créer des packages, vous pouvez effectuer les étapes suivantes:

# `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

Et

$ 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
>>> 

Si vous avez rencontré une erreur suivante

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)

C'est parce que CMake essaie de trouver la bibliothèque libboost_python3.so, mais dans ubuntu c'est libboost_python-py35.so (/usr/lib/x86_64-linux-gnu/libboost_python-py35.so), vous devez donc changer de ligne

find_package(Boost REQUIRED python3)

à

find_package(Boost REQUIRED python-py35)

dans le fichier src/vision_opencv/cv_bridge/CMakeLists.txt et reconstruire le package.

10
hexonxons

J'ai anaconda3 installé sur mon système et je rencontre un problème similaire lors de l'utilisation de cv_bridge. Quand j'essaye de construire en utilisant catkin build cv_bridge il génère une erreur. J'utilise python3.7 de conda. Ma commande catkin cofig est:

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

Solution: Il y a quelques choses que j'ai faites et le problème a été résolu.

  • puisque anaconda est utilisé, les exécutables et les directorires devraient être ceux de votre environnement virtuel actuel. -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
  • J'avais des problèmes de build lorsque j'ai essayé catkin build cv_bridge. Si vous rencontrez un problème similaire, supprimez tous les dossiers sauf src. Exécutez ensuite catkin_make depuis le terminal (assurez-vous d'être présent dans catkin_workspace).
  • source de l'espace de travail actuel source devel/setup.bash

Maintenant import cv2from cv_bridge.boost.cv_bridge_boost import getCvType

devrait fonctionner sans erreur.

1
Akash Baskaran