定義域のエラー
조회 수: 6 (최근 30일)
이전 댓글 표시
研究で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
답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Simscape Multibody에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!