close all;
clear all;
clc;
format short
global xInrun yInrun xPs yPs dydxInrun kurvature xExtInrun yExtInrun ext
global m CdA mu eta g h
global xland yland xLanding yLanding
global thetaAp thetaTo thetaPs
global xImpact yImpact vImpact
global xInr yInr
ft2m=12/39.37;
m2ft=1/ft2m;
deg2rad=pi/180;
mps2mph=2.237;
mph2mps=1/mps2mph;
CdA = 0.279
rho0 = 1.1839;
T0=298.15;
Y0=8772.;
T=0+T0;
Y=3870;
rho=rho0*exp(-T0*Y/T/Y0)*T0/T
g = 9.81
m = 60
mu = 0.1
eta = (CdA*rho)/(2*m)
thetaPs = 21*deg2rad;
thetaAp = thetaPs;
thetaTo = 20.6*deg2rad;
xRiderStart = 50
h=1.125;
xPs = 0:1:500;
yPs = -xPs*tan(thetaPs);
NUMPOINTS = 100;
LengthAp = 60;
LengthTo = 3;
RadiusTr = 9;
yRiderStart = interp1(xPs, yPs, xRiderStart);
xTrStart = xRiderStart + LengthAp*cos(thetaAp);
yTrStart = yRiderStart-LengthAp*sin(thetaAp);
xToStart = xTrStart + RadiusTr*sin(thetaAp) + RadiusTr*sin(thetaTo);
yToStart = yTrStart - (RadiusTr*cos(thetaTo) - RadiusTr*cos(thetaAp));
xToEnd = xToStart + LengthTo*cos(thetaTo);
yToEnd = yToStart + LengthTo*sin(thetaTo);
xAp = linspace(xRiderStart,xTrStart,NUMPOINTS);
yAp = xAp.*-tan(thetaAp);
xTrOrigin = xTrStart + RadiusTr*sin(thetaAp);
yTrOrigin = yTrStart + RadiusTr*cos(thetaAp);
xTr = linspace(xTrStart,xToStart,NUMPOINTS);
yTr = yTrOrigin - sqrt(RadiusTr*RadiusTr-(xTr-xTrOrigin).*(xTr-xTrOrigin));
xTo = linspace(xToStart,xToEnd,NUMPOINTS);
ext = 10;
xTo = [xTo + ext];
yTo = yToStart + (xTo-xToStart).*tan(thetaTo);
x = [xAp(1:(end-1)), xTr(1:(end-1)), xTo];
y = [yAp(1:(end-1)), yTr(1:(end-1)), yTo];
xInrun = linspace(x(1),x(end),500);
xInrunBeg = xInrun(1);
xInrunEnd = xInrun(end);
yInrun = interp1(x,y,xInrun);
dydxInrun = [0 diff(yInrun)./diff(xInrun)];
ddydxInrun = [0 diff(dydxInrun)];
kurvature = ddydxInrun./(1+dydxInrun.^2).^1.5;
tF=20;
dt=0.01;
tspan=0:dt:tF;
options = odeset('Events',@takeoff_event, 'RelTol', 1e-6);
stateInr_0 = [xRiderStart 1.2];
[ti,stateInr_i,tei,yei,iei]=ode15s(@inrun,tspan,stateInr_0,options);
tstateei=[tei yei iei]
xInr=stateInr_i(:,1);
yInr = interp1(xInrun, yInrun, xInr);
vInr=stateInr_i(:,2);
-----------------------------------------
function [value,isterminal,direction] = takeoff_event(t,state)
global xInrun ext xToStart
x=state(1);
value(1)=x-xToStart;
isterminal(1)=0;
direction(1)=1;
xTo=xInrun(end)-ext;
value(2)=x-xTo;
isterminal(2)=1;
direction(2)=1;
return
-----------------------------------------
function [ stateIRdot ] = inrun(t,stateIR)
global xInrun yInrun dydxInrun kurvature
global m CdA mu eta g
x=stateIR(1);
v=stateIR(2);
dydx=interp1(xInrun,dydxInrun,x);
k=interp1(xInrun,kurvature,x);
theta=atan(dydx);
stateIRdot=[0 0]';
stateIRdot(1)=v*cos(theta);
N=m*(g*cos(theta)+k*v*v);
stateIRdot(2)=-g*sin(theta)-eta*v*v-mu*N*sign(v)/m;
txvstatedot=[t x v stateIRdot'];
end