Skip to content
Snippets Groups Projects
Select Git revision
  • ca35a3cc1baca0b495c73452678ab10c0f7d2013
  • main default protected
  • rosification
  • refactoring
  • pp
  • mpc
  • realtimelogplotter
  • alv
  • gitlab_ci_podman
  • restructuring
  • viz_fix
11 results

smc_yumi_challenge.py

Blame
  • main.m 4.10 KiB
    %% Preliminaries
    clc; close all; clear all
    dmpParams;
    
    % Simulate demonstrated trajectory:
    dt = 1/250;
    t = linspace(0,10,10/dt)';
    traj = max(0,-sin(2*pi*t(1:round(2*end/5))/2.5)); traj = [traj ; traj(end)*ones(50,1)];
    
    % Determine DMP from demonstration:
    T_end = length(traj)*dt;
    tau =T_end/3; % Yields 95% convergence at the deomnstration time
    P = length(traj); % Number of time steps
    w = traj2w(traj,dt, tau, c, D, alpha_z, beta_z, alpha_x, n_kernel); % Basis function weights. Used to determine f.
    g = traj(end); % DMP goal point.
    
    %% Simulate unperturbed DMP
    %Initialize variables
    x = 1; % Phase parameter
    ydot = 0;
    y = zeros(size(traj));
    y(1) = traj(1);
    y0 = y(1);
    yddot_unpert = zeros(size(traj));
    
    % Simulate over time t
    for t = 2:2*P
        yddot  = dmp2acc(y0,y(t-1),ydot,g,tau, w, x, c, D, alpha_z, beta_z); % Get acceleration given DMP and states
        ydot = ydot + yddot*dt;
        y(t) = y(t-1) + ydot*dt;
        xdot = -alpha_x*x/tau;    
        x = x + xdot*dt;
        yddot_unpert(t) = yddot;
    end
    y_unpert = y;
    
    
    %% Simulate DMP execution with stopping perturbation
    %Initialize variables
    x = 1; % Phase variable
    y = zeros(size(traj));
    y(1) = traj(1); % Coupled trajectory
    y0 = y(1); % Start position
    ya = y; % Actual trajectory
    ya_dot = 0;
    e = 0; % Low-pass filtered error state
    ya_ddot_log = zeros(size(y));
    y_ddot_log = zeros(size(y));
    
    % Simulate over time t
    for t = 2:2*P
        tau_adapt = tau*(1+(kc*e^2)); % Adaptive time parameter
        ya_ddot = get_ya_ddot_lowgain_ff(ya(t-1), ya_dot, y(t-1), ydot, yddot); % Get reference accceleration for actual trajectory
        [ydot, yddot]  = dmp2vel_acc_ss(y0, y(t-1), g, tau_adapt, w, x, dt, alpha_e, c, D, alpha_z, beta_z,ya(t-1),e,kc); % Get coupled acceleration and velocit,y given DMP and states
        y(t) = y(t-1) + ydot*dt;
        xdot = -alpha_x*x/tau_adapt;    
        x = x + xdot*dt;
        
        % Stopping perturbation
        ya_dot = ya_dot + ya_ddot*dt;
        if (t > 500 && t < 750)
            ya_dot = 0;
        end
        
        ya(t) = ya(t-1) + ya_dot*dt;
        e_dot = alpha_e*(ya(t)-y(t)-e);
        e = e + e_dot*dt;
        ya_ddot_log(t) = ya_ddot;
        y_ddot_log(t) = yddot;
    end
    t = cumsum(dt*ones(size(y)));
    
    % Plot results
    figure
    subplot(211)
    plot(t(1:10:end),ya(1:10:end),'b-',t(1:10:end),y(1:10:end),'r--', t(1:10:end),y_unpert(1:10:end),'k-.','LineWidth',2)
    legend('y_a','y_c','y_u')
    axis([0 8 -.2 1])
    xlabel('Time [s]')
    ylabel('Position [m]')
    
    subplot(212)
    plot(t(1:10:end),ya_ddot_log(1:10:end),'b-',t(1:10:end),y_ddot_log(1:10:end),'r--', t(1:10:end),yddot_unpert(1:10:end),'k-.','LineWidth',2)
    legend('ÿ_a','ÿ_c','ÿ_u')
    axis([0 8 -20 20])
    xlabel('Time [s]')
    ylabel('Acceleration [m/s^2]')
    
    %% Simulate DMP execution with moving perturbation
    % Initialize variables
    x = 1; % Phase variable
    ydot = 0;
    yddot = 0;
    y = zeros(size(traj));
    y(1) = traj(1);
    y0 = y(1);
    ya = y;
    ya_dot = 0;
    e = 0; % Low-pass filtered error state
    ya_ddot_log = zeros(size(y));
    y_ddot_log = zeros(size(y));
    
    for t = 2:2*P
        tau_adapt = tau*(1+(kc*e^2)); % Adaptive time parameter
        ya_ddot = get_ya_ddot_lowgain_ff(ya(t-1), ya_dot, y(t-1), ydot, yddot); % Get reference accceleration for actual trajectory
        [ydot, yddot]  = dmp2vel_acc_ss(y0, y(t-1), g, tau_adapt, w, x, dt, alpha_e, c, D, alpha_z, beta_z,ya(t-1),e,kc); % Get coupled acceleration and velocit,y given DMP and states
        y(t) = y(t-1) + ydot*dt;
        xdot = -alpha_x*x/tau_adapt;    
        x = x + xdot*dt;
        
        % Moving perturbation
        ya_dot = ya_dot + ya_ddot*dt;
        if (t > 500 && t < 750)
            ya_dot = .15;
        end
        
        ya(t) = ya(t-1) + ya_dot*dt;
        e_dot = alpha_e*(ya(t)-y(t)-e);
        e = e + e_dot*dt;
        ya_ddot_log(t) = ya_ddot;
        y_ddot_log(t) = yddot;
    end
    t = cumsum(dt*ones(size(y)));
    
    % Plot results
    figure
    subplot(211)
    plot(t(1:10:end),ya(1:10:end),'b-',t(1:10:end),y(1:10:end),'r--', t(1:10:end),y_unpert(1:10:end),'k-.','LineWidth',2)
    legend('y_a','y_c','y_u')
    axis([0 8 -.2 1.5])
    xlabel('Time [s]')
    ylabel('Position [m]')
    
    subplot(212)
    plot(t(1:10:end),ya_ddot_log(1:10:end),'b-',t(1:10:end),y_ddot_log(1:10:end),'r--', t(1:10:end),yddot_unpert(1:10:end),'k-.','LineWidth',2)
    legend('ÿ_a','ÿ_c','ÿ_u')
    axis([0 8 -20 20])
    xlabel('Time [s]')
    ylabel('Acceleration [m/s^2]')