약 3년전에 실패했던 kitti dataset을 vins-mono에서 다시 돌려야 할 일이 생겨 오랜만에 그냥 다시 찾아보니 누군가가 vins-mono를 kitti dataset에 돌릴수있게 수정한 버전이 깃허브에 있어 3년만에 돌려볼수있게 되었다.
https://github.com/HKUST-Aerial-Robotics/VINS-Mono
GitHub - HKUST-Aerial-Robotics/VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator
A Robust and Versatile Monocular Visual-Inertial State Estimator - HKUST-Aerial-Robotics/VINS-Mono
github.com

기존 코드의 문제점
기존 vins-mono는 원래 공식적으로 kitti dataset을 지원해주지 않는다.

KITTI가 Vins-mono같은 VIO(Visual Inertial Odometry)기법에서 잘 돌아가지 않는 이유는 다음과 같다.
1. KITTI 데이터셋의 한계
Kitti dataset sync모드는 카메라와 IMU가 모두 10Hz로 취득되었다. 그러나 기존 VIO 알고리즘들은 100Hz IMU를 권장한다.
2. 동기화 문제
KITTI dataset은 unsync된 버전도 홈페이지에 있다. 이거는 IMU가 100Hz이긴 하나 카메라 데이터랑 동기화가 안되어있다. 기존 VIO는 동기화된 데이터가 꼭 필요해서 이것도 사용할수가 없다.
문제해결
기존의 VINS-mono가 잘 안되는 이유가 Vins-mono-kitti 깃허브를 발견하면서 알게되었는데, 여기서는 KITTI dataset에 맞게 여러 설정 파라미터들을 수정해 문제를 해결했다.






이 파일들로 코드를 돌리면 잘된다. 이런 사소한 파라미터들 하나하나가 VIO 성공에 큰 영향을 미치는듯.
1. KITTI dataset 다운로드
https://www.cvlibs.net/datasets/kitti/
The KITTI Vision Benchmark Suite
We thank Karlsruhe Institute of Technology (KIT) and Toyota Technological Institute at Chicago (TTI-C) for funding this project and Jan Cech (CTU) and Pablo Fernandez Alcantarilla (UoA) for providing initial results. We further thank our 3D object labeling
www.cvlibs.net
VIO는 sync 데이터가 필요하므로 kitti dataset 중 raw datam, sync 버전으로 다운받아야한다.

2. KITTI Dataset rosbag으로 변환
https://github.com/tomas789/kitti2bag
GitHub - tomas789/kitti2bag: Convert KITTI dataset to ROS bag file the easy way!
Convert KITTI dataset to ROS bag file the easy way! - tomas789/kitti2bag
github.com
그 다음에 rosbag 형태로 데이터를 돌려야하기 때문에 kitti2bag이라는 라이브러리를 사용해서 bag파일로 수정한다.
pip install kitti2bag
kitti2bag -t 2011_09_26 -r 0002 raw_synced .
이렇게 하면 bag 파일이 생성된다.

3. VINS-MONO-KITTI github clone 및 설치
https://github.com/LiXiaoQiang123z/vins-mono-kitti
GitHub - LiXiaoQiang123z/vins-mono-kitti: 适配kitti数据集
适配kitti数据集. Contribute to LiXiaoQiang123z/vins-mono-kitti development by creating an account on GitHub.
github.com
가장 중요한 vins-mono-kitti 깃허브. 기존 vins-mono 세팅이랑 동일한데, 이게 melodic이랑만 호환이 되어서 ubuntu 20.04 noetic인 나는 docker에서 설치했다.
docker 파일
# Dockerfile for Ubuntu 18.04 + ROS Melodic + VINS-Mono KITTI (OpenCV 3.2.0 호환)
# 1. 베이스 이미지
FROM ros:melodic-ros-base
# 2. 환경변수 설정
ENV DEBIAN_FRONTEND=noninteractive
SHELL ["/bin/bash", "-c"]
# 3. 필수 패키지 설치
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
cmake \
git \
wget \
python-rosdep \
python-rosinstall \
python-rosinstall-generator \
python-wstool \
python-catkin-tools \
python-opencv \
python-empy \
python-catkin-pkg \
python-yaml \
# ROS 핵심 패키지들
ros-melodic-tf \
ros-melodic-tf2 \
ros-melodic-tf2-ros \
ros-melodic-tf2-geometry-msgs \
ros-melodic-geometry-msgs \
ros-melodic-geometry2 \
ros-melodic-cv-bridge \
ros-melodic-image-transport \
ros-melodic-message-filters \
ros-melodic-roscpp \
ros-melodic-rospy \
ros-melodic-std-msgs \
ros-melodic-sensor-msgs \
ros-melodic-nav-msgs \
ros-melodic-visualization-msgs \
# VINS-Mono 관련 의존성
libeigen3-dev \
libgoogle-glog-dev \
libgflags-dev \
libatlas-base-dev \
libsuitesparse-dev \
&& rm -rf /var/lib/apt/lists/*
# 4. Ceres Solver 설치 (VINS-Mono 필수)
RUN cd /tmp && \
git clone https://github.com/ceres-solver/ceres-solver.git && \
cd ceres-solver && \
git checkout 1.14.0 && \
mkdir build && cd build && \
cmake .. -DCMAKE_BUILD_TYPE=Release && \
make -j$(nproc) && \
make install && \
cd / && rm -rf /tmp/ceres-solver
# 5. rosdep 초기화
RUN rosdep init || true \
&& rosdep update
# 6. 작업 디렉터리 생성
RUN mkdir -p /home/developer/catkin_ws/src
WORKDIR /home/developer/catkin_ws
# 7. VINS-Mono KITTI 어댑테이션 소스 클론 및 OpenCV 버전 수정
RUN git clone https://github.com/LiXiaoQiang123z/vins-mono-kitti.git src/vins-mono-kitti && \
# camera_model CMakeLists.txt의 OpenCV 버전 요구사항 완화
sed -i 's/find_package(OpenCV 3.4.5 REQUIRED)/find_package(OpenCV REQUIRED)/g' \
src/vins-mono-kitti/camera_model/CMakeLists.txt && \
# 다른 패키지의 OpenCV 버전 요구사항도 완화 (필요시)
find src/vins-mono-kitti -name "CMakeLists.txt" -exec \
sed -i 's/find_package(OpenCV [0-9]\+\.[0-9]\+\.[0-9]\+ REQUIRED)/find_package(OpenCV REQUIRED)/g' {} \;
# 8. 의존성 설치
RUN /bin/bash -lc "rosdep install --from-paths src --ignore-src -r -y"
# 9. catkin 워크스페이스 빌드
RUN /bin/bash -lc "source /opt/ros/melodic/setup.bash && catkin_make"
# 10. 환경 설정 파일 업데이트
RUN echo "source /opt/ros/melodic/setup.bash" >> /home/developer/.bashrc \
&& echo "source /home/developer/catkin_ws/devel/setup.bash" >> /home/developer/.bashrc
# 11. 출력 디렉터리 생성
RUN mkdir -p /home/developer/output
# 12. 컨테이너 시작 명령
ENTRYPOINT ["/bin/bash", "-lc", "source /home/developer/.bashrc && exec bash"]
4. VINS-MONO 돌리기
# 기본 실행 (터미널 접속)
sudo docker run -it --name vinsmono-test vinsmono-kitti
# GUI 지원과 데이터 볼륨 마운트
sudo docker run -it --name vinsmono-test \
--network host \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=$DISPLAY \
-v ~/kitti_data:/data \
vinsmono-kitti
# 컨테이너 접속 후
roslaunch vins_estimator kitti.launch #터미널1
rosbag play your_bag_name.bag #터미널2
roslaunch vins_estimator vins_rviz.launch #터미널3
rviz에서 trajectory가 찍히는것을 볼수있다.

결과 파일은 config 파일에 설정된 output_path로 저장된다.

이제 kitti dataset으로 openvins 같은것도 돌려봐야겠다.