Sensorless pole slipping on ramp-up under propeller load — torque_constant sensitivity (T500, ODrive Pro 0.6.12)

axis0.config.motor.motor_type                  MOTOR_TYPE_HIGH_CURRENT
axis0.config.motor.pole_pairs                  7
axis0.config.motor.torque_constant             0.04544
axis0.config.motor.phase_resistance            0.0756
axis0.config.motor.phase_inductance            4.05e-05
axis0.config.motor.current_soft_max            95.0
axis0.config.motor.current_hard_max            100.0
axis0.config.motor.sensorless_observer_gain    500.0
axis0.config.motor.sensorless_pll_bandwidth    500.0
axis0.config.motor.bEMF_FF_enable              True
axis0.config.motor.wL_FF_enable                True
axis0.config.sensorless_ramp.current           20.0
axis0.config.sensorless_ramp.vel               14.0
axis0.config.sensorless_ramp.accel             31.8
axis0.config.sensorless_ramp.finish_on_vel     True
axis0.config.sensorless_pm_flux_linkage        0.0
axis0.controller.config.control_mode           CONTROL_MODE_VELOCITY_CONTROL
axis0.controller.config.input_mode             INPUT_MODE_VEL_RAMP
axis0.controller.config.vel_ramp_rate          20.0
axis0.controller.config.vel_gain               0.5
axis0.controller.config.vel_integrator_gain    0.333333
axis0.controller.config.vel_integrator_limit   3.5
axis0.controller.config.vel_limit              50.0
config.dc_bus_overvoltage_trip_level           56.0
config.dc_max_positive_current                 50.0

ODrive Pro, firmware 0.6.12-1. Blue Robotics T500 thruster, 7 pole pairs, running
sensorless at 48 V with a propeller fitted in water. Velocity control, VEL_RAMP.

Commanding 0 → 70 rad/s, the motor sometimes fails to hold commutation during the
ramp: an audible repetitive knock, phase current climbs to the soft-max clamp, and
the velocity estimate wanders well away from the setpoint before it either recovers
or settles low. It is intermittent and load-dependent — the same command on the same
drive with no water load runs clean.

Chasing it, we found the behaviour is very sensitive to torque_constant. Two
back-to-back runs on the same drive, identical command and identical ramp settings,
changing only that one value:

                            Kt = 0.021205      Kt = 0.04544
  time to 90% of 70 rad/s        2.31 s            1.56 s
  slip events                    5                 0
  steady-state spread            47.36 rad/s       3.18 rad/s
  steady-state stdev             9.4 %             1.2 %
  peak phase current             95.3 A            34.8 A

0.021205 is what the published 390 Kv rating gives via 8.27/Kv. 0.04544 is what we
measured on the bench for the same motor. With the lower value the loop asks for
roughly twice the current for the same torque, pins against the 95 A soft-max, and
has no authority left; because sensorless_pm_flux_linkage is 0.0 and therefore
derived as (2/3)·Kt/pole_pairs, the same number also halves the estimator’s back-EMF
model. The result is 95 A of phase current against no more than 23.9 A of bus
current — a lot of current producing very little torque.

Running on the measured 0.04544 removes the slipping on ramp-up entirely in this
configuration, so we are not blocked. What we would like to understand is the
residual case: under steady load we still occasionally see commutation lost with a
velocity estimate that stays plausible rather than collapsing, so the spinout
detection does not fire and nothing is reported — the drive keeps commanding current
into a rotor it is no longer tracking, and the first visible symptom is thermal.

Could you please help us identify the possible root cause of this issue?