Raw File

%% Set up the path
clear; close all;
clc; beep off; 
currentFolder = pwd
addpath(genpath(currentFolder));
%%
speed_str = 'HallwayExperimentApprox1_50';%'alpha3_HallwayExperimentApprox1_0'%'HallwayExperimentApprox1_50'
load(strcat('w_',speed_str),'w'); 
w0 = w; clear w; alpha = get(w0,'alpha');
[stepLenNomRW, stepTimeNomRW, nominalP_RW, nominalLegSpeedRW, nominalPushOffWorkRW, nominalStepSpeedRW, nominalMiddleStanceTimeRW, nominalHeelStrikeWorkRW,...
    nominalHipTorqeWithoutPushOff, xsNomWithMS, tsNomWithMS, vintermsNom] = loadNominalsRW(w0, speed_str);

xInd = find(xsNomWithMS(:,1)==0) ;
nominalLegMSSpeedRW = xsNomWithMS(xInd,2);
x_init = xsNomWithMS(xInd, :);

variableStepLenFlag = 0;
constantSpeedFlag = 0;
constantTimeFlag = 0;
minimizeHorizontalPushfOffFlag = 0;

% select the terrain: oU, oD, UnD, oD2FFsBump (refers to DnUP), pyramid, longUnevenA (refers to complex 1), longUnevenB (refers to complex 2)
% if you select oU_no_opt it walks over oU without optimizing, 
% level_no_opt01  flat terrain no optimization
trialTypeTempStr = 'longUnevenB';%'UnD';%'level_no_opt01';%';%'traj';%''oD2FFsBump';%'pyramid';%'longUnevenA';%';% _variableStepLenOLDver  'oD';%'oU';%UnD_variableStepLen' 'level_no_opt16';%'pyramid';%'oD2FFsBump';;%'oU'%';%'oU';%'longUnevenA';

if strfind(trialTypeTempStr, 'variableStepLen')
    variableStepLenFlag = 1; 
    nominalSpeedForVariableStep = abs(nominalLegMSSpeedRW);
end

runNonLinModel = 0;
latePushOffFlag = 0;
includeHipTorqueFlag = 0;

%figure
FZ = 15; LW = 1;
colors = jet(length(1 ));% colors = jet(length(bumps_heights )); %colors = [1 0 0; 0 0 1; 0 0 0;  1 0 1; 0 1 1; 0 1 1];% r b k m c c
color_index = 1; color_index_diff = 1;
%********************************************************************************

options = optimset('algorithm', 'sqp', 'MaxFunEvals', 20000, 'Display', 'iter-detailed', 'TolX', 1e-8);% 50000,'TolFun',1e-8,'TolCon',1e-7); %'iter-detailed'

% i = 1; %no loop now
numStepsBefore = 6; % 6 ORIGIAL Numsteps = numStepsAfter +  numStepsBefore  + bumps. % MS when numStepsAfter =  numStepsBefore it's symmetric for oU and oD.
numStepsAfter =  numStepsBefore;

stdVal = [], offsetBump = [], uniformScale = []; bumpsHeightTraj = [];

%if running a traj
% bumHeightDimless = [0.125 -0.125];%0.075 is 3 inched 0.125 is 5 inches this is like 7.5cm
% bumpsHeightTraj = asin(bumHeightDimless/(2*sin(alpha)));

[bumps, numSteps, optimationOnFlag, constantTimeFlag ] = setBumps2v3(numStepsBefore, numStepsAfter, trialTypeTempStr, alpha, stdVal, offsetBump, uniformScale, bumpsHeightTraj);
boundPushOffBegin = []; boundPushOffEnd = [];
[params, lb, ub] = setInitialParamsNBoundsForRW_v2(numSteps, nominalP_RW, runNonLinModel, stepTimeNomRW, boundPushOffBegin, boundPushOffEnd)

w = set(w0,'bumps', bumps);         
tsTemp2 = []; xsTemp2 = []; %this are required when tere is no optimization
if optimationOnFlag          
    % cost 
    if variableStepLenFlag
        fcost = @(params)f_minimizeOptimalCostRW2_MStoMSvariableAlpha(w, params, latePushOffFlag, x_init, nominalSpeedForVariableStep);
    elseif constantTimeFlag
        fcost = @(params)f_minimizeOptimalCostRW2_MStoMS_constTime(w, params, x_init, stepTimeNomRW, latePushOffFlag);
    elseif minimizeHorizontalPushfOffFlag
        fcost = @(params)f_minimizeOptimalCostRW2_MStoMSminimizeHorizontalPushfOff(w, params, latePushOffFlag, x_init);
    else
        fcost = @(params)f_minimizeOptimalCostRW2_MStoMS(w, params); 
    end
   
    %constraint
    desiredTime = stepTimeNomRW*numSteps;
    
    if variableStepLenFlag
        fconstraint = @(params)gaitConstraintsForUnevenTerrainRW2_MStoMSvariableStepLen(params, w,  desiredTime, nominalLegMSSpeedRW, latePushOffFlag, x_init, nominalSpeedForVariableStep)
    elseif constantTimeFlag
        fconstraint = @(params)gaitConstraintsForUnevenTerrainRW2_MStoMS_constantTime(params, w, nominalLegMSSpeedRW, latePushOffFlag, x_init)
    elseif constantSpeedFlag
        fconstraint = @(params)gaitConstraintsForUnevenTerrainRW2_MStoMS_constantSpeed(params, w, nominalLegMSSpeedRW, latePushOffFlag, x_init)  
    else
        fconstraint = @(params)gaitConstraintsForUnevenTerrainRW2_MStoMS(params, w,  desiredTime, nominalLegMSSpeedRW, latePushOffFlag, x_init);
    end
    
    % optimize
    [optctrls, fval, exitflag, output, lambda, grad, hessian] = fmincon(fcost, params, [], [], [], [], lb, ub, fconstraint,options); 
    
    if exitflag ~= 1
        warning('Fmincon can not optimize \n');
        keyboard;
    end   

    %stop if the optimal solution hits to the upper bound this is %not reaseonable to do if there are limited PO's also just %check for upper bound PO can be zero
    optctrlsTocheck = optctrls(find(optctrls ~= nominalP_RW));%<--------ASSUMES first row is push ofss
    if ~isempty(find(optctrlsTocheck == max(ub(1,:)))) || ~isempty(find(optctrls == min(lb))) %<--------ASSUMES first row is push ofss
       error('hiting the bounds');
    end

    % regenerate    INCLUDE non line. model later      
    if variableStepLenFlag
        [xc, tc, xs, ts, energies, indices, vinterms] = onestep3_MStoMSvariableAlpha(w, x_init, [], optctrls, latePushOffFlag, nominalSpeedForVariableStep);  %Original 
    else
        [xc, tc, xs ,ts, energies, indices, vinterms] = onestep3_MStoMS(w, x_init, [], optctrls, latePushOffFlag);   
    end
             
else %NO OPTIMIZATION       
      optctrls = ones(1,numSteps(1))*nominalP_RW;
      [xc,tc,xs,ts,energies,indices, vinterms] = onestep3_MStoMS(w, x_init,[], optctrls, latePushOffFlag); 
end

outputORG = getSpeedWorkTimeGainRw2(xs, ts, indices, energies, optctrls, bumps, nominalPushOffWorkRW, stepLenNomRW, stepTimeNomRW);

figSpeed = figure; hold on;
plot(outputORG.timeMS_wrtHS, outputORG.speedMS , 'color', colors(1,:),'linewidth', LW);  plot(outputORG.timeMS_wrtHS, outputORG.speedMS,'.', 'markersize', 15, 'color', colors(1,:));
plot([0 0], ylim,'k-.','linewidth', LW); plot(xlim, -[nominalLegMSSpeedRW nominalLegMSSpeedRW], 'k--','linewidth', LW);   xlabel('time mid stance wrt on bump heel strike(dim.less)'); ylabel('angular vel mid stance');title(trialTypeTempStr);

figTimeGain = figure;
fms = plot(outputORG.timeMS, outputORG.timeGainMS, 'color', colors(1,:),'linewidth', LW); hold on; plot(outputORG.timeMS, outputORG.timeGainMS,'.', 'markersize', 15, 'color', colors(1,:));
plot(xlim, [0 0], 'k--','linewidth', LW); xlabel('time mid stance (dim.less)'); ylabel('time gain mid stance'); title(trialTypeTempStr);
fhs = plot(outputORG.timeMS, outputORG.timeGainHS,'r','linewidth', LW); plot(outputORG.timeMS, outputORG.timeGainHS,'r.','linewidth', LW, 'markersize', 15);  %you took out the inital optimal step
plot([0 0], ylim,'k-.','linewidth', LW); legend([fms fhs], 'Mid Stance time gain', 'Heel strike time gain')


figSpeedImu = figure;
plot(outputORG.timeNormalized, -xs(:, 2) , 'color', colors(1,:),'linewidth', LW); hold on; %
plot(outputORG.timeMS, outputORG.speedImu , 'color', colors(1,:),'linewidth', LW); hold on; plot(outputORG.timeMS, outputORG.speedImu,'.', 'markersize', 15, 'color', colors(1,:));
plot([0 0], ylim,'k-.','linewidth', LW); plot(xlim, [nominalStepSpeedRW nominalStepSpeedRW], 'k--','linewidth', LW);  ylim([0 0.8]); xlabel('time mid stance (dim.less)'); ylabel('imu speed'); title(trialTypeTempStr);

back to top