ROS python3使用cv_bridge报错,在melodic中使用python3 cv_bridge

ROS cv_bridge报错:在melodic中使用python3+cv_bridge

  • 问题描述
  • 解决方案
  • 使用方法
  • 2022.7补充

问题描述

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包了。

2022.7补充

如果系统中的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了。

你可能感兴趣的:(ROS,机器人操作系统,python,开发语言)