ThermoSLAM is a research project for Stereo Thermal Visual SLAM aimed at robust metric mapping in degraded visual environments (e.g., low light, smoke, fog, and texture-poor scenes).
The pipeline uses stereo thermal imagery to estimate odometry, generate dense depth, synchronize outputs, and build a final map using OctoMap.
Build a practical thermal-first SLAM stack that:
- Works when RGB cameras degrade or fail
- Produces metric mapping outputs
- Combines learned odometry and dense stereo depth into a unified map
The current ThermoSLAM mapping stack is composed of the following building blocks:
-
Visual Odometry
- Repository:
tartandriver-MAC-VO-ROS2 - Purpose: produces thermal stereo visual odometry.
- Repository:
-
Dense Stereo Depth
- Repository:
foundation_stereo_ros - Purpose: produces dense depth from stereo thermal inputs.
- Repository:
-
Depth/Odometry Synchronization + Transform Matching
- Code:
disparity_odom_sync_postprocess - Purpose: synchronizes depth and odometry messages and aligns transforms before mapping.
- Code:
-
Final Mapping
- Mapper: Octomap Server 2
- Purpose: fuses synchronized depth + pose information into final 3D occupancy mapping.
Stereo Thermal Input -> VO (pose) + Dense Depth -> Sync/Postprocess -> Octomap Server 2 -> Final Map
- Ubuntu + ROS 2 installed (currently assumed: ROS 2 Humble)
- A ROS 2 workspace (example:
~/thermoslam_ws) - Dependencies cloned and available in
src/
git clone --recurse-submodules https://github.com/swastikmhptr/ThermoSLAM.git
cd ThermoSLAM/thermoslam_ws
source /opt/ros/humble/setup.bash
rosdep update
rosdep install --from-paths src --ignore-src -r -y
colcon build --symlink-install
source install/setup.bashUse separate terminals and source your workspace in each:
source /opt/ros/humble/setup.bash
source ~/ThermoSLAM/thermoslam_ws/install/setup.bashTerminal A - Thermal Stereo Visual Odometry
ros2 launch tartandriver_mac_vo_ros2 vo_thermal_stereo.launch.pyTerminal B - Dense Stereo Depth
ros2 launch foundation_stereo_ros thermal_stereo_depth.launch.pyTerminal C - Depth/Odom Sync + Transform Postprocess
ros2 run disparity_odom_sync_postprocess sync_node \
--ros-args \
-p depth_topic:=/foundation/depth/image \
-p odom_topic:=/tartan/vo/odom \
-p output_cloud_topic:=/thermoslam/depth_registered \
-p output_pose_topic:=/thermoslam/pose_syncedTerminal D - Octomap Mapping
ros2 launch octomap_server2 octomap_mapping.launch.py \
pointcloud_topic:=/thermoslam/depth_registered \
frame_id:=mapExpected primary interfaces:
- Thermal stereo images:
/thermal/left/image_rect/thermal/right/image_rect
- VO output:
/tartan/vo/odom(nav_msgs/msg/Odometry)
- Dense depth output:
/foundation/depth/image(sensor_msgs/msg/Image)
- Postprocess synchronized output:
/thermoslam/depth_registered(sensor_msgs/msg/PointCloud2)/thermoslam/pose_synced(geometry_msgs/msg/PoseStampedornav_msgs/msg/Odometry)
- Mapping output:
/octomap_full//octomap_binary(fromoctomap_server2)
# Check active topics
ros2 topic list
# Check message rates (examples)
ros2 topic hz /tartan/vo/odom
ros2 topic hz /foundation/depth/image
ros2 topic hz /thermoslam/depth_registered
# Inspect frames
ros2 run tf2_tools view_framesIf mapping is live, you should see:
- stable odometry updates
- synchronized depth/pose stream
- growing OctoMap occupancy output
# Example placeholder baseline launch
ros2 launch isaac_ros_nvblox nvblox_rgbd.launch.py \
color_topic:=/camera/color/image_raw \
depth_topic:=/camera/depth/image_rect_raw \
camera_info_topic:=/camera/color/camera_info \
global_frame:=mapCompare ThermoSLAM vs baseline on:
- map completeness
- map consistency
- Average Chamfer Distance
- robustness in degraded visual conditions
- runtime throughput
To establish a baseline, we use:
- NVIDIA Isaac ROS NVBlox
- Input modality: RGB-D
- Goal: compare baseline RGB-D mapping quality/performance against ThermoSLAM thermal-stereo mapping.
This baseline is useful for:
- Quantitative map quality comparisons
- Runtime and robustness comparisons in degraded visual conditions
- Ablation and benchmarking against a known modern mapping stack
Our test dataset is TartanRGBT:
- Hugging Face: theairlabcmu/TartanRGBT
- Size: approximately 79 GB
- Modalities include synchronized RGB, thermal, and depth archives
Install the Hugging Face client:
pip install huggingface_hubThe dataset provides a helper extraction script (data_extraction.py) in the dataset repository card instructions.
General usage:
python data_extraction.py <base_dir> [--delete_zips yes|no]Where:
<base_dir>is whereTartanRGBT_dataset/will be created--delete_zipscontrols whether zip files are deleted after extraction (noby default)
After extraction, data is organized by day -> trajectory -> modality:
TartanRGBT_dataset/
├── day1/
│ └── <trajectory_name>/
│ ├── thermal_left_rect_8/
│ ├── thermal_right_rect_8/
│ ├── thermal_right_rect_16/
│ ├── thermal_right_left_16/
│ ├── zed_left_rect/
│ ├── zed_right_rect/
│ ├── RGB_aligned_with_thermal/
│ └── stereo_depth/
├── day2/
├── day3/
├── day4/
└── day5/
For ThermoSLAM experiments, the key inputs are typically:
thermal_left_rect_8/thermal_right_rect_8(or 16-bit thermal variants)stereo_depth(for cross-checking or baseline references)RGB_aligned_with_thermal(mainly for baseline and comparison studies)
This project relies on external repositories/modules:
tartandriver-MAC-VO-ROS2(thermal stereo VO)foundation_stereo_ros(dense stereo depth)disparity_odom_sync_postprocess(message sync + transform alignment)octomap_server2(final map generation)isaac_ros_nvblox(RGB-D baseline mapping)