Skip to content

Commit a2f44a8

Browse files
author
MASAHIRO KUBOTA
committedFeb 20, 2023
所望の力から電流を求めるコード書けた
1 parent 7b64ec3 commit a2f44a8

24 files changed

+1042
-78
lines changed
 

‎Ampere2.m

+13-14
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
function [F, T] = Ampere2(I2_x, I2_y, I2_z, I1_x, I1_y, I1_z, a, N, x, y, z, p1, q1, l1, p2, q2, l2, splitB, splitA)
1+
function [F, T] = Ampere2(I2_x, I2_y, I2_z, I1_x, I1_y, I1_z, a, N, x, y, z, quat1, quat2, splitB, splitA)
22
%原点にあるN巻き,半径a,電流Iのコイルによって,(x, y, z)にあるN巻き,半径a,電流I_x, I_y, I_zのコイルに発生するアンペール力(力,トルク)
33
% Detailed explanation goes here
44

@@ -8,23 +8,22 @@
88
phi = 0;
99
F = [0, 0, 0];
1010
T = [0, 0, 0];
11-
quat = quaternion([p2,q2,l2],'euler','XYZ','point');
1211

1312

1413
%z coil
1514
while i < splitA
1615

1716
i = i + 1;
1817
phi = phi + d_phi;
19-
rot_point_z = rotatepoint(quat, [a * cos(phi), a * sin(phi), 0]);
20-
B = magnetic_flux_three_coil(rot_point_z(1) + x, rot_point_z(2) + y, rot_point_z(3) + z, I1_x, I1_y, I1_z, a, N, p1, q1, l1, splitB);
18+
rot_point_z = rotatepoint(quat2, [a * cos(phi), a * sin(phi), 0]);
19+
B = magnetic_flux_three_coil(rot_point_z(1) + x, rot_point_z(2) + y, rot_point_z(3) + z, I1_x, I1_y, I1_z, a, N, quat1, splitB);
2120
%disp(norm(B))
22-
d_I = I2_z * N * rotatepoint(quat, [-sin(phi), cos(phi), 0]) * d_phi;
21+
d_I = I2_z * N * rotatepoint(quat2, a * [-sin(phi), cos(phi), 0]) * d_phi;
2322
%disp(I2_z)
2423
%disp(B)
2524
d_F = cross(d_I, B);
2625
%d_F = Ampere(I, phi, B);
27-
d_T = cross(rotatepoint(quat, [a*cos(phi), a*sin(phi), 0]), d_F);
26+
d_T = cross(rotatepoint(quat2, [a*cos(phi), a*sin(phi), 0]), d_F);
2827
%disp(d_B)
2928
F = F + d_F;
3029
T = T + d_T;
@@ -37,13 +36,13 @@
3736

3837
i = i + 1;
3938
phi = phi + d_phi;
40-
rot_point_y = rotatepoint(quat, [a * sin(phi), 0, a * cos(phi)]);
41-
B = magnetic_flux_three_coil(rot_point_y(1) + x, rot_point_y(2) + y, rot_point_y(3) + z, I1_x, I1_y, I1_z, a, N, p1, q1, l1, splitB);
42-
d_I = I2_y * N* rotatepoint(quat, [cos(phi), 0, -sin(phi)] )* d_phi;
39+
rot_point_y = rotatepoint(quat2, [a * sin(phi), 0, a * cos(phi)]);
40+
B = magnetic_flux_three_coil(rot_point_y(1) + x, rot_point_y(2) + y, rot_point_y(3) + z, I1_x, I1_y, I1_z, a, N, quat1, splitB);
41+
d_I = I2_y * N* rotatepoint(quat2, a * [cos(phi), 0, -sin(phi)] )* d_phi;
4342

4443
d_F = cross(d_I, B);
4544
%d_F = Ampere(I, phi, B);
46-
d_T = cross(rotatepoint(quat, [a*sin(phi), 0, a*cos(phi)]), d_F);
45+
d_T = cross(rotatepoint(quat2, [a*sin(phi), 0, a*cos(phi)]), d_F);
4746
%disp(d_B)
4847
F = F + d_F;
4948
T = T + d_T;
@@ -58,14 +57,14 @@
5857

5958
i = i + 1;
6059
phi = phi + d_phi;
61-
rot_point_x = rotatepoint(quat, [0, a * cos(phi), a * sin(phi)]);
62-
B = magnetic_flux_three_coil(rot_point_x(1) + x, rot_point_x(2) + y, rot_point_x(3) + z, I1_x, I1_y, I1_z, a, N, p1, q1, l1, splitB);
63-
d_I = I2_x * N* rotatepoint(quat, [0, -sin(phi), cos(phi)]) * d_phi;
60+
rot_point_x = rotatepoint(quat2, [0, a * cos(phi), a * sin(phi)]);
61+
B = magnetic_flux_three_coil(rot_point_x(1) + x, rot_point_x(2) + y, rot_point_x(3) + z, I1_x, I1_y, I1_z, a, N, quat1, splitB);
62+
d_I = I2_x * N* rotatepoint(quat2, a * [0, -sin(phi), cos(phi)]) * d_phi;
6463
%d_I = I2_x * N* [0, -sin(phi), cos(phi)] * d_phi;
6564
d_F = cross(d_I, B);
6665
%d_F = Ampere(I, phi, B);
6766
%disp(d_F)
68-
d_T = cross(rotatepoint(quat, [0, a*cos(phi), a*sin(phi)]), d_F);
67+
d_T = cross(rotatepoint(quat2, [0, a*cos(phi), a*sin(phi)]), d_F);
6968
%disp(d_B)
7069
F = F + d_F;
7170
%disp("d_F is")

‎README.md

+16-6
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,28 @@ READMEに,使えるファイルを書かないとなー
33

44
READMEにどのファイルどうつかったらどういうことができるかまとめないとなー
55

6+
Ampere2.mは原点にあるN巻き,半径a,電流Iのコイルによって,(x, y, z)にあるN巻き,半径a,電流I_x, I_y, I_zのコイルに発生するアンペール力(力,トルク)を計算.
7+
coil_FT.mでいろんな相対姿勢でビオサバールとアンペールで電磁力とトルクを計算する.
8+
9+
dynamics2record.mで任意の場所から10^-5Nの上限でレコード盤軌道にもって行く制御
10+
11+
dynamic2record_movie.mで1つの衛星がレコード盤軌道に投入されるシミュレーション動画.dynamics2record.mを改造.フィードバックゲインに注意しろ!
12+
13+
force2current.mで所望の力を電流に変換する.
614

7-
plot_magnetic_field_FT2で特定の位置姿勢,電流,分割電流数での相手のコイルにかかる力とトルクを計算
8-
coil_FT.mで,色んな姿勢パターンでコイルに加わる力とトルクを算出.
15+
plot_magnetic_field_FT2.mで特定の位置姿勢,電流,分割電流数での相手のコイルにかかる力とトルクを計算
16+
plot_magnetic_field_FT2_dipole.mで特定の位置姿勢,電流,分割電流数での相手のコイルにかかる力とトルクをダイポール近似で計算
917

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

14-
coil_FT.mでいろんな相対姿勢でビオサバールとアンペールで電磁力とトルクを計算する.
15-
plot_magnetic_field_FT2.mで決められた相対姿勢,電流で発生る電磁力とトルクを計算する.
1628

17-
dynamics2record.mで任意の場所から10^-5Nの上限でレコード盤軌道にもって行く制御
1829

19-
dynamic2record_movie.mで1つの衛星がレコード盤軌道に投入されるシミュレーション動画.dynamics2record.mを改造.
2030

‎calculateI.asv

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
function I_jk = calculateI(x_j, x_k, q_j, q_k, split, a, j_coil, k_coil)
2+
%2つのコイルによって発生する電磁力の周回積分項を計算
3+
% Detailed explanation goes here
4+
5+
%{
6+
if j_coil == 1
7+
E = [0,pi/2,0];
8+
q_x = quaternion(E,'euler','XYZ','point');
9+
q_j = q_x*q_j;
10+
end
11+
12+
if j_coil == 2
13+
E = [-pi/2,0,0];
14+
q_x = quaternion(E,'euler','XYZ','point');
15+
q_j = q_x*q_j;
16+
end
17+
18+
if k_coil == 1
19+
E = [0,pi/2,0];
20+
q_x = quaternion(E,'euler','XYZ','point');
21+
q_k = q_x*q_k;
22+
end
23+
24+
25+
if k_coil == 2
26+
E = [-pi/2,0,0];
27+
q_x = quaternion(E,'euler','XYZ','point');
28+
q_k = q_x*q_k;
29+
end
30+
31+
32+
33+
34+
d_phi = 2*pi/split;
35+
d_theta = 2*pi/split;
36+
37+
I_jk = zeros(1,3);
38+
phi = 0;
39+
40+
for l = 1:split
41+
phi = phi + d_phi;
42+
theta = 0;
43+
II_ij = zeros(1,3);
44+
for m = 1:split
45+
theta = theta + d_theta;
46+
r_jk = calculater_jk(x_j, x_k, q_j, q_k, theta, phi, a);
47+
48+
%磁場の向きdispすると向きが合ってるかのデバッグができる.
49+
II_ij = II_ij + 1/norm(r_jk)^3*cross([-a*sin(theta), a*cos(theta), 0], r_jk)*d_theta;
50+
51+
%disp(1/norm(r_jk)^3*cross(r_jk, [-a*sin(phi), a*cos(phi), 0]))
52+
end
53+
54+
q_jk = quatmultiply(q_k, quatconj(q_j));
55+
%disp(rad2deg(phi))
56+
%disp(r_jk)
57+
%disp(II_ij)
58+
%disp(cross(II_ij, rotatepoint(q_jk, [-a*sin(theta), a*cos(theta), 0])*d_theta))
59+
rt = rotatepoint(q_jk, [-a*sin(phi), a*cos(phi), 0]);
60+
I_jk = I_jk + cross(rt, II_ij)*d_phi;
61+
%disp(x_k - x_j + rotatepoint(q_jk, [-a*sin(theta), a*cos(theta), 0]))
62+
%disp(I_jk)
63+
64+
end

‎calculateI.m

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
function I_jk = calculateI(x_j, x_k, q_j, q_k, split, a, j_coil, k_coil)
2+
%2つのコイルによって発生する電磁力の周回積分項を計算
3+
% Detailed explanation goes here
4+
5+
6+
if j_coil == 1
7+
E = [0,pi/2,0];
8+
q_x = quaternion(E,'euler','XYZ','point');
9+
q_j = q_j*q_x;
10+
end
11+
12+
if j_coil == 2
13+
E = [-pi/2,0,0];
14+
q_x = quaternion(E,'euler','XYZ','point');
15+
q_j = q_j*q_x;
16+
end
17+
18+
if k_coil == 1
19+
E = [0,pi/2,0];
20+
q_x = quaternion(E,'euler','XYZ','point');
21+
q_k = q_k*q_x;
22+
end
23+
24+
25+
if k_coil == 2
26+
E = [-pi/2,0,0];
27+
q_x = quaternion(E,'euler','XYZ','point');
28+
q_k = q_k*q_x;
29+
end
30+
31+
32+
33+
34+
d_phi = 2*pi/split;
35+
d_theta = 2*pi/split;
36+
37+
I_jk = zeros(1,3);
38+
phi = 0;
39+
40+
for l = 1:split
41+
phi = phi + d_phi;
42+
theta = 0;
43+
II_ij = zeros(1,3);
44+
for m = 1:split
45+
theta = theta + d_theta;
46+
r_jk = calculater_jk(x_j, x_k, q_j, q_k, theta, phi, a);
47+
48+
%磁場II_ijの向きdispすると向きが合ってるかのデバッグができる.
49+
II_ij = II_ij + 1/norm(r_jk)^3*cross(rotatepoint(q_j, [-a*sin(theta), a*cos(theta), 0]), r_jk)*d_theta;
50+
%disp(r_jk)
51+
%disp(1/norm(r_jk)^3*cross(r_jk, [-a*sin(phi), a*cos(phi), 0]))
52+
end
53+
54+
q_jk = quatmultiply(q_k, quatconj(q_j));
55+
56+
%disp(rad2deg(phi))
57+
%disp(r_jk)
58+
%disp(II_ij)
59+
%disp(cross(II_ij, rotatepoint(q_jk, [-a*sin(theta), a*cos(theta), 0])*d_theta))
60+
%disp(q_k)
61+
rt = rotatepoint(q_k, [-a*sin(phi), a*cos(phi), 0]);
62+
I_jk = I_jk + cross(rt, II_ij)*d_phi;
63+
64+
%disp(x_k - x_j + rotatepoint(q_jk, [-a*sin(theta), a*cos(theta), 0]))
65+
%disp(I_jk)
66+
67+
end

‎calculater_jk.m

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
function r_jk = calculater_jk(x_j, x_k, q_j, q_k, theta, phi, a)
2+
%コイルjの電流要素から見た,コイルkの電流要素の位置ベクトル
3+
% Detailed explanation goes here
4+
%a = 0.015;
5+
%x_j = [0.1, 0.1, 0.1];
6+
%E_j = [pi/3,0,pi/4];
7+
%q_j = quaternion(E_j,'euler','XYZ','point');
8+
%theta = deg2rad(120);
9+
%dl_j = rotatepoint(q_j, [-a*sin(theta), a*cos(theta), 0]);
10+
x_jR = x_j + rotatepoint(q_j, [a*cos(theta), a*sin(theta), 0]);
11+
%x_jR0 = x_j + rotatepoint(q_j, [a, 0, 0]);
12+
13+
%x_k = [-0.1, -0.1, -0.1];
14+
%E_k = [-pi/3,0,-pi/4];
15+
%q_k = quaternion(E_k,'euler','XYZ','point');
16+
%phi = deg2rad(-120);
17+
%dl_k = rotatepoint(q_k, [-a*sin(phi), a*cos(phi), 0]);
18+
x_kR = x_k + rotatepoint(q_k, [a*cos(phi), a*sin(phi), 0]);
19+
%x_kR0 = x_k + rotatepoint(q_k, [a, 0, 0]);
20+
21+
r_jk = x_kR - x_jR;
22+
end

‎draw_coil.m

+1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ function draw_coil(x, q, a)
1313
hold on
1414
plot3(coil2_y(1,:) + x0, coil2_y(2,:) + y0, coil2_y(3,:) + z0)
1515
plot3(coil2_z(1,:) + x0, coil2_z(2,:) + y0, coil2_z(3,:) + z0)
16+
hold on
1617
end

‎dynamic2record_movie.m

+1
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@
174174

175175
%各時刻での電磁力の大きさをグラフ化
176176
figure
177+
str='';
177178
plot((1:N)/60, u_data)
178179
xlabel('時間(min)');
179180
ylabel('力(N)');

0 commit comments

Comments
 (0)
Please sign in to comment.