asinで角度を算出する際の場合分けをする方法

5 Ansichten (letzte 30 Tage)
光貴 川島
光貴 川島 am 19 Okt. 2021
Verschoben: Atsushi Ueno am 17 Aug. 2022
asinを用いて関節角度を算出しようとしています。
-2π~2πの区間に数値が収まるように、ifを用いて場合分けをしようと考えているのですが、どのようにすると上手く数値を算出できるでしょうか?
現在はこのような形でコードを用いているのですが、alphaとgammaの角度が上手く算出できません。
どなたか詳しい方がいましたらご教授お願い致します。
Xd = pel_x; % 遠位X軸方向ベクトル 例)(0.015,0.4,1): (x座標,y座標,z座標) <-- 横に入れる(横ベクトル)
Yd = pel_y; % 遠位Y軸方向ベクトル
Zd = pel_z; % 遠位Z軸方向ベクトル
Xp = thigh_x; % 近位X軸方向ベクトル
Yp = knee_y; % 近位Y軸方向ベクトル
Zp = ankle_z; % 近位Z軸方向ベクトル
for i = 1:size(Xd,1)
idx = 3*i-2;
T(idx:idx+2,:) = [dot(Xd(i,:),Xp(i,:)),dot(Xd(i,:),Yp(i,:)),dot(Xd(i,:),Zp(i,:));...
dot(Yd(i,:),Xp(i,:)),dot(Yd(i,:),Yp(i,:)),dot(Yd(i,:),Zp(i,:));...
dot(Zd(i,:),Xp(i,:)),dot(Zd(i,:),Yp(i,:)),dot(Zd(i,:),Zp(i,:))]; % 座標系同士の内積で算出
% alpha: flexion/extension, beta: abduction/adduction, gamma: ext.rotation/int.rotation
beta(i,:) = rad2deg(asin(T(3*i,1)));
alpha(i,:) = rad2deg(asin(-1*T(3*i,2)/cos(beta(i,:))));
if alpha(i,:) > 0
alpha(i,:)=pi-alpha(i,:);
elseif alpha(i,:) > pi
alpha(i,:)=alpha(i,:)-2*pi;
end
gamma(i,:) = rad2deg(asin(-1*T(3*i-1,1)/cos(beta(i,:))));
if gamma(i,:) > 0
gamma(i,:)=pi-gamma(i,:);
elseif gamma(i,:) > pi
gamma(i,:)=gamma(i,:)-2*pi;
end
end
  1 Kommentar
Atsushi Ueno
Atsushi Ueno am 19 Okt. 2021
Verschoben: Atsushi Ueno am 17 Aug. 2022
if alpha(i,:) > 0
elseif alpha(i,:) > pi
静的に眺めてみるだけでも疑問点が出てきます。
  • 1行目を満たさず(0以下で)、2行目を満たす(πより大きい)事は無いので、2行目はデッドパスになります
  • 比較しているのはベクトルのようですが、ベクトルの要素の内一つでも条件を満たさないとFalseになります
以上の2点から、if文内の文が実行される事は極めて稀になるので、一目でなんかおかしいと判ります。その点再検討してみては如何でしょうか?

Melden Sie sich an, um zu kommentieren.

Antworten (0)

Produkte


Version

R2020b

Community Treasure Hunt

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

Start Hunting!