在ROS1上实现RGBD图像的传输与作为话题发布

实践平台

  • melodic版本ROS1
  • 发布的是TUM格式的RGBD数据,可从相关网页了解如何生成该类数据形式

依托的博文

  • 本文主要依托于将RGBD数据制作为rosbag,并作为话题发布,在实践该文的过程中,我遇到了一系列的问题,撰文记录之

遇到的问题

问题1

  • 尝试使用ros驱动opencv使用imshow函数显示深度图像时出现“OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor…”
    这个问题的出现是比较令人费解的,我一度以为是imshow不能显示单通道图像,但后来发现并不是,问题还是出现在ros本身的opencv版本与外界opencv版本不兼容上,具体的解决措施见下一条

  • /usr/bin/ld: warning: libopencv_imgcodecs.so.3.2, needed by /opt/ros/melodic/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.4.4 ; /usr/bin/ld: warning: libopencv_core.so.4.4, needed by /usr/local/lib/libopencv_highgui.so.4.4.0, may conflict with libopencv_core.so.3.2; 这俩是编译时的警告,但是如果不管的话,后面运行的时候就会出错。错误就是上一条

  • 解决方案
    git clone https://github.com/ros-perception/vision_opencv.git
    提取出其中的cv_bridge功能包,然后插入一下, 基本就能解决问题了

catkin_make --pkg cv_bridge

当然,也有其他插入多个功能包的方案,例如同时插入vision_opencv和image_pipeline

其他的问题

  • 在使用如上方法将cv_bridge插入之后,你可能面临这样的问题:使用catkin_make构建项目并使用不会有任何问题,但是使用catkin build的时候,会报类似于"cv::imshow()"未定义的引用等opencv相关的错误,编译时的这个错误当然有方法可以绕过,但是运行时仍然会有新的问题。这该如何解决呢?
  • 受到这篇文章的启发,我用ldd查了一下相关依赖,发现涉及到的opencv关系有点太复杂了。我的系统中有2.4.1、3.4.1 、4.4.0三个版本的opencv,而且他们中有的还直接安装到系统的lib目录中,cv_bridge默认是3.2。处理起来很麻烦,后来我删除了其中两个版本,保留了一个,这样就能顺利编译了。ldd查询的一个示例如下:
ldd libcv_bridge.so | grep opencv

问题2

  • 运行时出现 Attempt to unlock mutex that was not locked
  • 我的解决方案很简单,注释掉cv::startWindowThread() 就行

差不多就这两个问题吧,也花了不少时间,开个贴记录一下

你可能感兴趣的:(经验分享)