ROS与opencv之间的数据类型转换是通过cv_bridge这个包来实现的。melodic中默认使用python2,因此rospy的cv_bridge也默认是python2版本的。使用python3导入cv_bridge时会报这个错:
from cv_bridge.boost.cv_bridge_boost import getCvType
ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)
此时需要重新编译一个适用于Python3的cv_bridge包。
首先下载源码:
git clone https://github.com/ros-perception/vision_opencv.git
新建工作空间并把cv_bridge包放入:
mkdir -p vision_opencv_ws/src
cd vision_opencv_ws
mv -r ../vision_opencv src/
设置catkin编译使用的python3版本:
catkin config -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.6m -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.6m.so
(可选)指定编译包后放入install文件夹中:
catkin config --install
编译:
catkin build
在运行python3前,激活新编译好的cv_bridge环境:
source vision_opencv_ws/install/setup.bash
然后运行python代码就可以正常导入cv_bridge包了。
如果系统中的opencv版本为4,则需要使用noetic版本的cv_bridge,即下载源码后要切换分支:
git clone https://github.com/ros-perception/vision_opencv.git
git checkout -b mynoetic origin/noetic
并且,要把CMakeLists.txt
中的:
if(NOT ANDROID)
find_package(PythonLibs)
if(PYTHONLIBS_VERSION_STRING VERSION_LESS "3.8")
# Debian Buster
find_package(Boost REQUIRED python37)
else()
# Ubuntu Focal
find_package(Boost REQUIRED python)
endif()
else()
改为
if(NOT ANDROID)
find_package(PythonLibs)
if(PYTHONLIBS_VERSION_STRING VERSION_LESS "3.8")
# Debian Buster
find_package(Boost REQUIRED python3)
else()
# Ubuntu Focal
find_package(Boost REQUIRED python)
endif()
else()
然后再根据上面的步骤编译。
使用时,首先要修改系统的python环境变量,因为source /opt/ros/melodic/setup.bash
会自动把ros python2.7 dist-packages
添加到python路径中,import优先找的是python2的包,所以要把这个环境变量改掉:
unset PYTHONPATH
source vision_opencv_ws/install/setup.bash
source /opt/ros/melodic/setup.bash
这样就优先使用python3的cv_bridge
了。