README.md
December 6, 2024 · View on GitHub
This repo contains the implementation of ORB-SLAM3 ROS Wrapper.
Installation
See chapter ORB-SLAM3-ROS below to get information how to setup repository.
ORB-SLAM3-ROS
A ROS implementation of ORB-SLAM3 V1.0 that focuses on the ROS part.
This package uses catkin build. Tested on Ubuntu 20.04.
1. Prerequisites
Eigen3
sudo apt install libeigen3-dev
Pangolin
cd ~
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build && cd build
cmake ..
make
sudo make install
OpenCV
Check the OpenCV version on your computer (required at least 3.0):
python3 -c "import cv2; print(cv2.__version__)"
On a freshly installed Ubuntu 20.04.4 LTS with desktop image, OpenCV 4.2.0 is already included. If a newer version is required (>= 3.0), follow installation instruction and change the corresponding OpenCV version in CMakeLists.txt
(Optional) hector-trajectory-server
Install hector-trajectory-server to visualize the real-time trajectory of the camera/imu. Note that this real-time trajectory might not be the same as the keyframes' trajectory.
sudo apt install ros-[DISTRO]-hector-trajectory-server
2. Installation
cd ~/catkin_ws/src
git clone https://github.com/thien94/orb_slam3_ros.git
cd ../
catkin build
3. Run Examples
Mono mode with NTU VIRAL's eee_01.bag:
# In one terminal:
roslaunch orb_slam3_ros ntuviral_mono.launch
# In another terminal:
rosbag play eee_01.bag -s 50 # The UAV starts moving at t~50s
Stereo mode with KITTI's 2011_09_26:
- First, download KITTI dataset and convert the raw data into bag file following this instruction. You can automate the downloading process using this script.
- Run the example:
# In one terminal:
roslaunch orb_slam3_ros kitti_stereo.launch
# In another terminal:
rosbag play kitti_2011_09_26_drive_0002_synced.bag
Mono-inertial mode with EuRoC's MH_01_easy.bag:
# In one terminal:
roslaunch orb_slam3_ros euroc_mono_inertial.launch
# In another terminal:
rosbag play MH_01_easy.bag
Stereo-inertial mode with TUM-VI's dataset-corridor1_512_16.bag
# In one terminal:
roslaunch orb_slam3_ros tum_vi_stereo_inertial.launch
# In another terminal:
rosbag play dataset-corridor1_512_16.bag
RGB-D mode with TUM's rgbd_dataset_freiburg1_xyz.bag
# In one terminal:
roslaunch orb_slam3_ros tum_rgbd.launch
# In another terminal:
rosbag play rgbd_dataset_freiburg1_xyz.bag
- Note: change
TUMX.yamltoTUM1.yaml,TUM2.yamlorTUM3.yamlfor freiburg1, freiburg2 and freiburg3 sequences respectively.
RGB-D-Inertial mode with VINS-RGBD's Normal.bag
- Download the bag files, for example Normal.bag.
- Decompress the bag, run
rosbag decompress Normal.bag. - Change the calibration params in
RealSense_D435i.yamlif necessary.
# In one terminal:
roslaunch orb_slam3_ros rs_d435i_rgbd_inertial.launch.launch
# In another terminal:
rosbag play Normal.bag
Live stereo-inertial mode with Realsense T265
- Modify the original
rs_t265.launchto enable fisheye images and imu data (changeunite_imu_methodtolinear_interpolation). - Run
rs-enumerate-devices -cto get the calibration parameters and modifyconfig/Stereo-Inertial/RealSense_T265.yamlaccordingly. A detailed explaination can be found here. - Run:
# In one terminal:
roslaunch realsense2_camera rs_t265.launch
# In another terminal:
roslaunch orb_slam3_ros rs_t265_stereo_inertial.launch
Save and load map
The map file will have .osa extension, and is located in the ROS_HOME folder (~/.ros/ by default).
Load map:
- Set the name of the map file to be loaded with
System.LoadAtlasFromFileparam in the settings file (.yaml). - If the map file is not available,
System.LoadAtlasFromFileparam should be commented out otherwise there will be error.
Save map:
- Option 1: If
System.SaveAtlasToFileis set in the settings file, the map file will be automatically saved when you kill the ros node. - Option 2: You can also call the following ros service at the end of the session
rosservice call /orb_slam3/save_map [file_name]
4. ROS topics, params and services
Subscribed topics
/camera/image_rawfor Mono(-Inertial) node/camera/left/image_rawfor Stereo(-Inertial) node/camera/right/image_rawfor Stereo(-Inertial) node/imufor Mono/Stereo/RGBD-Inertial node/camera/rgb/image_rawand/camera/depth_registered/image_rawfor RGBD node
Published topics
/orb_slam3/camera_pose, left camera pose in world frame, published at camera rate/orb_slam3/body_odom, imu-body odometry in world frame, published at camera rate/orb_slam3/tracking_image, processed image from the left camera with key points and status text/orb_slam3/tracked_points, all key points contained in the sliding window/orb_slam3/all_points, all key points in the map/orb_slam3/kf_markers, markers for all keyframes' positions/tf, with camera and imu-body poses in world frame
Params
voc_file: path to vocabulary file required by ORB-SLAM3settings_file: path to settings file required by ORB-SLAM3enable_pangolin: enable/disable ORB-SLAM3's Pangolin viewer and interface. (trueby default)
Services
rosservice call /orb_slam3/save_map [file_name]: save the map as[file_name].osainROS_HOMEfolder.rosservice call /orb_slam3/save_traj [file_name]: save the estimated trajectory of camera and keyframes as[file_name]_cam_traj.txtand[file_name]_kf_traj.txtinROS_HOMEfolder.
Docker
Provided Dockerfile sets up an image based a ROS noetic environment including RealSense SDK
To access a USB device (such as RealSense camera) inside docker container use:
docker run --network host --privileged -v /dev:/dev -it [image_name]
NOTE:
--network hostis recommended to listen to rostopics outside the container
To-do:
Publish basic topics (camera pose, tracking image and point cloud)Publish more topics (odom, full map pointcloud, keyframe, etc.)Add other functions as services (map save/load, save estimated trajectory, etc.)Add docker support
Usage
Commands to launch application and services to save generated trajectory as well as map.
Launch
roslaunch orb_slam3_ros <launch_file> \
do_bag:=<do_bag> bag:=<bag> bag_start:=<bag_start> bag_rate:=<bag_rate> \
do_save_traj:=<do_save_traj> traj_file_name:=<traj_file_name> \
do_save_map:=<do_save_map> map_file_name:=<map_file_name>
Parameter
launch_file: specifies launch file following the formatrover_<mode>_<cam>.launchmode∈ ["mono", "mono_inertial", "rgbd", "rgbd_inertial", "stereo", "stereo_inertial"]: specifies sensors to use.cam∈ ["d435i", "t265", "pi_cam_02"]: specifies camera.do_bag∈ ["true", "false"], OPTIONAL: specifies to replay a bag.bag, OPTIONAL: specifies path to rosbag.bag_start, OPTIONAL: specifies where to start rosbag from [s]bag_rate, OPTIONAL: specifies rate [hz] to replay rosbag.do_save_traj∈ ["true", "false"], OPTIONAL: specifies to save a predicted trajectory.traj_file_name, OPTIONAL: specifies file name of trajectory.do_save_map∈ ["true", "false"], OPTIONAL: specifies to save a generated map.map_file_name, OPTIONAL: specifies file name of map.