************************************
我是ubuntu18.04 ROS-Melodic
*************************************
ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)
这个报错是在ubuntu18.04 ROS-Melodic中的python文件,文件头加入了
#!/usr/bin/env python3
由于在ROS-Melodic中cv_bridge需要在python2中编译,故出现了问题如下:
import rospy
import cv2
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Image
如上的库,1、2、4行想在python3中编译,3行想在python2中编译。咱们的目的是3行我也想在python3中编译。
解决:
查遍csdn,有的文章没有细节,导致成功都是瞎猫碰到死耗子,他好使了,你未必好使,而且留下烂摊子。
1.首先必须进入python3环境而且必须确认你的python3的版本!
ROS修改:ubuntu系统更改默认python版本(重要操作)_机械专业的计算机小白的博客-CSDN博客https://blog.csdn.net/wzfafabga/article/details/127191057?spm=1001.2014.3001.5502不会看上文,灵活切换python版本,是ROS-melodic的重要操作。
做完上部分操作就可以通过如下命令快速切换:
sudo update-alternatives --config python
有 2 个候选项可用于替换 python (提供 /usr/bin/python)。
选择 路径 优先级 状态
------------------------------------------------------------
0 /usr/bin/python2 2 自动模式
1 /usr/bin/python2 2 手动模式
* 2 /usr/bin/python3.6 1 手动模式
要维持当前值[*]请按<回车键>,或者键入选择的编号:
选择2是python3,其中版本为python3.6!
2.在桌面打开终端,安装编译所需要的包。
sudo apt-get install python-catkin-tools python3-dev python3-catkin-pkg-modules python3-numpy python3-yaml ros-melodic-cv-bridge
python3-numpy 已经是最新版 (1:1.13.3-2ubuntu1)。
python3-yaml 已经是最新版 (3.12-1build2)。
python3-dev 已经是最新版 (3.6.7-1~18.04)。
python-catkin-tools 已经是最新版 (0.6.1-1)。
python3-catkin-pkg-modules 已经是最新版 (0.5.2-1)。
3.单独创建工作空间,为了区分灵活取名。(cv_bridge_ws可改成自己想要的名字)
mkdir -p cv_bridge_ws/src
cd cv_bridge_ws
4.注意!这里的3.6是我的python版本,不意味着是你的版本,根据第一步先确定你的python版本!
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
catkin config --install
5.注意这些操作涉及路径问题!不要随便再开一个终端!将代码从github上克隆进src文件夹中。这里可能出现网络问题,连接手机热点,反复运行知道克隆成功。
git clone https://github.com/ros-perception/vision_opencv.git src/vision_opencv
6.注意!这个查询版本是必须的,我的版本号未必是你的版本号!版本号后面要用。
apt-cache show ros-melodic-cv-bridge | grep Version
# 这是我的版本不意味着是你的版本!
Version: 1.13.0-0bionic.20220127.152918
7.注意和第六步版本号对上!
cd src/vision_opencv/
git checkout 1.13.0
8.编译
catkin build cv_bridge
9.现在可以关闭终端,在刚刚的创建的工作空间打开终端。当然也可以用cd的方式去到达这个目录。
环境变量
source ./install/setup.bash
打开python3编译器
python3
调用cv_bridge库,如果成功调用说明我们的cv_bridge能在python3中运行,这就是我们的目的。
from cv_bridge.boost.cv_bridge_boost import getCvType
成功后退出python3
exit()
如果你向我一样,没报错说明,没问题了。
rosmelodic@rosmelodic-virtual-machine:~/cv_bridge_ws$ source ./install/setup.bash
rosmelodic@rosmelodic-virtual-machine:~/cv_bridge_ws$ python3
Python 3.6.9 (default, Jun 29 2022, 11:45:57)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> from cv_bridge.boost.cv_bridge_boost import getCvType
>>>
10.如果失败了,看看细节是不是没把握到,是不是网络不好包没下载好。失败后可以将刚刚创建的工作空间删除,在重新尝试!或者说有些报错我没遇到,这种情况多找几个文章对比后再进行操作。
11.如果没失败,意味着pyhon3中调用cv_bridge已经可以实现了。但是需要注意:
调用时一定要注意先后顺序,先在主工作空间source一下
source ./devel/setup.bash
再cd到刚刚创建的工作空间下source一下,同时加上--extend
source ./install/setup.bash --extend
这些source路径都是有迹可循的,灵活一些。
不要在刚刚创建的工作空间下再放别的功能包,这个工作空间只作为编译cv_bridge的工作空间。
12.实际例子
开启一个摄像头图像发布节点。这个注意摄像头要打开同时驱动都安装好。
(1条消息) 1.ROS机器视觉:单目摄像头的调用与标定_机械专业的计算机小白的博客-CSDN博客https://blog.csdn.net/wzfafabga/article/details/127206880?spm=1001.2014.3001.5502
roslaunch robot_vision usb_cam.launch
在我保存代码的工作空间source一下。
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ source ./devel/setup.bash
退回到home路径。
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ cd ../
cd到刚刚建立用来编译cv_bridge的工作空间。
rosmelodic@rosmelodic-virtual-machine:~$ cd cv_bridge_ws/
再source一下,注意加上--entend,但是亲测不加也正常运行了。
rosmelodic@rosmelodic-virtual-machine:~/cv_bridge_ws$ source ./install/setup.bash --extend
测试python3调用cv_bridge库。没报错,调用成功。
rosmelodic@rosmelodic-virtual-machine:~/cv_bridge_ws$ python3
from cv_bridge.boost.cv_bridge_boost import getCvType
exit()
用rosrun打开调用cv_bridge的文件。
rosmelodic@rosmelodic-virtual-machine:~/cv_bridge_ws$ rosrun robot_vision cv_bridge_test.py
[INFO] [1665449121.225020]: Starting cv_bridge_test node
最后打开rqt_image_view,观察usb_cam的各种形式的消息类型。
rosmelodic@rosmelodic-virtual-machine:~$ rqt_image_view
运行结果
13.总结
这部分没有细节是肯定会失败的,而且报错都是一样的无从下手。只能一步一步排除错误。
ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)