Jumbo Crane Container Control

Contents

Problem description

Time-optimal control of a Jumbo Container Crane avoiding an obstacle.

Crane dynamics described in the book: Informatics in control automation and robotics II DOI 10.1007/978-1-4020-5626-0 , Springer, 2007, pp.79-84. T.J.J. van den Boom, J.B. Klaassens, R. Meiland Real-time optimal control for a non linear container crane using a neural network

Optimal control problem by: W.L. De Koning, G Fitie and L.G. Van Willigenburg

Programmers: Gerard Van Willigenburg (Wageningen University) Willem De Koning (retired from Delft University of Technology)

% Copyright (c) 2009-2009 by Tomlab Optimization Inc.

Problem setup

% Array with consecutive number of collocation points
narr = [10 10 40];

toms t tf % Free final time

toms ho1

for i=1:length(narr)
    p = tomPhase('p', t, 0, tf, narr(i), [], 'cheb');
    setPhase(p)

    tomStates x1 x2 x3 x4 x5 x6
    tomControls u1 u2

    x = [x1; x2; x3; x4; x5; x6];

    % Crane parameters
    gr = 9.81;  He = 50;    Jh = 35.6;  Jt = 13.5;  le = 40;  ht = 50;
    mc = 47000; mt = 33000; Nh = 26.14; Nt = 16.15; rh = 0.6; rt = 0.5;
    xol = 8;    xor = 15;   hob = 15;

    % Initial & terminal states
    xi = [0;  0; 0; 0; 50; 0];
    xf = [50; 0; 0; 0; 50; 0];

    % Initial guess
    if i==1;
       x0 = {tf==20.4; ho1==0; icollocate({x1 == 50*t/20; x2 == xi(2)
            x3 == xi(3); x4 == xi(4); x5 == xi(5); x6 == xi(6)})
            collocate({u1 == -2000; u2 == -5000})};
    else
        x0 = {tf==tfopt;
            icollocate({x1 == xopt1; x2 == xopt2
            x3 == xopt3; x4 == xopt4; x5 == xopt5; x6 == xopt6})
            collocate({u1 == uopt1; u2 == uopt2})};
    end

    % Box constraints
    cbox = {15 <= tf <= 30; -4200 <= collocate(u1) <= 4200
        -11490 <= collocate(u2) <= 11490};

    % Boundary constraints
    cbnd = {initial(x == xi), final(x == xf)};

    Gt  = Jt*Nt*Nt/(rt*rt); Gh = Jh*Nh*Nh/(rh*rh);
    st  = sin(x3); ct = cos(x3);
    Ft  = (Nt/rt)*u1; Fh = (Nh/rh)*u2;
    d2x = (mc+Gh)*Ft-mc*Fh.*st+mc*gr*Gh*st.*ct+mc*Gh*x5.*x4.*x4.*st;
    d2x = d2x./((mc+Gh)*(mt+Gt)+mc*Gh*(1-ct.*ct));

    % xc is the container x position against time
    xc = x1+x5*sin(x3);
    % hc is the height of the container against time
    hc = ht-x5*cos(x3);
    % ho is the height of the obstacle at the container x position.
    %ho = ifThenElse(xc<=xol,0,ifThenElse(xc>=xor,0,hob));
    % do is the distance to the obstacle from the container.
    do = max(max(xol-xc,xc-xor),hc-ho1);

    % Path constraint - Distance to obstacle should always be >= 0
    % and height should always be >= 0.
    % Test 300 points, evenly spaced in time.
    pth = {atPoints(linspace(0,tf,300),{do>=0,hc>=0}),ho1>=hob};

    % ODEs
    ode = collocate({
        dot(x1) == x2
        dot(x2) == d2x
        dot(x3) == x4
        dot(x4) == (-2*x6.*x4-gr*st-d2x.*ct)./x5
        dot(x5) == x6
        dot(x6) == (Fh+mc*x5.*x4.*x4+mc*gr*ct-mc*d2x.*st)/(mc+Gh)
        });

    % Objective
    objective = tf;

Solve the problem

    options = struct;
    if i==1
        % To improve convergece, we make the obstacle constraint softer,
		% by including it in the ojbective rather than as a hard constraint
		% in the first iteration.
		% This is necessary because of the very nonlinear properties of this
		% constraint.
        pth = pth{1};
        objective = objective - 2*ho1;
    end
    options.name = 'Crane with obstacle';
    solution = ezsolve(objective, {cbox, cbnd, pth, ode}, x0, options);

    tfopt = subs(tf,solution);
    xopt1 = subs(x1,solution);
    xopt2 = subs(x2,solution);
    xopt3 = subs(x3,solution);
    xopt4 = subs(x4,solution);
    xopt5 = subs(x5,solution);
    xopt6 = subs(x6,solution);
    uopt1 = subs(u1,solution);
    uopt2 = subs(u2,solution);
Problem type appears to be: lpcon
===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2010-02-05
=====================================================================================
Problem: ---  1: Crane with obstacle            f_k     -34.674715981432669000
                                       sum(|constr|)      0.000000101978588531
                              f(x_k) + sum(|constr|)    -34.674715879454084000
                                              f(x_0)     20.399999999999999000

Solver: snopt.  EXIT=0.  INFORM=1.
SNOPT 7.2-5 NLP code
Optimality conditions satisfied

FuncEv    1 ConstrEv  356 ConJacEv  356 Iter   95 MinorIter 8525
CPU time: 6.875000 sec. Elapsed time: 6.891000 sec. 
Problem type appears to be: lpcon
===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2010-02-05
=====================================================================================
Problem: ---  1: Crane with obstacle            f_k      23.843382233623789000
                                       sum(|constr|)      0.000000280437766914
                              f(x_k) + sum(|constr|)     23.843382514061556000
                                              f(x_0)     30.000000000000000000

Solver: snopt.  EXIT=0.  INFORM=1.
SNOPT 7.2-5 NLP code
Optimality conditions satisfied

FuncEv    1 ConstrEv   17 ConJacEv   17 Iter   13 MinorIter  168
CPU time: 0.406250 sec. Elapsed time: 0.406000 sec. 
Problem type appears to be: lpcon
===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2010-02-05
=====================================================================================
Problem: ---  1: Crane with obstacle            f_k      19.558349883431084000
                                       sum(|constr|)      0.012120632528751712
                              f(x_k) + sum(|constr|)     19.570470515959837000
                                              f(x_0)     23.843382233623789000

Solver: snopt.  EXIT=0.  INFORM=1.
SNOPT 7.2-5 NLP code
Optimality conditions satisfied

FuncEv    1 ConstrEv  102 ConJacEv  102 Iter   44 MinorIter 2859
CPU time: 8.187500 sec. Elapsed time: 8.234000 sec. 
end

% Get solution for 50 points, evenly distributed in time.
nt = 50;
topt = linspace(0,subs(tf,solution),nt);
xopt = subs(atPoints(topt,x),solution);

% Plot
[nt,nx]=size(xopt);

clf
axis([-10 60 0 50]);
axis image;

% Draw Obstacle
line([xol xol xor xor],[0 hob hob 0]);
title('Crane cable trajectory and obstacle');

if nx==6
    xtop=xopt(:,1); ytop=50*ones(size(topt));
    xbottom=xopt(:,1)+xopt(:,5).*sin(xopt(:,3));
    ybottom=50-xopt(:,5).*cos(xopt(:,3));
elseif nx==4
    xtop=xopt(:,1); ytop=50*ones(size(topt));
    xbottom=xopt(:,1)+40*sin(xopt(:,3));
    ybottom=50-40*cos(xopt(:,3));
else
    error('Crane model should have 4 or 6 state variables');
end

% Draw cable trajectory
tl=5; lt=length(topt);
for k=1:lt
    line([xtop(k) xbottom(k)],[ytop(k) ybottom(k)]);
    if tl/lt>0.01; pause(tl/lt); end
end
hold on
ezplot(xc,hc);
hold off
xlabel('X coordinate'); ylabel('Y coordinate');