Vehicle modelling in moving frame
> restart: libname := libname, "C:/MBSymba": with(MBSymba_r6):LA:=LinearAlgebra:
>
> PDEtools[declare]({u(t),omega(t),delta(t)},prime=t,quiet);
MBSymba release 6 - Copyright (C) 2011 by R. Lot, M. Massaro - University of Padova (Italy)
Definition of the Moving Frame

> use_moving_frame(u(t),0,0,0,0,omega(t)):
Warning, The base frame <moving_frame> has been selected.
> W = VM;

The cehicle CG is located on the origin of the moving frame
> R := origin(moving_frame): show(R);

velocity
> VR := velocity(R): show(VR);

acceleration
> AR := acceleration(R): show(AR);

front tire
> TF := translate(w,0,0) . rotate('Z',delta(t));

contact point
> F := origin(TF): show(F);

> VF := project( velocity(F) , TF): show(VF);

> comp_Y(VF,TF);
> no_sideslip := op(solve({%},{omega(t)}));
![]()
![]()
>
>
>
Vehicle modelling in absolute coordinates
> restart: libname := libname, "C:/MBSymba": with(MBSymba_r6):LA:=LinearAlgebra:
> PDEtools[declare]({x(t),y(t),psi(t),u(t),v(t),omega(t),delta(t)},prime=t,quiet);
MBSymba release 6 - Copyright (C) 2011 by R. Lot, M. Massaro - University of Padova (Italy)
Definition of the vehicleframe Frame

> TV := translate(x(t),y(t),0) . rotate('Z',psi(t));

The cehicle CG is located on the origin of the moving frame
> R := origin(TV): show(R);

velocity
> VR := project(velocity(R),TV): show(VR);

acceleration
> AR := project(acceleration(R),TV): show(AR);

introducuction of holonomic constraints
> no_rear_sideslip := op(solve ( [comp_X(VR)=u(t) , comp_Y(VR)=0] , diff([x(t),y(t)],t)));
![]()
> VR[comps] := simplify(subs(no_rear_sideslip,VR[comps])): show(VR);

> AR := project(velocity(VR),TV): show(AR);

Vehicle modelling in moving frame and trajectory tracking
> restart: libname := libname, "C:/MBSymba": with(MBSymba_r6):LA:=LinearAlgebra:
> PDEtools[declare]({omega(t),delta(t) , x(t),y(t),psi(t)},prime=t,quiet);
MBSymba release 6 - Copyright (C) 2011 by R. Lot, M. Massaro - University of Padova (Italy)
Definition of the Moving Frame

> TV := translate(x(t),y(t),0) . rotate('Z',psi(t));

> track_eqns := use_moving_frame(u,0,0,0,0,omega(t) , TV):
track_eqns; Vector(track_eqns);
Warning, The base frame <moving_frame> has been selected.
![]()

> track_ODE := op(solve(track_eqns, diff( [x(t),y(t),psi(t)],t) )): Vector(track_ODE);

front tire without sideslip
> TF := translate(w,0,0) . rotate('Z',delta(t));

contact point
> F := origin(TF): show(F);

> VF := project( velocity(F) , TF): show(VF);

> comp_Y(VF,TF);
> no_sideslip := op(solve({%},{omega(t)}));
![]()
![]()
> track_ODE := subs(no_sideslip, track_ODE): Vector(%);

Numerical simulation
> w := 2.2; wheelbase
> u := 25; vehicle (constant) speed
> delta := t -> piecewise(t<1,0 ,t<2, 0.1*(t-1), t<4.5, 0.1, 0):
plot( delta(t),t=0..5,title="Steering angle [rad]",thickness=2);
![]()
![]()

> motion := dsolve( track_ODE union [x(0)=1,y(0)=2,psi(0)=0.3], type=numeric, range=0..6):
> plots[odeplot](motion,[ [ x(t), y(t), color=blue,thickness=2 ]] , labels=["x [m]","y [m]"], scaling=constrained);
