定義域のエラー
3 views (last 30 days)
Show older comments
研究でMATLABを用いてドローンの制御についてシミュレーションしている大学生です.
添付させていただいた画像を基に,MATLAB functionでプロペラの回転速度の導出をしたいのですが,高度の偏差(FBZ)が負の時,sqrtの中が負になり,定義域のエラーになります.
そこで,負の時に回転速度が100となるようにしてエラーを回避しているのですが,実際の挙動と異なるのでどのようにしたらよいか教えていただきたいです.
やりたいこととすれば,偏差が負の時(目標高度を超えてる)に,回転方向は一定で,回転速度を減らす方向に制御したいです.
アドバイスいただければ幸いです.よろしくお願いいたします.
以下にプログラムと,プロペラの回転速度の式をjpgで添付させていただきます.チルト角の計算の部分は無視していただいて大丈夫です.
function [alpha_1,alpha_2,alpha_3,alpha_4,Omega1,Omega2,Omega3,Omega4]= Distributor(alpha_n1,alpha_n2,alpha_n3,alpha_n4,delta_x,delta_y,delta_z,FBX,FBY,FBZ,C1,C2,Kt,KQ)
%チルト角の計算(補正値)
alpha_1 = alpha_n1 - ((C1*delta_z) / 4) - ((C2*FBY) / 2);
alpha_2 = alpha_n2 - ((C1*delta_z) / 4) + ((C2*FBX) / 2);
alpha_3 = alpha_n3 - ((C1*delta_z) / 4) + ((C2*FBY) / 2);
alpha_4 = alpha_n4 - ((C1*delta_z) / 4) - ((C2*FBX) / 2);
% 各プロペラの回転速度[Ω]の値を計算
Omega1_squared = (FBZ / (4 * Kt)) - (delta_y / (2 * KQ));
Omega2_squared = (FBZ / (4 * Kt)) + (delta_x / (2 * KQ));
Omega3_squared = (FBZ / (4 * Kt)) + (delta_y / (2 * KQ));
Omega4_squared = (FBZ / (4 * Kt)) - (delta_x / (2 * KQ));
% 負の平方根が存在しないように、負の値を100に置き換える
Omega1 = sqrt(max(Omega1_squared, 10000));
Omega2 = sqrt(max(Omega2_squared, 10000));
Omega3 = sqrt(max(Omega3_squared, 10000));
Omega4 = sqrt(max(Omega4_squared, 10000));
% 1番と3番のプロペラは時計回り、2番と4番は反時計回りに設定
% ここで1を時計回り、-1を反時計回りとする
directions = [1; -1; 1; -1];
% 各モーターの回転速度に方向を適用
Omega1 = Omega1 * directions(1);
Omega2 = Omega2 * directions(2);
Omega3 = Omega3 * directions(3);
Omega4 = Omega4 * directions(4);
% 計算されたオメガ値を返す
return
0 Comments
Answers (0)
See Also
Categories
Find more on Brakes and Detents in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!