Skip to content

Commit eb82725

Browse files
author
MASAHIRO KUBOTA
committedFeb 21, 2023
コイルに流れる電流上限を考慮した電磁力上限を設けた2衛星のシミュレーション作った
1 parent a2f44a8 commit eb82725

9 files changed

+472
-70
lines changed
 

‎README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ coil_FT.mでいろんな相対姿勢でビオサバールとアンペールで
99
dynamics2record.mで任意の場所から10^-5Nの上限でレコード盤軌道にもって行く制御
1010

1111
dynamic2record_movie.mで1つの衛星がレコード盤軌道に投入されるシミュレーション動画.dynamics2record.mを改造.フィードバックゲインに注意しろ!
12+
dynamic2record_movie2.mの方が収束性はいい.
1213

1314
force2current.mで所望の力を電流に変換する.
1415

@@ -20,9 +21,10 @@ test8.mで地球の磁場を計算
2021
test9.mはchatGPTで生成したコード.matlabで動画を生成し,保存するためのコード.
2122
test10.mでコイルjの電流要素から見た,コイルkの電流要素の位置ベクトルを表示(I_ij確かめるために使った).plot_magnetic_field_FT2.mと同じ.計算の仕方が違う.逆問題を解くための式のバグ取りのため.
2223
test12.mはtest10.mを改造して,特定の力を出すために必要な電流を出力するためのコード
23-
test11.mは特定の力を出すために必要な電流を出力して,その値をplot_magnetic_field_FT2.mで検証している.最大電流も定義してるから,実際に出せる力がこのコードでわかる.
2424

25+
test11.mは特定の力を出すために必要な電流を出力して,その値をplot_magnetic_field_FT2.mで検証している.最大電流も定義してるから,実際に出せる力がこのコードでわかる.
2526

27+
two_satellite_record_movie.mはコイルや距離によって発生できる電磁力の上限が決まることをビオサバールを用いた逆計算をして電磁力を決めている.
2628

2729

2830

‎dynamic2record_movie.m

+2-2
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@
9494
%R = diag([10^7, 10^3, 10^7]); エネルギーが少なくて済む=振動が少ない
9595
%この値はランデブの軌道制御における予見ファジィ制御と最適制御の比較から持ってきてる.
9696

97-
Q = diag([1, 1, 100, 0, 0, 0]);
98-
R = diag([10^7, 10^3, 10^7]);
97+
Q = diag([1, 1, 1, 10^5, 10^5, 10^5]);
98+
R = diag([1, 1, 1]);
9999

100100
%リッカチ方程式を解いて最適ゲインを求める
101101
[~,K,~] = icare(A,B,Q,R,[],[],[]);

‎dynamic2record_movie2.m

+6-4
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,11 @@
168168
toc
169169

170170

171+
%フレームレート
172+
Fs = 30;
171173

174+
%表示間引き数 (表示間引き数×フレームレート×サンプリングタイム)=n倍速となる
175+
Th = 10;
172176

173177
%各時刻での電磁力の大きさをグラフ化
174178
figure
@@ -225,11 +229,9 @@
225229
% 日時をファイル名に追加
226230
filename = sprintf('movie/dynamics2record_%s.avi', datetime('now','Format', dateformat));
227231

228-
%フレームレート
229-
Fs = 30;
230232

231-
%表示間引き数 (表示間引き数×フレームレート×サンプリングタイム)=n倍速となる
232-
Th = 10;
233+
234+
233235

234236
% 動画の準備
235237
vidObj = VideoWriter(filename); % 動画ファイル名

‎feedback_system.asv

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
function [X1, x_tilda1_data, u1_data, x_d1_data] = feedback_system(x_d1, v_d1, T, N, x1_0, A_d, B_d, B, K)
2+
%UNTITLED4 Summary of this function goes here
3+
% Detailed explanation goes here
4+
5+
%状態配列
6+
X1 = zeros(N, 6);
7+
8+
%初期値代入
9+
X1(1,:) = x1_0;
10+
11+
%変位あり状態方程式の入力変位を設定するための係数
12+
B_sharp = (B.'*B)\B.';
13+
14+
%グラフを作るためのデータ配列
15+
u1_data = zeros(N,3);
16+
x_tilda1_data = zeros(N,1);
17+
x_d1_data = zeros(N,3);
18+
19+
20+
tic
21+
for i = 1:N %時刻i*T
22+
xd = x_d1(i*T);
23+
24+
%フィードバック系を0に収束させるために入力変位を設定
25+
u_d = B_sharp*(v_d1(i*T) - A_d*xd);
26+
27+
%目標値と現在地のずれ
28+
x_tilda = X1(i, :).' - xd;
29+
30+
%x_tildaを0にするためのフィードバック
31+
u_tilda = -K*x_tilda;
32+
33+
%元の状態方程式の入力(N)
34+
u = u_tilda + u_d;
35+
36+
%所望の力が上限を超えた場合,方向そのままで大きさを小さくする.
37+
if norm(u)>10^-5
38+
u = u*10^-5/norm(u);
39+
end
40+
41+
[F, ] = force2current(F, a, i_max, x_j, x_k, q_j, q_k)
42+
43+
%離散状態方程式
44+
X1(i+1, :) = A_d*X1(i, :).' + B_d*u;
45+
46+
%目標値までの距離を格納
47+
x_tilda1_data(i) = norm(X1(i, :).' - xd);
48+
49+
%電磁力ベクトルを格納
50+
u1_data(i,:) = u;
51+
52+
%目標軌道
53+
x_d1_data(i,:) = xd(1:3,1).';
54+
end

‎feedback_system.m

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
function [X1, x_tilda1_data, u1_data, x_d1_data] = feedback_system(x_d1, v_d1, T, N, x1_0, A_d, B_d, B, K, q1, q2, a, i_max)
2+
%UNTITLED4 Summary of this function goes here
3+
% Detailed explanation goes here
4+
5+
6+
7+
8+
9+
%状態配列
10+
X1 = zeros(N, 6);
11+
12+
%初期値代入
13+
X1(1,:) = x1_0;
14+
15+
%変位あり状態方程式の入力変位を設定するための係数
16+
B_sharp = (B.'*B)\B.';
17+
18+
%グラフを作るためのデータ配列
19+
u1_data = zeros(N,3);
20+
x_tilda1_data = zeros(N,1);
21+
x_d1_data = zeros(N,3);
22+
23+
24+
tic
25+
for i = 1:N %時刻i*T
26+
disp(i)
27+
xd = x_d1(i*T);
28+
29+
%フィードバック系を0に収束させるために入力変位を設定
30+
u_d = B_sharp*(v_d1(i*T) - A_d*xd);
31+
32+
%目標値と現在地のずれ
33+
x_tilda = X1(i, :).' - xd;
34+
35+
%x_tildaを0にするためのフィードバック
36+
u_tilda = -K*x_tilda;
37+
38+
%元の状態方程式の入力(N)
39+
u1 = u_tilda + u_d;
40+
41+
%所望の力が上限を超えた場合,方向そのままで大きさを小さくする.
42+
%if norm(u)>10^-5
43+
% u = u*10^-5/norm(u);
44+
%end
45+
46+
47+
[u, ~] = force2current(u1.', a, i_max, X1(i, 1:3), -X1(i, 1:3), q1, q2);
48+
49+
50+
51+
%離散状態方程式
52+
X1(i+1, :) = A_d*X1(i, :).' + B_d*u;
53+
54+
%目標値までの距離を格納
55+
x_tilda1_data(i) = norm(X1(i, :).' - xd);
56+
disp(norm(X1(i, :).' - xd))
57+
58+
%電磁力ベクトルを格納
59+
u1_data(i,:) = u;
60+
61+
%目標軌道
62+
x_d1_data(i,:) = xd(1:3,1).';
63+
end

‎force2current.asv

+36-15
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,24 @@
1-
%function i = force2current(f, a, i_max, N, I1)
1+
function [F, i_k] = force2current(F, a, i_max, x_j, x_k, q_j, q_k)
22
%Find the required current from the desired force.
33
% Detailed explanation goes here
44

5+
6+
%disp(F)
7+
%disp(a)
8+
%disp(i_max)
9+
%disp(x_j)
10+
%disp(x_k)
11+
%disp(q_j)
12+
%disp(q_k)
13+
14+
%a = 0.015;
15+
N = 17;
16+
517
myu0 = 1.2566*10^(-6);
6-
i_j = [1 1 1] * 10^-5;
18+
split = 10;
719

8-
S = zeros(3,3);
20+
i_j = i_max * (x_k - x_j)/norm(x_k - x_j) ;
21+
%i_k = [1 2 3] ;
922

1023
%E_j = [pi/3,0,pi/4];
1124
%q_j = quaternion(E_j,'euler','XYZ','point');
@@ -15,27 +28,35 @@ I_j3 = zeros(1,3);
1528

1629
for j = 1:3
1730
I_j1 = I_j1 + i_j(j)*calculateI(x_j, x_k, q_j, q_k, split, a, j, 1);
31+
%disp(I_j1)
32+
disp(calculateI(x_j, x_k, q_j, q_k, split, a, j, 1))
1833
I_j2 = I_j2 + i_j(j)*calculateI(x_j, x_k, q_j, q_k, split, a, j, 2);
34+
%disp(I_j2)
1935
I_j3 = I_j3 + i_j(j)*calculateI(x_j, x_k, q_j, q_k, split, a, j, 3);
36+
%disp(I_j3)
2037
end
2138

39+
40+
2241
S = N*[I_j1.', I_j2.', I_j3.'];
2342

24-
F = myu0/(4*pi)*S*N
43+
disp("SSSSSSS")
44+
disp(S)
45+
%F = myu0/(4*pi)*N*S*i_k.';
2546

47+
%F = [10^-14, 10^-14, 10^-14].';
48+
disp(F)
49+
F = F*1;
2650

27-
%{
28-
while j = 1:3
29-
30-
while k = 1:3
31-
51+
i_k = 4*pi/(myu0*N)*(S\F.');
52+
%disp(i_k)
3253

33-
S = N*i*I1*[]
34-
S_inv = inv(S);
35-
i = 4*pi/(N*myu0)*S_inv*f;
54+
if max(abs(i_k)) >= i_max
55+
i_k = i_k * i_max/max(abs(i_k));
56+
disp('over')
57+
end
3658

37-
if i_max > i
3859

60+
%F = myu0/(4*pi)*N*S*i_k;
3961

40-
end
41-
%}
62+
end

‎force2current.m

+23-5
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,23 @@
1-
function i_mat = force2current(F, a, i_max, I1, x_j, x_k, q_j, q_k)
1+
function [F, i_k] = force2current(F, a, i_max, x_j, x_k, q_j, q_k)
22
%Find the required current from the desired force.
33
% Detailed explanation goes here
44

5+
6+
%disp(F)
7+
%disp(a)
8+
%disp(i_max)
9+
%disp(x_j)
10+
%disp(x_k)
11+
%disp(q_j)
12+
%disp(q_k)
13+
514
%a = 0.015;
615
N = 17;
716

817
myu0 = 1.2566*10^(-6);
918
split = 10;
1019

11-
i_j = I1 ;
20+
i_j = i_max * (x_k - x_j)/norm(x_k - x_j) ;
1221
%i_k = [1 2 3] ;
1322

1423
%E_j = [pi/3,0,pi/4];
@@ -19,6 +28,8 @@
1928

2029
for j = 1:3
2130
I_j1 = I_j1 + i_j(j)*calculateI(x_j, x_k, q_j, q_k, split, a, j, 1);
31+
%disp(I_j1)
32+
%disp(calculateI(x_j, x_k, q_j, q_k, split, a, j, 1))
2233
I_j2 = I_j2 + i_j(j)*calculateI(x_j, x_k, q_j, q_k, split, a, j, 2);
2334
%disp(I_j2)
2435
I_j3 = I_j3 + i_j(j)*calculateI(x_j, x_k, q_j, q_k, split, a, j, 3);
@@ -28,17 +39,24 @@
2839

2940

3041
S = N*[I_j1.', I_j2.', I_j3.'];
42+
43+
%disp("SSSSSSS")
3144
%disp(S)
3245
%F = myu0/(4*pi)*N*S*i_k.';
3346

3447
%F = [10^-14, 10^-14, 10^-14].';
3548
%disp(F)
49+
%F = F*1;
3650

37-
i_mat = 4*pi/(myu0*N)*(S\F.');
51+
i_k = 4*pi/(myu0*N)*(S\F.');
52+
%disp(i_k)
3853

54+
if max(abs(i_k)) >= i_max
55+
i_k = i_k * i_max/max(abs(i_k));
56+
%disp('over')
57+
end
3958

4059

60+
F = myu0/(4*pi)*N*S*i_k;
4161

42-
if any(i_mat >= i_max)
43-
i_mat = i_mat * i_max/max(i_mat);
4462
end

0 commit comments

Comments
 (0)
Please sign in to comment.