如何在Conda虚拟环境中与ROS Noetic搭配使用CV-Bridge?
解决Conda环境中CV-Bridge的libp11-kit符号错误问题
这个错误是因为Conda环境自带的libffi库和系统的libp11-kit依赖的libffi版本冲突导致的,以下是几个可行的解决办法:
方案1:临时/永久调整库加载路径
- 激活你的TensorFlow Conda环境:
conda activate your_tensorflow_env - 执行命令临时让系统库优先加载:
export LD_LIBRARY_PATH=/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH - 之后再运行ROS节点或导入CV-Bridge测试,问题应该能解决
- 要永久生效的话,在
~/anaconda3/envs/your_tensorflow_env/etc/conda/activate.d/目录下新建env_vars.sh文件,写入export LD_LIBRARY_PATH=/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH,以后激活环境时会自动执行这个配置
方案2:源码编译适配Conda环境的CV-Bridge
系统预装的CV-Bridge是针对系统Python编译的,和Conda环境的Python存在兼容性问题,自己编译适配版本:
- 激活Conda环境,安装基础依赖:
conda install python=3.8 opencv(ROS Noetic对应Python3.8,版本要匹配) - 创建一个新的Catkin工作空间:
mkdir -p catkin_cvbridge_ws/src && cd catkin_cvbridge_ws/src - 克隆CV-Bridge源码并切换到Noetic分支:
git clone https://github.com/ros-perception/vision_opencv.git && cd vision_opencv && git checkout noetic - 返回工作空间根目录,用Conda环境的Python编译:
catkin_make -DPYTHON_EXECUTABLE=$(which python) \ -DPYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \ -DPYTHON_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR'))")/libpython3.8.so
- 编译完成后,激活Conda环境并source工作空间:
source devel/setup.bash,之后导入CV-Bridge就不会有冲突了
方案3:在ROS Python环境中调用Conda的TensorFlow
如果不想编译CV-Bridge,可以直接在系统ROS的Python环境里用Conda的TensorFlow:
- 在系统Python中安装打包工具:
pip install conda-pack - 打包你的TensorFlow Conda环境:
conda pack -n your_tensorflow_env -o tf_env.tar.gz - 在ROS节点的Python脚本开头添加以下代码,加载打包的环境:
import sys import tarfile import os # 解压环境到临时目录 tar = tarfile.open("tf_env.tar.gz", "r:gz") tar.extractall(path="/tmp/tf_env") tar.close() # 添加Conda环境的Python路径到系统路径最前面 sys.path.insert(0, "/tmp/tf_env/lib/python3.8/site-packages") # 现在可以同时导入CV-Bridge和TensorFlow了 import cv_bridge import tensorflow as tf
内容的提问来源于stack exchange,提问作者kgarmon
相关产品推荐
相关产品推荐

