最近开始学习VINS-Mono系统源码,也看到了网上有许多别人的的阅读笔记和代码介绍资料。对我自己而言,阅读前人的笔记能够很快帮助自己加深对系统以及代码的整体理解。但是,自己也要写阅读笔记,这样在写的过程中能加深自己的认识和对系统的理解。
VINS-Mono的代码路径:https://github.com/HKUST-Aerial-Robotics/VINS-Mono
VINS-Mono的概要介绍我们直接阅读github上README中指定的paper就可以进行了解,无需多言。我们进入它的github路径下,下载好代码后按照README中的描述,预装需要的软件、编译、下载数据集、运行,这样一步一步进行操作就可以将VINS-Mono玩起来。
我这里下载的是EuRoC MAV Dataset数据集中的MH_04_difficult.bag,按照README介绍。打开三个终端,运行命令如下。
在第一个终端中执行命令:
roslaunch vins_estimator euroc.launch
程序运行结果,截取前边一部分显示如下:
从以上显示日志中的NODES可以看出,这里启动了三个结点:feature_tracker、pose_graph、vins_estimator。
这里的euroc.launch文件代码如下:
euroc.launch文件中确实启动了feature_tracker、vins_estimator和pose_graph这三个node,这个和上边的日志是对应的。并且可以看到,这个文件中设置的config_path配置文件是euroc_config.yaml,这个yaml文件中是系统运行的相关配置信息,特别要强调的是里边包含了相机和IMU之间的外参,这样的话在系统运行的时候就不需要对外参进行在线标定了。
在第二个终端中执行命令:
roslaunch vins_estimator vins_rviz.launch
vins_rviz.launch代码如下:
其中启动了rviz,对应的配置文件为vins_rviz_config.rviz。
在第三个终端中执行如下命令播放下载的数据集bag:
rosbag play /home/zhuwsh/Desktop/SLAM/dataset/MH_04_difficult.bag
运行结果截图如下:
另外,也可以运行没有相机和IMU之间外参的脚本,这样的话在系统运行过程中就会在线标定相机和IMU之间的外参。替换掉上边第一项的输入,如下所示:
roslaunch vins_estimator euroc_no_extrinsic_param.launch
打开euroc_no_extrinsic_param.launch文件后,看到下面一行配置信息:
也就是说该launch文件对应的配置文件为euroc_config_no_extrinsic.yaml,在该yaml文件中确实看不到相机和IMU之间的外参。
新开一个终端执行rqt_graph命令并在图形界面中选择Nodes/Topics(active),显示结果截图如下:
rqt_graph是一个很好用的工具,可以分析ros中正在运行的结点和结点之间的topic订阅和发布关系。在这里,我们可以先通过这张图来初步对VINS-Mono做个初步的了解。
图中总共有4个结点,这四个结点的topic订阅和发布情况如下:
1)播放bag的play结点
该结点发布/imu0和/cam0/image_raw两个topic:
/imu0:被vins_estimator结点订阅;
/cam0/image_raw:被feature_tracker和pose_graph两个结点订阅;
2)feature_tracker结点
feature_tracker结点订阅的topic:/cam0/image_raw
feature_tracker结点发布的topic:
1、/feature_tracker/feature_img
2、/feature_tracker/feature
3、/feature_tracker/restart
3)vins_estimator结点
vins_estimator订阅的topic:
1、/imu0
2、/feature_tracker/feature
3、/feature_tracker/restart
4、/pose_graph/match_points
vins_estimator发布的topic:
1、/vins_estimator/keyframe_pose
2、/vins_estimator/relo_relative_pose
3、/vins_estimator/extrinsic
4、/vins_estimator/odometry
5、/vins_estimator/keyframe_point
6、/vins_estimator/imu_propagate
7、/tf
8、/vins_estimator/point_cloud
9、/vins_estimator/path
10、/vins_estimator/camera_pose_visual
实际上,在代码中还会发布/vins_estimator/relocalization_path、/vins_estimator/history_cloud、/vins_estimator/key_poses、/vins_estimator/camera_pose这几个topic。
4)pose_graph结点
pose_graph订阅的topic:
1、/vins_estimator/imu_propagate
2、/vins_estimator/odometry
3、/cam0/image_raw
4、/vins_estimator/keyframe_pose
5、/vins_estimator/extrinsic
6、/vins_estimator/keyframe_point
7、/vins_estimator/relo_relative_pose
pose_graph发布的topic:
1、/pose_graph/match_image
2、/pose_graph/camera_pose_visual
3、/pose_graph/key_odometrys
4、/pose_graph/no_loop_path
5、/pose_graph/match_points
6、/pose_graph/base_path
7、/pose_graph/pose_graph
8、/pose_graph/pose_graph_path
9、/pose_graph/path_1
10、/pose_graph/path_2
11、/pose_graph/path_3
12、/pose_graph/path_4
13、/pose_graph/path_5
基于ROS开发的系统,其实分析代码的过程中,就是要梳理清楚topic在各个node之间的订阅和发布关系,以及接收到订阅的topic后对message的处理。系统的逻辑部分就在接收到message后的代码处理当中。
本篇笔记是对VINS-Mono系统运行的一个大概了解,后边的笔记中,我会根据以上运行结果和对系统中结点和topic的初步了解进行代码阅读理解。
VINS-Mono代码阅读笔记(二):feature_tracker代码阅读