HKUST-Aerial-Robotics/VINS-Fusion
GitHub: HKUST-Aerial-Robotics/VINS-Fusion
VINS-Fusion 是一个基于优化的多传感器状态估计器,为无人机、汽车和 AR/VR 等自主应用提供精确的视觉惯性定位与里程计估计。
Stars: 4627 | Forks: 1609
# VINS-Fusion
## 一个基于优化的多传感器状态估计器
VINS-Fusion 是一个基于优化的多传感器状态估计器,可为自主应用(无人机、汽车和 AR/VR)实现精确的自主定位。VINS-Fusion 是 [VINS-Mono](https://github.com/HKUST-Aerial-Robotics/VINS-Mono) 的扩展,支持多种视觉惯性传感器类型(单目相机 + IMU、双目相机 + IMU,甚至仅双目相机)。我们还展示了一个融合 VINS 与 GPS 的基础示例。
**特性:**
- 支持多种传感器(双目相机 / 单目相机+IMU / 双目相机+IMU)
- 在线空间标定(相机与 IMU 之间的变换)
- 在线时间标定(相机与 IMU 之间的时间偏移)
- 视觉回环
我们在 [KITTI Odometry Benchmark](http://www.cvlibs.net/datasets/kitti/eval_odometry.php) 上是**排名第一**的开源双目算法(2019年1月12日)。
**作者:** 来自 [HKUST](https://www.ust.hk/) [空中机器人小组](http://uav.ust.hk/) 的 [Tong Qin](http://www.qintonguav.com)、Shaozu Cao、Jie Pan、[Peiliang Li](https://peiliangli.github.io/) 和 [Shaojie Shen](http://www.ece.ust.hk/ece.php/profile/facultydetail/eeshaojie)
**视频:**
**相关论文:**(论文与代码不完全一致)
* **Online Temporal Calibration for Monocular Visual-Inertial Systems**, Tong Qin, Shaojie Shen, IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS, 2018), **最佳学生论文奖** [pdf](https://ieeexplore.ieee.org/abstract/document/8593603)
* **VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator**, Tong Qin, Peiliang Li, Shaojie Shen, IEEE Transactions on Robotics [pdf](https://ieeexplore.ieee.org/document/8421746/?arnumber=8421746&source=authoralert)
*如果您在学术研究中使用了 VINS-Fusion,请引用我们的相关论文。[bib](https://github.com/HKUST-Aerial-Robotics/VINS-Fusion/blob/master/support_files/paper_bib.txt)*
## 1. 前置条件
### 1.1 **Ubuntu** 和 **ROS**
Ubuntu 64位 16.04 或 18.04。
ROS Kinetic 或 Melodic。[ROS 安装](http://wiki.ros.org/ROS/Installation)
### 1.2. **Ceres Solver**
请遵循 [Ceres 安装说明](http://ceres-solver.org/installation.html)。
## 2. 构建 VINS-Fusion
克隆代码仓库并执行 catkin_make:
```
cd ~/catkin_ws/src
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git
cd ../
catkin_make
source ~/catkin_ws/devel/setup.bash
```
(如果您在此步骤失败,请尝试使用另一台具有纯净系统的计算机,或者重新安装 Ubuntu 和 ROS)
## 3. EuRoC 示例
下载 [EuRoC MAV Dataset](http://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets) 到 YOUR_DATASET_FOLDER。以 MH_01 为例,您可以使用三种传感器类型(单目相机 + IMU、双目相机 + IMU 和双目相机)运行 VINS-Fusion。
打开四个终端,分别运行 vins 里程计、视觉回环(可选)、rviz 并播放 bag 文件。
绿色路径是 VIO 里程计;红色路径是视觉回环下的里程计。
### 3.1 单目相机 + IMU
```
roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag
```
### 3.2 双目相机 + IMU
```
roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml
rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag
```
### 3.3 双目相机
```
roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml
rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag
```
## 4. KITTI 示例
### 4.1 KITTI Odometry(双目)
下载 [KITTI Odometry dataset](http://www.cvlibs.net/datasets/kitti/eval_odometry.php) 到 YOUR_DATASET_FOLDER。以序列 00 为例,
打开两个终端,分别运行 vins 和 rviz。
(我们在没有回环功能的情况下在 KITTI 基准测试上评估了里程计)
```
roslaunch vins vins_rviz.launch
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yaml
rosrun vins kitti_odom_test ~/catkin_ws/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yaml YOUR_DATASET_FOLDER/sequences/00/
```
### 4.2 KITTI GPS 融合(双目 + GPS)
下载 [KITTI raw dataset](http://www.cvlibs.net/datasets/kitti/raw_data.php) 到 YOUR_DATASET_FOLDER。以 [2011_10_03_drive_0027_synced](https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_10_03_drive_0027/2011_10_03_drive_0027_sync.zip) 为例。
打开三个终端,分别运行 vins、global fusion 和 rviz。
绿色路径是 VIO 里程计;蓝色路径是 GPS 全局融合下的里程计。
```
roslaunch vins vins_rviz.launch
rosrun vins kitti_gps_test ~/catkin_ws/src/VINS-Fusion/config/kitti_raw/kitti_10_03_config.yaml YOUR_DATASET_FOLDER/2011_10_03_drive_0027_sync/
rosrun global_fusion global_fusion_node
```
## 5. 车载环境下的 VINS-Fusion 演示
下载 [car bag](https://drive.google.com/open?id=10t9H1u8pMGDOI6Q2w2uezEq5Ib-Z8tLz) 到 YOUR_DATASET_FOLDER。
打开四个终端,分别运行 vins 里程计、视觉回环(可选)、rviz 并播放 bag 文件。
绿色路径是 VIO 里程计;红色路径是视觉回环下的里程计。
```
roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/vi_car/vi_car.yaml
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/vi_car/vi_car.yaml
rosbag play YOUR_DATASET_FOLDER/car.bag
```
## 6. 使用您的设备运行
VIO 不仅仅是一种软件算法,它在很大程度上依赖于硬件质量。对于初学者,我们建议您使用专业设备运行 VIO,这些设备包含全局快门相机和硬件同步。
### 6.1 配置文件
为您的设备编写一个配置文件。您可以以 EuRoC 和 KITTI 的配置文件为例。
### 6.2 相机标定
VINS-Fusion 支持多种相机模型(pinhole、mei、equidistant)。您可以使用 [camera model](https://github.com/hengli/camodocal) 来标定您的相机。我们在 /camera_models/calibrationdata 下放置了一些示例数据,以向您展示如何进行标定。
```
cd ~/catkin_ws/src/VINS-Fusion/camera_models/camera_calib_example/
rosrun camera_models Calibrations -w 12 -h 8 -s 80 -i calibrationdata --camera-model pinhole
```
## 7. Docker 支持
为了进一步简化构建过程,我们在代码中添加了 docker。Docker 环境就像一个沙盒,从而使得我们的代码独立于环境。要使用 docker 运行,首先请确保您的机器上安装了 [ros](http://wiki.ros.org/ROS/Installation) 和 [docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/)。然后通过 `sudo usermod -aG docker $YOUR_USER_NAME` 将您的账户添加到 `docker` 组中。**如果遇到 `Permission denied` 错误,请重新打开终端或注销后重新登录**,输入:
```
cd ~/catkin_ws/src/VINS-Fusion/docker
make build
```
请注意,根据您的网络和机器性能,docker 构建过程可能需要一段时间。VINS-Fusion 成功构建后,您可以使用脚本 `run.sh` 运行 vins estimator。
脚本 `run.sh` 可以接受多个标志和参数。标志 `-k` 表示 KITTI,`-l` 表示回环融合,`-g` 表示全局融合。您可以通过 `./run.sh -h` 获取详细用法。以下是使用此脚本的一些示例:
```
# Euroc 单目相机 + IMU
./run.sh ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
# Euroc 双目相机 + IMU 与 loop fusion
./run.sh -l ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
# KITTI Odometry (双目)
./run.sh -k ~/catkin_ws/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yaml YOUR_DATASET_FOLDER/sequences/00/
# KITTI Odometry (双目) 与 loop fusion
./run.sh -kl ~/catkin_ws/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yaml YOUR_DATASET_FOLDER/sequences/00/
# KITTI GPS Fusion (双目 + GPS)
./run.sh -kg ~/catkin_ws/src/VINS-Fusion/config/kitti_raw/kitti_10_03_config.yaml YOUR_DATASET_FOLDER/2011_10_03_drive_0027_sync/
```
在 EuRoC 案例中,您需要打开另一个终端并播放您的 bag 文件。如果您需要修改代码,只需在修改后使用适当的参数重新运行 `./run.sh` 即可。
## 8. 致谢
我们使用 [ceres solver](http://ceres-solver.org/) 进行非线性优化,使用 [DBoW2](https://github.com/dorian3d/DBoW2) 进行回环检测,以及通用的 [camera model](https://github.com/hengli/camodocal) 和 [GeographicLib](https://geographiclib.sourceforge.io/)。
## 9. 许可证
源代码在 [GPLv3](http://www.gnu.org/licenses/) 许可证下发布。
我们仍在努力提高代码的可靠性。如有任何技术问题,请联系 Tong Qin 。
如有商业咨询,请联系 Shaojie Shen 。
VINS-Fusion 是一个基于优化的多传感器状态估计器,可为自主应用(无人机、汽车和 AR/VR)实现精确的自主定位。VINS-Fusion 是 [VINS-Mono](https://github.com/HKUST-Aerial-Robotics/VINS-Mono) 的扩展,支持多种视觉惯性传感器类型(单目相机 + IMU、双目相机 + IMU,甚至仅双目相机)。我们还展示了一个融合 VINS 与 GPS 的基础示例。
**特性:**
- 支持多种传感器(双目相机 / 单目相机+IMU / 双目相机+IMU)
- 在线空间标定(相机与 IMU 之间的变换)
- 在线时间标定(相机与 IMU 之间的时间偏移)
- 视觉回环
我们在 [KITTI Odometry Benchmark](http://www.cvlibs.net/datasets/kitti/eval_odometry.php) 上是**排名第一**的开源双目算法(2019年1月12日)。
**作者:** 来自 [HKUST](https://www.ust.hk/) [空中机器人小组](http://uav.ust.hk/) 的 [Tong Qin](http://www.qintonguav.com)、Shaozu Cao、Jie Pan、[Peiliang Li](https://peiliangli.github.io/) 和 [Shaojie Shen](http://www.ece.ust.hk/ece.php/profile/facultydetail/eeshaojie)
**视频:**
**相关论文:**(论文与代码不完全一致)
* **Online Temporal Calibration for Monocular Visual-Inertial Systems**, Tong Qin, Shaojie Shen, IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS, 2018), **最佳学生论文奖** [pdf](https://ieeexplore.ieee.org/abstract/document/8593603)
* **VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator**, Tong Qin, Peiliang Li, Shaojie Shen, IEEE Transactions on Robotics [pdf](https://ieeexplore.ieee.org/document/8421746/?arnumber=8421746&source=authoralert)
*如果您在学术研究中使用了 VINS-Fusion,请引用我们的相关论文。[bib](https://github.com/HKUST-Aerial-Robotics/VINS-Fusion/blob/master/support_files/paper_bib.txt)*
## 1. 前置条件
### 1.1 **Ubuntu** 和 **ROS**
Ubuntu 64位 16.04 或 18.04。
ROS Kinetic 或 Melodic。[ROS 安装](http://wiki.ros.org/ROS/Installation)
### 1.2. **Ceres Solver**
请遵循 [Ceres 安装说明](http://ceres-solver.org/installation.html)。
## 2. 构建 VINS-Fusion
克隆代码仓库并执行 catkin_make:
```
cd ~/catkin_ws/src
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git
cd ../
catkin_make
source ~/catkin_ws/devel/setup.bash
```
(如果您在此步骤失败,请尝试使用另一台具有纯净系统的计算机,或者重新安装 Ubuntu 和 ROS)
## 3. EuRoC 示例
下载 [EuRoC MAV Dataset](http://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets) 到 YOUR_DATASET_FOLDER。以 MH_01 为例,您可以使用三种传感器类型(单目相机 + IMU、双目相机 + IMU 和双目相机)运行 VINS-Fusion。
打开四个终端,分别运行 vins 里程计、视觉回环(可选)、rviz 并播放 bag 文件。
绿色路径是 VIO 里程计;红色路径是视觉回环下的里程计。
### 3.1 单目相机 + IMU
```
roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag
```
### 3.2 双目相机 + IMU
```
roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml
rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag
```
### 3.3 双目相机
```
roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml
rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag
```
## 4. KITTI 示例
### 4.1 KITTI Odometry(双目)
下载 [KITTI Odometry dataset](http://www.cvlibs.net/datasets/kitti/eval_odometry.php) 到 YOUR_DATASET_FOLDER。以序列 00 为例,
打开两个终端,分别运行 vins 和 rviz。
(我们在没有回环功能的情况下在 KITTI 基准测试上评估了里程计)
```
roslaunch vins vins_rviz.launch
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yaml
rosrun vins kitti_odom_test ~/catkin_ws/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yaml YOUR_DATASET_FOLDER/sequences/00/
```
### 4.2 KITTI GPS 融合(双目 + GPS)
下载 [KITTI raw dataset](http://www.cvlibs.net/datasets/kitti/raw_data.php) 到 YOUR_DATASET_FOLDER。以 [2011_10_03_drive_0027_synced](https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_10_03_drive_0027/2011_10_03_drive_0027_sync.zip) 为例。
打开三个终端,分别运行 vins、global fusion 和 rviz。
绿色路径是 VIO 里程计;蓝色路径是 GPS 全局融合下的里程计。
```
roslaunch vins vins_rviz.launch
rosrun vins kitti_gps_test ~/catkin_ws/src/VINS-Fusion/config/kitti_raw/kitti_10_03_config.yaml YOUR_DATASET_FOLDER/2011_10_03_drive_0027_sync/
rosrun global_fusion global_fusion_node
```
## 5. 车载环境下的 VINS-Fusion 演示
下载 [car bag](https://drive.google.com/open?id=10t9H1u8pMGDOI6Q2w2uezEq5Ib-Z8tLz) 到 YOUR_DATASET_FOLDER。
打开四个终端,分别运行 vins 里程计、视觉回环(可选)、rviz 并播放 bag 文件。
绿色路径是 VIO 里程计;红色路径是视觉回环下的里程计。
```
roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/vi_car/vi_car.yaml
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/vi_car/vi_car.yaml
rosbag play YOUR_DATASET_FOLDER/car.bag
```
## 6. 使用您的设备运行
VIO 不仅仅是一种软件算法,它在很大程度上依赖于硬件质量。对于初学者,我们建议您使用专业设备运行 VIO,这些设备包含全局快门相机和硬件同步。
### 6.1 配置文件
为您的设备编写一个配置文件。您可以以 EuRoC 和 KITTI 的配置文件为例。
### 6.2 相机标定
VINS-Fusion 支持多种相机模型(pinhole、mei、equidistant)。您可以使用 [camera model](https://github.com/hengli/camodocal) 来标定您的相机。我们在 /camera_models/calibrationdata 下放置了一些示例数据,以向您展示如何进行标定。
```
cd ~/catkin_ws/src/VINS-Fusion/camera_models/camera_calib_example/
rosrun camera_models Calibrations -w 12 -h 8 -s 80 -i calibrationdata --camera-model pinhole
```
## 7. Docker 支持
为了进一步简化构建过程,我们在代码中添加了 docker。Docker 环境就像一个沙盒,从而使得我们的代码独立于环境。要使用 docker 运行,首先请确保您的机器上安装了 [ros](http://wiki.ros.org/ROS/Installation) 和 [docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/)。然后通过 `sudo usermod -aG docker $YOUR_USER_NAME` 将您的账户添加到 `docker` 组中。**如果遇到 `Permission denied` 错误,请重新打开终端或注销后重新登录**,输入:
```
cd ~/catkin_ws/src/VINS-Fusion/docker
make build
```
请注意,根据您的网络和机器性能,docker 构建过程可能需要一段时间。VINS-Fusion 成功构建后,您可以使用脚本 `run.sh` 运行 vins estimator。
脚本 `run.sh` 可以接受多个标志和参数。标志 `-k` 表示 KITTI,`-l` 表示回环融合,`-g` 表示全局融合。您可以通过 `./run.sh -h` 获取详细用法。以下是使用此脚本的一些示例:
```
# Euroc 单目相机 + IMU
./run.sh ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
# Euroc 双目相机 + IMU 与 loop fusion
./run.sh -l ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
# KITTI Odometry (双目)
./run.sh -k ~/catkin_ws/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yaml YOUR_DATASET_FOLDER/sequences/00/
# KITTI Odometry (双目) 与 loop fusion
./run.sh -kl ~/catkin_ws/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yaml YOUR_DATASET_FOLDER/sequences/00/
# KITTI GPS Fusion (双目 + GPS)
./run.sh -kg ~/catkin_ws/src/VINS-Fusion/config/kitti_raw/kitti_10_03_config.yaml YOUR_DATASET_FOLDER/2011_10_03_drive_0027_sync/
```
在 EuRoC 案例中,您需要打开另一个终端并播放您的 bag 文件。如果您需要修改代码,只需在修改后使用适当的参数重新运行 `./run.sh` 即可。
## 8. 致谢
我们使用 [ceres solver](http://ceres-solver.org/) 进行非线性优化,使用 [DBoW2](https://github.com/dorian3d/DBoW2) 进行回环检测,以及通用的 [camera model](https://github.com/hengli/camodocal) 和 [GeographicLib](https://geographiclib.sourceforge.io/)。
## 9. 许可证
源代码在 [GPLv3](http://www.gnu.org/licenses/) 许可证下发布。
我们仍在努力提高代码的可靠性。如有任何技术问题,请联系 Tong Qin 标签:C++, SLAM, 多传感器融合, 数据擦除, 无人机, 机器人, 状态估计, 自动驾驶, 视觉惯性里程计, 请求拦截