WSL2(24.04) ORB-SLAM3 + RealSense D455 실행하기

김인곤·2026년 3월 11일

ROS

목록 보기
5/5

환경

  • OS: WSL2 + Ubuntu 24.04 LTS
  • GCC: 13.3.0
  • CMake: 3.28
  • OpenCV: 4.6.0
  • Python: 3.12
  • 카메라: Intel RealSense D455

참고 링크

위 블로그는 Ubuntu 18.04 / OpenCV 3.2 / Python 2.7 기준이라 24.04에서는 그대로 따라하면 안 됩니다.
libpython2.7-dev, OpenCV 3.2 다운그레이드, Pangolin v0.5 고정 모두 무시합니다.


1. 필수 패키지 설치

sudo apt update
sudo apt install -y \\
  build-essential cmake git pkg-config \\
  libeigen3-dev libboost-all-dev \\
  libopencv-dev \\
  libglew-dev libpython3-dev \\
  libssl-dev libsuitesparse-dev \\
  libgl1-mesa-dev libegl1-mesa-dev \\
  libwayland-dev libxkbcommon-dev wayland-protocols \\
  libjpeg-dev libpng-dev libtiff-dev

2. librealsense SDK 설치

cd ~/ros2_ws/src
git clone <https://github.com/IntelRealSense/librealsense.git>
cd librealsense
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_EXAMPLES=true
make -j$(nproc)
sudo make install
sudo ldconfig

ROS2 Jazzy 쓰는 경우 아래도 가능:

sudo apt install ros-jazzy-librealsense2

WSL2 USB 카메라 연결

Windows PowerShell (관리자):

usbipd list
usbipd bind --busid <BUSID>
usbipd attach --wsl --busid <BUSID>

WSL2에서 확인:

rs-enumerate-devices | head -5

3. Pangolin 빌드

cd ~/ros2_ws/src
git clone <https://github.com/stevenlovegrove/Pangolin.git>
cd Pangolin
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
sudo make install
sudo ldconfig

4. ORB-SLAM3 빌드

cd ~/ros2_ws/src
git clone <https://github.com/UZ-SLAMLab/ORB_SLAM3.git>
cd ORB_SLAM3

C++11 → C++14 패치 (GCC 13 필수)

sed -i 's/-std=c++11/-std=c++14/g' CMakeLists.txt
sed -i 's/-std=c++11/-std=c++14/g' Thirdparty/DBoW2/CMakeLists.txt
sed -i 's/-std=c++11/-std=c++14/g' Thirdparty/g2o/CMakeLists.txt

빌드

chmod +x build.sh
./build.sh

빌드 확인

ls lib/libORB_SLAM3.so
ls Examples/RGB-D/rgbd_realsense_D435i

5. D455 카메라 캘리브레이션 설정

기본 yaml은 D435i 기준이라 D455 실제값으로 바꿔야 합니다.

intrinsic 확인:

rs-enumerate-devices -c 2>&1 | grep -A 20 "Color"

Examples/RGB-D/RealSense_D435i.yaml 수정:

%YAML:1.0

File.version: "1.0"
Camera.type: "PinHole"

# D455 intrinsics (rs-enumerate-devices로 확인한 값)
Camera1.fx: 387.195
Camera1.fy: 386.644
Camera1.cx: 327.3
Camera1.cy: 240.311

Camera1.k1: -0.0543549
Camera1.k2: 0.0654697
Camera1.p1: -0.000211961
Camera1.p2: 0.000824876

Camera.width: 640
Camera.height: 480
Camera.fps: 30
Camera.RGB: 1

Stereo.ThDepth: 40.0
Stereo.b: 0.095

RGBD.DepthMapFactor: 1000.0

ORBextractor.nFeatures: 1250
ORBextractor.scaleFactor: 1.2
ORBextractor.nLevels: 8
ORBextractor.iniThFAST: 20
ORBextractor.minThFAST: 7

Viewer.KeyFrameSize: 0.05
Viewer.KeyFrameLineWidth: 1.0
Viewer.GraphLineWidth: 0.9
Viewer.PointSize: 2.0
Viewer.CameraSize: 0.08
Viewer.CameraLineWidth: 3.0
Viewer.ViewpointX: 0.0
Viewer.ViewpointY: -0.7
Viewer.ViewpointZ: -3.5
Viewer.ViewpointF: 500.0

D435이면 Stereo.b: 0.05, D455면 Stereo.b: 0.095
fx/fy/cx/cy는 카메라 개체마다 다르니 반드시 본인 카메라 값으로!


6. 소스코드 수정 (IMU 없이 실행)

Examples/RGB-D/rgbd_realsense_D435i.cc 178~180번째 줄의 IMU 스트림 주석 처리:

// cfg.enable_stream(RS2_STREAM_ACCEL, RS2_FORMAT_MOTION_XYZ32F);
// cfg.enable_stream(RS2_STREAM_GYRO, RS2_FORMAT_MOTION_XYZ32F);

D455는 IMU가 있어서 주석 해제하면 IMU도 쓸 수 있습니다.
D435는 IMU가 없으므로 반드시 주석 처리해야 합니다.

재빌드:

cd ~/ros2_ws/src/ORB_SLAM3/build
make -j$(nproc)

7. 실행

# 카메라 점유 프로세스 확인 (있으면 kill)
fuser /dev/video* 2>/dev/null

# 실행
cd ~/ros2_ws/src/ORB_SLAM3
./Examples/RGB-D/rgbd_realsense_D435i Vocabulary/ORBvoc.txt Examples/RGB-D/RealSense_D435i.yaml

Pangolin 창이 2개 뜹니다:

  • 위: 3D 맵 (포인트 클라우드 + 키프레임)
  • 아래: 현재 프레임 + 특징점 (초록=추적 성공, 빨간=실패)

카메라를 방 안에서 천천히 움직이면 3D 지도가 만들어집니다.


트러블슈팅

Couldn't resolve requests

rs2::error: Couldn't resolve requests

→ IMU 스트림 주석 처리 안 함 (6단계) 또는 카메라 점유 중

Device or resource busy

xioctl(VIDIOC_S_FMT) failed, errno=16

fuser /dev/video*로 점유 프로세스 찾아서 kill

Pangolin 창 안 뜸

echo $DISPLAY:0인지 확인. WSLg 필요.

종료 시 Segfault

QObject::killTimer: Timers cannot be stopped from another thread
Segmentation fault

→ 정상. ORB-SLAM3 알려진 이슈. CameraTrajectory.txt는 정상 저장됨.

0개의 댓글