위 블로그는 Ubuntu 18.04 / OpenCV 3.2 / Python 2.7 기준이라 24.04에서는 그대로 따라하면 안 됩니다.
libpython2.7-dev,OpenCV 3.2 다운그레이드,Pangolin v0.5 고정모두 무시합니다.
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
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
Windows PowerShell (관리자):
usbipd list
usbipd bind --busid <BUSID>
usbipd attach --wsl --busid <BUSID>
WSL2에서 확인:
rs-enumerate-devices | head -5
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
cd ~/ros2_ws/src
git clone <https://github.com/UZ-SLAMLab/ORB_SLAM3.git>
cd ORB_SLAM3
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
기본 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는 카메라 개체마다 다르니 반드시 본인 카메라 값으로!
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)
# 카메라 점유 프로세스 확인 (있으면 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 지도가 만들어집니다.
rs2::error: Couldn't resolve requests
→ IMU 스트림 주석 처리 안 함 (6단계) 또는 카메라 점유 중
xioctl(VIDIOC_S_FMT) failed, errno=16
→ fuser /dev/video*로 점유 프로세스 찾아서 kill
→ echo $DISPLAY가 :0인지 확인. WSLg 필요.
QObject::killTimer: Timers cannot be stopped from another thread
Segmentation fault
→ 정상. ORB-SLAM3 알려진 이슈. CameraTrajectory.txt는 정상 저장됨.
