注:これは初めてのMATLAB S関数を使用したもので、Simulinkを使用したことがあります。s関数の直接フィードスルー
S機能の入力変数inp
を使用しようとすると、3
にNaN
が返されます。システムへの入力は、バス作成者を介してシステムに接続された3つの単純なステップ関数である。システムをシミュレートしようとすると、エラーメッセージが表示されます。inp
でテストプリントを実行してNaNであることがわかりました。何か案は?
詳細:
私はクラスのプロジェクトとしてセグウェイをシミュレートしています。 Simulinkのアクチュエータ(DCモータ)とプラント(Segway自体)を別々のS-functionブロックとしてシミュレートしています。モータは3つの入力をとります:電圧、セグウェイの速度、およびピッチ軸に関連する角速度セグウェイ(逆起電力による)。出力は電機子電流です。
これはシンプルでリニアな非差動システムです。そのため、州は存在しません。実行される唯一の計算は、入力から出力へのフィードスルーです。次のようにコードは次のとおりです。
function [sys,X0]=nl_pend(time,state,inp,FLAG,ICs);
% actuator parameters:
% R_m: motor armature resistance
% K_b: motor back emf constant
% K_t: motor torque constant
% r: radius of the wheel
global R_m K_b K_t r;
if FLAG == 0, % initialize system parameters and states
% Call file that initializes parameters
segway_dcmotor_pars;
% This system has:
% 0 states (theta,thetatheta_dot),
% 3 input (v,x_dot,theta_dot),
% 1 outputs (i)
nx = 0; % # of states
nu = 3; % # of inputs
ny = 1; % # of outputs
sys = [nx; 0; ny; nu; 0; 0];
% Initial Conditions (will be passed as and argument)
X0 = ICs;
elseif FLAG == 1, % states derivatives
%blank
elseif FLAG == 3, % system outputs
%inp(1) = motor voltage
%inp(2) = segway velocity
%inp(3) = segway pitch angular velocity
display(inp);
y(1) = (1/R_m)*inp(1) - (K_b/(r*R_m))*inp(2) + (K_b/R_m)*inp(3);
sys = y;
else,
sys = [];
end
まあ、私は解決策を見つけたを設定する必要がありますので、それは、直接フィードスルーです。私は状態を持たずに、アーマチュアの電荷である単一の状態qを持つように変更しました。 これは解決策ではないので、私は最初の方法がうまくいかなかった理由について質問を開いたままにします。 – Ataraxia