Increasing Raspberry Pi Communication Speed

Hi!

I have a Raspberry Pi communicating with the ODrive (via USB) controlling 2 motors, but reading data and sending control commands takes a long time. Is there a command that can query the ODrive for all sensor values at once? Or is there a firmware level change to increase the speed of communicating with the ODrive?

For example, getting encoder position for one axis within a loop runs at 600 Hz (see sample code below). Getting 2 encoders slows down the loop rate to 300 Hz. Sending/receiving 6 values: 2 encoder + 2 measured current + 2 current set points (the bare minimum I need) slows down the loop rate to 100 Hz. Ideally I’d be getting 12+ values from the ODrive at all times (state, errors, temperature) but this reduces loop frequency to <50 Hz. It would be awesome to get all these at 100+ Hz.

Thank you!


Setup info:

  • Raspberry Pi 3 B+
  • ODrive v3.6 (with SPI firmware)
  • USB communication between Pi and ODrive
  • Using Python to control ODrive

Here is a really simple function I used to test this (I call this from the odrivetool command line interface after the appropriate imports):

def testSpeed(odrv0,nTimes):
    Iteration = 0
    t0        = time.time()

    print('Running...')
    while(True):
        try:
            Iteration   += 1
            Time        = time.time() - t0

            for i in range(nTimes):
                odrv0.axis0.encoder.pos_estimate

            if Time >= 5:
                break

        except KeyboardInterrupt:
            print('\n***STOPPED BY USER***')
            break

    print('Mean freq:    %20.2f Hz' % ((Iteration + 0.0)/Time))

There are two things you can try:

  1. Use the serial interface and see if it is any faster.
  2. Write a custom function into the firmware that takes multiple inputs/outputs.

Option 2. has been working really well for me. Take a look here: Odrive and Java.