nmi-val / analysis / plot_minimum_jerk.py
plot_minimum_jerk.py
Raw
import numpy as np

import matplotlib
matplotlib.rc('figure', max_open_warning = 0)

import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
matplotlib.use('Agg')

def multipage(filename, figs=None):
    pp = PdfPages(filename)
    if figs is None:
        figs = [plt.figure(n) for n in plt.get_fignums()]
        # print("All fig names")
        # print(plt.get_fignums())
    for fig in figs:
        fig.savefig(pp, format='pdf',bbox_inches='tight')
    pp.close()


def mjtg(currents, setpoints, frequency, move_time):
    trajectories = []
    trajectories_vel = []
    for idx in range(len(currents)):
        current = currents[idx]
        setpoint = setpoints[idx]

        trajectory = []
        trajectory_derivative = []
        timefreq = int(move_time * frequency)
        # print("Time freq: %d" % timefreq)
        for time in range(1, timefreq+1):
            trajectory.append(
                current + (setpoint - current) *
                (10.0 * (time/timefreq)**3
                - 15.0 * (time/timefreq)**4
                + 6.0 * (time/timefreq)**5))

            trajectory_derivative.append(
                frequency * (1.0/timefreq) * (setpoint - current) *
                (30.0 * (time/timefreq)**2.0
                - 60.0 * (time/timefreq)**3.0
                + 30.0 * (time/timefreq)**4.0))
        # trajectory.append(trajectory[-1]) # append twice for convenience
        # trajectory.append(trajectory[-1])
        trajectories.append(trajectory)
        trajectories_vel.append(trajectory_derivative)
    
    return np.array(trajectories), np.array(trajectories_vel)

# Set up and calculate trajectory.
# average_velocity = 20.0
# current = 0.0
# setpoint = 180.0
# frequency = 25
# time = (setpoint - current) / average_velocity
freq = 1000
traj, traj_vel = mjtg([0], [1], freq, 1)
traj_vel /= max(traj_vel[0,:])

traj_acc = np.diff(traj_vel, axis=1)*freq
traj_acc /= max(traj_acc[0,:])

traj_jerk = np.diff(traj_acc, axis=1)*freq
traj_jerk /= max(traj_jerk[0,:])

t = np.arange(0,freq,1)/freq
# print(traj_acc.shape)
fig = plt.figure(figsize=(12,4))
plt.subplot(1,2,1)
plt.plot(t, traj[0,:], label="Position")
plt.title("Position")
plt.xlabel("Time [s]")
plt.ylabel("Position [m]")
plt.subplot(1,2,2)
plt.plot(t, traj_vel[0,:], label="Velocity")
plt.plot(t[1:], traj_acc[0,:], label="Acceleration")
plt.plot(t[2:], traj_jerk[0,:], label="Jerk")
plt.legend()
plt.title("Normalised timederivatives of position")
plt.xlabel("Time [s]")
plt.ylabel("Derivatives")
multipage("minimum_jerk.pdf")