Effacer les filtres
Effacer les filtres

定義域のエラー

4 vues (au cours des 30 derniers jours)
隆浩 鈴木
隆浩 鈴木 le 15 Jan 2024
Modifié(e) : Atsushi Ueno le 20 Jan 2024
研究で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

Réponses (0)

Catégories

En savoir plus sur Brakes and Detents dans Help Center et File Exchange

Tags

Produits


Version

R2023b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!