当运行Python文件时出现如下报错:
Traceback (most recent call last): File "<frozen importlib._bootstrap>", line 971, in _find_and_load File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 658, in _load_unlocked File "<frozen importlib._bootstrap>", line 571, in module_from_spec File "<frozen importlib._bootstrap_external>", line 922, in create_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)
.....
ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)
检查原因,是因为在ROS中默认使用python2,rospy的cv_bridge默认也是python2版本的,在使用python3中导入cv_brdige时会报出以上错误.
解决方法:
需要重新编译一个用于python3版本的cv_bridge包,即可:
步骤如下:
1,安装相关依赖包
sudo apt-get install python-catkin-tools python3-dev python3-catkin-pkg-modules python3-numpy python3-yaml ros-kinetic-cv-bridge
2.新建一个工作空间
mkdir -p ~/python3_ws/src
cd ~/python3_ws/src
catkin_init_workspace
cd ..
catkin_make
catkin_make install
3.进入src目录,下载cv_bridge功能包
git clone -b kinetic https://github.com/ros-perception/vision_opencv.git
4.退出src,编译,注意配置本地python环境,虚拟环境编译无效,注意这里ubuntu16.04Python版本为3.5
cd ..
catkin_make -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.5m -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so #寻找对应位置
catkin config --install
5.在编译时,若遇到如下报错:
Errors << cv_bridge:cmake /home/zhangman/VisionTracking/logs/cv_bridge/build.cmake.002.log
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)
根据错误提示,boost_python3库找不到,根据网上提示,在/usr/lib/x86_64-linux-gnu文件夹中查看相关boost_python库,如图所示,发现没有python3的相关库,只有python-py35的库。可能是因为安装的时候有多个版本的python导致命名不是python,解决方案是建立python-py35到python的软连接。如果没找到python-py35而是找到了python-py3x,解决方案相同,建立软连接即可。
//到libboost_python-py35所在文件夹下,建立软连接
cd /usr/lib/x86_64-linux-gnu/
sudo ln -s libboost_python-py35.so libboost_python3.so
sudo ln -s libboost_python-py35.a libboost_python3.a
6.以后就在当前工作空间下运行需要使用python3版本cv_bridge的代码
注意:运行前要执行source devel/setup.bash --extend,表示将cv_bridge的扩展环境添加到当前虚拟环境中,这样就可以在XXX虚拟环境中使用cv_bridge
#进入你的工作空间
cd ./python_ws
#进入你的虚拟环境
conda activate xxx
#导入环境配置
source devel/setup.bash --extend
#进入python测试
python
from cv_bridge.boost.cv_bridge_boost import getCvType
若无报错,即解决问题