系统:Ubuntu20.04
平台:Jetson Orin NX
ROS:ROS2 Foxy
OpenCV:4.5.4 with CUDA
问题源自编译时警告:
/usr/bin/ld: warning: libopencv_imgcodecs.so.4.2, needed by /opt/ros/foxy/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.4.5.4
/usr/bin/ld: warning: libopencv_core.so.4.2, needed by /opt/ros/foxy/lib/libcv_bridge.so, may conflict with libopencv_core.so.4.5.4
以及运行时报错:
OpenCV(4.5.4) /home/ubuntu/build_opencv/opencv/modules/core/src/matrix.cpp:250: error: (-215:Assertion failed) s >= 0 in function ‘setSize’
代码是一个图像订阅节点,cv::imshow("view", cv_ptr->image);
这一行显示图像没有问题,但是一旦声明一个新的cv::Mat
则会产生上述报错。
经上网查阅,发现ROS2 Foxy自带的OpenCV与系统的OpenCV冲突了。
参考了许多文章,大多建议源码编译并重新安装cv_bridge https://github.com/ros-perception/vision_opencv。
可以先卸载目前的cv_bridge
:sudo apt-get remove ros-foxy-cv-bridge
,不过我没卸...可能这是我后面遇到问题的原因。先往下看:
选择对应ros版本的分支并clone:
git clone https://github.com/ros-perception/vision_opencv.git -b foxy
进入cv_brdige
文件夹,修改其中的CMakeLists,可以将find_package(OpenCV 4 QUIET
修改为自己的OpenCV版本或者用set(OpenCV_DIR "/home/jetson/opencv-4.5.4/build")
指定想要使用的OpenCV路径:
find_package(OpenCV 4.5.4 QUIET
然后开始编译:
mkdir build && cd build
cmake -D CMAKE_INSTALL_PREFIX=/usr/local/cv_bridge454 ..
sudo make -j8 && sudo make install -j8
根据一些文章[1]-[3]中的建议,我将编译后的文件生成在/usr/local/cv_bridge454
目录下。
在一些博客[4][5]中也看到将cv_brdige
安装在Foxy目录下的:cmake -DCMAKE_INSTALL_PREFIX=/opt/ros/foxy ..
这样做的目的可能是直接替换掉当前的cv_brdige
我对比了一下,生成在/usr/local/cv_bridge454
目录下的文件,和ROS2 Foxy本身目录下的cv_brdige
中的文件,文件名是一样的,但是文件夹结构不太一样。所以我也不太清楚能否这样安装。
然后在自己的ROS2项目CMakeLists中,指定 cv_brdige
路径,注意在find_package
之前:
set(cv_bridge_DIR "/usr/local/cv_bridge454/share/cv_bridge/cmake")
重新编译你的ROS2代码,理论上运行时就不会报错了。
但是我还是在报错,最终一篇Blog[6]为我提供了思路:
用colcon build
来编译cv_brdige
,把他编译为一个ROS2功能包
然后执行下面命令,我的代码就可以运行而且不报错了。
source /home/jetson/Documents/CV/ros2_demo/vision_opencv/cv_bridge/install/setup.bash
参考文章
[1] https://blog.csdn.net/fb_941219/article/details/105705759
[2] https://blog.csdn.net/qq_41816368/article/details/133843917
[3] https://blog.csdn.net/Q_L_Y/article/details/135783171
[4] https://www.cnblogs.com/iamheying/p/17028586.html
[5] https://blog.csdn.net/zhngyue123/article/details/133900617