cmake \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv-3.3.1 \
-D BUILD_PNG=OFF \
-D BUILD_TIFF=OFF \
-D BUILD_TBB=OFF \
-D BUILD_JPEG=OFF \
-D BUILD_JASPER=OFF \
-D BUILD_ZLIB=OFF \
-D BUILD_EXAMPLES=ON \
-D BUILD_opencv_java=OFF \
-D BUILD_opencv_python2=ON \
-D BUILD_opencv_python3=ON \
-D ENABLE_PRECOMPILED_HEADERS=OFF \
-D WITH_OPENCL=OFF \
-D WITH_OPENMP=OFF \
-D WITH_FFMPEG=ON \
-D WITH_GSTREAMER=OFF \
-D WITH_GSTREAMER_0_10=OFF \
-D WITH_CUDA=ON \
-D WITH_GTK=ON \
-D WITH_VTK=ON \
-D WITH_TBB=ON \
-D WITH_1394=OFF \
-D WITH_OPENEXR=OFF \
-D OPENCV_EXTRA_MODULES_PATH=/home/ly/package/OpenCV-3.3.1/opencv_contrib-3.3.1/modules \
-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.0 \
-D CUDA_ARCH_BIN=6.1 \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_TESTS=OFF \
..
成功编译后,在安装eigen库以及其他依赖,完成环境配置
roslaunch vins_estimator euroc.launch
roslaunch vins_estimator vins_rviz.launch
rosbag play YOUR_PATH_TO_DATASET/MH_01_easy.bag
pip install evo --uograde --np-binary evo --user
evo_traj euroc data.csv --save_as_tum
将GroundTruth转换为tum格式
evo_traj tum FrameTrajectory_TUM_Format.txt --ref=data.tum -p
画出轨迹,后添加–align,可以将轨迹对齐
evo_ape tum data.tum FrameTrajectory_TUM_Format.txt -va --plot
计算绝对轨迹误差
。。。
rpg_trajectory_evaluation评价工具
ToolBox
按照README即可,无需在ros下编译。
对于廉价的IMU设备,需要对IMU的一些自身参数进行矫正:三轴的对齐、比例因子、固有的零偏。采用imu_tk安装包进行标定,将得到的校正矩阵、校正向量对发布的IMU数据进行修改。
安装imu_tk安装包
找到imu_tk ros封装的安装包,按照README进行安装。
安装后,进行测试,可能会报错,将缺失的工具gnuplot对应安装即可解决。
录制数据包
imu_tk对数据包的录制具有有特殊的要求,必须满足其中算法的需要。
首先静置50s左右
接着每隔1~2s换一次IMU位置,过程中平滑的旋转IMU
最后结束记录
进行标定
执行命令
rosrun imu_tk imu_calib_node imu_tk.bag /imu
结果保存至对应路径的文件夹内
对imu传感器的噪声数据、随机游走进行标定,IMU需要包含重力加速度。使用imu_utis包进行标定
rosbag play imu.bag
roslaunch imu_utils my_imu.launch
结果保存至对应的yaml文件以及txt文件,获取imu的噪声以及随机游走
使用camera calibration 标定
下载对应的ros功能包ros camera calibration
rosrun camera_calibration cameracalibrator.py --size 11x8 --square 0.03 image:=/zed_node/left/image_rect_color
其中参数size 11x8 注意是字母x,他是棋盘内部角点个数,如下图所示。square为棋盘正方形边长,注意刚刚开始标定的时候,CALIBRATE按钮是灰色的。
使用kalibr工具实现单目标定
rosbag record -O camera.bag /zed_node/left/image_rect_color
kalibr_bagextractor --image-topics /zed_node/left/image_rect_color --output-folder /home/ly/catkin_kalibr_ws/src/Kalibr/bags --bag /home/ly/catkin_kalibr_ws/src/Kalibr/bags/camera.bag
kalibr_bagcreater --folder /home/ly/catkin_kalibr_ws/src/Kalibr/bags --output-bag test.bag
kalibr_calibrate_cameras --bag /home/ly/catkin_kalibr_ws/test.bag --topic /cam0/image_raw --models pinhole-radtan --target /home/ly/catkin_kalibr_ws/src/Kalibr/config/april_6×6.yaml
在标定过程中,可能会报关于“focal length”初始化错误的错误,目前参照解决办法标定完成后,在文件夹内生成yaml文件
采用Kalibr工具进行联合标定
kalibr_create_target_pdf --type apriltag --nx [NUM_COLS] --ny [NUM_ROWS] --tsize [TAG_WIDTH_M] --tspace [TAG_SPACING_PERCENT]
方括号内填入对应的标定板尺寸,官方给出的尺寸及对应的配置文件,链接标定板设置
若产生:ImportError:No module named pyx的错误,需要安装python对应的模块即可
sudo apt-get install python-pyx
同时保存对应的配置文件aprilgrid.yaml,采用gedit生成对应文件,填入如下数据,否则脚本可能打不开
target_type: 'aprilgrid' #gridtype
tagCols: 6 #number of apriltags
tagRows: 6 #number of apriltags
tagSize: 0.088 #size of apriltag, edge to edge [m]
tagSpacing: 0.3 #ratio of space between tags to tagSize
#example: tagSize=2m, spacing=0.5m --> tagSpacing=0.25[-]
rosbag record /cam0/image_raw /cam1/image_raw /imu0 -O dynamic.bag
rosbag能同时采集多个节点对应的数据,后续采用rosbag 的play模式播放记录的数据,或者在脚本文件读取bag中的数据。利用Kalibr_bagextractor进行bag数据的解析,并生成对应的imu.csv文件以及将图片数据保存至制定的目录。脚本实现代码如下:kalibr_bagextractor --image-topics /zed_node/left/image_rect_color --imu-topics /imu --output-folder /home/ly/catkin_kalibr_ws/src/Kalibr/bags --bag /home/ly/catkin_kalibr_ws/src/Kalibr/bags/combination.bag
`在解析到指定的文件夹后,再次生成对应的bag文件,其代码如下:
kalibr_bagcreater --folder /home/ly/catkin_kalibr_ws/src/Kalibr/bags --output-bag test.bag
2.改写脚本,在节点运行中实时保存对应传感器的数据,并将对应数据存储到对应路径,以一定格式存储
+-- dataset-dir
+-- cam0
│ +-- 1385030208726607500.png
│ +-- ...
│ -- 1385030212176607500.png
+-- cam1
│ +-- 1385030208726607500.png
│ +-- ...
│ -- 1385030212176607500.png
-- imu0.csv
为了实现标定,相机节点以及imu节点写了数据爬取脚本,为相机IMU联合标定做准备。
kalibr_calibrate_imu_camera --target april.yaml --cam src/Kalibr/config/camchain-homelycatkin_kalibr_wstest.yaml --imu src/Kalibr/config/imu_config.yaml --bag src/Kalibr/bags/calibration.bag
得到相机与IMU之间的变换矩阵以及时间偏移等参数。
初始化设备
以ros为例,在ros系统中开启Camera节点、IMU节点,同时开启VINS-mono的两个节点:roslaunch vins_estimator euroc.launch
以及roslaunch vins_estimator vins_rviz.launch
。在运行之前需要考虑配置/home/××/vins-mono-catkin_ws/src/VINS-Mono/config/euroc/euroc_config.yaml
配置文件的设置。其中包含:
1.传感器节点名称
2.相机模型:PINHOLE 等
3.图片属性:大小、内参
4.IMU与相机的外参、时移(设备可在线估计)
5.特征点个数、最小特征距离
6.IMU的内参:noise、random walk等
7.其他
运行程序
对于标定好的IMU与相机的设备来说,VINS程序运行不会出现太大问题,做一些适当的平移与旋转即可满足激励,完成初始化工作,实现位姿实时估计。而对于一些低成本传感器设备,而且没有经过精确校准来说,VINS的初始化困难。用一些廉价IMU与自己的Camera相机刚性连接后测试VINS后,发现一直无法初始化设备,错误显示在Gyro的偏置估计太大导致程序崩溃,后边一直没调通,猜测是Gyro传感器的问题(标定该传感器时,发现传感器的噪声密度过大),亦或是时间偏移过大,没有验证。
运用视觉惯导传感器在正确配置下应该没有太大问题。
保存与重用
VINS-Mono提供了PoseGraph的保存与重用,在运行结束时,可以将关键帧数据保存,同样在启动VINS时配置文件调用即可。
在实现视觉惯性融合之前,需要对相机、IMU储备一些知识,之后再去看vins融合的理论。
一下罗列相关论文
IMU(Inertial measurement unit,简称IMU)惯性测量单元,测量物体的三轴角速度和加速度,有的配有地磁以及气压的测量。IMU属于捷联式惯导link.对于IMU,我们关心IMU的噪声,Allan方差分析噪声的问题link.