Updated sensors

This commit is contained in:
dario 2024-06-20 18:13:59 +02:00
parent c0ccd93acf
commit 43bc71c742
11 changed files with 57112 additions and 39 deletions

56663
druckkammer.csv Normal file

File diff suppressed because it is too large Load Diff

91
siemens_parsed.csv Normal file
View File

@ -0,0 +1,91 @@
time,DB5 Objekte_-ST3_Isttemperatur [°C],DB5 Objekte_-V2_Rückmeldung Arbeitsstellung für Trend,DB5 Objekte_-SV1_Istdruck Visu [mBar abs],DB5 Objekte_-SV1_Istdruck Visu Mantisse [mBar abs],DB5 Objekte_-SV1_Istdruck Visu Exponent,DB5 Objekte_-ST1_Isttemperatur [°C],DB5 Objekte_-ST2_Isttemperatur [°C],Pressure
578.7037048339844,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
1273.2175903320312,24.4,-20.0,902.03241,9.020324,2.0,24.4,25.0,902.0324
1967.7777786254883,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
2662.1527786254883,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
3356.7013778686523,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
4051.1342544555664,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
4745.648147583008,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
5440.127311706543,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
6134.5601806640625,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
6829.108787536621,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
7523.611106872559,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
8218.009262084961,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
8912.488418579102,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
9607.002311706543,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
10301.493064880371,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
10995.9375,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
11690.46297454834,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
12384.953704833984,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
13079.456024169922,24.4,-20.0,902.03241,9.020324,2.0,24.4,25.0,902.0324
13773.888885498047,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
14468.298606872559,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
15162.789352416992,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
15857.291664123535,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
16551.71295928955,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
17246.30786895752,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
17940.706024169922,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
18635.150466918945,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
19329.733795166016,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
20024.201377868652,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
20718.622688293457,24.299999,-20.0,923.56897,9.23569,2.0,24.200001,24.9,923.569
21413.17130279541,24.299999,-20.0,233.712646,2.337126,2.0,23.6,24.200001,233.7126
22107.673614501953,24.299999,-20.0,74.985168,7.498517,1.0,23.6,24.200001,74.98517
22802.1759185791,24.299999,-20.0,29.057066,2.905707,1.0,23.700001,24.299999,29.05707
23496.527770996094,24.299999,-20.0,12.757988,1.275799,1.0,23.799999,24.4,12.75799
24190.94906616211,24.299999,-20.0,269.259064,2.692591,2.0,24.1,24.6,269.2591
24885.48610687256,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
25579.90739440918,24.4,-20.0,923.56897,9.23569,2.0,24.4,24.9,923.569
26274.456024169922,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
26968.90045928955,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
27663.495376586914,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
28357.98610687256,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
29052.46527862549,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
29746.94443511963,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
30441.354164123535,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
31135.76389312744,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
31830.34722137451,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
32524.872680664062,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
33219.24768066406,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
33913.784729003906,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
34608.22917175293,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
35302.800926208496,24.4,-20.0,923.56897,9.23569,2.0,24.299999,24.9,923.569
35997.25694274902,24.299999,-20.0,548.038269,5.480383,2.0,23.799999,24.4,548.0382999999999
36691.64351654053,24.299999,-20.0,145.58696,1.45587,2.0,23.5,24.1,145.587
37386.18054962158,24.299999,-20.0,53.814953,5.381495,1.0,23.6,24.200001,53.81495
38080.67130279541,24.299999,-20.0,21.891624,2.189162,1.0,23.700001,24.299999,21.89162
38775.02314758301,24.299999,-20.0,9.773297,9.773297,0.0,23.799999,24.4,9.773297
39469.60648345947,24.299999,-20.0,5.539739,5.539739,0.0,23.9,24.4,5.539739
40164.10878753662,24.299999,-20.0,3.617636,3.617636,0.0,23.9,24.5,3.617636
40858.541664123535,24.299999,-20.0,2.549855,2.549855,0.0,24.0,24.5,2.549855
41553.02082824707,24.299999,-20.0,1.91839,1.91839,0.0,24.0,24.6,1.91839
42247.534729003906,24.299999,-20.0,1.54061,1.54061,0.0,24.0,24.6,1.54061
42942.00231170654,24.299999,-20.0,1.216785,1.216785,0.0,24.0,24.6,1.216785
43636.48147583008,24.299999,-20.0,1.007466,1.007466,0.0,24.0,24.6,1.007466
44330.92593383789,24.299999,-20.0,0.873253,8.732529,-1.0,24.0,24.6,0.8732529
45025.42823791504,24.299999,-20.0,0.756922,7.569218,-1.0,24.0,24.6,0.7569218000000001
45719.88426208496,24.299999,-20.0,0.656996,6.569963,-1.0,24.1,24.700001,0.6569963000000001
46414.42130279541,24.299999,-20.0,0.597822,5.978216,-1.0,24.1,24.700001,0.5978216
47108.93518066406,24.299999,-20.0,0.518181,5.181814,-1.0,24.1,24.700001,0.5181814
47803.34490966797,24.299999,-20.0,0.47151,4.715096,-1.0,24.1,24.700001,0.47150960000000003
48497.88194274902,24.299999,-20.0,0.429041,4.290406,-1.0,24.1,24.700001,0.4290406
49192.36110687256,24.299999,-20.0,0.390398,3.903976,-1.0,24.1,24.700001,0.3903976
49886.770835876465,24.299999,-20.0,0.354743,3.547427,-1.0,24.1,24.700001,0.3547427
50581.25,24.299999,-20.0,0.322791,3.227909,-1.0,24.1,24.700001,0.3227909
51275.76389312744,24.299999,-20.0,0.307912,3.079116,-1.0,24.1,24.700001,0.3079116
51970.300926208496,24.299999,-20.0,0.280178,2.80178,-1.0,24.1,24.700001,0.280178
52664.733795166016,24.299999,-20.0,0.254589,2.545894,-1.0,24.1,24.700001,0.2545894
53359.20137786865,24.299999,-20.0,0.242853,2.428534,-1.0,24.1,24.700001,0.2428534
54053.657402038574,24.299999,-20.0,0.22098,2.2098,-1.0,24.1,24.700001,0.22098
54748.15971374512,24.299999,-20.0,0.210793,2.107933,-1.0,24.1,24.700001,0.21079330000000002
55442.63888549805,24.299999,-20.0,0.193949,1.939492,-1.0,24.1,24.700001,0.19394920000000002
56137.04860687256,24.299999,-20.0,0.182712,1.827117,-1.0,24.1,24.700001,0.18271170000000003
56831.62036895752,24.299999,-20.0,0.174289,1.742891,-1.0,24.1,24.700001,0.1742891
57526.08795928955,24.299999,-20.0,0.166255,1.662551,-1.0,24.1,24.700001,0.1662551
58220.52082824707,24.299999,-20.0,0.164419,1.644192,-1.0,24.1,24.700001,0.16441920000000002
58914.91898345947,24.299999,-20.0,0.169753,1.69753,-1.0,24.1,24.700001,0.16975300000000001
59609.51387786865,24.299999,-20.0,0.174289,1.742891,-1.0,24.1,24.700001,0.1742891
60303.912033081055,24.299999,-20.0,0.182712,1.827117,-1.0,24.1,24.700001,0.18271170000000003
60998.530097961426,24.299999,-20.0,203.141159,2.031412,2.0,24.200001,24.799999,203.1412
61692.90508270264,24.4,-20.0,632.268799,6.322688,2.0,24.299999,24.9,632.2688
62387.44211578369,24.4,-20.0,923.56897,9.23569,2.0,24.4,25.0,923.569
1 time DB5 Objekte_-ST3_Isttemperatur [°C] DB5 Objekte_-V2_Rückmeldung Arbeitsstellung für Trend DB5 Objekte_-SV1_Istdruck Visu [mBar abs] DB5 Objekte_-SV1_Istdruck Visu Mantisse [mBar abs] DB5 Objekte_-SV1_Istdruck Visu Exponent DB5 Objekte_-ST1_Isttemperatur [°C] DB5 Objekte_-ST2_Isttemperatur [°C] Pressure
2 578.7037048339844 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
3 1273.2175903320312 24.4 -20.0 902.03241 9.020324 2.0 24.4 25.0 902.0324
4 1967.7777786254883 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
5 2662.1527786254883 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
6 3356.7013778686523 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
7 4051.1342544555664 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
8 4745.648147583008 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
9 5440.127311706543 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
10 6134.5601806640625 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
11 6829.108787536621 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
12 7523.611106872559 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
13 8218.009262084961 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
14 8912.488418579102 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
15 9607.002311706543 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
16 10301.493064880371 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
17 10995.9375 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
18 11690.46297454834 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
19 12384.953704833984 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
20 13079.456024169922 24.4 -20.0 902.03241 9.020324 2.0 24.4 25.0 902.0324
21 13773.888885498047 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
22 14468.298606872559 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
23 15162.789352416992 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
24 15857.291664123535 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
25 16551.71295928955 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
26 17246.30786895752 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
27 17940.706024169922 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
28 18635.150466918945 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
29 19329.733795166016 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
30 20024.201377868652 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569
31 20718.622688293457 24.299999 -20.0 923.56897 9.23569 2.0 24.200001 24.9 923.569
32 21413.17130279541 24.299999 -20.0 233.712646 2.337126 2.0 23.6 24.200001 233.7126
33 22107.673614501953 24.299999 -20.0 74.985168 7.498517 1.0 23.6 24.200001 74.98517
34 22802.1759185791 24.299999 -20.0 29.057066 2.905707 1.0 23.700001 24.299999 29.05707
35 23496.527770996094 24.299999 -20.0 12.757988 1.275799 1.0 23.799999 24.4 12.75799
36 24190.94906616211 24.299999 -20.0 269.259064 2.692591 2.0 24.1 24.6 269.2591
37 24885.48610687256 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
38 25579.90739440918 24.4 -20.0 923.56897 9.23569 2.0 24.4 24.9 923.569
39 26274.456024169922 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
40 26968.90045928955 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
41 27663.495376586914 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
42 28357.98610687256 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
43 29052.46527862549 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
44 29746.94443511963 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
45 30441.354164123535 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
46 31135.76389312744 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
47 31830.34722137451 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
48 32524.872680664062 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
49 33219.24768066406 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
50 33913.784729003906 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
51 34608.22917175293 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
52 35302.800926208496 24.4 -20.0 923.56897 9.23569 2.0 24.299999 24.9 923.569
53 35997.25694274902 24.299999 -20.0 548.038269 5.480383 2.0 23.799999 24.4 548.0382999999999
54 36691.64351654053 24.299999 -20.0 145.58696 1.45587 2.0 23.5 24.1 145.587
55 37386.18054962158 24.299999 -20.0 53.814953 5.381495 1.0 23.6 24.200001 53.81495
56 38080.67130279541 24.299999 -20.0 21.891624 2.189162 1.0 23.700001 24.299999 21.89162
57 38775.02314758301 24.299999 -20.0 9.773297 9.773297 0.0 23.799999 24.4 9.773297
58 39469.60648345947 24.299999 -20.0 5.539739 5.539739 0.0 23.9 24.4 5.539739
59 40164.10878753662 24.299999 -20.0 3.617636 3.617636 0.0 23.9 24.5 3.617636
60 40858.541664123535 24.299999 -20.0 2.549855 2.549855 0.0 24.0 24.5 2.549855
61 41553.02082824707 24.299999 -20.0 1.91839 1.91839 0.0 24.0 24.6 1.91839
62 42247.534729003906 24.299999 -20.0 1.54061 1.54061 0.0 24.0 24.6 1.54061
63 42942.00231170654 24.299999 -20.0 1.216785 1.216785 0.0 24.0 24.6 1.216785
64 43636.48147583008 24.299999 -20.0 1.007466 1.007466 0.0 24.0 24.6 1.007466
65 44330.92593383789 24.299999 -20.0 0.873253 8.732529 -1.0 24.0 24.6 0.8732529
66 45025.42823791504 24.299999 -20.0 0.756922 7.569218 -1.0 24.0 24.6 0.7569218000000001
67 45719.88426208496 24.299999 -20.0 0.656996 6.569963 -1.0 24.1 24.700001 0.6569963000000001
68 46414.42130279541 24.299999 -20.0 0.597822 5.978216 -1.0 24.1 24.700001 0.5978216
69 47108.93518066406 24.299999 -20.0 0.518181 5.181814 -1.0 24.1 24.700001 0.5181814
70 47803.34490966797 24.299999 -20.0 0.47151 4.715096 -1.0 24.1 24.700001 0.47150960000000003
71 48497.88194274902 24.299999 -20.0 0.429041 4.290406 -1.0 24.1 24.700001 0.4290406
72 49192.36110687256 24.299999 -20.0 0.390398 3.903976 -1.0 24.1 24.700001 0.3903976
73 49886.770835876465 24.299999 -20.0 0.354743 3.547427 -1.0 24.1 24.700001 0.3547427
74 50581.25 24.299999 -20.0 0.322791 3.227909 -1.0 24.1 24.700001 0.3227909
75 51275.76389312744 24.299999 -20.0 0.307912 3.079116 -1.0 24.1 24.700001 0.3079116
76 51970.300926208496 24.299999 -20.0 0.280178 2.80178 -1.0 24.1 24.700001 0.280178
77 52664.733795166016 24.299999 -20.0 0.254589 2.545894 -1.0 24.1 24.700001 0.2545894
78 53359.20137786865 24.299999 -20.0 0.242853 2.428534 -1.0 24.1 24.700001 0.2428534
79 54053.657402038574 24.299999 -20.0 0.22098 2.2098 -1.0 24.1 24.700001 0.22098
80 54748.15971374512 24.299999 -20.0 0.210793 2.107933 -1.0 24.1 24.700001 0.21079330000000002
81 55442.63888549805 24.299999 -20.0 0.193949 1.939492 -1.0 24.1 24.700001 0.19394920000000002
82 56137.04860687256 24.299999 -20.0 0.182712 1.827117 -1.0 24.1 24.700001 0.18271170000000003
83 56831.62036895752 24.299999 -20.0 0.174289 1.742891 -1.0 24.1 24.700001 0.1742891
84 57526.08795928955 24.299999 -20.0 0.166255 1.662551 -1.0 24.1 24.700001 0.1662551
85 58220.52082824707 24.299999 -20.0 0.164419 1.644192 -1.0 24.1 24.700001 0.16441920000000002
86 58914.91898345947 24.299999 -20.0 0.169753 1.69753 -1.0 24.1 24.700001 0.16975300000000001
87 59609.51387786865 24.299999 -20.0 0.174289 1.742891 -1.0 24.1 24.700001 0.1742891
88 60303.912033081055 24.299999 -20.0 0.182712 1.827117 -1.0 24.1 24.700001 0.18271170000000003
89 60998.530097961426 24.299999 -20.0 203.141159 2.031412 2.0 24.200001 24.799999 203.1412
90 61692.90508270264 24.4 -20.0 632.268799 6.322688 2.0 24.299999 24.9 632.2688
91 62387.44211578369 24.4 -20.0 923.56897 9.23569 2.0 24.4 25.0 923.569

View File

@ -29,7 +29,6 @@ class Accelerometer(Sensor):
def __init__( def __init__(
self, dataset: DataSource, self, dataset: DataSource,
logger: Logger, logger: Logger,
coord_system: CoordSystem = CoordSystem.RIGHT_HANDED,
orientation: NDArray = np.identity(3), orientation: NDArray = np.identity(3),
offset: float = 0, offset: float = 0,
transforms: List[Transform] = []): transforms: List[Transform] = []):
@ -48,27 +47,22 @@ class Accelerometer(Sensor):
assert orientation.shape == (3, 3), 'Orientation has to be a 3x3 matrix.' assert orientation.shape == (3, 3), 'Orientation has to be a 3x3 matrix.'
self._offset = np.array([offset, 0, 0]) self._offset = np.array([offset, 0, 0])
self._coord_system = coord_system
self._orientation = orientation self._orientation = orientation
def _get_data(self) -> ArrayLike | float: def _get_data(self) -> ArrayLike | float:
acc = self._dataset.get_acceleration('global') acc = self._dataset.get_acceleration('global')
# self._logger.write('global_ax', acc[0], self._get_name()) self._logger.write('global_ax', acc[0], self._get_name())
# self._logger.write('global_ay', acc[1], self._get_name()) self._logger.write('global_ay', acc[1], self._get_name())
# self._logger.write('global_az', acc[2], self._get_name()) self._logger.write('global_az', acc[2], self._get_name())
# Convert FL to body # Convert FL to body
acc = self._dataset.global_to_local() @ acc acc = self._dataset.global_to_local() @ acc
# acc += mat @ np.array([0, 0, g]) acc += self._dataset.global_to_local() @ np.array([0, 0, g])
# self._logger.write('local_x', acc[0], self._get_name()) self._logger.write('local_x', acc[0], self._get_name())
# self._logger.write('local_y', acc[1], self._get_name()) self._logger.write('local_y', acc[1], self._get_name())
# self._logger.write('local_z', acc[2], self._get_name()) self._logger.write('local_z', acc[2], self._get_name())
# Flip axes to sensor's perspective. Spatz uses a right-handed coordinate system.
#if self._coord_system == CoordSystem.LEFT_HANDED:
# acc[1] *= -1
# Rotate the acceleration vector to accomodate the accelerometer's orientation on the rocket. # Rotate the acceleration vector to accomodate the accelerometer's orientation on the rocket.
acc = self._orientation @ acc acc = self._orientation @ acc

View File

@ -1,21 +1,30 @@
import numpy as np
from numpy.typing import ArrayLike from numpy.typing import ArrayLike
from typing import List from typing import List
from spatz.sensors import Sensor from spatz.sensors import Sensor
from spatz.transforms import Transform from spatz.transforms import Transform
from spatz.dataset import Dataset
from spatz.simulations.data_source import DataSource from spatz.simulations.data_source import DataSource
from spatz.logger import Logger from spatz.logger import Logger
class Gyroscope(Sensor): class Gyroscope(Sensor):
def __init__(self, dataset: DataSource, logger: Logger, offset: float = 0, transforms: List[Transform] = []): def __init__(self, dataset: DataSource, logger: Logger, orientation=np.identity(3), transforms: List[Transform] = []):
super().__init__(dataset, logger, transforms) super().__init__(dataset, logger, transforms)
self._offset = offset self._orientation = orientation
def calibrate(self, n_samples):
return np.sum(self() for i in range(n_samples)) / n_samples
def _get_data(self) -> ArrayLike | float: def _get_data(self) -> ArrayLike | float:
# Rotation in rad/sec # Rotation in rad/sec
x = self._dataset.get_angular_velocity() omegas = self._dataset.get_angular_velocity()
omegas = self._orientation @ omegas
return x self._log('ox', omegas[0])
self._log('oy', omegas[1])
self._log('oz', omegas[2])
return omegas

View File

@ -13,7 +13,7 @@ from spatz.transforms import Transform
class H3LIS100DL(Accelerometer): class H3LIS100DL(Accelerometer):
def __init__(self, dataset: DataSource, logger: Logger, orientation=np.identity(3), offset: float = 0, transforms: List[Transform] = []): def __init__(self, dataset: DataSource, logger: Logger, orientation=np.identity(3), offset: float = 0, transforms: List[Transform] = []):
super().__init__(dataset, logger, CoordSystem.RIGHT_HANDED, orientation, offset, transforms) super().__init__(dataset, logger, orientation, offset, transforms)
def _get_name(self) -> AnyStr: def _get_name(self) -> AnyStr:
return "H3LIS100DL" return "H3LIS100DL"
@ -23,6 +23,14 @@ class H3LIS100DL(Accelerometer):
g = 9.81 g = 9.81
x = np.floor(np.clip(x, -100*g, +100*g) / g) x = np.floor(np.clip(x, -100*g, +100*g) / g)
for i in range(3):
value = np.random.random()
if (value < 0.1):
x[i] += 1
if (value > 0.9):
x[i] -= 1
return x return x

View File

@ -4,7 +4,7 @@ from typing import AnyStr, List
from numpy.typing import ArrayLike from numpy.typing import ArrayLike
from spatz.sensors import Accelerometer, Gyroscope, IMU, CoordSystem from spatz.sensors import Accelerometer, Gyroscope, IMU, CoordSystem
from spatz.transforms import Transform, GaussianNoise from spatz.transforms import Transform, GaussianNoise, DriftingBias
from spatz.simulations.data_source import DataSource from spatz.simulations.data_source import DataSource
from spatz.dataset import Dataset from spatz.dataset import Dataset
from spatz.logger import Logger from spatz.logger import Logger
@ -14,26 +14,37 @@ class WSEN_ISDS(IMU):
pass pass
g = 9.81
class WSEN_ISDS_ACC(Accelerometer): class WSEN_ISDS_ACC(Accelerometer):
def __init__(self, dataset: DataSource, logger: Logger, orientation=np.identity(3), offset=0, transforms: List[Transform] = []): def __init__(self, dataset: DataSource, logger: Logger, orientation=np.identity(3), offset=0, transforms: List[Transform] = []):
super().__init__(dataset, logger, CoordSystem.LEFT_HANDED, orientation, offset, transforms) super().__init__(dataset, logger, orientation, offset, transforms)
self.__variance = 0.05 self.__bias = DriftingBias(np.zeros(3), np.array([
self.__noise = GaussianNoise(np.zeros(3), np.identity(3) * self.__variance) 0.00113044 / g * 1000,
0.00108539 / g * 1000,
0.00127884 / g * 1000
]), 400)
self.__constant_bias = np.random.normal(0, 0.81423, 3)
self.__normal = GaussianNoise(0, np.array([
0.0003330315865455515 / g * 1000,
0.00016874534484267122 / g * 1000,
0.0003885568325537318 / g * 100
]))
def _get_name(self) -> AnyStr: def _get_name(self) -> AnyStr:
return 'WSEN_ISDS_ACC' return 'WSEN_ISDS_ACC'
def _sensor_specific_effects(self, x: ArrayLike) -> ArrayLike: def _sensor_specific_effects(self, x: ArrayLike) -> ArrayLike:
t = self._dataset.get_time() t = self._dataset.get_time()
g = 9.81
# Convert to milli-g. # Convert to milli-g.
x = x / g * 1000 x = x / g * 1000
# Apply noise to the true values. # Apply noise to the true values.
y = self.__noise(t, x) y = self.__constant_bias + self.__normal(t, self.__bias(t, x))
noise = y - x noise = y - x
# Log the chosen noise values. # Log the chosen noise values.
@ -48,8 +59,12 @@ class WSEN_ISDS_ACC(Accelerometer):
class WSEN_ISDS_GYRO(Gyroscope): class WSEN_ISDS_GYRO(Gyroscope):
def __init__(self, dataset: Dataset, logger: Logger, offset=0, transforms: List[Transform] = []): def __init__(self, dataset: Dataset, logger: Logger, orientation = np.identity(3), transforms: List[Transform] = []):
super().__init__(dataset, logger, offset, transforms) super().__init__(dataset, logger, orientation, transforms)
self.__bias = DriftingBias(np.zeros(3), np.array([0.00218 * 1000, 0.00105 * 1000, 0.00203 * 1000]), 400)
self.__constant_bias = np.random.normal(0, 2*2000, 3)
self.__normal = GaussianNoise(0, np.array([0.0049272 * 1000, 0.00557833 * 1000, 0.00407826 * 1000]))
def _get_name(self) -> AnyStr: def _get_name(self) -> AnyStr:
return 'WSEN_ISDS_GYRO' return 'WSEN_ISDS_GYRO'
@ -58,6 +73,9 @@ class WSEN_ISDS_GYRO(Gyroscope):
# Convert to milli-degrees per second. # Convert to milli-degrees per second.
x = (x / np.pi) * 180 * 1000 x = (x / np.pi) * 180 * 1000
t = self._dataset.get_time()
x = self.__constant_bias + self.__normal(t, self.__bias(t, x))
# TODO: Noise model. # TODO: Noise model.
self._log('ox', x[0]) self._log('ox', x[0])

View File

@ -15,7 +15,7 @@ class MS5611(PressureSensor):
# Noise model obtained by a test flight using this sensor. # Noise model obtained by a test flight using this sensor.
# self.__pad_noise = GaussianNoise(0, 0.03) # self.__pad_noise = GaussianNoise(0, 0.03)
# self.__flight_noise = GaussianNoise(0, 1.5) # self.__flight_noise = GaussianNoise(0, 1.5)
self.__noise = ProportionalGaussian(0, 0.0015) self.__noise = GaussianNoise(0, 0.00043300242654881085)
def _get_name(self) -> AnyStr: def _get_name(self) -> AnyStr:
return 'MS5611' return 'MS5611'

View File

@ -1,3 +1,3 @@
from spatz.transforms.transform import Transform from spatz.transforms.transform import Transform
from spatz.transforms.noise import GaussianNoise, ProportionalGaussian from spatz.transforms.noise import GaussianNoise, ProportionalGaussian, DriftingBias
from spatz.transforms.failures import Downtime from spatz.transforms.failures import Downtime

View File

@ -37,6 +37,35 @@ class GaussianNoise(Transform):
return x return x
class DriftingBias(Transform):
def __init__(self, init: ArrayLike, covariance: ArrayLike, Tc: float) -> None:
"""First order Gauss-Markov (GM) model used to model drift.
Args:
init (ArrayLike): The initial bias.
covariance (ArrayLike): Covariance matrix of the process.
Tc (float): Correlation time of the process.
"""
super().__init__()
self.__t = 0
self.__beta = 1 / Tc
self.__covariance = covariance
self.__Tc = Tc
self.__x_old = np.copy(init)
def __call__(self, t: float, x: ArrayLike) -> ArrayLike:
dt = t - self.__t
self.__t = t
w = np.random.normal(np.zeros_like(x), self.__covariance*(1-np.exp(-2 * dt / self.__Tc)))
drift = (1 - self.__beta * dt) * self.__x_old + w
self.__x_old = drift
return x + drift
class ProportionalGaussian(Transform): class ProportionalGaussian(Transform):
def __init__(self, mu, sigma) -> None: def __init__(self, mu, sigma) -> None:
super().__init__() super().__init__()

123
testing.ipynb Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,10 +1,148 @@
from spatz.sensors.antenna.tx_gain import GainPattern import pygame
import math import serial
import re
import numpy as np
import time
pattern = GainPattern("data/gain_pattern/farfield_all.txt") from numpy import array
from pyquaternion import Quaternion
from math import cos, sin, pi
# pattern.get_gain(41,66) from spatz.sensors.imu.wsen_isds import WSEN_ISDS_GYRO
# pattern.get_gain(40,100) from spatz.simulation import Simulation
# pattern.get_gain(10,180) from spatz.simulations.rocketpy import RocketPyCSV
# pattern.get_gain(0,95)
# pattern.get_gain(21,100) # Blatantly stolen from: https://stackoverflow.com/questions/21019471/how-can-i-draw-a-3d-shape-using-pygame-no-other-modules
X, Y, Z = 0, 1, 2
def rotation_matrix(a, b, by):
"""
rotation matrix of a, b, by radians around x, y, z axes (respectively)
"""
sa, ca = sin(a), cos(a)
sb, cb = sin(b), cos(b)
sby, cby = sin(by), cos(by)
return (
(cb*cby, -cb*sby, sb),
(ca*sby + sa*sb*cby, ca*cby - sby*sa*sb, -cb*sa),
(sby*sa - ca*sb*cby, ca*sby*sb + sa*cby, ca*cb)
)
class Physical:
def __init__(self, vertices, edges, colors):
"""
a 3D object that can rotate around the three axes
:param vertices: a tuple of points (each has 3 coordinates)
:param edges: a tuple of pairs (each pair is a set containing 2 vertices' indexes)
"""
self.__vertices = array(vertices)
self.__edges = tuple(edges)
self.__colors = tuple(colors)
self.__rotation = Quaternion(axis=(1, 0, 0), angle=0) # radians around each axis
def rotate(self, quaternion):
self.__rotation = quaternion
@property
def lines(self):
location = array([self.__rotation.rotate(vertex) for vertex in self.__vertices]) # an index->location mapping
return (((location[v1], location[v2]), color) for (v1, v2), color in zip(self.__edges, self.__colors))
BLACK, RED, GREEN, BLUE = (0, 0, 0), (255, 128, 128), (128, 255, 128), (128, 128, 255)
LIGHTRED, LIGHTGREEN, LIGHTBLUE = (128, 64, 64), (64, 128, 64), (64, 64, 128)
class Paint:
def __init__(self, shape, shape2):
self.__shape = shape
self.__shape2 = shape2
self.__size = 900, 450
self.__clock = pygame.time.Clock()
self.__screen = pygame.display.set_mode(self.__size)
def __fit(self, vec):
"""
ignore the z-element (creating a very cheap projection), and scale x, y to the coordinates of the screen
"""
# notice that len(self.__size) is 2, hence zip(vec, self.__size) ignores the vector's last coordinate
return [round(70 * coordinate + frame / 2) for coordinate, frame in zip(vec, self.__size)]
def __draw_shape(self, thickness=4):
for (start, end), color in self.__shape.lines:
pygame.draw.line(self.__screen, color, self.__fit((start[0]-2, start[1], start[2])), self.__fit((end[0]-2, end[1], end[2])), thickness)
for (start, end), color in self.__shape2.lines:
pygame.draw.line(self.__screen, color, self.__fit((start[0]+2, start[1], start[2])), self.__fit((end[0]+2, end[1], end[2])), thickness)
def draw(self):
self.__screen.fill(BLACK)
self.__draw_shape()
pygame.display.flip()
self.__clock.tick(40)
def main():
from pygame import K_q, K_w, K_a, K_s, K_z, K_x
rotation = Quaternion(axis=[1, 0, 0], angle=pi/2)
axes = Physical(
vertices=((0, 0, 0), (0, 0, 2), (0, 2, 0), (2, 0, 0)),
edges=({0, 1}, {0, 2}, {0, 3}),
colors=(BLUE, GREEN, RED)
)
truth = Physical(
vertices=((0, 0, 0), (0, 0, 2), (0, 2, 0), (2, 0, 0)),
edges=({0, 1}, {0, 2}, {0, 3}),
colors=(LIGHTBLUE, LIGHTGREEN, LIGHTRED)
)
pygame.init()
pygame.display.set_caption("Simulation")
renderer = Paint(axes, truth)
simulation = Simulation().load(RocketPyCSV('nominal_wind.csv'))
gyro = simulation.add_sensor(WSEN_ISDS_GYRO)
offset = gyro.calibrate(100)
att = simulation.add_observer([' e0', ' e1', ' e2', ' e3'])
dt = 0.01
quat = np.array([-0.706864,0.018510,0.018510,-0.706864])
while True:
time.sleep(0.01)
simulation.advance(dt)
omegas = gyro() - offset
true = att()
omegas = (omegas / 1000) * np.pi / 180
matrix = np.array([
[1, -dt/2*omegas[0], -dt/2*omegas[1], -dt/2*omegas[2]],
[dt/2*omegas[0], 1, dt/2*omegas[2], -dt/2*omegas[1]],
[dt/2*omegas[1], -dt/2*omegas[2], 1, dt/2*omegas[0]],
[dt/2*omegas[2], dt/2*omegas[1], -dt/2*omegas[0], 1]
])
quat = matrix @ quat
quat /= np.linalg.norm(quat)
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
axes.rotate(Quaternion(x=quat[0], y=quat[1], z=quat[2], w=quat[3]))
truth.rotate(Quaternion(x=true[0], y=true[1], z=true[2], w=true[3]))
renderer.draw()
if __name__ == '__main__':
main()