Unicycle Model

Unicycle Model

Given:

A unicycle trying to get to the goal

Dynamic Constraints

\[\dot{x}_1(t)=x_4(t)cos(u_1(t))\]
\[\dot{x}_2(t)=x_4(t)sin(u_1(t))\]
\[\dot{x}_3(t)=u_1(t)\]
\[\dot{x}_4(t)=u_2(t)\]

Boundary Conditions

\[{x}_1(0)=0 \qquad {x}_1(t_f)=free\]
\[{x}_2(0)=pi/2\qquad {x}_2(t_f)=free\]
\[{x}_3(0)=0.5\qquad {x}_3(t_f)=free\]
\[{x}_4(0)=0\qquad {x}_4(t_f)=free\]

Find:

The control signals that minimize distance to goal $(x_g,y_g)$ within $tplan$

\[J=({x}_1(t_f)-x_g)^2 + ({x}_2(t_f)-y_g)^2)\]

Solution:

Packages that will be used

using NLOptControl, PrettyPlots

Define the Problem

Next let's write down the boundary conditions into an array:

X0=[0,0,pi/2,0]
XL=[-10,-10,-pi,0]
XU=[10,10,pi,1]
CL=[-1,-3]
CU=[1,3]

Define the Problem

n = define(numStates=4,numControls=2,X0=X0,XL=XL,XU=XU,CL=CL,CU=CU)

State and Control Names

names=[:x,:y,:psi,:ux]
descriptions=["X (m)","Y (m)","Yaw Angle (rad)","Longitudinal Velocity (m/s)"]
states!(n,names,descriptions=descriptions)
names = [:r,:ax]
descriptions=["Yaw Rate (rad/s)","Longitudinal Acceleration (m/s^2)"];
controls!(n,names,descriptions=descriptions)

Differential Equations

dx = [:(ux[j]*cos(psi[j])),:(ux[j]*sin(psi[j])),:(r[j]),:(ax[j])]
dynamics!(n,dx)

Define and Configure the Problem:

tplan = 7.0
configure!(n;(:Nck=>[50]),(:finalTimeDV=>false), (:tf=>tplan))

Objective Function

x = n.r.ocp.x[:,1]; y = n.r.ocp.x[:,2]; # pointers to JuMP variables
xg = -2; yg = 4;
@NLobjective(n.ocp.mdl, Min, (x[end]-xg)^2 + (y[end]-yg)^2)

Optimize

optimize!(n)

Post Process

plotSettings(;(:size=>(700,700)))
allPlots(n)

Taking a closer look at the position:

plotSettings(;(:size=>(400,400)));
statePlot(n,1,1,2;(:lims=>false))
xlims!(-3,2);
ylims!(0,5);