ODrive v3.6 (FW 0.5.4) — robot pulls right under straight command (Axis0), same over USB and CAN

Hi all,

I’m building a differential-drive robot with two 6.5″ hoverboard hub motors (hall sensors, 15 pole pairs) on an ODrive v3.6 (FW 0.5.4). No matter what I try, the robot consistently yaws to the right when I command straight motion. The right wheel is on Axis0 (M0); the left is on Axis1 (M1). The behavior is identical whether I control over USB (odrivetool) or over CAN (cansimple) from a Jetson. Off-ground both axes look OK, but on the floor Axis0 seems to lag/saturate and the robot drifts right; increasing the velocity integrator just delays the onset and then it spins harder.

Power is a ~10S pack; vbus ~38 V during tests.

I’ve already:

  • Erased & reconfigured, saved, and rebooted multiple times.
  • Verified sign conventions (mirrored wheel), tried different PI gains, and added small filtering capacitors on the hall lines.
  • Seen intermittent Axis0 calibration error in the past: MotorError.PHASE_RESISTANCE_OUT_OF_RANGE. Axis1 calibrates cleanly. After tuning, both calibrate, but the rightward drift persists under load.

Calibration / runtime parameters (same on both axes):

python

CopyEdit

# Global power/limits
odrv0.config.dc_max_negative_current = -24
odrv0.config.max_regen_current = 24.0
odrv0.config.dc_bus_overvoltage_trip_level = 42

# Encoder (HALL)
axis.encoder.config.mode = ENCODER_MODE_HALL
axis.encoder.config.cpr = 90
axis.encoder.config.calib_scan_distance = 150
axis.encoder.config.bandwidth = 100

# Motor
axis.motor.config.pole_pairs = 15
axis.motor.config.motor_type = MOTOR_TYPE_HIGH_CURRENT
axis.motor.config.torque_constant = 0.516875   # ~8.27/16
axis.motor.config.current_control_bandwidth = 100
axis.motor.config.calibration_current = 10
axis.motor.config.resistance_calib_max_voltage = 6
axis.motor.config.current_lim = 15
axis.motor.config.requested_current_range = 24

# Controller (velocity mode)
axis.controller.config.control_mode = CONTROL_MODE_VELOCITY_CONTROL
axis.controller.config.vel_limit = 15
axis.controller.config.vel_limit_tolerance = 3.0
axis.controller.config.pos_gain = 10
axis.controller.config.vel_gain = 0.2
axis.controller.config.vel_integrator_gain = 0.05

Symptoms in brief

  • Commanding straight (equal & opposite wheel speeds) → robot veers right (Axis0 side).
  • Off-ground tracking looks fine on both axes; on-ground, Axis0 underperforms.
  • Increasing vel_integrator_gain delays the drift for a second or two, then it “runs away” into a spin.

Questions

  1. Are there known differences between Axis0 (M0) and Axis1 (M1) behavior with hoverboard motors on v3.6 that could explain this asymmetry under load?
  2. Any recommendations to address PHASE_RESISTANCE_OUT_OF_RANGE on Axis0 during calibration (e.g., adjust resistance_calib_max_voltage, requested_current_range, wiring checks specific to M0)?
  3. For hall-based hoverboard wheels in velocity control, what gains / bandwidths have you found to work well on v3.6? Should I reduce encoder.bandwidth and/or use torque feedforward to keep both sides matched?
  4. Would running each wheel on Axis1 of two ODrives be a reasonable workaround, or is there a better fix on a single board?

Hi! I’m guessing one motor has higher friction than the other.

One thing I’d check – when the robot is lifted off the ground, and you’re just commanding a fixed vel for both wheels, what’s the axis.motor.current_control.Iq_measured for each motor?

Also, if you swap the motors (and hall connections, and re-run motor cal / hall polarity cal / hall phase cal), does the issue follow the motor, or the axis?

Are you using 22nF capacitors on the hall lines into the ODrive?