Skip to main content
The Dark Art of Postmortem DebuggingRead
Robot recordings
Robot recordings

The recording shows when. It never shows why.

Camera and lidar are most of the file and none of the answer. logcat.ai reads the channel inventory from the recording's own index and decodes the two channels that explain a run. It can tell a node that stopped from a topic nobody wrote to.

run_0000-00-00_synthetic.mcap
13 ch · 11:00
/arm/cmd went quiet, 06:42.180
/rosout
/diagnostics
/camera/image_raw
/points
/scan
/imu/data
/tf
/odom
/joint_states
/cmd_vel
/arm/cmd
/gripper/cmd
/battery_state
00:0005:3011:00

A recording shows exactly when a channel went quiet, and never why: that is usually in a log the robot wrote somewhere else.

Illustrative. Synthetic data.
Robot recordings / ROS bag analyzer
Robot recordings

The recording shows when. It never shows why.

Camera and lidar are most of the file and none of the answer. logcat.ai reads the channel inventory from the recording's own index and decodes the two channels that explain a run. It can tell a node that stopped from a topic nobody wrote to.

run_0000-00-00_synthetic.mcap
13 channels · 535,942 msgs · 11:00 · bright rows decoded · health not OK from 06:25
/arm/cmd went quiet at 06:42.180, eleven channels kept going
/rosout2,318
/diagnostics660
/camera/image_raw19,800
/points6,600
/scan6,600
/imu/data132,000
/tf264,000
/odom33,000
/joint_states66,000
/cmd_vel3,290
/arm/cmd1,608 · went quiet
/gripper/cmd0 · never published
/battery_state66
00:0001:0002:0003:0004:0005:0006:0007:0008:0009:0011:00

A recording shows exactly when a channel went quiet, and never why: that is usually in a log the robot wrote somewhere else.

Illustrative. Synthetic data.
Deep Research · one recording, one question

One recording, one question.

The recording is asked directly. The investigation reads the health reports in order, finds the moment a channel went quiet, checks that it was quiet rather than never used, and says plainly when the cause is not in the file.

Question

The arm stopped responding about seven minutes in. What does the recording show leading up to it?

Recordingrun_0000-00-00_synthetic.mcap
Channels13 · 535,942 messages
Window11 min 00 s · absolute
Decodedlog + health · sensor payload untouched
Illustrative investigation.
Synthetic recording, not a customer run.
06:20 to 07:00 · three of thirteen channelshealth not OK from 06:25.0 · /arm/cmd quiet from 06:42.180
/diagnostics
/rosout
/arm/cmd
06:2006:25.0 degraded06:42.180 quiet07:00
Investigation · 7 of 12 steps shownconfidence · outcome
01Read the channel inventoryhigh13 channels, 1 of them carried nothing
02Which components reported a problem?high2 of 9 left OK, arm controller first
03Order the not-OK health reportshigharm controller degraded at 06:25.0
04Read the log stream around 06:25highcontrol loop overrun, repeating
05Did the command channel go quiet?highlast message 06:42.180, then silence
06Silent, or never used?high1,608 messages before it stopped
07Anything in the recording that explains the overrun?medno, the cause is outside the middleware
Answer

The arm controller missed its control deadline and took itself out.

The arm controller went from OK to degraded at 06:25.0 and to critical at 06:42.0, and its own health message names a control loop overrun. The log stream shows that overrun repeating for seventeen seconds before the controller stopped publishing on its command channel, which had carried 1,608 messages up to that point. That channel is silent for the rest of the run rather than absent, which is a different fact and is reported as one. Nothing in the recording says why the loop overran, so the next file to read is the kernel log from the same window.

What to do nextGive the control loop its own budget or its own core, then re-record the same motion.Upload the robot's kernel log for this window: the recording has the stall, not the reason.
Findings
criticalArm controller: OK to degraded at 06:25.0, critical at 06:42.0
criticalCommand channel silent from 06:42.180 to the end of the run
warnControl loop overrun repeats 41 times in 17 s
info1 channel is in the inventory and carried no messages at all
noteSensor channels inventoried, not decoded: no payload was read
arm controller · missed control deadline · cause outside the recording
Three formats, one reading

All three recording formats.

You don't have to tell us which one you have. Recognition is by content, not by file name: the same channels come out of all three, read the same way.

Classic bagsingle file · .bag

The original single-file recording. Upload it directly, exactly as it came off the robot.

MCAP containercontainer · .mcap

The container newer ROS 2 systems record to by default. Read the same way as the other two.

Database-backed ROS 2database file · .db3

The other ROS 2 storage backend, where the recording is a database file rather than a stream.

No export step

There's no export step, no conversion, and nothing to declare in the upload. If your robot wrote it, we read it.

Illustrative. Synthetic data. The same five channels drawn beside each format.
Two channels, in depth

What gets read, and what deliberately doesn't.

Two channels are decoded in depth. Everything else is inventoried and left alone, on purpose.

01The channel inventory

Every channel, the message type it declared, how many messages it carried, and the window it covers, read from the recording's own index. A channel that carried nothing is kept rather than dropped, because it's usually the interesting one.

13 channels · types · counts · windows · read in full
02Component health

Each reporting component's worst state across the run, what it said at the time, and every report that wasn't OK in the order the robot made them. This is the machine's own account of itself.

/diagnostics · worst state: critical · not OK from 06:25.0
03The log stream, promoted

The robot's log messages are pulled out into their own searchable log beside the recording. It opens in the log viewer and answers questions the way any other log does.

/rosout · 2,318 messages · opens as its own log
04Sensor payload, left alone

Camera frames, lidar returns and point clouds are inventoried and never decoded. In a recording carrying them that's almost the whole file, and skipping it is what makes a very large recording quick to analyze.

/camera/image_raw · /points · /tf · inventoried, never decoded
Illustrative. Synthetic data.
Coverage

Every answer says what it was drawn from.

Three things are read: the channel inventory, the robot's log stream, and its component health reports. Each one reports its own state, every time, so you're never left reading an empty result and guessing which kind of empty it is.

Read in full

It was decoded and the answer draws on its contents.

Read in part
42% not decoded · stated

Some of it was decoded, and the answer says how much.

Not read
present · could not be decoded

It is there and could not be decoded, which is stated rather than shown as a zero.

Not present
no channel · nothing to draw

This recording does not carry it, which is a different fact from an empty one.

The one that matters

A channel nobody could decode and a channel the robot published nothing on look identical if you only count messages, and only the second one means the robot was quiet.

Why it is hard

Why a recording is hard to get an answer out of.

The file is enormous, the interesting part is tiny, and the usual way of reading it is to watch it go past.

01Size

A few minutes of a camera and a lidar is gigabytes. The part that explains the run is a rounding error inside it, and most tools insist on reading the rest first.

gigabytes of payloadthe part that explains the run
02Replay isn't reading

Playing a run back at wall-clock speed to watch for the moment it went wrong is waiting, not analysis. Eleven minutes of run costs eleven minutes of your attention, and you get one look.

00:0011:0006:42eleven minutes of watching, one look
03Silence looks like absence

A node that stopped publishing and a topic nobody ever wrote to both count zero messages. Telling them apart is the difference between a fault and a non-event.

/arm/cmd · 0 after 06:42 · stopped/gripper/cmd · 0 · never used
04The cause is often somewhere else

A node stops publishing and the reason is in the kernel log, or in memory pressure, or on a bus. The recording shows the symptom and stops there.

recording: the symptomthe reason: somewhere else
Illustrative. Synthetic data.
What you get back

A dashboard, a searchable log, and two ways to ask.

01A dashboard

What the recording is, component health, the reports that weren't OK, what was read, and how the messages divided across channels. It renders from the recording's own metadata, so nothing on it is guessed.

13 channels · 9 components · 2 not OK · 3 things read
02Quick Search

Ask the recording a question in plain English and get an answer from it in seconds, cited to the channels it came from.

seconds · cited to /diagnostics, /rosout
03Deep Research

A multi-round investigation that queries the recording, follows what it finds, and reports what it couldn't read as clearly as what it could.

12 rounds · reports what it could not read
04
Delta

Put a recording next to another run, or next to the robot's kernel log, on one timeline. Recordings carry absolute timestamps, which makes them a good anchor for a log whose timezone was never written down.

two files · one timeline · the cause beside the symptom
run_0000-00-00_synthetic.mcap · absolute time06:00 to 07:00
/diagnostics
/rosout
/arm/cmd
kernel log · dmesg · timezone never written, anchored to the recordingDelta
kernel
06:0006:18.4 kernel burst, 6.6 s before the arm degraded06:42.180 quiet07:00Illustrative. Synthetic data. The kernel lane is invented to show the alignment, not a diagnosis.
Recording

Record it however you already do.

Nothing here needs a special capture mode. Upload whatever your robot already writes.

ROS 1rosbag record -a
ROS 2, default storageros2 bag record -a
ROS 2, MCAPros2 bag record -a -s mcap
Worth recording

A recording that includes the robot's log channel and its health channel gives you the most, because those are the two read in depth. Recording them costs almost nothing next to sensor data.

On your account

What you need on your account.

Robot recording analysis needs robotics log analysis on your account. Without it a recording still uploads and is still recognised for what it is, and the analysis step is skipped. Emailsales@logcat.aiif you need it enabled.

Common questions

Questions about robot recordings.

What gets read, what doesn't, and what it takes to get an answer.

01Which ROS recording formats can I upload?

All three, and you don't have to say which one you have. The classic single-file bag, the MCAP container that newer ROS 2 systems record to by default, and the database-backed ROS 2 recording. Recognition is by content rather than by file name. There's no export or conversion step.

02Do you decode camera and lidar data?

No, and that's deliberate. Sensor payload is left untouched, which is what keeps a recording that's mostly image or point cloud data quick to analyze. Those channels are still inventoried, with their message type and count, you just don't get their contents. Questions about what the robot saw can't be answered from a recording. Questions about what it did and what it reported can.

03How large a recording can I upload?

Recordings get a much larger allowance than an ordinary log, because a run carrying camera or lidar data is large by nature and trimming it throws away the evidence. Upload the recording as it came off the robot. Recording the log and health channels to their own recording is still worth doing when you can, since it uploads in a fraction of the time and is the same analysis: the reading cost tracks the diagnostic channels rather than the total size, because sensor payload is never decoded.

04How do I know what the analysis actually read?

Every answer states its coverage. The channel inventory, the log stream and the health reports each report whether they were read in full, read in part, could not be read, or aren't in this recording at all. That matters more than it sounds. A channel nobody could decode and a channel the robot published nothing on look identical if you only count messages, and only the second one means the robot was quiet. The two are kept apart and labelled.

05What happens to the robot's log messages?

The log stream is pulled out of the recording and promoted to its own searchable log beside it. It opens in the log viewer and answers questions the way any other log does, so you can read what the robot said around a moment without opening the recording at all. The recording keeps its own dashboard and its own investigations.

06Can I look at a recording next to the robot's other logs?

Yes. A comparison can place a recording alongside the robot's kernel log, a packet capture, or anything else you collected from the same machine, on one timeline. Recordings carry absolute timestamps, which makes them a good anchor for a log whose timezone was never written down. That pairing is usually where the cause turns up, because the recording tends to hold the symptom.

07Do I need anything enabled on my account?

Robot recording analysis needs robotics log analysis on your account, which is the exact wording you'll see if a recording is held back. Without it a recording still uploads and is still recognised for what it is, but the analysis step is skipped. Email sales@logcat.ai if you need it enabled.

/arm/cmd06:42.180 · the recording shows whenthe why is in your next upload
Robot recordings

Point it at your last run.

Upload the recording as it came off the robot. You get a dashboard, the log stream as its own searchable log, and an answer you can trace back to a channel.

Illustrative. Synthetic data.