要让ROS Jazzy与OpenCV 4.10兼容,需解决两个核心问题:ROS默认依赖旧版OpenCV,以及符号冲突/API差异。以下是完整解决方案:
步骤1:源码编译安装OpenCV 4.10
bash
# 安装编译依赖
sudo apt install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
# 下载源码
git clone https://github.com/opencv/opencv.git
cd opencv
git checkout 4.10.0
# 编译安装(关键:自定义安装路径)
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.10.0 \
-D BUILD_opencv_cudacodec=OFF \ # 禁用CUDA避免冲突
-D WITH_GTK=ON \
-D BUILD_EXAMPLES=OFF ..
make -j$(nproc)
sudo make install
步骤2:从源码重新编译 cv_bridge
2.1 创建独立工作空间
bash
mkdir -p ~/cv_bridge_ws/src
cd ~/cv_bridge_ws/src
git clone -b ros2 https://github.com/ros-perception/vision_opencv.git
2.2 修改 cv_bridge 配置
编辑 vision_opencv/cv_bridge/CMakeLists.txt :
cmake
2.3 编译 cv_bridge
bash
cd ~/cv_bridge_ws
source /opt/ros/jazzy/setup.bash
colcon build --packages-select cv_bridge \
--cmake-args -DCMAKE_BUILD_TYPE=Release \
-DOpenCV_DIR=/usr/local/opencv-4.10.0/lib/cmake/opencv4
步骤3:解决符号冲突问题
若运行时出现 libopencv_*.so 冲突,强制链接新版OpenCV:
bash
# 创建自定义环境变量脚本
echo 'export LD_LIBRARY_PATH=/usr/local/opencv-4.10.0/lib:$LD_LIBRARY_PATH' > ~/set_opencv_env.sh
source ~/set_opencv_env.sh # 每次使用ROS前执行
步骤4:在ROS项目中使用兼容环境
bash
# 终端1:加载cv_bridge和OpenCV环境
source ~/cv_bridge_ws/install/setup.bash
source ~/set_opencv_env.sh
# 终端2:正常启动ROS节点
source /opt/ros/jazzy/setup.bash
ros2 run your_package your_node
关键注意事项
-
版本检查
在代码中验证OpenCV版本:
cpp
#include <opencv2/core/version.hpp>
std::cout << "OpenCV version: " << CV_VERSION << std::endl;
-
API适配
OpenCV 4.10中移除的API(如 CV_BGR2GRAY )需替换:
cpp
// 旧版 (<=3.x)
cv::cvtColor(image, gray, CV_BGR2GRAY);
// 新版 (4.x+)
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
-
隔离依赖
在 package.xml 中声明兼容性:
xml
<depend>cv_bridge</depend>
<build_depend>opencv</build_depend>
|