ROS melodic 安装 python3 cv_bridge

发布于:2025-03-23 ⋅ 阅读:(24) ⋅ 点赞:(0)

有时候,我们需要处理这些兼容性问题。此处列举我的过程,以供参考

mkdir -p my_ws_py39/src
cd my_ws_py39
catkin_make_isolated
  -DPYTHON_EXECUTABLE=/usr/bin/python3 \
  -DPYTHON_INCLUDE_DIR=/usr/include/python3.8 \
  -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.8.so

catkin_make_isolated allows per-package customization,和常见的 catkin_make 在这里区别不大。很多教程都推荐加上 --install,我这里没有,因为失败了,原因在下面。

其中,三个 命令行标识需要更改为你自己的环境路径,你可以通过

python3 -c "import sysconfig; print(sysconfig.get_path('include'))"
python3 -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))"

来找到后两个。至于第一个,因为我在 miniconda下,可以通过指令

conda env list

查看。若是 linux,可以使用指令:

which python

显示当前 激活的(actived) python环境。在编译成功后,刷新当前环境,执行指令

source my_ws_py39/devel_ioslated/setup.bash

注意路径。此处我处于 ~路径下。

然后,将 vision_opencv-melodic.zip 文件夹放在 my_ws_py39/src目录下,并解压。此处更通用的做法是通过 git 指令进行 clone。我不想花时间在 git 配置上,直接以 zip的形式下载。

再重新走一遍 上述的 catkin_make_isolated指令,带上必要的命令行选项。

若成功,进行测试。

rospack find cv_bridge

查看文件路径。

第二份测试方式,先在一个终端中执行 roscore,启动 rosmaster。再在另一个终端中运行下述脚本,保证它能够运行在 ros 网络中。记得 通过指令 

chmod +x test_cv_bridge.py

 给脚本权限。此处,我假设脚本名为 test_cv_bridge.py

#!/usr/bin/env python
import rospy
from cv_bridge import CvBridge
import cv2

if __name__ == '__main__':
    rospy.init_node('cv_bridge_test')
    bridge = CvBridge()
    # 创建一个空白图像用于测试
    import numpy as np
    img = np.zeros((100,100,3), dtype=np.uint8)
    try:
        # 将 OpenCV 格式转换为 ROS 图像消息
        img_msg = bridge.cv2_to_imgmsg(img, encoding="bgr8")
        rospy.loginfo("cv_bridge 工作正常!")
    except Exception as e:
        rospy.logerr("cv_bridge 测试失败: %s", e)

Addition

我实际执行的语句

# 系统级的安装
sudo apt-get install ros-melodic-cv-bridge ros-melodic-image-geometry
sudo apt-get install python3-dev

# 虚拟环境中的安装
pip install rospkg catkin_pkg


# 实际使用的编译指令
catkin_make_isolated   -DPYTHON_EXECUTABLE=/home/ncut/miniconda3/envs/tf/bin/python3.9   -DPYTHON_INCLUDE_DIR=/home/ncut/miniconda3/envs/tf/include/python3.9
source devel_isolated/setup.bash

# 将 melodic 版本的package放入 /src目录下后执行
catkin_make_isolated   -DPYTHON_EXECUTABLE=/home/ncut/miniconda3/envs/tf/bin/python3.9   -DPYTHON_INCLUDE_DIR=/home/ncut/miniconda3/envs/tf/include/python3.9
source devel_isolated/setup.bash

#记得在 编译后执行 source 刷新


# 以下信息是另一个工作空间示例,使用 catkin_make
mkdir -p ws_py39/src
cd ws_py39/
catkin_make  -DPYTHON_EXECUTABLE=/home/ncut/miniconda3/envs/tf/bin/python3.9 -DPYTHON_INCLUDE_DIR=/home/ncut/miniconda3/envs/tf/include/python3.9 -DPYTHON_LIBRARY=/home/ncut/miniconda3/envs/tf/lib/libpython3.9.so

source devel/setup.bash 
cd src/
catkin_create_pkg graduation std_msgs roscpp rospy  
cd ../

catkin_make  -DPYTHON_EXECUTABLE=/home/ncut/miniconda3/envs/tf/bin/python3.9 -DPYTHON_INCLUDE_DIR=/home/ncut/miniconda3/envs/tf/include/python3.9 -DPYTHON_LIBRARY=/home/ncut/miniconda3/envs/tf/lib/libpython3.9.so

--install失败的原因。

这里是log,方便查看:

error: option --install-layout not recognized
CMake Error at catkin_generated/safe_execute_install.cmake:4 (message):
execute_process(.../catkin_generated/python_distutils_install.sh)
returned error code

查了资料,因为 cv_bridgesetup.py(或 CMakeLists.txt)中的 --install-layout 选项在 Python 3 下不被识别。

为什么分两次编译

第一次编译是为了 创建这个工作空间,然后通过 source 指令刷新该工作空间。这样,后面的编译操作,都会找到该工作空间中的信息,也即,它会使用python3。

第二次编译则是为了编译 cv_bridge。即我们真正的目的。

所以第一次编译是 必要的 preprocess,预处理。