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.
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.
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.
-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
Maintenant import cv2
from cv_bridge.boost.cv_bridge_boost import getCvType
devrait fonctionner sans erreur.