Table of Contents

ROS 2: thermal camera in Foxglove

Display an AMG8833 8×8 thermal camera on one Axiom in Foxglove using the ready-made thermal layout. The host driver publishes a standard sensor_msgs/msg/Image topic containing temperatures in °C. foxglove_bridge makes the ROS topics available to the viewer over a WebSocket connection.

The data follows this path:

Axiom + AMG8833 → axiom_driver → thermal/image
    → foxglove_bridge → Foxglove Image panel

Before starting

Complete Install and connect. You need an Axiom with a supported AMG8833 profile, the camera attached, and a working USB or Wi-Fi connection. Use the host firmware for this walkthrough. The driver owns the connection to Axiom; the viewer subscribes to the ROS data.

This guide uses the example board namespace /axiom1, matching the supplied layout. It is a user-chosen name, not a hardware ID. You can keep a different namespace by substituting it in the service and topic names below and choosing its image topic in the imported panel. Replace /path/to/axiom-ros2 in the commands with your actual checkout path.

Use the setup-file path for your ROS installation in config/machine.env, as described in Install and connect. The installation example uses Ubuntu 24.04 and Jazzy; bridge installation below uses the distribution loaded by scripts/setup_env.sh.

You also need a Foxglove account with access to direct WebSocket connections and layout import/editing. Foxglove currently specifies a developer seat for direct connections and editing layouts; see its live connection and layout documentation for current availability.

Update and build the host driver

If a driver is running, stop acquisition, disconnect it and stop the driver before changing its configuration or rebuilding. For an existing checkout already on main with no local source changes, update and rebuild from the repository root. If you do not yet have a checkout, follow Install and connect first.

cd "/path/to/axiom-ros2"
git pull --ff-only origin main
source scripts/setup_env.sh
printf 'ROS distribution: %s\n' "$ROS_DISTRO"
rosdep install --from-paths src --ignore-src -r -y
colcon build --base-paths src --symlink-install
source scripts/setup_env.sh

Use a current checkout containing thermal/image support and examples/foxglove/one-axiom-thermal.json. The layout is JSON: once the updated driver is built, later layout-only changes need a pull and reimport, without rebuilding.

Configure the thermal alias

Edit config/boards.yaml. Use axiom1 as the key for the board carrying the camera. For this example, rename the earlier axiom key to axiom1, preserving its USB or Wi-Fi connection settings and keeping auto_connect, auto_reconnect and autosub false. Stop the old driver before changing the namespace. Alternatively, keep its name and use that namespace throughout this guide. Add thermal/image inside its existing topic_aliases mapping, keeping any other aliases:

axioms:
  axiom1:
    # Keep this board's existing USB or Wi-Fi settings here.
    topic_aliases:
      thermal/image: {type: AMG8833, source: thermal/image}

This is a configuration fragment, not a replacement for the full board entry. The alias names the camera's ROS output; it does not install a sensor profile. It binds when exactly one matching AMG8833 is online and its metadata is ready. If several cameras match, use the bus and address selectors described in Sensors and multiple boards.

Prepare the terminals with tmux

Use the shared helper for this walkthrough. After configuring the board and building, run from an outer terminal:

cd "/path/to/axiom-ros2"
sudo apt install tmux
bash scripts/ros_tmux.sh

New panes preload the machine settings, ROS installation and built workspace. Run the steps below in the panes with the matching Terminal labels:

Pane Foxglove walkthrough
Terminal 1 Selected board's host driver.
Terminal 2 Connect, request acquisition and inspect the image topic.
Terminal 3 Foxglove bridge.
Terminal 4 Optional rate checks or other ROS commands.

The Foxglove viewer opens in a browser or desktop app separately. Press Ctrl+b, release it, then an arrow to change panes. Ctrl+b then z zooms the selected pane. Ctrl+b then d detaches; rerun the helper to return. For copying output and further controls, see tmux setup and controls.

If you use separate terminal windows, or reuse existing panes after a rebuild, prepare each one:

cd "/path/to/axiom-ros2"
source scripts/setup_env.sh

All ROS processes must use the same domain and middleware settings.

Terminal 1: start the selected board

ros2 launch axiom_driver axiom_minimal_launch.py \
  namespace:=axiom1 boards_file:="$AXIOM_ROS_BOARDS_FILE"

Leave it running. This starts the driver for the selected board. If that driver is already running, use its session rather than opening a second connection to the same Axiom.

Terminal 2: connect and acquire

ros2 service call /axiom1/connect axiom_interfaces/srv/Connect '{device_uri: ""}'
ros2 service call /axiom1/publish_data_subscription \
  axiom_interfaces/srv/PublishedDataSubscription '{rate_hz: 20.0}'
ros2 topic list -t --no-daemon
ros2 topic info /axiom1/thermal/image

Both services should return success: true. The image topic should have type sensor_msgs/msg/Image and one publisher. Inspect a frame:

ros2 topic echo /axiom1/thermal/image --once --qos-reliability best_effort

Expect width: 8, height: 8, encoding: 32FC1, is_bigendian: 0 and step: 32. The data field contains 256 bytes representing 64 little-endian float32 temperatures in Celsius. The header carries the sample's timestamp and sensor frame. The existing thermal/grid topic remains available for the RViz walkthrough.

The requested 20 Hz is a firmware delivery rate. It does not change the camera's own sampling rate. Starting a ROS subscriber or connecting the viewer does not start firmware acquisition; the service call above does that.

Terminal 3: install and start the bridge

Install the bridge once for your loaded ROS distribution:

sudo apt install "ros-${ROS_DISTRO}-foxglove-bridge"
ros2 launch foxglove_bridge foxglove_bridge_launch.xml

Leave the bridge running. It exposes ROS topics to Foxglove on port 8765. The driver and bridge can serve multiple ROS consumers while Axiom has one host acquisition connection.

Connect the viewer

Open Foxglove in Chrome or the Foxglove desktop app on any supported viewer computer. The viewer can run on the ROS host or on another computer that can reach it. Sign in as required by the viewer.

1. From the Foxglove dashboard or left-hand menu, choose Open connection.

2. Select Foxglove WebSocket.

3. If the viewer runs on the same computer as foxglove_bridge, enter ws://localhost:8765.

4. If the viewer runs on another computer, enter ws://ROS_HOST_IP:8765, replacing ROS_HOST_IP with the reachable IP address of the computer running foxglove_bridge. This is the host computer's address, not Axiom's Wi-Fi address.

5. Select Open and check that the Axiom topics appear.

localhost always means the computer running the viewer. Allow the bridge's TCP port 8765 through the host firewall if connecting from another computer on your local network. Browser or operating-system local-network permission prompts may also need to be allowed.

The web viewer needs internet access to load and sign in. This direct WebSocket connection carries measurements between the bridge and viewer on your local machine or network. Desktop offline use depends on Foxglove's standalone licensing. RViz provides a local alternative for the thermal display.

Import the single-camera layout

1. Click the layout name and dropdown arrow in the viewer's top toolbar to open Layouts.

2. Choose Import from file….

3. Select examples/foxglove/one-axiom-thermal.json from the checkout on the computer running the viewer.

4. Open the newly imported layout and save it as Axiom: thermal camera.

If the viewer runs on another computer, the JSON file must be on that computer. Download the layout JSON there, or copy it from the checkout before importing.

The layout contains one Image panel, titled Axiom 1: Thermal (°C), subscribed to /axiom1/thermal/image. Its Turbo colour map and fixed 15–40 °C scale are already set. Low temperatures are blue and high temperatures red. Values outside the display range clip to the end colours; the original temperature measurements remain available in the ROS message.

Move your hand in front of the camera. Warmer areas should change colour across the 8×8 grid. The image preserves the sensor's pixel order. Adjust the panel's rotation or flip controls if your camera mounting requires it; enlarging the display does not add measured pixels.

If your existing board namespace differs from axiom1, use its service names and select its thermal/image topic in the panel settings. The supplied layout requires no TF tree or camera calibration for this 2D heatmap. A spatial 3D projection would need a separate calibration and frame contract.

Replacing the JSON file on disk does not update a saved Foxglove layout. After pulling a layout update, import the file again and open the new layout.

If the image is empty

Symptom Check
Connected viewer, no Axiom topics Confirm the host driver is running and acquisition was started. Check that the bridge uses the same ROS domain and middleware as the driver.
Viewer cannot connect Keep Terminal 3 running. Use the bridge host's IP from another computer, and localhost only on that host. Check port 8765, local-network permissions and the viewer's direct-connection entitlement.
thermal/image has no publisher Inspect the board's devices inventory and check that the camera is online. Verify the alias, advertised type and namespace.
Identity topic exists but alias is missing Run ros2 topic list -t --no-daemon and look for a topic ending in /thermal/image. The alias may match several cameras; select one by bus/address or use its identity-based topic in the panel.
thermal/grid exists but no image topic exists Pull and rebuild the current host driver, source the workspace and restart the driver. Standard Image output requires the updated adapter and known Celsius units.
Wrong or extra panels Import one-axiom-thermal.json and select the newly imported layout.
Mostly one colour Check the temperatures and the 15–40 °C colour limits. Adjust Value min and Value max in the Image panel if needed.
Bridge package unavailable Check that ROS's package repositories are configured for the loaded distribution. See the official bridge installation guide for supported packages and source-build options.

To inspect the camera inventory in Terminal 2:

ros2 topic echo /axiom1/devices --once --qos-durability transient_local

Clean up

Stop the bridge with Ctrl+C in Terminal 3. In Terminal 2:

ros2 service call /axiom1/publish_data_subscription \
  axiom_interfaces/srv/PublishedDataSubscription '{rate_hz: 0.0}'
ros2 service call /axiom1/disconnect axiom_interfaces/srv/Disconnect '{}'

Then stop the driver with Ctrl+C in Terminal 1.

Reference

Repository Foxglove guide and layouts

Foxglove ROS 2 bridge setup

Foxglove Image panel

Layout import and export

Back to Axiom with ROS 2.