Hi guys,
We’ve tested a 4-wheeled rover today, which is driven by a pair of ODrives v3.6 24V. The main computer communicates with the ODrives over CAN.
While commanding the rover with the remote control, I noticed the rover become weaker and weaker, and at some point we noticed that only one of the wheels is spinning, the others are idle. The main computer should command all four wheels in unison.
A while later, all four wheels were idle, so we stopped and I went to see what happened. Unfortunately, our CAN interpretation code is very rudimentary. We’ve written a custom webservice, which decodes Heartbeat messages from the ODrive axes, and it told us:
"back left": {"busCurrent": 0.0, "busVoltage": 28.24, "controllerErrors": 1, "encoderErrors": 0, "motorErrors": 1, "pos": 92747.75, "spd": 0.0, "state": "IDLE"},
"back right": {"busCurrent": 0.0, "busVoltage": 28.20, "controllerErrors": 0, "encoderErrors": 0, "motorErrors": 1, "pos": 91969.98, "spd": 0.0, "state": "IDLE"},
"front left": {"busCurrent": 0.0, "busVoltage": 28.21, "controllerErrors": 0, "encoderErrors": 1, "motorErrors": 1, "pos": 96183.34, "spd": 0.0, "state": "IDLE"},
"front right": {"busCurrent": 0.0, "busVoltage": 28.21, "controllerErrors": 0, "encoderErrors": 0, "motorErrors": 1, "pos": 92925.57, "spd": 0.0, "state": "IDLE"}}
Sorry for the unfamiliar output, this is what our program decodes from the Heartbeats and a few other queries over CAN.
I did not implement reading the specific errors via the CAN Protocol’s Get Motor Error / Get Controller Error etc.
I will do that now.
But how do I test it? How to deliberately put the odrive in an error state, e.g. a motor error, without using the USB connection?
I though about e.g. disconnecting one phase, or something like that.