You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
4.8 KiB
161 lines
4.8 KiB
function movepoint_sfunc(block)
|
|
|
|
block.NumInputPorts = 1;
|
|
block.NumOutputPorts = 1;
|
|
|
|
% Setup port properties to be inherited or dynamic
|
|
block.SetPreCompInpPortInfoToDynamic;
|
|
block.SetPreCompOutPortInfoToDynamic;
|
|
|
|
% Override input port properties
|
|
block.InputPort(1).DatatypeID = 0; % double
|
|
block.InputPort(1).Complexity = 'Real';
|
|
block.InputPort(1).Dimensions = 3;
|
|
block.InputPort(1).DirectFeedthrough = true;
|
|
|
|
% Override output port properties
|
|
block.OutputPort(1).DatatypeID = 0; % double
|
|
block.OutputPort(1).Complexity = 'Real';
|
|
block.OutputPort(1).Dimensions = 4;
|
|
|
|
block.NumDialogPrms = 0;
|
|
|
|
% Specify if Accelerator should use TLC or call back into
|
|
% M-file
|
|
block.SetAccelRunOnTLC(false);
|
|
|
|
block.SimStateCompliance = 'DefaultSimState';
|
|
|
|
%block.RegBlockMethod('CheckParameters', @CheckPrms);
|
|
|
|
%block.RegBlockMethod('SetInputPortSamplingMode', @SetInpPortFrameData);
|
|
|
|
%block.RegBlockMethod('SetInputPortDimensions', @SetInpPortDims);
|
|
%block.RegBlockMethod('SetOutputPortDimensions', @SetOutPortDims);
|
|
%block.RegBlockMethod('SetInputPortDataType', @SetInpPortDataType);
|
|
%block.RegBlockMethod('SetOutputPortDataType', @SetOutPortDataType);
|
|
%block.RegBlockMethod('SetInputPortComplexSignal', @SetInpPortComplexSig);
|
|
%block.RegBlockMethod('SetOutputPortComplexSignal', @SetOutPortComplexSig);
|
|
|
|
%% PostPropagationSetup:
|
|
%% Functionality : Setup work areas and state variables. Can
|
|
%% also register run-time methods here
|
|
block.RegBlockMethod('PostPropagationSetup', @DoPostPropSetup);
|
|
|
|
%% Register methods called at run-time
|
|
%% -----------------------------------------------------------------
|
|
|
|
%%
|
|
%% ProcessParameters:
|
|
%% Functionality : Called in order to allow update of run-time
|
|
%% parameters
|
|
%block.RegBlockMethod('ProcessParameters', @ProcessPrms);
|
|
|
|
%%
|
|
%% InitializeConditions:
|
|
%% Functionality : Called in order to initialize state and work
|
|
%% area values
|
|
%block.RegBlockMethod('InitializeConditions', @InitializeConditions);
|
|
|
|
%%
|
|
%% Start:
|
|
%% Functionality : Called in order to initialize state and work
|
|
%% area values
|
|
block.RegBlockMethod('Start', @Start);
|
|
|
|
%%
|
|
%% Outputs:
|
|
%% Functionality : Called to generate block outputs in
|
|
%% simulation step
|
|
block.RegBlockMethod('Outputs', @Outputs);
|
|
|
|
%%
|
|
%% Update:
|
|
%% Functionality : Called to update discrete states
|
|
%% during simulation step
|
|
%% C-Mex counterpart: mdlUpdate
|
|
%%
|
|
%block.RegBlockMethod('Update', @Update);
|
|
|
|
%%
|
|
%% Derivatives:
|
|
%% Functionality : Called to update derivatives of
|
|
%% continuous states during simulation step
|
|
%% C-Mex counterpart: mdlDerivatives
|
|
%%
|
|
%block.RegBlockMethod('Derivatives', @Derivatives);
|
|
|
|
%%
|
|
%% Projection:
|
|
%% Functionality : Called to update projections during
|
|
%% simulation step
|
|
%% C-Mex counterpart: mdlProjections
|
|
%%
|
|
%block.RegBlockMethod('Projection', @Projection);
|
|
|
|
%%
|
|
%% SimStatusChange:
|
|
%% Functionality : Called when simulation goes to pause mode
|
|
%% or continnues from pause mode
|
|
%% C-Mex counterpart: mdlSimStatusChange
|
|
%%
|
|
%block.RegBlockMethod('SimStatusChange', @SimStatusChange);
|
|
|
|
%%
|
|
%% Terminate:
|
|
%% Functionality : Called at the end of simulation for cleanup
|
|
%% C-Mex counterpart: mdlTerminate
|
|
%%
|
|
%block.RegBlockMethod('Terminate', @Terminate);
|
|
|
|
%block.RegBlockMethod('WriteRTW', @WriteRTW);
|
|
end
|
|
|
|
function DoPostPropSetup(block)
|
|
block.NumDworks = 1;
|
|
block.Dwork(1).Name = 'direction';
|
|
block.Dwork(1).Dimensions = 1;
|
|
block.Dwork(1).DatatypeID = 0;
|
|
block.Dwork(1).Complexity = 'Real';
|
|
block.Dwork(1).UsedAsDiscState = false;
|
|
end
|
|
|
|
function Start(block)
|
|
block.Dwork(1).Data = 0;
|
|
end
|
|
|
|
function Outputs(block)
|
|
X = block.InputPort(1).Data;
|
|
|
|
x = X(1); y = X(2); theta = X(3);
|
|
|
|
d = sqrt(x^2 + y^2);
|
|
|
|
if block.Dwork(1).Data == 0
|
|
beta = -atan2(-y, -x);
|
|
alpha = -theta - beta;
|
|
fprintf('alpha %f, beta %f\n', alpha, beta);
|
|
% first time in simulation, choose the direction of travel
|
|
if (alpha > pi/2) || (alpha < -pi/2)
|
|
fprintf('going backwards\n');
|
|
block.Dwork(1).Data = -1;
|
|
else
|
|
fprintf('going forwards\n');
|
|
block.Dwork(1).Data = 1;
|
|
end
|
|
elseif block.Dwork(1).Data == -1
|
|
beta = -atan2(y, x);
|
|
alpha = -theta - beta;
|
|
else
|
|
beta = -atan2(-y, -x);
|
|
alpha = -theta - beta;
|
|
end
|
|
if alpha > pi/2
|
|
alpha = pi/2;
|
|
end
|
|
if alpha < -pi/2
|
|
alpha = -pi/2;
|
|
end
|
|
|
|
block.OutputPort(1).Data = [d alpha beta block.Dwork(1).Data];
|
|
end
|