derivative
ビークルの状態の時間微分
説明
は、運動モデルが stateDot = derivative(motionModel,state,cmds)bicycleKinematics、differentialDriveKinematics、または unicycleKinematics オブジェクトの場合、現在の状態微分 stateDot を 3 要素ベクトル [xDot yDot thetaDot] として返します。
運動モデルが ackermannKinematics オブジェクトの場合は、stateDot を 4 要素ベクトル [xDot yDot thetaDot psiDot] として返します。xDot および yDot はメートル/秒単位で指定されるビークルの速度を参照します。thetaDot はビークルの向きの角速度、psiDot はビークルのステアリングの角速度であり、どちらもラジアン/秒単位で指定します。
articulatedSteeringKinematics 運動モデルについては、stateDot を 4 要素ベクトル [xDot yDot thetaDot gammaDot] として返します。xDot および yDot はメートル/秒単位で指定されるビークルの速度を参照します。thetaDot は前車体の角速度、gammaDot は後車体を基準とした前車体の角速度であり、どちらもラジアン/秒単位で指定します。
例
ステアリング角度に拘束があるアッカーマン ステアリングを使用するモバイル ロボット モデルをシミュレートします。シミュレーション時にステアリング制限に達すると、モデルは最大ステアリング角度を維持します。ステアリングの飽和の影響を確認するには、1 台はステアリング角度に拘束があり、もう 1 台はステアリングに拘束が何もない、2 台のロボットの軌跡を比較します。
モデルの定義
アッカーマン運動学モデルを定義します。この自動車型モデルでは、前輪は指定された距離だけ離れています。これらが同心円で確実に旋回するように、車輪は異なるステアリング角度をもちます。旋回時に、前輪はステアリング角度の変化率としてステアリング入力を受け取ります。
carLike = ackermannKinematics;
シミュレーション パラメーターの設定
定数線形速度に従って一定のステアリング速度を入力として受け取るようにモバイル ロボットを設定します。拘束付きのロボットをより長時間シミュレートして、ステアリングの飽和を示します。
velo = 5; % Constant linear velocity psidot = 1; % Constant left steering rate % Define the total time and sample rate sampleTime = 0.05; % Sample time [s] timeEnd1 = 1.5; % Simulation end time for unconstrained robot timeEnd2 = 10; % Simulation end time for constrained robot tVec1 = 0:sampleTime:timeEnd1; % Time array for unconstrained robot tVec2 = 0:sampleTime:timeEnd2; % Time array for constrained robot initPose = [0;0;0;0]; % Initial pose (x y theta phi)
ODE ソルバーのオプション構造体の作成
この例では、options 構造体を ODE ソルバーの引数として渡します。options 構造体には、ステアリング角度の制限に関する情報が格納されています。options 構造体を作成するには、odesetの Events オプションと、作成されたイベント関数 detectSteeringSaturation を使用します。detectSteeringSaturation は最大ステアリング角度を 45 度に設定します。
detectSteeringSaturation を定義する方法の詳細については、この例の最後にある "イベント関数の定義" を参照してください。
options = odeset('Events',@detectSteeringSaturation);ODE ソルバーを使用したモデルのシミュレーション
次に、関数 derivative と ODE ソルバーode45を使用して、モデルを解決し、解を生成します。
% Simulate the unconstrained robot [t1,pose1] = ode45(@(t,y)derivative(carLike,y,[velo psidot]),tVec1,initPose); % Simulate the constrained robot [t2,pose2,te,ye,ie] = ode45(@(t,y)derivative(carLike,y,[velo psidot]),tVec2,initPose,options);
ステアリングの飽和の検出
ステアリング制限に達すると、モデルはそのイベントのタイムスタンプを登録します。制限に達するまでの時間は te に保存されます。
if te < timeEnd2 str1 = "Steering angle limit was reached at "; str2 = " seconds"; comp = str1 + te + str2; disp(comp) end
Steering angle limit was reached at 0.785 seconds
新しい初期条件を使用した拘束付きロボットのシミュレーション
次に、統合の終了前に、2 回目のシミュレーションの初期条件として拘束付きロボットの状態を使用します。入力ベクトルを変更して、ステアリング速度がゼロに設定されたステアリングの飽和を表します。
saturatedPsiDot = 0; % Steering rate after saturation cmds = [velo saturatedPsiDot]; % Command vector tVec3 = te:sampleTime:timeEnd2; % Time vector pose3 = pose2(length(pose2),:); [t3,pose3,te3,ye3,ie3] = ode45(@(t,y)derivative(carLike,y,cmds),tVec3,pose3,options);
結果のプロット
plot と、pose に保存されたデータを使用してロボットの軌跡をプロットします。
figure(1) plot(pose1(:,1),pose1(:,2),LineWidth=2) hold on plot([pose2(:,1); pose3(:,1)],[pose2(:,2);pose3(:,2)]) title("Trajectory X-Y") xlabel("X") ylabel("Y") legend("Unconstrained Robot","Constrained Robot",Location="northwest") axis equal

ステアリングの制限に達すると、拘束なしロボットは曲率の半径が減少するらせん状の軌跡を追従し、拘束付きロボットは曲率の半径が一定である円形の軌跡を追従します。
イベント関数の定義
4 番目の状態 theta が最大ステアリング角度と等しくなると統合が終了するようにイベント関数を設定します。
function [state,isterminal,direction] = detectSteeringSaturation(t,y) maxSteerAngle = 0.785; % Maximum steering angle (pi/4 radians) state(4) = (y(4) - maxSteerAngle); % Saturation event occurs when the 4th state, theta, is equal to the max steering angle isterminal(4) = 1; % Integration is terminated when event occurs direction(4) = 0; % Bidirectional termination end
二輪の運動学モデルを作成します。
model = bicycleKinematics;
状態を 4 つ設定し、それぞれの状態の制御コマンドを設定します。
state = [0 0 0;
1 1 0;
2 2 0;
3 3 0];
control = [0.1 pi/10;
1.0 pi/10;
5.0 pi/10;
9.0 pi/10];すべての制御コマンドの状態微分を計算します。
stateDot = model.derivative(state,control)
stateDot = 3×4
0.1000 1.0000 5.0000 9.0000
0 0 0 0
0.0325 0.3249 1.6246 2.9243
入力引数
運動モデルのプロパティを定義する移動運動学モデル オブジェクト。ackermannKinematics、bicycleKinematics、differentialDriveKinematics、unicycleKinematics、または articulatedSteeringKinematics オブジェクトとして指定します。
現在のビークルの状態。motionModel 入力に応じて 3 要素または 4 要素ベクトルとして返されます。
unicycleKinematics––[x y theta]bicycleKinematics––[x y theta]differentialDriveKinematics––[x y theta]ackermannKinematics––[x y theta psi]articulatedSteeringKinematics––[x y theta gamma]
すべてのビークル運動モデルについて、x および y はメートル/秒単位で指定されるビークルの位置を参照し、theta はラジアン単位で指定されるビークルの向きです。ackermannKinematics 運動モデルの psi はビークルのステアリング角度、articulatedSteeringKinematics 運動モデルの gamma は連結角度であり、どちらもラジアン単位で指定します。連結角度は、連結ステアリングをもつビークル モデルの後車体を基準とした前車体のステアリング角度を指します。
state を運動モデルに応じて N 行 3 列または N 行 4 列の行列として指定することで、複数の状態を指定できます。各行が状態に対応します。状態の数は 1 またはコマンドの数と等しくなければならないことに注意してください。状態を 1 つ指定する場合、cmds の各コマンドを使用してその状態の微分が計算されます。等しい数の状態とコマンドを指定すると、対応するコマンドを使用して各状態の微分が計算されます。
運動モデルへの入力コマンド。運動モデルに応じて 2 要素ベクトルまたは N 行 2 列の行列として指定します。cmds が N 行 2 列の行列の場合、各行がコマンドになります。
ackermannKinematics オブジェクトの場合、コマンドは [v psiDot] です。
articulatedSteeringKinematics オブジェクトの場合、コマンドは [v gammaDot] です。
その他の運動モデルの場合、motionModel の VehicleInputs プロパティによってコマンドの形式が決まります。
"VehicleSpeedSteeringAngle"––[v psiDot]"VehicleSpeedHeadingRate"––[v omegaDot]"WheelSpeedHeadingRate"(unicycleKinematicsのみ) ––[wheelSpeed omegaDot]"WheelSpeeds"(differentialDriveKinematicsのみ) ––[wheelL wheelR]
v はメートル/秒単位の運動方向のビークル速度です。psiDot はラジアン/秒単位のステアリング角速度です。gammaDot はラジアン/秒単位の連結角速度です。omegaDot はラジアン/秒単位の後車軸の角速度です。wheelL および wheelR はそれぞれ左と右のラジアン/秒単位の車輪速度です。
出力引数
motionModel 入力に応じて 3 要素または 4 要素ベクトルとして返される現在の状態微分:
unicycleKinematics––[xDot yDot thetaDot]bicycleKinematics––[xDot yDot thetaDot]differentialDriveKinematics––[xDot yDot thetaDot]ackermannKinematics––[xDot yDot thetaDot psiDot]articulatedSteeringKinematics––[xDot yDot thetaDot gammaDot]
xDot および yDot はメートル/秒単位で指定されるビークルの速度を参照します。thetaDot はビークルの向きの角速度、psiDot はビークルのステアリングの角速度、gammaDot は後車体を基準とした前車体の角速度であり、いずれもラジアン/秒単位で指定します。
cmds が N 行 2 列の行列として指定されている場合、stateDot は運動モデル オブジェクトに応じて 3 行 N 列または 4 行 N 列の行列になります。N は指定されているコマンドの数です。state で指定されている状態の数が N と等しい場合、stateDot の各列はそれぞれの状態とコマンドに対応します。たとえば、最初の列は、cmds の最初のコマンドを使用した state の最初の状態の状態微分です。state で指定されている状態が 1 つの場合、stateDot の各列は対応するコマンドと指定された状態の状態微分になります。これは、各コマンドを使用して単一の状態の状態微分が計算されることを意味します。
参照
[1] Lynch, Kevin M., and Frank C. Park. Modern Robotics: Mechanics, Planning, and Control. 1st ed. Cambridge, MA: Cambridge University Press, 2017.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
バージョン履歴
R2019b で導入derivative オブジェクト関数の cmds 引数で一度に複数の状態とコマンドを受け入れるようになりました。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)