ODrive Pro Torque issues

Hello everyone,

I have a few ODrive Pro controllers set up in a CAN bus configuration. I’m able to send position commands, and everything works as expected. For testing purposes, I currently have the motors set to filtered position control mode.

Observations:

  • When I send a single position command and wait until the motor reaches standstill, it exhibits high holding torque (I need to apply a lot of force to turn the motor by hand).
  • If I send a position command with a large offset from the current position, the motor seems to have significant torque (I can feel strong resistance if I try to hold the motor during movement).
  • However, when I send rapid position commands (incrementing by 0.1 turns every 10ms), the torque seems to be much lower. If I hold the motor tightly, it barely resists, and if I apply too much force, the motor “gives up” and stops moving. After a few seconds, it suddenly moves quickly to catch up with the now far-away position (e.g., 100 turns away).

Questions:

  1. Why is the torque so low when I send small position commands?
  2. When I read the IQ message 0x014 via CAN, the second entry (which should correspond to current consumption) only goes up to 3A when I try to turn the motor when it is not moving. I would expect this value to be much higher, around 10-20A (had this working with Odrive 3.6), especially since my current limits are set accordingly. Why is the current not reaching the expected levels? (limits are around 70-100A)

Thank you for your help!

Here is my config:

{
  "axis0.commutation_mapper.config.approx_init_pos": 0.0,
  "axis0.commutation_mapper.config.approx_init_pos_valid": false,
  "axis0.commutation_mapper.config.circular_output_range": 1.0,
  "axis0.commutation_mapper.config.circular": true,
  "axis0.commutation_mapper.config.index_gpio": 7,
  "axis0.commutation_mapper.config.index_offset": 0.0,
  "axis0.commutation_mapper.config.index_offset_valid": false,
  "axis0.commutation_mapper.config.offset": -1.032658338546753,
  "axis0.commutation_mapper.config.offset_valid": true,
  "axis0.commutation_mapper.config.passive_index_search": false,
  "axis0.commutation_mapper.config.scale": 20.0,
  "axis0.commutation_mapper.config.use_endstop": false,
  "axis0.commutation_mapper.config.use_index_gpio": false,
  "axis0.config.I_bus_hard_max": Infinity,
  "axis0.config.I_bus_hard_min": -Infinity,
  "axis0.config.I_bus_soft_max": Infinity,
  "axis0.config.I_bus_soft_min": -Infinity,
  "axis0.config.P_bus_soft_max": Infinity,
  "axis0.config.P_bus_soft_min": -Infinity,
  "axis0.config.calib_range": 0.019999999552965164,
  "axis0.config.calib_scan_distance": 8.0,
  "axis0.config.calib_scan_vel": 2.0,
  "axis0.config.commutation_encoder_bandwidth": NaN,
  "axis0.config.commutation_encoder": 10,
  "axis0.config.dir_gpio_pin": 9,
  "axis0.config.enable_error_gpio": false,
  "axis0.config.enable_step_dir": false,
  "axis0.config.enable_watchdog": false,
  "axis0.config.encoder_bandwidth": 1000.0,
  "axis0.config.error_gpio_pin": 10,
  "axis0.config.index_search_at_target_vel_only": false,
  "axis0.config.load_encoder": 10,
  "axis0.config.startup_closed_loop_control": false,
  "axis0.config.startup_encoder_index_search": false,
  "axis0.config.startup_encoder_offset_calibration": false,
  "axis0.config.startup_homing": false,
  "axis0.config.startup_max_wait_for_ready": 3.0,
  "axis0.config.startup_motor_calibration": false,
  "axis0.config.step_dir_always_on": false,
  "axis0.config.step_gpio_pin": 8,
  "axis0.config.torque_soft_max": Infinity,
  "axis0.config.torque_soft_min": -Infinity,
  "axis0.config.watchdog_timeout": 0.0,
  "axis0.config.anticogging.calib_bidirectional": true,
  "axis0.config.anticogging.calib_coarse_integrator_gain": 10.0,
  "axis0.config.anticogging.calib_coarse_tuning_duration": 60.0,
  "axis0.config.anticogging.calib_end_vel": 0.15000000596046448,
  "axis0.config.anticogging.calib_fine_dist_scale": 1.0,
  "axis0.config.anticogging.calib_fine_tuning_duration": 120.0,
  "axis0.config.anticogging.calib_start_vel": 1.0,
  "axis0.config.anticogging.enabled": false,
  "axis0.config.anticogging.max_torque": 0.15000000596046448,
  "axis0.config.calibration_lockin.accel": 3.183098793029785,
  "axis0.config.calibration_lockin.current": 1.0,
  "axis0.config.calibration_lockin.ramp_distance": 0.5,
  "axis0.config.calibration_lockin.ramp_time": 0.4000000059604645,
  "axis0.config.calibration_lockin.vel": 6.36619758605957,
  "axis0.config.can.bus_voltage_msg_rate_ms": 100,
  "axis0.config.can.encoder_msg_rate_ms": 10,
  "axis0.config.can.error_msg_rate_ms": 100,
  "axis0.config.can.heartbeat_msg_rate_ms": 100,
  "axis0.config.can.iq_msg_rate_ms": 10,
  "axis0.config.can.node_id": 2,
  "axis0.config.can.powers_msg_rate_ms": 0,
  "axis0.config.can.temperature_msg_rate_ms": 100,
  "axis0.config.can.torques_msg_rate_ms": 10,
  "axis0.config.can.version_msg_rate_ms": 0,
  "axis0.config.general_lockin.accel": 20.0,
  "axis0.config.general_lockin.current": 10.0,
  "axis0.config.general_lockin.finish_distance": 100.0,
  "axis0.config.general_lockin.finish_on_distance": false,
  "axis0.config.general_lockin.finish_on_vel": false,
  "axis0.config.general_lockin.initial_pos": 0.0,
  "axis0.config.general_lockin.ramp_distance": 3.1415927410125732,
  "axis0.config.general_lockin.ramp_time": 0.4000000059604645,
  "axis0.config.general_lockin.vel": 40.0,
  "axis0.config.motor.acim_autoflux_attack_gain": 10.0,
  "axis0.config.motor.acim_autoflux_decay_gain": 1.0,
  "axis0.config.motor.acim_autoflux_enable": false,
  "axis0.config.motor.acim_autoflux_min_Id": 10.0,
  "axis0.config.motor.acim_gain_min_flux": 10.0,
  "axis0.config.motor.acim_nominal_slip_vel": 2.3399999141693115,
  "axis0.config.motor.bEMF_FF_enable": false,
  "axis0.config.motor.calibration_current": 10.0,
  "axis0.config.motor.current_control_bandwidth": 1000.0,
  "axis0.config.motor.current_hard_max": 90.0,
  "axis0.config.motor.current_slew_rate_limit": 10000.0,
  "axis0.config.motor.current_soft_max": 70.0,
  "axis0.config.motor.direction": 1.0,
  "axis0.config.motor.ff_pm_flux_linkage": 0.0,
  "axis0.config.motor.ff_pm_flux_linkage_valid": false,
  "axis0.config.motor.fw_enable": false,
  "axis0.config.motor.fw_fb_bandwidth": 500.0,
  "axis0.config.motor.fw_mod_setpoint": 0.7786434292793274,
  "axis0.config.motor.motor_model_l_d": 0.0,
  "axis0.config.motor.motor_model_l_dq_valid": false,
  "axis0.config.motor.motor_model_l_q": 0.0,
  "axis0.config.motor.motor_type": 0,
  "axis0.config.motor.phase_inductance": 2.8741198548232205e-05,
  "axis0.config.motor.phase_inductance_valid": true,
  "axis0.config.motor.phase_resistance": 0.055579643696546555,
  "axis0.config.motor.phase_resistance_valid": true,
  "axis0.config.motor.pole_pairs": 20,
  "axis0.config.motor.power_torque_report_filter_bandwidth": 8000.0,
  "axis0.config.motor.resistance_calib_max_voltage": 2.0,
  "axis0.config.motor.sensorless_observer_gain": 1000.0,
  "axis0.config.motor.sensorless_pll_bandwidth": 1000.0,
  "axis0.config.motor.sensorless_pm_flux_linkage": 0.0,
  "axis0.config.motor.sensorless_pm_flux_linkage_valid": false,
  "axis0.config.motor.torque_constant": 0.09188888967037201,
  "axis0.config.motor.wL_FF_enable": false,
  "axis0.config.sensorless_ramp.accel": 31.83098793029785,
  "axis0.config.sensorless_ramp.current": 10.0,
  "axis0.config.sensorless_ramp.finish_distance": 15.915493965148926,
  "axis0.config.sensorless_ramp.finish_on_distance": false,
  "axis0.config.sensorless_ramp.finish_on_vel": true,
  "axis0.config.sensorless_ramp.initial_pos": 0.0,
  "axis0.config.sensorless_ramp.ramp_distance": 0.5,
  "axis0.config.sensorless_ramp.ramp_time": 0.4000000059604645,
  "axis0.config.sensorless_ramp.vel": 63.6619758605957,
  "axis0.controller.config.absolute_setpoints": false,
  "axis0.controller.config.circular_setpoint_range": 1.0,
  "axis0.controller.config.circular_setpoints": false,
  "axis0.controller.config.commutation_vel_scale": 1.0,
  "axis0.controller.config.control_mode": 3,
  "axis0.controller.config.enable_gain_scheduling": false,
  "axis0.controller.config.enable_overspeed_error": true,
  "axis0.controller.config.enable_torque_mode_vel_limit": true,
  "axis0.controller.config.enable_vel_limit": true,
  "axis0.controller.config.gain_scheduling_width": 0.0010000000474974513,
  "axis0.controller.config.homing_speed": 0.25,
  "axis0.controller.config.inertia": 0.0,
  "axis0.controller.config.input_filter_bandwidth": 40.0,
  "axis0.controller.config.input_mode": 3,
  "axis0.controller.config.pos_gain": 100.0,
  "axis0.controller.config.spinout_electrical_power_bandwidth": 20.0,
  "axis0.controller.config.spinout_electrical_power_threshold": 10.0,
  "axis0.controller.config.spinout_mechanical_power_bandwidth": 20.0,
  "axis0.controller.config.spinout_mechanical_power_threshold": -10.0,
  "axis0.controller.config.steps_per_circular_range": 1024,
  "axis0.controller.config.torque_ramp_rate": 0.009999999776482582,
  "axis0.controller.config.use_commutation_vel": false,
  "axis0.controller.config.use_load_encoder_for_commutation_vel": false,
  "axis0.controller.config.vel_gain": 1.0,
  "axis0.controller.config.vel_integrator_gain": 0.10000000149011612,
  "axis0.controller.config.vel_integrator_limit": Infinity,
  "axis0.controller.config.vel_limit": 4.0,
  "axis0.controller.config.vel_limit_tolerance": 1.2000000476837158,
  "axis0.controller.config.vel_ramp_rate": 10.0,
  "axis0.enable_pin.config.debounce_ms": 50,
  "axis0.enable_pin.config.enabled": false,
  "axis0.enable_pin.config.gpio_num": 11,
  "axis0.enable_pin.config.is_active_high": false,
  "axis0.enable_pin.config.offset": 0.0,
  "axis0.interpolator.config.dynamic": true,
  "axis0.max_endstop.config.debounce_ms": 50,
  "axis0.max_endstop.config.enabled": false,
  "axis0.max_endstop.config.gpio_num": 0,
  "axis0.max_endstop.config.is_active_high": false,
  "axis0.max_endstop.config.offset": 0.0,
  "axis0.mechanical_brake.config.gpio_num": 0,
  "axis0.mechanical_brake.config.is_active_low": true,
  "axis0.min_endstop.config.debounce_ms": 50,
  "axis0.min_endstop.config.enabled": false,
  "axis0.min_endstop.config.gpio_num": 0,
  "axis0.min_endstop.config.is_active_high": false,
  "axis0.min_endstop.config.offset": 0.0,
  "axis0.motor.motor_thermistor.config.beta": 3950.0,
  "axis0.motor.motor_thermistor.config.enabled": true,
  "axis0.motor.motor_thermistor.config.gpio_pin": 3,
  "axis0.motor.motor_thermistor.config.r_ref": 10000.0,
  "axis0.motor.motor_thermistor.config.t_ref": 25.0,
  "axis0.motor.motor_thermistor.config.temp_limit_lower": 5.0,
  "axis0.motor.motor_thermistor.config.temp_limit_upper": 25.0,
  "axis0.pos_vel_mapper.config.approx_init_pos": 0.0,
  "axis0.pos_vel_mapper.config.approx_init_pos_valid": false,
  "axis0.pos_vel_mapper.config.circular_output_range": 1.0,
  "axis0.pos_vel_mapper.config.circular": false,
  "axis0.pos_vel_mapper.config.index_gpio": 7,
  "axis0.pos_vel_mapper.config.index_offset": 0.0,
  "axis0.pos_vel_mapper.config.index_offset_valid": false,
  "axis0.pos_vel_mapper.config.offset": 0.0,
  "axis0.pos_vel_mapper.config.offset_valid": false,
  "axis0.pos_vel_mapper.config.passive_index_search": false,
  "axis0.pos_vel_mapper.config.scale": 1.0,
  "axis0.pos_vel_mapper.config.use_endstop": false,
  "axis0.pos_vel_mapper.config.use_index_gpio": false,
  "axis0.trap_traj.config.accel_limit": 4.0,
  "axis0.trap_traj.config.decel_limit": 3.0,
  "axis0.trap_traj.config.vel_limit": 6.0,
  "can.config.baud_rate": 500000,
  "can.config.protocol": 1,
  "config.dc_bus_overvoltage_trip_level": 58.0,
  "config.dc_bus_undervoltage_trip_level": 10.5,
  "config.dc_max_negative_current": -12.0,
  "config.dc_max_positive_current": 100.0,
  "config.enable_uart_a": false,
  "config.gpio0_mode": 17,
  "config.gpio10_mode": 17,
  "config.gpio11_mode": 17,
  "config.gpio12_mode": 17,
  "config.gpio13_mode": 17,
  "config.gpio14_mode": 17,
  "config.gpio15_mode": 17,
  "config.gpio16_mode": 17,
  "config.gpio17_mode": 17,
  "config.gpio18_mode": 17,
  "config.gpio1_mode": 17,
  "config.gpio2_mode": 17,
  "config.gpio3_mode": 17,
  "config.gpio4_mode": 17,
  "config.gpio5_mode": 17,
  "config.gpio6_mode": 17,
  "config.gpio7_mode": 17,
  "config.gpio8_mode": 17,
  "config.gpio9_mode": 17,
  "config.max_regen_current": 0.0,
  "config.uart0_protocol": 3,
  "config.uart_a_baudrate": 115200,
  "config.usb_cdc_protocol": 3,
  "config.user_config_0": 0,
  "config.user_config_1": 0,
  "config.user_config_2": 0,
  "config.user_config_3": 0,
  "config.user_config_4": 0,
  "config.user_config_5": 0,
  "config.user_config_6": 0,
  "config.user_config_7": 0,
  "config.gpio15_analog_mapping.endpoint": null,
  "config.gpio15_analog_mapping.max": 0.0,
  "config.gpio15_analog_mapping.min": 0.0,
  "config.gpio16_analog_mapping.endpoint": null,
  "config.gpio16_analog_mapping.max": 0.0,
  "config.gpio16_analog_mapping.min": 0.0,
  "config.gpio8_pwm_mapping.endpoint": null,
  "config.gpio8_pwm_mapping.max": 0.0,
  "config.gpio8_pwm_mapping.min": 0.0,
  "config.gpio9_pwm_mapping.endpoint": null,
  "config.gpio9_pwm_mapping.max": 0.0,
  "config.gpio9_pwm_mapping.min": 0.0,
  "config.inverter0.current_hard_max": 150.0,
  "config.inverter0.current_soft_max": 100.0,
  "config.inverter0.drv_config": 9029553772700800,
  "config.inverter0.mod_magn_max": 0.8651593923568726,
  "config.inverter0.shunt_conductance": 1999.9998779296875,
  "config.inverter0.temp_limit_lower": 83.95999908447266,
  "config.inverter0.temp_limit_upper": 103.11000061035156,
  "config.motor_fan.enabled": false,
  "config.motor_fan.lower": 70.0,
  "config.motor_fan.upper": 80.0,
  "config.odrv_fan.enabled": false,
  "config.odrv_fan.lower": 70.0,
  "config.odrv_fan.upper": 80.0,
  "hall_encoder0.config.edge0": NaN,
  "hall_encoder0.config.edge1": NaN,
  "hall_encoder0.config.edge2": NaN,
  "hall_encoder0.config.edge3": NaN,
  "hall_encoder0.config.edge4": NaN,
  "hall_encoder0.config.edge5": NaN,
  "hall_encoder0.config.edges_calibrated": false,
  "hall_encoder0.config.enabled": false,
  "hall_encoder0.config.hall_polarity_calibrated": false,
  "hall_encoder0.config.hall_polarity": 0,
  "hall_encoder0.config.ignore_illegal_hall_state": false,
  "hall_encoder1.config.edge0": 0.0767822265625,
  "hall_encoder1.config.edge1": 0.10179329663515091,
  "hall_encoder1.config.edge2": 0.0,
  "hall_encoder1.config.edge3": 0.0,
  "hall_encoder1.config.edge4": 0.0,
  "hall_encoder1.config.edge5": 1.1479437019748901e-41,
  "hall_encoder1.config.edges_calibrated": false,
  "hall_encoder1.config.enabled": true,
  "hall_encoder1.config.hall_polarity_calibrated": false,
  "hall_encoder1.config.hall_polarity": 0,
  "hall_encoder1.config.ignore_illegal_hall_state": false,
  "inc_encoder0.config.cpr": 8192,
  "inc_encoder0.config.enabled": false,
  "inc_encoder1.config.cpr": 8192,
  "inc_encoder1.config.enabled": false,
  "rs485_encoder_group0.config.mode": 2,
  "spi_encoder0.config.baudrate": 1687500,
  "spi_encoder0.config.biss_c_bits": 18,
  "spi_encoder0.config.delay": 0.0,
  "spi_encoder0.config.max_error_rate": 0.004999999888241291,
  "spi_encoder0.config.mode": 0,
  "spi_encoder0.config.ncs_gpio": 17,
  "spi_encoder1.config.baudrate": 1687500,
  "spi_encoder1.config.biss_c_bits": 18,
  "spi_encoder1.config.delay": 0.0,
  "spi_encoder1.config.max_error_rate": 0.004999999888241291,
  "spi_encoder1.config.mode": 0,
  "spi_encoder1.config.ncs_gpio": 17
}```

Okay, I am not 100% sure what I did but it works now. At least over usb. I changed to trajectory position control and increased all the velocity limits.
Not sure why that helped and what’s going on just wanted to update

Hi - I’m guessing this was because of the filtered position mode bandwidth:

https://docs.odriverobotics.com/v/latest/manual/control.html#filtered-position-control

Essentially, the filter bandwidth (especially since yours is quite low) will smooth out the position movements. I would recommend significantly raising the filter bandwidth, which should result in motor behavior more along the line of what you’re expecting.

Another possibility is that the device sending your CAN commands is lagging or the buffer is filling, so incoming commands are being delayed.

Sounds like trajectory mode did the trick though! Let me know if there’s any future issues.