【VINS-Mono】RealsenseD435i运行VINS-Mono,在ubuntu18.04和opencv3和cv_bridge的报错记录

2023-05-16

VINS-Mono(A Robust and Versatile Monocular Visual-Inertial State Estimator)
https://github.com/HKUST-Aerial-Robotics/VINS-Mono
VINS-Mono的官方配置环境Ubuntu 16.04, ROS Kinetic, OpenCV 3.3.1, Eigen 3.3.3,cereo1.14.0
我的环境Ubuntu 18.04, ROS Melodic, OpenCV 4.5.1&&3.3.1, Eigen 3.3.3,cereo1.14.0
踩坑总结:因为原来电脑就安装了opencv4.5.1,所以打算改vins-mono的opencv代码,但是ubuntu18.04的cv_bridge是和opencv3.2.0连接,导致调用opencv版本冲突,后来重新安装opencv4版本的cv_bridge,编译通过;但是在打开realsense会报错,因为realsense也用到了cv_bridge的但是用的opencv3.2.0,而改完后的vins-mono用的是opencv4.5.1,所以还是会有版本冲突。最终的解决方案是又安装了opencv3.3.1,不卸载原来版本的cv_bridge,最终成功运行。在debug的过程还发现要保持深度相机和vins-mono的图像大小一致(640x480),否则也会报错,最后是重新安装realsense-ros解决;开始使用时注意先把摄像头前后左右晃一下,这个是给IMU初始化用的。

参考教程
从零开始使用Realsense D435i运行VINS-Mono
Realsense D435i 相机与VINS-Mono连接时右侧不显示轨迹问题的解决
关于ros Melodic与opencv 4.5.5版本冲突cv_bridge报错的解决办法
Ubuntu下多版本OpenCV共存和切换

1.安装测试VINS-Mono

先用数据集测试VINS-Mono

cd ~/catkin_ws/src
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Mono.git
cd ..
catkin_make
source ~/catkin_ws/devel/setup.bash

数据集地址https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets
然后打开三个terminal,分别运行

roslaunch vins_estimator euroc.launch 
roslaunch vins_estimator vins_rviz.launch
rosbag play MH_01_easy.bag 

在这里插入图片描述

2.在RealsenseD435i上运行VINS-Mono

前面都测试好之后就可以在RealsenseD435i上运行VINS-Mone了

修改realsense包里的rs_camera.launch文件
第一处,修改unite_imu_method如下,这里是让IMU的角速度和加速度作为一个topic输出

 <arg name="unite_imu_method"      default="copy"/>

第二处,修改enable_sync参数为true,这里是开机相机和IMU的同步

  <arg name="enable_gyro"         default="true"/>
  <arg name="enable_accel"        default="true"/>
  <arg name="enable_sync"           default="true"/>

修改VINS-Mono包里的realsense_color_config.yaml文件
第一处,修改订阅的topic

imu_topic: "/camera/imu"
image_topic: "/camera/color/image_raw"

第二处,修改相机内参,这里先再次打开运行realsesne包,然后可以通过如下命令获取相机内参

rostopic echo /camera/color/camera_info

话题打印信息中D就是畸变系数,数值都为0;而K就是相机内参,将其替换掉配置文件中的默认值:

#camera calibration 
model_type: PINHOLE
camera_name: camera
image_width: 640
image_height: 480
distortion_parameters:
   k1: 0 #9.2615504465028850e-02
   k2: 0 #-1.8082438825995681e-01
   p1: 0 #-6.5484100374765971e-04
   p2: 0 #-3.5829351558557421e-04
projection_parameters:
   fx: 9.05654296875e+02 #6.0970550296798035e+02
   fy: 9.05483398438e+02 #6.0909579671294716e+02
   cx: 6.50563598633e+02  #3.1916667152289227e+02
   cy: 3.54959960938e+02  #2.3558360480225772e+02

第三处,IMU到相机的变换矩阵,这里我根据注释的提示修改成2

# Extrinsic parameter between IMU and Camera.
estimate_extrinsic: 2   # 0  Have an accurate extrinsic parameters. We will trust the following imu^R_cam, imu^T_cam, don't change it.
                        # 1  Have an initial guess about extrinsic parameters. We will optimize around your initial guess.
                        # 2  Don't know anything about extrinsic parameters. You don't need to give R,T. We will try to calibrate it. Do some rotation movement at beginning.                        
#If you choose 0 or 1, you should write down the following matrix.

第四处,IMU参数,这里我全部修改注释给的参数

#imu parameters       The more accurate parameters you provide, the better performance
acc_n: 0.2          # accelerometer measurement noise standard deviation. #0.2
gyr_n: 0.05         # gyroscope measurement noise standard deviation.     #0.05
acc_w: 0.02         # accelerometer bias random work noise standard deviation.  #0.02
gyr_w: 4.0e-5       # gyroscope bias random work noise standard deviation.     #4.0e-5
g_norm: 9.80       # gravity magnitude

第五处,是否需要在线估计同步时差,根据上述博主的建议这里选择不需要

#unsynchronization parameters
estimate_td: 0                      # online estimate time offset between camera and imu
td: 0.000                           # initial value of time offset. unit: s. readed image clock + td = real image clock (IMU clock)

第六处,相机曝光改成全局曝光

#rolling shutter parameters
rolling_shutter: 0                      # 0: global shutter camera, 1: rolling shutter camera
rolling_shutter_tr: 0               # unit: s. rolling shutter read out time per frame (from data sheet). 

打开深度相机,运行VINS-Mono

roslaunch realsense2_camera rs_camera.launch 
roslaunch vins_estimator realsense_color.launch 
roslaunch vins_estimator vins_rviz.launch

在这里插入图片描述

3.报错记录

问题一
编译vins-mono,opencv版本冲突

cmake_minimum_required(VERSION 2.8.3)
project(ar_demo)

set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++11 -DEIGEN_DONT_PARALLELIZE")
#-DEIGEN_USE_MKL_ALL")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")

set(OpenCV_DIR /usr/local/include/opencv2)
include_directories(${OpenCV_INCLUDE_DIRS}) 


find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  image_transport
  sensor_msgs
  cv_bridge
  message_filters
  camera_model
)
find_package(OpenCV 3.3.1 REQUIRED)
message("OpenCV version  is :  ${OpenCV_VERSION}")

catkin_package(

)


include_directories(
  ${catkin_INCLUDE_DIRS}
)

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
find_package(Eigen3)
include_directories(
  ${catkin_INCLUDE_DIRS}
  ${EIGEN3_INCLUDE_DIR}
)

add_executable(ar_demo_node src/ar_demo_node.cpp)

 target_link_libraries(ar_demo_node
   ${catkin_LIBRARIES} ${OpenCV_LIBS}
 )

解决方法
设置特定版本的opencv3.3.1,find_package(OpenCV 3.3.1 REQUIRED)

问题二

no previous pose graph
OpenCV Error: Assertion failed (_mask.empty() || (_mask.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) && _mask.sameSize(_image))) in goodFeaturesToTrack, file /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/imgproc/src/featureselect.cpp, line 366
terminate called after throwing an instance of 'cv::Exception'
  what():  /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/imgproc/src/featureselect.cpp:366: error: (-215) _mask.empty() || (_mask.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) && _mask.sameSize(_image)) in function goodFeaturesToTrack

[feature_tracker-1] process has died [pid 28321, exit code -6, cmd /home/k/catkin_ws/devel/lib/feature_tracker/feature_tracker __name:=feature_tracker __log:=/home/k/.ros/log/6cc297dc-da08-11eb-9403-244bfeccb575/feature_tracker-1.log].
log file: /home/k/.ros/log/6cc297dc-da08-11eb-9403-244bfeccb575/feature_tracker-1*.log

解决方法
具体原因是masksize和forw_img尺寸不一致,即相机和vins-mono设定的图像尺寸不一致,查看log文件,有报错信息提示

if (mask.size() != forw_img.size()){
    cout << "wrong size111 " << endl;
    cout<<"mask.size()"<<mask.size()<<endl;
    cout<<"forw_img.size()"<<forw_img.size()<<endl;
}

问题三
rviz 的 Global Statu 报错
在这里插入图片描述
解决方法
开始使用时注意先把摄像头前后左右晃一下,这个是给IMU初始化用的,Global Statu 也会恢复正常。




附录:踩坑记录

1.VINS-Mono在opencv4下的代码编写

问题一

//报错
error:  /home/ubuntu/catkin_ws/src/VINS-Mono/camera_model/src/chessboard/http://Chessboard.cc: In constructor ‘camodocal::Chessboard::Chessboard(cv::Size, cv::Mat&)’:
error:  /home/ubuntu/catkin_ws/src/VINS-Mono/camera_model/src/chessboard/Chessboard.cc:20:38: error: ‘CV_GRAY2BGR’ was not declared in this scope
cv::cvtColor(image, mSketch, CV_GRAY2BGR);

//解决方法
在报错文件上添加头文件 #include <opencv2/imgproc/imgproc_c.h>

问题二

//报错 
error: ‘CV_CALIB_CB_ADAPTIVE_THRESH’ was not declared in this scope 、
error: ‘CV_CALIB_CB_NORMALIZE_IMAGE’ was not declared in this scope、
error: ‘CV_CALIB_CB_FILTER_QUADS’ was not declared in this scope 、
error: ‘CV_CALIB_CB_FAST_CHECK’ was not declared in this scope ....

//解决方法
将 CV_CALIB_CB_ADAPTIVE_THRESH 修改为 cv::CALIB_CB_ADAPTIVE_THRESH、
将 CV_CALIB_CB_NORMALIZE_IMAGE 修改为 cv::CALIB_CB_NORMALIZE_IMAGE、
将 CV_CALIB_CB_FILTER_QUADS 修改为 cv::CALIB_CB_FILTER_QUADS、
将 CV_CALIB_CB_FAST_CHECK 修改为 cv::CALIB_CB_FAST_CHECK 

问题三

//报错
 error: ‘CV_RGB2GRAY’ was not declared in this scope
/home/ubuntu/catkin_ws/src/VINS-Mono/pose_graph/src/ThirdParty/DVision/BRIEF.cpp:53:32: error: ‘CV_RGB2GRAY’ was not declared in this scope cv::cvtColor(image, aux, CV_RGB2GRAY);
^~~~~~~~~~~
/home/ubuntu/catkin_ws/src/VINS-Mono/pose_graph/src/ThirdParty/DVision/BRIEF.cpp:53:32: note: suggested alternative: ‘CV_RGB’ cv::cvtColor(image, aux, CV_RGB2GRAY);

//解决方法
在报错文件上添加头文件 #include<opencv2/imgproc/types_c.h>

问题四

//报错
 error: ‘CV_FONT_HERSHEY_SIMPLEX’ was not declared in this scope 

//解决方法
 将报错文件上的 CV_FONT_HERSHEY_SIMPLEX 参数改为 cv::FONT_HERSHEY_SIMPLEX

问题五

//报错
单独遇到CV_AA的报错
//解决方法
将 CV_AA 改为 cv::LINE_AA

2.解决cv_bridge与opencv4版本不匹配

问题描述
ubutnu18.04对应的ROS中,opencv版本是3.2.0,cv_bridge对应的opencv版本也是3.2.0,但有些情况下我们自己安装的opencv版本和ros自带的版本不一致,即编译项目时使用的opencv版本和使用的cv_bridge对应的opencv版本不一致,因此版本有冲突

解决方法

1.卸载ros自带的cv_bridge

sudo apt-get remove ros-melodic-cv-bridge

2.下载cv_bridge(opencv4版本)

mkdir -p cv_bridge/src
cd cv_bridge/src
git clone https://github.com/fizyr-forks/vision_opencv.git
gedit ~/cv_bridge/src/vision_opencv-opencv4/cv_bridge/CMakeLists.txt 
cd ..
cdtkin_make

3.修改cv_bridge包下的CMakeLists.txt :

cmake_minimum_required(VERSION 2.8)
project(cv_bridge)
#opencv4库的路径
set(OpenCV_DIR "/usr/local/include/opencv4/opencv2")					#opencv库的路径,大家应该都一样
find_package(catkin REQUIRED COMPONENTS rosconsole sensor_msgs)

if(NOT ANDROID)
  find_package(PythonLibs)
  if(PYTHONLIBS_VERSION_STRING VERSION_LESS 3)
    find_package(Boost REQUIRED python)
  else()
    find_package(Boost REQUIRED python3)
  endif()
else()
find_package(Boost REQUIRED)
endif()

#改成4
find_package(OpenCV 4 REQUIRED						
  COMPONENTS
    opencv_core
    opencv_imgproc
    opencv_imgcodecs
  CONFIG
)

catkin_package(
  INCLUDE_DIRS include
  LIBRARIES ${PROJECT_NAME}
  CATKIN_DEPENDS rosconsole sensor_msgs
  DEPENDS OpenCV
  CFG_EXTRAS cv_bridge-extras.cmake
)

catkin_python_setup()

include_directories(include ${Boost_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})

if(NOT ANDROID)
add_subdirectory(python)
endif()
add_subdirectory(src)
if(CATKIN_ENABLE_TESTING)
  add_subdirectory(test)
endif()

# install the include folder
install(
  DIRECTORY include/${PROJECT_NAME}/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
)

4.这样就得到了基于自己opencv版本的cv_bridge,将cv_bridge安装到系统路径下

cd ~/cv_bridge/src/vision_opencv-opencv4/cv_bridge
mkdir build
cd build
cmake ..
make
sudo make install

5.最后在项目使用cv_bridge中的CMakeLists.txt 前面加上

#没有安装到系统路径下
set(cv_bridge_DIR ~/cv_bridge/devel/share/cv_bridge/cmake)
#安装到系统路径下
set(cv_bridge_DIR /usr/local/share/cv_bridge/cmake) 
set(OpenCV_DIR "/usr/local/include/opencv4/opencv2")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【VINS-Mono】RealsenseD435i运行VINS-Mono,在ubuntu18.04和opencv3和cv_bridge的报错记录 的相关文章

随机推荐

  • C++11 之for 新解

    前言 C 43 43 11这次的更新带来了令很多C 43 43 程序员期待已久的for range循环 xff0c 每次看到javascript xff0c lua里的for range xff0c 心想要是C 43 43 能有多好 xff
  • c++11之初始化列表

    一 前言 C 43 43 的学习中 xff0c 我想每个人都被变量定义和申明折磨过 xff0c 比如我在大学笔试过的几家公司 xff0c 都考察了const和变量 xff0c 类型的不同排列组合 xff0c 让你区别有啥不同 反正在学习C
  • Unity Update 详解

    0x01 简介 Unity的脚本继承了Monobehaviour类 xff0c 在脚本中定义函数 xff1a void FixedUpdate span class hljs list span void span class hljs k
  • 2016总结

    欲言又止 xff1a 每年的年终总结是要在新年之前发表在博客上 xff0c 今年的年终总结拖到现在完成 xff0c 我也是服自己 这里要感谢我的高中好友 64 万学清同学 xff0c 在我去年微信发表的有关年终总结的朋友圈下 xff0c 催
  • 阅读代码和修改别人代码的一些技巧以及注意事项

    作为刚刚走上工作岗位的fish xff0c 都要熟悉前辈们留下来的代码 这段时间是fish最痛苦的时间同时也是最轻松的时间 痛苦是因为要看大量的代码 xff0c 同时要慢慢从学生到社会人士的转变 xff08 xff0c 再不能睡懒觉了 xf
  • 一个分号引发的血案

    最近在看 Data Structures and Algorithms 这本书 xff0c 书里对数据结构和算法进行了简单的描述 xff0c 并且用伪码进行了实现 伪码毕竟和代码还是有很大不同的 xff0c 书的说明里说有C 写的源码 xf
  • Iphone客户端程序员半年工作总结

    来公司四个半月了 xff0c 从对客户端游戏编程的小白慢慢的也能写一些东西了 xff0c 当然了这里最感谢的人就是九天了 xff0c 对于九天其它的好我就不说了 xff0c 就是感觉九天为了团队 xff0c 为了项目 xff0c 他在很用心
  • Unity Android Activity控制

    前言 开发游戏 xff0c 在国内发行 xff0c 接入各个渠道SDK是一件绕不开的事情 并且这件事非常复杂琐碎 xff0c 原因如下 xff1a a 发行平台多 xff0c Android平台有30 xff0c 40家主流发行平台 b 每
  • MongoDB ODM 框架MongoMongo-简化你的数据存储

    MongMongo是一个用Java写的ODM框架 xff0c 使得对MongoDB的操作更加便捷 MongoMongo努力为Java开发者提供类似于ActiveORM 或者 Hibernate的操作API 并且保留了MongoDB的sche
  • Unity Android 加载动态库

    前言 在接入360 Android SDK时遇到在有些机型的Android机器上报错 xff0c 具体错误提示为 xff1a Failure to initialize Your hardware does not support this
  • 德鲁克谈《自我管理》笔记摘要

    一 我的长处是什么 多数人都以为他们知道自己擅长什么 xff0c 其实不然 要发现自己的长处 xff0c 唯一的途径就是分析回馈法 写下自己预期的结果 9 12个月后 xff0c 将实际结果和预期比较 总结改善自己的预期和行动 我们要以持之
  • ubuntu下搭建cocos2dx编程环境-上

    这大半年一直在开发flash游戏 xff0c 用到的编程语言是actionscript和c 43 43 所以这次公司决定开发手游端的话 xff0c C 43 43 不是很生疏 xff0c 这是个好消息 坏消息是由于现在网页游戏还没有上线 x
  • netty使用epoll报错:java.lang.UnsatisfiedLinkError: failed to load the required native library

    Caused by java lang UnsatisfiedLinkError could not load a native library netty transport native epoll x86 64 最近修改moquett
  • 用Opencv打造一台自动视觉目标跟踪系统

    平移 倾斜伺服装置 xff0c 帮助摄像机使用视觉自动跟踪颜色对象 简介 现在我们将使用我们的设备帮助相机自动跟踪颜色对象 xff0c 如下所示 xff1a OpenCV可免费用于学术和商业用途 它具有C 43 43 xff0c C xff
  • datetime.datetime.now().strftime

    datetime datetime now strftime Y m d H M S 1 python datetime模块用strftime 格式化时间 span class token keyword import span datet
  • 图像处理之灰度图像转换与二值化

    灰度图像与二值化 问题描述 xff1a 将彩色图像转换为灰度图像并进行二值化处理 代码如下 xff08 示例 xff09 xff1a span class token macro property span class token dire
  • softmax函数如何防止数值上溢和溢出问题

    参照https blog csdn net csuzhaoqinghui article details 79742685
  • VR系统的组成与交互技术汇总

    今天给大家介绍一下VR系统的组成与当前一些VR交互技术 xff0c 希望大家对VR有更深的理解 一个典型的虚拟现实系统主要由计算机 输入输出设备 虚拟现实设计 浏览软件等组成 用户以计算机为核心 xff0c 通过输入输出设备与应用软件的虚拟
  • 嵌入式Linux C编程学习之路(三)——初识GCC

    Gcc xff08 GNU C Compiler xff09 是GNU推出的功能强大 性能优越的多平台编译器 xff0c 是GNU的代表作之一 Gcc可以在多种硬体平台上编译出可执行程序 xff0c 其执行效率与一般的编译器相比平均效率要高
  • 【VINS-Mono】RealsenseD435i运行VINS-Mono,在ubuntu18.04和opencv3和cv_bridge的报错记录

    VINS Mono xff08 A Robust and Versatile Monocular Visual Inertial State Estimator xff09 https github com HKUST Aerial Rob