---json {"name": "Thermal camera in Foxglove"} --- ====== 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 [[:axiom:ros2:getting_started|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 [[:axiom:ros2:getting_started|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 [[https://docs.foxglove.dev/docs/visualization/connecting/live|live connection]] and [[https://docs.foxglove.dev/docs/visualization/layouts|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 [[:axiom:ros2:getting_started|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 [[:axiom:ros2:sensors_and_boards|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 [[:axiom:ros2:getting_started#use_tmux_for_the_ros_consoles|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 [[:axiom:ros2:thermal_camera|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 [[https://app.foxglove.dev|Foxglove in Chrome]] or the [[https://foxglove.dev/download|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 [[https://docs.foxglove.dev/docs/standalone-license|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 [[https://raw.githubusercontent.com/robotical/axiom-ros2/main/examples/foxglove/one-axiom-thermal.json|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 [[https://docs.foxglove.dev/docs/getting-started/frameworks/ros2|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 ===== [[https://github.com/robotical/axiom-ros2/blob/main/examples/foxglove/README.md|Repository Foxglove guide and layouts]] [[https://docs.foxglove.dev/docs/getting-started/frameworks/ros2|Foxglove ROS 2 bridge setup]] [[https://docs.foxglove.dev/docs/visualization/panels/image|Foxglove Image panel]] [[https://docs.foxglove.dev/docs/visualization/layouts|Layout import and export]] Back to [[:axiom:ros2:start|Axiom with ROS 2]].