robotics-telemetry-inspector · Category: Robotics & Physical AI / Humanoid & Fleet Telemetry
Humanoid & Fleet Telemetry Inspector — Find the overheating knee, the weak cell and the dropped topic before the robot runs again.
Your actuator logs, BMS exports, ROS 2 bags, flight logs, URDF models and CAN captures already say what is about to fail. This inspector reads them offline, checks harmonic-drive duty cycles and joint limits, 16S LiFePO4 cell spread and sag, ROS 2 topic rates, QoS, clock skew and TF-tree integrity, and PX4 / ArduPilot EKF, vibration, GNSS and ESC readiness, then writes a prioritised preventive-maintenance checklist. It never talks to the robot.
SKU: robotics-telemetry-inspector · Skills: robotics-telemetry-inspector-setup + robotics-telemetry-inspector · Runtime: 3,245 lines stdlib Python · Price: $49.00 USD one-time · card, Apple Pay or Google Pay
What It Does: The 4-Bucket Technical Breakdown
- Local-only inputs: actuator and joint CSV / JSON, BMS CSV / JSON, ROS 2 bags (
.db3,.mcap, metadata), PX4.ulgand ArduPilot logs, URDF / SDF models, and candump / CSV / JSON CAN or RS485 captures. Archives and XML are parsed with hardened limits (ARCHIVE_SAFETY_VIOLATION,XML_ENTITY_SAFETY_VIOLATION). - 4 deterministic audit buckets:
- Actuator, Joint & Harmonic-Drive Duty Cycles (with URDF / SDF and CAN bus cross-checks): stator temperature against each joint's limit, duty cycle, peak and continuous torque, velocity and position against the model, backlash and service hours, and CAN error frames, bus-off, EMCY and heartbeat loss.
ACTUATOR_THERMAL_OVERLOADACTUATOR_HIGH_DUTY_CYCLEJOINT_TORQUE_LIMIT_EXCEEDEDJOINT_VELOCITY_LIMIT_EXCEEDEDJOINT_POSITION_LIMIT_EXCEEDEDHARMONIC_DRIVE_WEAR_THRESHOLDCAN_BUS_FAULT_OR_TIMEOUTACTUATOR_ERROR_FLAGS_SETURDF_JOINT_LIMIT_INVALIDACTUATOR_JOINT_NOT_IN_MODEL. - 16S LiFePO4 / LiPo Battery Management System: per-cell spread under load versus rest, weakest-cell sag, MOSFET and pack temperature, discharge C-rate and state of health against rated cycles.
BMS_CELL_IMBALANCE_DELTABMS_CRITICAL_CELL_SAGBMS_MOSFET_THERMAL_RISEBMS_DISCHARGE_CRATE_EXCEEDEDBMS_SOH_DEGRADATIONBMS_CELL_COUNT_MISMATCH. - ROS 2 Bag, TF Tree & QoS Integrity: per-topic message rate and gaps against expected Hz, backward timestamp jumps and inter-sensor clock skew, publisher-versus-subscriber QoS, and cycles or disconnected roots in the
/tf+/tf_staticgraph.ROSBAG_TOPIC_DROPOUTROSBAG_CLOCK_DRIFT_OR_JUMPQOS_INCOMPATIBLE_MISMATCHTF_TREE_CYCLE_OR_DISCONNECT. - PX4 / ArduPilot Flight Readiness & Preventive Maintenance: EKF innovation ratios, IMU vibration and clipping, GNSS fix quality, ESC desync, overheat and RPM spread, failsafe and pre-arm faults, plus the checklist CSV.
EKF_INNOVATION_DIVERGENCEIMU_VIBRATION_CLIPPINGGNSS_DEGRADED_FIXESC_DESYNC_OR_OVERHEATFLIGHT_FAILSAFE_OR_PREARM_FAULT.
- Actuator, Joint & Harmonic-Drive Duty Cycles (with URDF / SDF and CAN bus cross-checks): stator temperature against each joint's limit, duty cycle, peak and continuous torque, velocity and position against the model, backlash and service hours, and CAN error frames, bus-off, EMCY and heartbeat loss.
- Cross-cutting:
EMBEDDED_TELEMETRY_CREDENTIAL(HIGH) flags a Wi-Fi password, key or token inside a bag, MCAP, ULog, URDF or YAML metadata record, with the value redacted. - Recurring delta mode (
--state PATH --delta): reportsBMS_CELL_DELTA_SPIKEACTUATOR_THERMAL_DRIFTSOH_DEGRADATION_STEPTOPIC_RATE_REGRESSIONbetween runs, plus new, changed and resolved findings, suited to a scheduledUpdateRoutineafter each shift or flight.
How It Runs (5 Steps)
.wattcoin_license_check.py --sku robotics-telemetry-inspector must return "state": "OK" before every run.robotics_telemetry_inspector.py and bot_common.py against the pinned values; any mismatch stops the run.--actuators, --bms, --rosbag, --flight-log, --urdf, --can-log; credentials in tables or arguments are refused (exit 10).--maintenance-out checklist, optional --state --delta events, and a fail-closed exit code.Real Sample Audit: 12-DOF humanoid, dual battery pack, ROS 2 and PX4 fleet
Sample disclosure: this is a representative sample, not a customer report. It was produced against public or fictional test targets; account and credential values are placeholders or redacted (for example wck_<REDACTED>), and no private keys, seed phrases or secrets are ever shown. Your own report will differ in content and length.
Excerpt from --self-check --format markdown --now 2026-10-27T00:00:00Z on the built-in synthetic fleet (12-joint harmonic-drive humanoid on CAN, a 16S LiFePO4 main pack and 6S LiPo auxiliary pack, a ROS 2 navigation bag with an expectations file, an MCAP fleet bag and a PX4 quadrotor log). All joints, packs, bags and frames are fabricated for illustration and no robot, vehicle or network was contacted. Output is unedited; omitted parts are marked. Exit 3: the worst finding is CRITICAL. The Wi-Fi password in the MCAP metadata is redacted in the report.
# Humanoid & Fleet Telemetry Inspector Report ``` snapshot 2026-10-27 00:00:00 UTC | tool=robotics-telemetry-inspector endpoints local-files ``` ## Summary Inputs: 12 actuator row(s), 2 BMS pack(s), 2 bag(s) / 7 topic(s), 10 flight record(s), 121 CAN frame(s), 12 URDF/SDF joint(s) | critical | high | medium | low | info | worst | |---|---|---|---|---|---| | 12 | 21 | 4 | 1 | 0 | CRITICAL | ## Bucket 1 - Actuator, joint & harmonic-drive duty cycles | joint | stator C | max C | peak Nm | rms Nm | vel rad/s | duty % | hours | backlash arcmin | |---|---|---|---|---|---|---|---|---| | l_hip_yaw | 55.0 | 90.0 | 60.0 | 20.0 | 3.00 | 40 | 1000 | 1.00 | | l_hip_roll | 55.0 | 90.0 | 60.0 | 20.0 | 7.20 | 40 | 1000 | 1.00 | | l_hip_pitch | 55.0 | 90.0 | 60.0 | 20.0 | 3.00 | 40 | 1000 | 1.00 | | l_knee_pitch | 104.0 | 90.0 | 135.0 | 20.0 | 3.00 | 88 | 1000 | 3.40 | | l_ankle_pitch | 55.0 | 90.0 | 60.0 | 20.0 | 3.00 | 40 | 1000 | 1.00 | | l_ankle_roll | 55.0 | 90.0 | 60.0 | 20.0 | 3.00 | 40 | 1000 | 1.00 | | r_hip_yaw | 55.0 | 90.0 | 60.0 | 20.0 | 3.00 | 40 | 8100 | 1.00 | | r_hip_roll | 55.0 | 90.0 | 60.0 | 20.0 | 3.00 | 40 | 1000 | 1.00 | | r_hip_pitch | 55.0 | 90.0 | 60.0 | 20.0 | 3.00 | 40 | 1000 | 1.00 | | r_knee_pitch | 93.0 | 100.0 | 60.0 | 45.0 | 3.00 | 40 | 1000 | 1.00 | | r_ankle_pitch | 55.0 | 90.0 | 60.0 | 20.0 | 3.00 | 74 | 7300 | 1.00 | | r_ankle_roll | 55.0 | 90.0 | 60.0 | 20.0 | 3.00 | 40 | 1000 | 1.00 | [... CAN bus summary table omitted ...] - **CRITICAL** `ACTUATOR_THERMAL_OVERLOAD` l_knee_pitch stator 104.0 C is at/over its limit (90.0 C max, 100 C absolute) - **CRITICAL** `CAN_BUS_FAULT_OR_TIMEOUT` bus can0 entered bus-off (controller disconnected itself after repeated errors) - **CRITICAL** `CAN_BUS_FAULT_OR_TIMEOUT` bus can0: 1 emergency / fault frame(s) (cob_id 0x082) - **CRITICAL** `CAN_BUS_FAULT_OR_TIMEOUT` bus can0: 7 of 121 frames are error frames (5.8%; CRC 6, stuff 6, form 0) - **CRITICAL** `JOINT_TORQUE_LIMIT_EXCEEDED` l_knee_pitch peak torque 135.00 Nm exceeds the 120.00 Nm limit (URDF/SDF effort) - **HIGH** `ACTUATOR_HIGH_DUTY_CYCLE` l_knee_pitch duty cycle 88.0% (limits: >70% MEDIUM, >85% HIGH) - **HIGH** `ACTUATOR_THERMAL_OVERLOAD` r_knee_pitch stator 93.0 C is within 10 C of its limit (100.0 C max) or at/over 85 C - **HIGH** `CAN_BUS_FAULT_OR_TIMEOUT` bus can0: heartbeat timeout on node 0x01 (4.00 s silent) - **HIGH** `HARMONIC_DRIVE_WEAR_THRESHOLD` l_knee_pitch harmonic drive: backlash 3.40 arcmin exceeds the 3.00 arcmin limit - **HIGH** `JOINT_POSITION_LIMIT_EXCEEDED` l_hip_roll observed position 0.900..0.900 is outside the model range [-0.600, 0.500] - **HIGH** `JOINT_TORQUE_LIMIT_EXCEEDED` r_knee_pitch RMS torque 45.00 Nm exceeds the 40.00 Nm rated torque (continuous overload) - **HIGH** `JOINT_VELOCITY_LIMIT_EXCEEDED` l_hip_roll velocity 7.20 rad/s exceeds the 6.00 rad/s limit - **MEDIUM** `ACTUATOR_HIGH_DUTY_CYCLE` r_ankle_pitch duty cycle 74.0% (limits: >70% MEDIUM, >85% HIGH) - **MEDIUM** `HARMONIC_DRIVE_WEAR_THRESHOLD` r_hip_yaw harmonic drive: 8100 operating hours reached the 8000 h service interval - **LOW** `HARMONIC_DRIVE_WEAR_THRESHOLD` r_ankle_pitch harmonic drive: 7300 operating hours is 91% of the 8000 h service interval ## Bucket 2 - 16S LiFePO4 / LiPo battery management system | pack | chem | cells | V | A | min mV | max mV | delta mV | state | MOSFET C | pack C | SOH % | cycles | |---|---|---|---|---|---|---|---|---|---|---|---|---| | HUM-PACK-A | LiFePO4 | 16 | 51.2 | 160.0 | 2440 | 3248 | 808 | load | 78.0 | 41.0 | 78.0 | 3250 | | AUX-PACK-B | LiPo | 6 | 23.1 | 4.0 | 3830 | 3840 | 10 | rest | 31.0 | 28.0 | 97.0 | 40 | - **CRITICAL** `BMS_CELL_IMBALANCE_DELTA` HUM-PACK-A (LiFePO4) cell spread 808 mV (2440..3248 mV) under load; balancer active - **CRITICAL** `BMS_CRITICAL_CELL_SAG` HUM-PACK-A (LiFePO4) weakest cell 2440 mV is below the 2500 mV critical floor - **HIGH** `BMS_DISCHARGE_CRATE_EXCEEDED` HUM-PACK-A (LiFePO4) drawing 1.60 C (160.0 A / 100.0 Ah) over the 1.50 C limit - **HIGH** `BMS_MOSFET_THERMAL_RISE` HUM-PACK-A (LiFePO4) MOSFET 78.0 C / pack 41.0 C is above the warning limit (75 C / 50 C) - **MEDIUM** `BMS_SOH_DEGRADATION` HUM-PACK-A (LiFePO4) state of health 78.0%, 3250 cycles (rated 3000) ## Bucket 3 - ROS 2 bag, TF tree & QoS integrity [... per-topic rate tables omitted ...] - **CRITICAL** `ROSBAG_TOPIC_DROPOUT` nav.db3: required/safety topic /cmd_vel recorded 0 messages (expected 10.0 Hz) - **CRITICAL** `TF_TREE_CYCLE_OR_DISCONNECT` nav.db3: /tf + /tf_static frame graph contains a cycle (base_link -> lidar -> map -> odom -> base_link); transform lookups will loop or fail - **HIGH** `QOS_INCOMPATIBLE_MISMATCH` nav.db3: sensor topic /scan QoS mismatch: BEST_EFFORT publisher vs RELIABLE subscriber; endpoints will not connect or will silently drop data - **HIGH** `ROSBAG_CLOCK_DRIFT_OR_JUMP` nav.db3: topic /imu/data has 2 backward timestamp jump(s) (bag time 1, header stamp 1) - **HIGH** `ROSBAG_CLOCK_DRIFT_OR_JUMP` nav.db3: inter-sensor clock skew 67.0 ms (/imu/data vs /joint_states); sensor fusion will mis-associate samples - **HIGH** `ROSBAG_TOPIC_DROPOUT` nav.db3: topic /imu/data has a 0.52 s message gap, over 5x the 0.020 s period (50.0 Hz expected) - **HIGH** `ROSBAG_TOPIC_DROPOUT` nav.db3: topic /scan ran at 3.00 Hz, 30% of the expected 10.0 Hz - **HIGH** `ROSBAG_TOPIC_DROPOUT` nav.db3: topic /scan has a 4.25 s message gap, over 5x the 0.100 s period (10.0 Hz expected) - **HIGH** `TF_TREE_CYCLE_OR_DISCONNECT` nav.db3: /tf + /tf_static frame graph has 2 disconnected root frames (arm_base, world); expected a single tree - **MEDIUM** `QOS_INCOMPATIBLE_MISMATCH` nav.db3: topic /joint_states uses KEEP_ALL (depth 0): unbounded queue memory risk on a long run ## Bucket 4 - PX4 / ArduPilot EKF, IMU, GNSS & ESC flight readiness [... EKF / vibration / GNSS and ESC tables omitted ...] - **CRITICAL** `EKF_INNOVATION_DIVERGENCE` EKF velocity innovation test ratio peaks at 1.12 (>=0.7 HIGH, >=1.0 rejects the measurement) - **CRITICAL** `ESC_DESYNC_OR_OVERHEAT` ESC 1: 3 desync event(s), peak temperature 108.0 C - **CRITICAL** `FLIGHT_FAILSAFE_OR_PREARM_FAULT` a failsafe was active during the log - **HIGH** `ESC_DESYNC_OR_OVERHEAT` ESC mean RPM spread 21.2% (5200..6600) exceeds 15%: a motor/prop/ESC is working harder or slipping - **HIGH** `FLIGHT_FAILSAFE_OR_PREARM_FAULT` pre-arm check failure logged: Preflight Fail: Accel inconsistent - **HIGH** `GNSS_DEGRADED_FIX` outdoor GNSS degraded: min fix type 3, min satellites 5, max HDOP 2.70 (fix<3, sats<6 or HDOP>2.5) - **HIGH** `IMU_VIBRATION_CLIPPING` IMU vibration RMS peaks at 35.0 m/s^2 (x 35.0, y 28.0, z 17.5; >30 HIGH, >60 CRITICAL) Preventive maintenance & flight-readiness checklist (53 row(s); full list with --maintenance-out) | prio | category | asset | check | status | due | |---|---|---|---|---|---| | 0 | Flight readiness | OVERALL | Heuristic readiness gate over the supplied logs (not an airworthine... | NO-GO | - | | 1 | Actuator / joint | l_knee_pitch | l_knee_pitch stator 104.0 C is at/over its limit (90.0 C max, 100 C... | NO-GO | before next operation | | 1 | Actuator / joint | l_knee_pitch | l_knee_pitch peak torque 135.00 Nm exceeds the 120.00 Nm limit (URD... | NO-GO | before next operation | | 1 | Battery / BMS | HUM-PACK-A | HUM-PACK-A (LiFePO4) cell spread 808 mV (2440..3248 mV) under load;... | NO-GO | before next operation | | 1 | Battery / BMS | HUM-PACK-A | HUM-PACK-A (LiFePO4) weakest cell 2440 mV is below the 2500 mV crit... | NO-GO | before next operation | | 1 | CAN / RS485 bus | can0 | bus can0 entered bus-off (controller disconnected itself after repe... | NO-GO | before next operation | [... 34 more checklist rows omitted ...] ## Other - **HIGH** `EMBEDDED_TELEMETRY_CREDENTIAL` fleet.mcap: field metadata:network:wifi_password holds what looks like a credential field (value redacted); rotate it and re-export the log without it exit_code 3 (fail-on=medium) --- [... SCOPE_NOTE omitted (printed in full with every report) ...]
CLI Reference: Flags & Exit Codes
| Flag | Meaning |
|---|---|
PATH ... / --dir DIR | Telemetry files, .zip archives or directories (roles auto-detected). --dir discovers files recursively; symlinks it finds are skipped and reported as degraded sources. |
--actuators PATH | Actuator / joint log (CSV or JSON): stator and max temperature, RMS and peak torque, velocity, duty cycle, operating hours, backlash, error flags, optional position. |
--bms PATH | BMS export (CSV or JSON): chemistry, series cells, pack voltage and current, per-cell mV, load state, MOSFET and pack temperature, SOH, cycles. |
--rosbag PATH | ROS 2 bag (.db3, .mcap, metadata.yaml / JSON summary) or an expectations file (topics, expected Hz, required, subscriber QoS). Repeatable. |
--flight-log PATH | PX4 .ulg or ArduPilot .bin / CSV / JSON: EKF innovations, vibration, GNSS, ESC, failsafe and pre-arm. Repeatable. |
--urdf PATH | URDF or SDF model: joint position, velocity and effort limits cross-checked against the actuator log. |
--can-log PATH | candump-style text, or CSV / JSON bus export: error frames, bus-off, EMCY frames, heartbeats. |
--maintenance-out PATH | Write the full preventive-maintenance and flight-readiness checklist as a new CSV (refuses input paths). |
--state PATH --delta | Store a snapshot (0600) and report events, new, changed and resolved findings against it. Degraded runs never overwrite it. |
--self-check | Audit the built-in synthetic fixtures (written to a private temp dir) and verify every expected finding code fires. Exits with the audit code, or 11 with SELF_CHECK_FAILED if one is missing. |
--now ISO | Override the report clock (YYYY-MM-DD or YYYY-MM-DDTHH:MM:SSZ) for reproducible runs and maintenance due dates. |
--format {text,markdown,md,json,html} / --json / --out PATH | Report format and destination. |
--fail-on {none,info,low,medium,high,critical} | Exit threshold (default medium). |
| Exit code | Meaning |
|---|---|
0 | Completed with nothing at or above --fail-on. |
1 | Worst finding is MEDIUM (or LOW/INFO with a lower threshold). |
2 | Worst finding is HIGH. |
3 | Worst finding is CRITICAL. |
10 | Bad input or refusal: missing file, bad flag, --delta without --state, a symlink input, or a credential / token / signing key in arguments or tables. |
11 | Degraded: unreadable, malformed or unsafe input, a skipped symlink, or nothing to audit. Never a clean result. |
Mandatory Refusal Boundaries
- Offline and strictly read-only. No network request. It never issues motor or actuator commands, torque setpoints, CAN frames, MAVLink parameter writes or BMS register writes, never overrides a safety interlock, and never modifies an input file.
--state,--outand--maintenance-outonly create new files and refuse any input path. - No credentials. Fleet API tokens, passwords, seed phrases, MAVLink signing keys, ROS 2 DDS security private keys, Wi-Fi passwords and SSH keys in arguments, tables or candump logs are refused (exit
10) and never echoed. A credential inside a bag, MCAP, ULog, URDF or YAML metadata record raisesEMBEDDED_TELEMETRY_CREDENTIALwith the value redacted. - Your logs only. It audits telemetry from robots and vehicles you own or are authorised to review. Symlinked inputs are refused and all reads are opened without following links.
- Heuristic, not certification. Findings are offline diagnostics on exported logs, not airworthiness, FAA / EASA flight certification, or functional-safety (ISO 13849 / IEC 61508 / ISO 10218) approval. A GO on the readiness checklist is not a flight or operation clearance.
Scope note (printed with every report): 100% offline, local, read-only inspection of the actuator, BMS, CAN / RS485, ROS 2 bag (.db3 / .mcap / metadata), PX4 ULog / ArduPilot and URDF / SDF files you supply. Findings are offline diagnostic heuristics on exported logs, not airworthiness, FAA / EASA flight certification, or functional-safety approval. No network request is made and no hardware is commanded.
Pinned Runtime Hashes (SHA-256 Verified)
https://botappstore.com/runtime/robotics_telemetry_inspector.py— 3,245 lines — SHA-256:aa45c09553b0c989a988c4f2375a7d9e596f338afa5f98969db09896eb6c6b17https://botappstore.com/runtime/bot_common.py— 274 lines — SHA-256:d1941b61b95ca664e4c1286c3bf1918c00e976c2c1601199b19200257650e526
Runtime URLs are license-gated: send X-License-Key: wcl_... or X-Agent-Key: wck_... (unauthenticated requests get 401). The served file carries a per-license watermark block (5 lines), so compare the X-Canonical-SHA256 response header (or the SHA-256 after stripping the block) against the pins above. The recommended path is the setup skill installer:
python3 /workspace/.wattcoin_license_check.py --sku robotics-telemetry-inspector --install-runtime ... --expected-sha256 aa45c09553b0c989a988c4f2375a7d9e596f338afa5f98969db09896eb6c6b17
The setup and audit skills verify both canonical digests before every run and refuse to execute either file on a mismatch. Both are locked at chmod 500. The runtime is stdlib-only Python and is covered by 724 unit tests.
Technical FAQ
Which robot and fleet files does it read?
Does it connect to my robot, CAN bus or BMS?
What do I get besides findings?
How does the ROS 2 bag audit know about subscriber QoS?
What does delta mode watch?
What does it refuse to do?
Licensing & Setup
$49.00 USD one-time, paid by card, Apple Pay or Google Pay, with up to 3 workspace-reset rebinds and no subscription. On Turn 1 the robotics-telemetry-inspector-setup skill installs the read-only license helper (0500), verifies and installs the SHA-256-pinned runtime, registers and activates /workspace/.wattcoin_env (0600, starter activation), binds your wcl_<64-hex> license via POST /api/v1/agents/license/claim, and runs the built-in --self-check. Every later run starts with the license gate.
One wcl_... key, two runtimes. Your license key works inside Grok Bot and from any local terminal or IDE agent (Cursor, Claude Code, Windsurf, CI/CD) via the standalone single-file Python 3 CLI (/runtime/robotics_telemetry_inspector.py) — Python 3.10+ standard library only, zero pip install dependencies, with --json / --markdown output.