IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Ubuntu 18.04 ROS Melodic中调用支持Python3的cv_bridge -> 正文阅读

[系统运维]Ubuntu 18.04 ROS Melodic中调用支持Python3的cv_bridge

0.背景

这段时间搞了VINS-Mono和深度学习的结合,需要调用cv_bridge进行通信,而ROS Melodic默认安装的cv_bridge是支持python2.7的,而现在的深度学习代码都是用Python3写的,所以就出现了问题。python3中直接调用cv_bridge的话会有报错:

ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)

不过幸运的是这个问题可以自己动手解决,cv_bridge其实是ROS的一个功能包,所以我们可以基于源码编译自己的cv_bridge。在需要的时候覆盖掉ROS自带的进行调用。

1. 编译自己的cv_bridge功能包(Python 3.7.11)

# 安装需要的库
sudo apt-get install python-catkin-tools python3-dev python3-catkin-pkg-modules python3-numpy python3-yaml ros-melodic-cv-bridge

# 创建一个目录作为工作空间
mkdir -p cv-bridge-py3.7/src

# 配置工作空间
catkin config -DPYTHON_EXECUTABLE=/home/qyz/anaconda3/envs/pytorch/bin/python3 -DPYTHON_INCLUDE_DIR=/home/qyz/anaconda3/envs/pytorch/include/python3.7m -DPYTHON_LIBRARY=/home/qyz/anaconda3/envs/pytorch/lib/libpython3.7m.so -DCMAKE_BUILD_TYPE=Release -DSETUPTOOLS_DEB_LAYOUT=OFF 

catkin config --install


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

# 根据返回的版本,然后切换到指定版本分支上
apt-cache show ros-melodic-cv-bridge | grep Version
# Version: 1.13.0-0bionic.20210505.032238
# Checkout right version in git repo. In our case it is 1.13.0
cd src/vision_opencv/
git checkout 1.13.0
cd ../../
# Build, 编译的时候如果提示没有cmake,可以通过:python3 -m pip install cmake
catkin build cv_bridge

这里还有一点要很需要注意的是build cv_bridge会用到C++的opencv库,../vision_opencv/cv_bridge/CMakeLists.txt中有相关的find_package命令。而安装ROS会自带OpenCV,它通常和自己默认的安装目录不一样,会出现在

  • /usr/include
  • /usr/libx86_64-linux-gnu/

这时如果其他基于C++的功能包(比如VINS-Mono)和cv_bridge-py37有交互的话,就很有可能因为他们编译时所基于的C++的OpenCV版本不一致而报错。C++对于库的版本很敏感,根本比不了python中conda提供的环境隔离方便。所以最好的办法就是维护自己环境的干净和一致性,环境中的C++库都只有一个版本。

2. 更新当前shell的环境变量

编译通过后我们就可以在需要时调用,基于ROS的工作空间覆盖机制,我们source了以后就会有限搜索新的路径,从而覆盖掉/opt/ros/melodic/share 里的cv_bridge.

# Extend environment with new package
source install/setup.bash --extend  # 或者使用绝对路径

打印环境变量验证

echo $ROS_PACKAGE_PATH
  • source前: /opt/ros/melodic/share
  • source后: /home/qyz/catkin_ws/cv-bridge-py3.7/install/share:/opt/ros/melodic/share

这时在当前环境中就可以正常使用python3解释器跑py脚本了

3. 附录

Why use source xxx --extend(为什么使用source xxx --extend)

The source command generally overwrites one another in the sense that if you have 2 separate cakin workspaces A and B, if you perform source devel/setup.bash in workspace A and then perform source devel/setup.bash in workspace B, the second command will override the first command and the packages in workspace A will not be available to you.

To overcome this, in workspace A, perform source devel/setup.bash as usual but after this, going into workspace B ensure to perform source devel/setup.bash --extend and now packages from both workspaces will be enabled. In a similar light, perhaps you could try source /opt/ros/melodic/setup.bash and then source devel/setup.bash --extend in your workspace
大概意思就是连续的source后边的会覆盖前边的,对后一个使用extend就会保留前面的了。

参考链接

  1. https://shliang.blog.csdn.net/article/details/117230220?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-117230220-blog-106771848.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-117230220-blog-106771848.pc_relevant_default&utm_relevant_index=2
  2. https://stackoverflow.com/questions/49221565/unable-to-use-cv-bridge-with-ros-kinetic-and-python3?rq=1
  3. https://answers.ros.org/question/349276/ros-commands-no-longer-working-after-source-catkin_wsdevelsetupbash/
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 11:10:24  更:2022-07-03 11:11:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 12:32:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码