Telega Velocity Tracking during Long Operation

While operating six AD5050 “Myxa” ESCs in a long duration test setup, we discovered a severe failure condition.

The ESCs are operated via Cyphal (Telega 1.0 firmware), receive velocity setpoints via the setpoint_velocity port at 20 Hz, and (should) run uninterrupted for days and potentially weeks. Each device has its own setpoint index for the subscription array.

After a few hours of continuous operation, the velocity tracking starts getting worse, there seems to be a semi-constant offset between setpoint and actual velocity. After a few more hours, some ESCs start showing behavior where the velocity can’t go below a certain lower threshold, as is shown in the picture below. From there, this problem usually gets worse quickly, sometimes resulting in prolonged periods of full throttle (current-limited).

setpoint and estimate in 5-hour intervals

We have tested and observed this for around 130 hours, with the pattern emerging multiple times with different ESCs. Restarting the sequence seems to solve the immediate issue (dashed vertical lines in the plot below), a full reboot of the Telega firmware (solid black vertical lines) does not seem to have any additional effect.

The complete configuration dump of the devices is attached below, full telemetry data at 20 Hz is available upon request.

config.json (51.6 KB)


Please advise ASAP:

  1. Is this a known issue or a new one?
  2. How does this endanger existing drones flying with this firmware and configuration?
  3. Is there a way to counter this with a different device configuration?

Hello @pavel-kirienko, do you have a first assessment on this?
I am available for a call any time today.

Kind Regards, Lasse

Hi Lasse,

This is not a known issue. The INDI controller has the integrator off per your config, and internally it is basically stateless otherwise. One thing that seems suspicious is that you have RCPWM control enabled without strong pull and no deadband:

        "aux.ctl.1_rcpwm.deadband": 0.0,
        "aux.ctl.1_rcpwm.rev_mid_fwd": [0.00095, 0.00095, 0.00200],
        "aux.ctl.dead0": false,
        "aux.ctl.mode": "dv 360.0",
        "aux.ctl.type": 1,
        "aux.pull": 0

In this setup, especially if you have anything plugged into the aux port, spurious control inputs are possible. Can you check if it’s possible to reproduce the issue with the aux port disabled completely?

Sure thing. I will disable the AUX input completely (aux.ctl.type = 0, aux.ctl.mode = "") and start another test run this evening.


EDIT: Tests are running with the aux.* configuration below.

aux.ctl.1_rcpwm.deadband: 0.000030  # changed, for good measure
aux.ctl.1_rcpwm.rev_mid_fwd: [0.000950, 0.000950, 0.002000]
aux.ctl.dead0: false
aux.ctl.mode: ""  # disabled
aux.ctl.type: 0   # also disabled
aux.power_output: false
aux.pull: -1  # pull-down enabled, for good measure

This run also shows first signs of the same problem, even with the PWM input completely disabled. I have not yet observed the “setpoint clipping” state, but the offset is already noticeable.

First 10 hours

I had to restart the test sequence this morning due to an unrelated issue, but I will continue trying to reproduce the fault sequence observed earlier.

Over the weekend I have not been able to reproduce the velocity runaway described above, so the issue might be related to the RCPWM input configuration.

The slowly accumulating velocity error is still very much a thing, though:

@finwood would it be possible to obtain the current and demand factor plots captured around the onset of the issue? I am having trouble reproducing it locally so far.

EDIT: Also it would help if you could check whether setting drive.velocity_ctl.2_indi.acceleration_pi[1] to a small positive value (the integral channel of the acceleration controller in the INDI) can mitigate the issue.

It appears that I virtually succeeded in reproducing the problem. It is related to a discrepancy between the estimated torque and the real torque due to motor parameter drift with temperature and other environmental factors. Investigation is still ongoing but I could really use additional telemetry data.

Sorry for the delay, I have been out sick the past few days.

I’ve exported a dataset for the run described in the first post above, from 2026-04-21 15:55:00+02:00 to 2026-04-22 14:20:00+02:00. The different Telega ports are available at https://telega-velocity-tracking.s3.fr-par.scw.cloud/2026-05-08/topic.parquet, along with the heartbeat of all devices in the network and the published velocity setpoint (a zubax.primitive.real16.Vector6.1.0).

$ mc ls -r scw/telega-velocity-tracking
[2026-05-08 12:04:11 UTC]  46MiB STANDARD 2026-05-08/compact.parquet
[2026-05-08 12:04:13 UTC]  70MiB STANDARD 2026-05-08/dq.parquet
[2026-05-08 12:04:05 UTC] 149MiB STANDARD 2026-05-08/dynamics.parquet
[2026-05-08 12:04:09 UTC]  29MiB STANDARD 2026-05-08/feedback.parquet
[2026-05-08 12:04:02 UTC] 4.6MiB STANDARD 2026-05-08/heartbeat.parquet
[2026-05-08 12:04:08 UTC]  85MiB STANDARD 2026-05-08/power.parquet
[2026-05-08 12:04:15 UTC]  32MiB STANDARD 2026-05-08/setpoint.parquet
[2026-05-08 12:04:10 UTC]  35MiB STANDARD 2026-05-08/status.parquet
[2026-05-08 12:04:14 UTC]  29MiB STANDARD 2026-05-08/temperature.parquet
[2026-05-08 12:17:18 UTC] 6.2GiB STANDARD duck.db

The complete dataset of all runs so far is additionaly available in the DuckDB file also present in the same S3 bucket: duck.db (6.2 GiB). The parquet files are flattened DSDL with two metadata columns (see below), the DuckDB file has been created with this load.sql (2.9 KB) script.

D select * from 'https://telega-velocity-tracking.s3.fr-par.scw.cloud/2026-05-08/dynamics.parquet' using sample 20;
┌───────────────────────────────┬─────────┬───────────┬──────────────────────┬───────────────────────────────┬────────────────────────────────┬────────────────────────────────┐
│             _time             │ node_id │ timestamp │     value.force      │ value.kinematics.acceleration │ value.kinematics.base.position │ value.kinematics.base.velocity │
│   timestamp with time zone    │ varchar │   int64   │        double        │            double             │             double             │             double             │
├───────────────────────────────┼─────────┼───────────┼──────────────────────┼───────────────────────────────┼────────────────────────────────┼────────────────────────────────┤
│ 2026-04-21 13:55:03.76766+00  │ 3       │         0 │   0.6566559672355652 │              -69.924072265625 │                    730986.0625 │             197.10565185546875 │
│ 2026-04-21 13:56:22.769198+00 │ 5       │         0 │   1.0289949178695679 │            11.938908576965332 │                    747683.5625 │             209.23870849609375 │
│ 2026-04-21 13:56:38.019905+00 │ 5       │         0 │    0.707126796245575 │             21.43035888671875 │                    751347.1875 │             176.62103271484375 │
│ 2026-04-21 13:57:14.419906+00 │ 3       │         0 │   0.6392955780029297 │           -28.593862533569336 │                     759666.875 │             171.12203979492188 │
│ 2026-04-21 13:57:40.9195+00   │ 9       │         0 │    1.618090271949768 │            -53.09518051147461 │                     747686.625 │             277.27325439453125 │
│ 2026-04-21 14:01:38.519125+00 │ 3       │         0 │    1.090759515762329 │             38.23926544189453 │                    815768.8125 │             226.67576599121094 │
│ 2026-04-21 14:01:39.719373+00 │ 9       │         0 │   1.4970026016235352 │             63.99597930908203 │                    804274.1875 │              253.1598358154297 │
│ 2026-04-21 14:24:47.665016+00 │ 3       │         0 │   0.6707499027252197 │            -43.34175491333008 │                    1099007.875 │              185.4061737060547 │
│ 2026-04-21 14:27:06.516994+00 │ 5       │         0 │    0.914699137210846 │             -67.4951400756836 │                    1131927.125 │             212.21258544921875 │
│ 2026-04-21 14:27:50.116756+00 │ 9       │         0 │   1.0696144104003906 │             9.265597343444824 │                     1144119.75 │             224.44955444335938 │
│ 2026-04-21 14:28:46.564169+00 │ 3       │         0 │   1.0770829916000366 │            -43.53392028808594 │                    1149462.875 │             228.18487548828125 │
│ 2026-04-21 14:31:36.566597+00 │ 9       │         0 │   0.8062918186187744 │            -39.81865692138672 │                      1195345.0 │             214.55711364746094 │
│ 2026-04-21 14:32:20.417871+00 │ 9       │         0 │   0.9429265260696411 │            10.476663589477539 │                    1205183.375 │             210.44305419921875 │
│ 2026-04-21 14:32:50.116919+00 │ 11      │         0 │   1.2505079507827759 │            15.955648422241211 │                      1202019.5 │                226.68505859375 │
│ 2026-04-21 14:33:15.616082+00 │ 5       │         0 │   1.4629199504852295 │             20.21344566345215 │                      1216264.0 │             246.18482971191406 │
│ 2026-04-21 14:33:55.968157+00 │ 9       │         0 │   0.8948553204536438 │            -11.41098690032959 │                     1226390.25 │             220.50579833984375 │
│ 2026-04-21 14:35:05.216667+00 │ 11      │         0 │  0.01984763890504837 │           -62.269229888916016 │                    1231866.875 │              81.72111511230469 │
│ 2026-04-21 14:35:25.820794+00 │ 1       │         0 │ 0.029463443905115128 │          -0.18615809082984924 │                    1235760.625 │             18.929285049438477 │
│ 2026-04-21 14:35:51.971003+00 │ 5       │         0 │  0.03417893499135971 │           0.08125068247318268 │                      1241478.5 │             21.887453079223633 │
│ 2026-04-21 14:36:07.159013+00 │ 11      │         0 │ 0.034444019198417664 │           0.12848812341690063 │                     1233153.75 │             19.646543502807617 │
├───────────────────────────────┴─────────┴───────────┴──────────────────────┴───────────────────────────────┴────────────────────────────────┴────────────────────────────────┤
│ 20 rows                                                                                                                                                            7 columns │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

I will be back in the lab on Monday and will start another test run with a small drive.velocity_ctl.2_indi.acceleration_pi[1] value, I will update you on the results later that week.

I have been able to reproduce the runaway (velocity?) controller issue, even with the AUX input disabled and a small positive I-gain in the INDI acceleration controller. The integral channel was able to compensate for the slowly accumulating velocity offset, but the runaway still occurred.

Shortly before the runaway, the “clipping” behavior is also still present. During that time, the motor seemed severely hindered in decelerating, as can be seen in the second-to-last plot at around 03:34:00. At 04:00:00 the test run was interrupted to prevent the controller from overheating.

first 30 hours

ESC configuration

See config.json (6.9 KB) or partial excerpt below.

aux.ctl.1_rcpwm.deadband: 0.000030
aux.ctl.1_rcpwm.rev_mid_fwd: [0.000950, 0.000950, 0.002000]
aux.ctl.dead0: false
aux.ctl.mode: ""  # disabled
aux.ctl.type: 0   # also disabled
aux.power_output: false
aux.pull: -1  # pull-down enabled

drive.current_brake_pu: 0.5
drive.flux_weakening.bemf_pid: [4.0, 2.0, 0.01]
drive.flux_weakening.voltage_boost: 1.0
drive.observer.type: 0
drive.observer.0_ekf.proc_noise: [1000000.0, 3000000.0, 100000000.0]
drive.observer.0_ekf.sched_factor: [0.80, 0.95]
drive.velocity_ctl.type: 2  # INDI strategy
drive.velocity_ctl.acceleration: [-400.0, 800.0]
drive.velocity_ctl.2_indi.acceleration_pi: [30.0, 1.0]
drive.velocity_ctl.2_indi.mass: 10e-06
drive.voltage_clipping: False

motor.current_ctl_bwr: 0.05
motor.current_max: 40.0
motor.current_ramp: 5000.0
motor.voltage_ramp: 20.0

I have uploaded the telemetry data from this 40-hour run to the same S3 bucket, available under the 2026-05-15 key.

$ mc ls -r scw/telega-velocity-tracking/
[2026-05-15 09:50:11 CEST]  85MiB STANDARD 2026-05-15/compact.parquet
[2026-05-15 09:50:38 CEST] 130MiB STANDARD 2026-05-15/dq.parquet
[2026-05-15 09:47:48 CEST] 280MiB STANDARD 2026-05-15/dynamics.parquet
[2026-05-15 09:49:29 CEST]  52MiB STANDARD 2026-05-15/feedback.parquet
[2026-05-15 09:48:20 CEST] 9.1MiB STANDARD 2026-05-15/heartbeat.parquet
[2026-05-15 09:49:28 CEST] 157MiB STANDARD 2026-05-15/power.parquet
[2026-05-15 09:56:30 CEST]  55MiB STANDARD 2026-05-15/setpoint.parquet
[2026-05-15 09:49:41 CEST]  60MiB STANDARD 2026-05-15/status.parquet
[2026-05-15 09:50:39 CEST]  52MiB STANDARD 2026-05-15/temperature.parquet
[2026-05-15 10:27:52 CEST] 7.2GiB STANDARD duck.db