解决ROS和python3中cv_bridge的问题

一. 问题

       1. 使用ROS的时候只用了C++/python2,没有发现cv_bridge问题

       使用Anaconda配置了一个只有Python3.5的环境,运行cv_bridge时出现报错

 from cv_bridge import CvBridge, CvBridgeError
    ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)

      2. 原因:    ROS自带的cv_bridge只支持python2,想要使用Python3需要自行编译cv_bridge包

  电脑环境:Ubuntu 16.04+ROS +Anaconda3+Python3.5

二. 解决方案

    1. 首先进入python3的环境并安装相关依赖包

sudo apt-get install python-catkin-tools python3-dev python3-catkin-pkg-modules python3-numpy python3-yaml ros-kinetic-cv-bridge

2. 创建一个工作空间用于存放待编译的 cv_bridge 文件   

mkdir -p catkin_workspace/src

   3. 指示carkin设置cmake变量

cd catkin_workspace
#注意,该处需要根据你原本自带的系统python版本设定。16.04是python3.5,18.04是python3.6
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

4.  指示 catkin 将构建的包安装到安装位置。

catkin config --install

5. 在catkin_workspace工作空间中克隆 cv_bridge src

git clone https://github.com/ros-perception/vision_opencv.git src/vision_opencv

6. 在您的存储库中查找 cv_bridge 的版本

apt-cache show ros-kinetic-cv-bridge | grep Version

 7. 检测正确的版本。

#该步骤可以省去
cd src/vision_opencv/
git checkout 1.12.8#必须要编译否则cv_bridge的CMakeLists默认版本为python37
cd ../../

 8.  开始编译

#有可能会有warning,不用管,只要不报错就行
catkin build
或者 catkin build cv_bridge

9. 测试安装成功

source /home/zhy/catkin_workspace/install/setup.bash --extend
python3
from cv_bridge.boost.cv_bridge_boost import getCvType

 10. 运行代码

# 打开虚拟环境env_py3和进入catkin_workspace空间进行source。
conda activate pytorch
cd catkin_workspace/
# 这里 --extend 参数的作用是让这次的路径配置不影响之前配置好的路径,否则这一次source会覆盖掉之前配置的路径。
source install/setup.bash --extend##每次都必须先激活然后才能使python3调用cv_bridge
cd ..
# 进入另一个工作空间,该空间含有需要启动的python脚本节点。
cd catkin_ws/src/beginner_tutorials/scripts/
python3 ImgSub.py
condapy3
source /home/zhy/catkin_workspace/install/setup.bash --extend
cd Documents/catkin_wss
rosrun .....

11. 如果编译过程中遇到下面的报错:

  编译过程中,如果出现下面的报错(目前好像vision_opencv导出来的boost是boost_python37):

CMake Error at /usr/share/cmake-3.6/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)

 这是因为CMake试图找到libboost_python3.so库,但是在ubuntu中它是libboost_python-py35.so(/usr/lib/x86_64-linux-gnu/libboost_python-py35.so)。因此应该在文件src/vision_opencv/cv_bridge/CMakeLists.txt中将下面这行更改find_package()中的内容,更改为python-py35。然后再重新编译:

原始行:

find_package(Boost REQUIRED python3)

更改成:

find_package(Boost REQUIRED python-py35)

三. 参考文献

参考文献1: Anaconda虚拟环境中,让Python3使用ROS的cv_bridge

参考文献2: 使用Python进行ros图像的发送

  • 8
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值