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
- Are there known differences between Axis0 (M0) and Axis1 (M1) behavior with hoverboard motors on v3.6 that could explain this asymmetry under load?
- Any recommendations to address
PHASE_RESISTANCE_OUT_OF_RANGE
on Axis0 during calibration (e.g., adjustresistance_calib_max_voltage
,requested_current_range
, wiring checks specific to M0)? - 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? - Would running each wheel on Axis1 of two ODrives be a reasonable workaround, or is there a better fix on a single board?