In [124]:
#%matplotlib notebook
%matplotlib inline

import matplotlib
matplotlib.rcParams['figure.figsize'] = (12, 9)

import scipy
import scipy.stats
import math
import numpy as np
import pandas as pd

from astropy import units as u

#import ipywidgets
#from ipywidgets import interact

Return Delay Time

Return Delay Time @57600 bps

Measured time (with an oscilloscope) between the end of the last bit of the Instruction Packet and the beginning of the first bit of the Status Packet with respect to the Return Delay Time value set within the tested Dynamixel (address 0x05 in the internal Control Table).

Raspberry Pi using GPIO


In [40]:
rdt_dict = {
    50:  [184, 184, 184, 184, 279, 184, 198, 279, 192, 326],
    100: [345, 501, 350, 350, 492, 350, 350, 496, 495, 350],
    150: [501, 648, 648, 648, 501, 648, 648, 648, 501, 567],
    200: [800, 800, 800, 800, 690, 800, 800, 800, 660, 800],
    250: [960, 960, 960, 960, 960, 960, 837, 856, 955, 955]
}

df_gpio = pd.DataFrame(rdt_dict)

Raspberry Pi using USB2Dynamixel


In [42]:
rdt_dict = {
    50:  [190, 190, 185, 187, 246, 190, 190, 190, 190, 332],
    100: [480, 492, 492, 346, 346, 346, 495, 450, 487, 421],
    150: [510, 650, 650, 506, 645, 496, 496, 645, 525, 503],
    200: [800, 660, 660, 800, 800, 800, 800, 742, 800, 800],
    250: [965, 955, 955, 965, 816, 965, 965, 955, 955, 965]
}

df_usb2dynamixel = pd.DataFrame(rdt_dict)

Plots


In [117]:
fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(10, 8))

df_gpio.plot(ax=ax1,
             kind="box",
             color="r",
             legend=True,
             label="GPIO")

df_usb2dynamixel.plot(ax=ax2,
                      kind="box",
                      color="b",
                      legend=True,
                      label="USB2Dynamixel");

ax1.grid(True)
ax2.grid(True)

ax1.set_xlabel("Return Delay Time", fontsize=12)
ax1.set_ylabel("Measured Return Delay Time (µs)", fontsize=12)

ax2.set_xlabel("Return Delay Time", fontsize=12)
ax2.set_ylabel("Measured Return Delay Time (µs)", fontsize=12)

ax1.set_title("Return Delay Time (@57600bps)", fontsize=16)


Out[117]:
<matplotlib.text.Text at 0x1241e08d0>

In [116]:
fig, ax1 = plt.subplots(nrows=1, ncols=1, figsize=(10, 5))

df_gpio.mean().plot(ax=ax1,
                    yerr=df_gpio.std(),
                    legend=True,
                    label="GPIO",
                    color="r",
                    linewidth=1)

df_usb2dynamixel.mean().plot(ax=ax1,
                             yerr=df_usb2dynamixel.std(),
                             legend=True,
                             label="USB2Dynamixel",
                             color="b",
                             linewidth=1);

ax1.set_xlim(left=45, right=255)

ax1.grid(True)

ax1.set_xlabel("Return Delay Time", fontsize=12)
ax1.set_ylabel("Measured Return Delay Time (µs)", fontsize=12)
ax1.set_title("Return Delay Time (@57600bps)", fontsize=16)


Out[116]:
<matplotlib.text.Text at 0x1241539b0>

Baud rate

Measured time (with an oscilloscope) between the start and the end of a byte.


In [198]:
br_array = np.array([
    [9600,   1039, 1040],
    [19200,  519,  520],
    [57600,  173,  173],
    [115200, 87,   86],
    [230400, 1039, 43],
    [460800, 1039, 21],
    [921600, 1039, 10]
])

# Actual dt = 1 / baud_rate * (8 bits + 1 start bit + 1 stop bit) * 1000000 microsec
actual_dt = 1. / br_array[:,0] * 10. * 1000000.

df = pd.DataFrame(data=np.hstack([br_array[:,1:], actual_dt.reshape([-1, 1])]),
                  index=br_array[:,0],
                  columns=["delta time per byte using GPIO (µs)",
                           "delta time per byte using USB2Dynamixel (µs)",
                           "actual delta time per byte (µs)"])
df.index.name = "baud rate"
df


Out[198]:
delta time per byte using GPIO (µs) delta time per byte using USB2Dynamixel (µs) actual delta time per byte (µs)
baud rate
9600 1039.0 1040.0 1041.666667
19200 519.0 520.0 520.833333
57600 173.0 173.0 173.611111
115200 87.0 86.0 86.805556
230400 1039.0 43.0 43.402778
460800 1039.0 21.0 21.701389
921600 1039.0 10.0 10.850694

In [201]:
fig, ax1 = plt.subplots(nrows=1, ncols=1, figsize=(10, 5))

df.plot(ax=ax1,
        color=["red", "blue", "green"],
        logx=True,
        logy=True,
        legend=True);


Note: using the default Raspberry Pi configuration, the baud rate is wrong above 115kbps on GPIO.

To fix this issue, see: