@jjlmoya/utils-drones 1.30.0 → 1.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -0
  3. package/src/entries.ts +4 -0
  4. package/src/index.ts +1 -1
  5. package/src/tests/locale_completeness.test.ts +1 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/drone-motor-propeller-calculator/bibliography.astro +6 -0
  8. package/src/tool/drone-motor-propeller-calculator/bibliography.ts +12 -0
  9. package/src/tool/drone-motor-propeller-calculator/component.astro +109 -0
  10. package/src/tool/drone-motor-propeller-calculator/controller.ts +174 -0
  11. package/src/tool/drone-motor-propeller-calculator/dom-views.ts +78 -0
  12. package/src/tool/drone-motor-propeller-calculator/drone-motor-propeller-calculator.css +562 -0
  13. package/src/tool/drone-motor-propeller-calculator/entry.ts +27 -0
  14. package/src/tool/drone-motor-propeller-calculator/evaluator.ts +14 -0
  15. package/src/tool/drone-motor-propeller-calculator/i18n/de.ts +202 -0
  16. package/src/tool/drone-motor-propeller-calculator/i18n/en.ts +202 -0
  17. package/src/tool/drone-motor-propeller-calculator/i18n/es.ts +202 -0
  18. package/src/tool/drone-motor-propeller-calculator/i18n/fr.ts +202 -0
  19. package/src/tool/drone-motor-propeller-calculator/i18n/id.ts +192 -0
  20. package/src/tool/drone-motor-propeller-calculator/i18n/it.ts +192 -0
  21. package/src/tool/drone-motor-propeller-calculator/i18n/ja.ts +192 -0
  22. package/src/tool/drone-motor-propeller-calculator/i18n/ko.ts +192 -0
  23. package/src/tool/drone-motor-propeller-calculator/i18n/nl.ts +192 -0
  24. package/src/tool/drone-motor-propeller-calculator/i18n/pl.ts +192 -0
  25. package/src/tool/drone-motor-propeller-calculator/i18n/pt.ts +192 -0
  26. package/src/tool/drone-motor-propeller-calculator/i18n/ru.ts +192 -0
  27. package/src/tool/drone-motor-propeller-calculator/i18n/sv.ts +192 -0
  28. package/src/tool/drone-motor-propeller-calculator/i18n/tr.ts +192 -0
  29. package/src/tool/drone-motor-propeller-calculator/i18n/zh.ts +192 -0
  30. package/src/tool/drone-motor-propeller-calculator/index.ts +11 -0
  31. package/src/tool/drone-motor-propeller-calculator/logic.test.ts +56 -0
  32. package/src/tool/drone-motor-propeller-calculator/logic.ts +108 -0
  33. package/src/tool/drone-motor-propeller-calculator/seo.astro +12 -0
  34. package/src/tool/drone-motor-propeller-calculator/storage.ts +26 -0
  35. package/src/tool/drone-motor-propeller-calculator/ui.ts +55 -0
  36. package/src/tools.ts +3 -0
@@ -0,0 +1,192 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { SEOSection } from '../../../types';
3
+ import type { DroneMotorPropellerLocaleContent } from '../entry';
4
+ import { BIBLIOGRAPHY_ITEMS } from '../bibliography';
5
+
6
+ const slug = 'kalkylator-dronarmotor-och-propeller';
7
+ const title = 'Kalkylator för Drönarmotor och Propeller';
8
+ const description = 'Uppskatta drönarmotorns dragkraft, varvtal under belastning, stigningshastighet, effekt och strömförbrukning utifrån KV, batterispänning, propellergeometri och drönarvikt.';
9
+
10
+ const ui = {
11
+ "presetsHeader": "Välj en flygprofil",
12
+ "presetTinyCruiser": "Lätt micro cruiser 3.5 tum",
13
+ "presetFreestyle": "Freestyle 5 tum",
14
+ "presetLongRange": "Long range 7 tum",
15
+ "presetCinelifter": "Cinelifter 8 motorer",
16
+ "unitHeader": "Visningsenheter",
17
+ "metricUnit": "Metrisk",
18
+ "imperialUnit": "Imperial",
19
+ "setupHeader": "Drivlina och ram",
20
+ "motorKvLabel": "Motor KV (RPM/V)",
21
+ "batteryVoltageLabel": "Batterispänning",
22
+ "propDiameterLabel": "Propellerdiameter",
23
+ "propPitchLabel": "Propellerstigning",
24
+ "bladeCountLabel": "Antal blad",
25
+ "motorCountLabel": "Antal motorer",
26
+ "droneWeightLabel": "Flygfärdig vikt (RTF)",
27
+ "benchDataHeader": "Tillverkarens testpunkt",
28
+ "benchThrustLabel": "Dragkraft per motor",
29
+ "benchVoltageLabel": "Testspänning",
30
+ "optionalLabel": "Valfritt",
31
+ "twoBlades": "2 blad",
32
+ "threeBlades": "3 blad",
33
+ "fourBlades": "4 blad",
34
+ "twoMotors": "2 motorer",
35
+ "fourMotors": "4 motorer",
36
+ "sixMotors": "6 motorer",
37
+ "eightMotors": "8 motorer",
38
+ "resultsHeader": "Dragkraft och lyftkraftsbalans",
39
+ "estimatedLabel": "Fysikalisk modelluppskattning.",
40
+ "benchBasedLabel": "Kalibrerad med testbänk.",
41
+ "loadedRpmLabel": "Varvtal under belastning",
42
+ "pitchSpeedLabel": "Teoretisk stigningshastighet",
43
+ "thrustPerMotorLabel": "Dragkraft per motor",
44
+ "totalThrustLabel": "Total statisk dragkraft",
45
+ "totalPowerLabel": "Beräknad effekt",
46
+ "totalCurrentLabel": "Beräknad ström",
47
+ "thrustMarginLabel": "Lyftkraftsmarginal",
48
+ "hoverThrottleLabel": "Gas vid hovring",
49
+ "sceneCaption": "propellerhastighet under belastning",
50
+ "underpoweredStatus": "Låg marginal",
51
+ "workableStatus": "Användbar marginal",
52
+ "headroomStatus": "God marginal",
53
+ "underpoweredAdvice": "Den totala dragkraften är mindre än dubbla drönarvikten. Förvänta dig begränsad manöverförmåga och låg tolerans mot vind.",
54
+ "workableAdvice": "Praktisk reserv för normal flygning. Kontrollera motortemperatur och ESC efter långvarig hovring.",
55
+ "headroomAdvice": "Riklig statisk lyftkraftsreserv. Förbättrar kontrollen men kräver mer ström från fartreglagen.",
56
+ "sourceNote": "Testpunkten kalibrerar endast dragkraften. Effekt och ström förblir modelluppskattningar.",
57
+ "modelSourceNote": "Ingen testpunkt. Använder teoretisk fysikalisk modell.",
58
+ "manufacturerNote": "Använd helst mätdata från samma motor och propeller.",
59
+ "modelNote": "Statisk dragkraft, effekt och ström är uppskattningar. Verkliga resultat beror på luftdensitet och förluster.",
60
+ "safetyNote": "Använd aldrig kalkylatorn som ersättning för en riktig testbänk. Kontrollera elektriska gränser före flygning.",
61
+ "thrustAxisLabel": "Dragkraftsriktning",
62
+ "weightAxisLabel": "Drönarvikt",
63
+ "clearBenchData": "Rensa testpunkt"
64
+ };
65
+
66
+ const faq = [
67
+ {
68
+ "question": "Vad beräknar denna kalkylator för drönarmotor och propeller?",
69
+ "answer": "Den uppskattar varvtal under belastning, stigningshastighet, dragkraft per motor och totalt, effekt samt ström baserat på KV, spänning, propeller och vikt."
70
+ },
71
+ {
72
+ "question": "Hur matchar jag motor och propeller för en drönare?",
73
+ "answer": "Börja med tillverkarens rekommendationer. Jämför den totala dragkraften med flygvikten och verifiera ström och temperatur på en testbänk."
74
+ },
75
+ {
76
+ "question": "Varför är en testpunkt från tillverkaren bättre än den teoretiska modellen?",
77
+ "answer": "Den tar hänsyn till den exakta propellergeometrin och förlusterna. Kalkylatorn skalar uppgiften till den valda spänningen."
78
+ },
79
+ {
80
+ "question": "Hur påverkar propellerstorleken drönarens dragkraft?",
81
+ "answer": "Statisk dragkraft beror starkt på diameter och varvtal. En större propeller flyttar mer luft men kräver mer vridmoment."
82
+ },
83
+ {
84
+ "question": "Garanterar denna kalkylator att drönaren är säker att flyga?",
85
+ "answer": "Nej. Det är ett planeringsverktyg. Kontrollera verklig ström och temperatur på en testbänk före flygning."
86
+ }
87
+ ];
88
+
89
+ const howTo = [
90
+ {
91
+ "name": "Välj en flygprofil",
92
+ "text": "Välj en förinställning för att läsa in lämpliga startvärden för KV, spänning, propeller och vikt."
93
+ },
94
+ {
95
+ "name": "Ange ram och propellerdata",
96
+ "text": "Ange flygvikt samt specifikationer för motor och propeller i metriska eller imperialistiska enheter."
97
+ },
98
+ {
99
+ "name": "Lägg till en mätpunkt",
100
+ "text": "Om du har testbänksdata anger du uppmätt dragkraft och testspänning för att kalibrera modellen."
101
+ }
102
+ ];
103
+
104
+ const seo: SEOSection[] = [
105
+ {
106
+ type: 'title',
107
+ text: 'Principen för matchning av drönarmotor och propeller',
108
+ level: 2,
109
+ },
110
+ {
111
+ type: 'paragraph',
112
+ html: 'Kombinationen av motor och propeller beror på varvtal, diameter, stigning, spänning och vridmoment. Verktyget beräknar statisk lyftkraft och strömförbrukning.',
113
+ },
114
+ {
115
+ type: 'title',
116
+ text: 'Resultat som visas',
117
+ level: 2,
118
+ },
119
+ {
120
+ type: 'table',
121
+ headers: ["Resultat","Betydelse"],
122
+ rows: [["Varvtal under belastning","Obelastat RPM uppskattat och reducerat med belastningsfaktor"],["Statisk dragkraft","Dragkraft per motor och total lyftkraft"],["Lyftkraftsmarginal","Total statisk dragkraft jämförd med drönarvikt"],["Effekt och ström","Beräknad elförbrukning vid vald spänning"]],
123
+ },
124
+ {
125
+ type: 'title',
126
+ text: 'Hur du använder kalkylatorn',
127
+ level: 2,
128
+ },
129
+ {
130
+ type: 'list',
131
+ items: ["Ange motor KV och batterispänning.","Välj diameter, stigning, antal blad och motorer.","Lägg till tillverkarens testdata om det finns.","Verifiera temperatur och ström på testbänk före flygning."],
132
+ },
133
+ {
134
+ type: 'title',
135
+ text: 'Betydelsen av mätdata',
136
+ level: 2,
137
+ },
138
+ {
139
+ type: 'paragraph',
140
+ html: 'Propellerdragkraft beror på luftdensitet och form. Uppmätta testbänksdata ger den mest exakta kalibreringen.',
141
+ },
142
+ {
143
+ type: 'tip',
144
+ title: 'Testplanering',
145
+ html: 'Utför ett test på testbänk och mät ström och temperatur före första flygningen.',
146
+ },
147
+ ];
148
+
149
+ const schemas: DroneMotorPropellerLocaleContent['schemas'] = [
150
+ {
151
+ '@context': 'https://schema.org',
152
+ '@type': 'FAQPage',
153
+ mainEntity: faq.map((item) => ({
154
+ '@type': 'Question',
155
+ name: item.question,
156
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
157
+ })),
158
+ } as WithContext<FAQPage>,
159
+ {
160
+ '@context': 'https://schema.org',
161
+ '@type': 'HowTo',
162
+ name: title,
163
+ description,
164
+ step: howTo.map((step, index) => ({
165
+ '@type': 'HowToStep',
166
+ position: index + 1,
167
+ name: step.name,
168
+ text: step.text,
169
+ })),
170
+ } as WithContext<HowTo>,
171
+ {
172
+ '@context': 'https://schema.org',
173
+ '@type': 'SoftwareApplication',
174
+ name: title,
175
+ description,
176
+ applicationCategory: 'UtilityApplication',
177
+ operatingSystem: 'All',
178
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
179
+ } as WithContext<SoftwareApplication>,
180
+ ];
181
+
182
+ export const content: DroneMotorPropellerLocaleContent = {
183
+ slug,
184
+ title,
185
+ description,
186
+ ui,
187
+ seo,
188
+ faq,
189
+ bibliography: BIBLIOGRAPHY_ITEMS,
190
+ howTo,
191
+ schemas,
192
+ };
@@ -0,0 +1,192 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { SEOSection } from '../../../types';
3
+ import type { DroneMotorPropellerLocaleContent } from '../entry';
4
+ import { BIBLIOGRAPHY_ITEMS } from '../bibliography';
5
+
6
+ const slug = 'dron-motor-ve-pervane-hesaplayici';
7
+ const title = 'Dron Motor ve Pervane Hesaplayıcı';
8
+ const description = 'Motor KV değeri, pil voltajı, pervane geometrisi ve dron ağırlığından motor itiş kuvveti, yüklü RPM, adım hızı, güç ve akım çekimini hesaplayın.';
9
+
10
+ const ui = {
11
+ "presetsHeader": "Bir uçuş profili seçin",
12
+ "presetTinyCruiser": "Hafif micro cruiser 3.5 inç",
13
+ "presetFreestyle": "Freestyle 5 inç",
14
+ "presetLongRange": "Long range 7 inç",
15
+ "presetCinelifter": "Cinelifter 8 motorlu",
16
+ "unitHeader": "Görüntüleme birimleri",
17
+ "metricUnit": "Metrik",
18
+ "imperialUnit": "İmparatorluk",
19
+ "setupHeader": "Motor sistemi ve gövde",
20
+ "motorKvLabel": "Motor KV değeri (RPM/V)",
21
+ "batteryVoltageLabel": "Pil voltajı",
22
+ "propDiameterLabel": "Pervane çapı",
23
+ "propPitchLabel": "Pervane adımı",
24
+ "bladeCountLabel": "Kanat sayısı",
25
+ "motorCountLabel": "Motor sayısı",
26
+ "droneWeightLabel": "Uçuşa hazır ağırlık (RTF)",
27
+ "benchDataHeader": "Üretici test noktası",
28
+ "benchThrustLabel": "Motor başına itiş",
29
+ "benchVoltageLabel": "Test voltajı",
30
+ "optionalLabel": "İsteğe bağlı",
31
+ "twoBlades": "2 kanatlı",
32
+ "threeBlades": "3 kanatlı",
33
+ "fourBlades": "4 kanatlı",
34
+ "twoMotors": "2 motorlu",
35
+ "fourMotors": "4 motorlu",
36
+ "sixMotors": "6 motorlu",
37
+ "eightMotors": "8 motorlu",
38
+ "resultsHeader": "İtiş ve kaldırma dengesi",
39
+ "estimatedLabel": "Fiziksel model tahmini.",
40
+ "benchBasedLabel": "Test standı verisiyle kalibre.",
41
+ "loadedRpmLabel": "Yüklü hız",
42
+ "pitchSpeedLabel": "Teorik hatve hızı",
43
+ "thrustPerMotorLabel": "Motor başına itiş",
44
+ "totalThrustLabel": "Toplam statik itiş",
45
+ "totalPowerLabel": "Tahmini güç",
46
+ "totalCurrentLabel": "Tahmini akım",
47
+ "thrustMarginLabel": "Kaldırma marjı",
48
+ "hoverThrottleLabel": "Süzülme gazı",
49
+ "sceneCaption": "yük altındaki pervane hızı",
50
+ "underpoweredStatus": "Düşük marj",
51
+ "workableStatus": "Kullanılabilir marj",
52
+ "headroomStatus": "Güçlü marj",
53
+ "underpoweredAdvice": "Toplam itiş kuvveti dron ağırlığının iki katından azdır. Rüzgarda ve ani manevralarda toparlanma kabiliyeti sınırlı olabilir.",
54
+ "workableAdvice": "Normal uçuş için pratik yedek güç. Hesaplamaya güvenmeden önce uzun süreli süzülme sonrası motor sıcaklığını kontrol edin.",
55
+ "headroomAdvice": "Cömert statik kaldırma rezervi. Kontrol tepkisini artırır ancak ESC lerden daha fazla akım çeker.",
56
+ "sourceNote": "Test noktası yalnızca itişi kalibre eder. Güç ve akım model tahminleridir.",
57
+ "modelSourceNote": "Test verisi yok. İtiş şeffaf katsayı modelini kullanır.",
58
+ "manufacturerNote": "Mümkünse aynı motor ve pervane kombinasyonuna ait test verisini kullanın.",
59
+ "modelNote": "Statik itiş, güç ve akım tahmindir. Gerçek sonuçlar hava yoğunluğu ve kayıplara bağlıdır.",
60
+ "safetyNote": "Bu hesaplayıcıyı hiçbir zaman gerçek test standının yerine kullanmayın. Uçuştan önce sınırları doğrulayın.",
61
+ "thrustAxisLabel": "İtiş yönü",
62
+ "weightAxisLabel": "Dron ağırlığı",
63
+ "clearBenchData": "Test verisini temizle"
64
+ };
65
+
66
+ const faq = [
67
+ {
68
+ "question": "Bu dron motor ve pervane hesaplayıcısı neleri hesaplar?",
69
+ "answer": "Yüklü RPM, teorik adım hızı, motor başına ve toplam statik itiş, güç ve akımı KV, voltaj, pervane ve ağırlık verilerinden tahmin eder."
70
+ },
71
+ {
72
+ "question": "Dron motoru ile pervane nasıl eşleştirilir?",
73
+ "answer": "Üreticinin önerdiği KV ve pervane boyutlarıyla başlayın. Toplam itişi uçuş ağırlığıyla karşılaştırın ve uçuştan önce test standında kontrol edin."
74
+ },
75
+ {
76
+ "question": "Üretici test verisi neden teorik modelden daha iyidir?",
77
+ "answer": "Gerçek pervane geometrisini ve kayıpları içerir. Hesaplayıcı bu veriyi seçilen voltaja uyarlar."
78
+ },
79
+ {
80
+ "question": "Pervane boyutu dron itiş kuvvetini nasıl etkiler?",
81
+ "answer": "Statik itiş doğrudan çapa ve dönme hızına bağlıdır. Daha büyük pervane daha fazla hava iter ancak motordan daha fazla tork talep eder."
82
+ },
83
+ {
84
+ "question": "Bu hesaplayıcı dronun güvenle uçacağını garanti eder mi?",
85
+ "answer": "Hayır. Bu bir planlama aracıdır. Uçuştan önce gerçek akım ve sıcaklık değerlerini test standında doğrulayın."
86
+ }
87
+ ];
88
+
89
+ const howTo = [
90
+ {
91
+ "name": "Bir uçuş profili seçin",
92
+ "text": "Başlangıç değerlerini yüklemek için dronunuza en yakın hazır ayarı seçin."
93
+ },
94
+ {
95
+ "name": "Gövde ve pervane verilerini girin",
96
+ "text": "Uçuş ağırlığını ve motor pervane özelliklerini metrik veya imparatorluk birimlerinde girin."
97
+ },
98
+ {
99
+ "name": "Ölçülen test noktasını ekleyin",
100
+ "text": "Test standı veriniz varsa, modeli kalibre etmek için motor başına itiş ve voltajı girin."
101
+ }
102
+ ];
103
+
104
+ const seo: SEOSection[] = [
105
+ {
106
+ type: 'title',
107
+ text: 'Dron motoru ve pervane uyumu nasıl çalışır',
108
+ level: 2,
109
+ },
110
+ {
111
+ type: 'paragraph',
112
+ html: 'Motor ve pervane eşleşmesi dönme hızı, çap, adım, pil voltajı ve tork arasındaki dengedir. Bu araç statik kaldırma ve elektrik gereksinimini hesaplar.',
113
+ },
114
+ {
115
+ type: 'title',
116
+ text: 'Hesaplayıcının gösterdiği sonuçlar',
117
+ level: 2,
118
+ },
119
+ {
120
+ type: 'table',
121
+ headers: ["Sonuç","Ne anlama gelir"],
122
+ rows: [["Yüklü hız","Yük faktörü ile düşürülmüş boşta RPM tahmini"],["Statik itiş","Motor başına itiş ve toplam kaldırma gücü"],["Kaldırma marjı","Toplam statik itişin uçuş ağırlığına oranı"],["Güç ve akım","Seçilen voltaj için tahmini elektrik çekimi"]],
123
+ },
124
+ {
125
+ type: 'title',
126
+ text: 'Dron motor hesaplayıcısı nasıl kullanılır',
127
+ level: 2,
128
+ },
129
+ {
130
+ type: 'list',
131
+ items: ["Motor KV ve pil voltajını girin.","Pervane çapı, adımı, kanat ve motor sayısını seçin.","Varsa üretici test standı verisini ekleyin.","Uçuştan önce akım ve sıcaklığı test standında doğrulayın."],
132
+ },
133
+ {
134
+ type: 'title',
135
+ text: 'Test verisinin önemi',
136
+ level: 2,
137
+ },
138
+ {
139
+ type: 'paragraph',
140
+ html: 'Pervane itişi hava yoğunluğuna ve geometriye bağlıdır. Ölçülen test verileri en doğru kalibrasyonu sağlar.',
141
+ },
142
+ {
143
+ type: 'tip',
144
+ title: 'Test planı hazırlama',
145
+ html: 'İlk uçuştan önce motor sıcaklığını ve akım çekimini test standında kontrol edin.',
146
+ },
147
+ ];
148
+
149
+ const schemas: DroneMotorPropellerLocaleContent['schemas'] = [
150
+ {
151
+ '@context': 'https://schema.org',
152
+ '@type': 'FAQPage',
153
+ mainEntity: faq.map((item) => ({
154
+ '@type': 'Question',
155
+ name: item.question,
156
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
157
+ })),
158
+ } as WithContext<FAQPage>,
159
+ {
160
+ '@context': 'https://schema.org',
161
+ '@type': 'HowTo',
162
+ name: title,
163
+ description,
164
+ step: howTo.map((step, index) => ({
165
+ '@type': 'HowToStep',
166
+ position: index + 1,
167
+ name: step.name,
168
+ text: step.text,
169
+ })),
170
+ } as WithContext<HowTo>,
171
+ {
172
+ '@context': 'https://schema.org',
173
+ '@type': 'SoftwareApplication',
174
+ name: title,
175
+ description,
176
+ applicationCategory: 'UtilityApplication',
177
+ operatingSystem: 'All',
178
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
179
+ } as WithContext<SoftwareApplication>,
180
+ ];
181
+
182
+ export const content: DroneMotorPropellerLocaleContent = {
183
+ slug,
184
+ title,
185
+ description,
186
+ ui,
187
+ seo,
188
+ faq,
189
+ bibliography: BIBLIOGRAPHY_ITEMS,
190
+ howTo,
191
+ schemas,
192
+ };
@@ -0,0 +1,192 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { SEOSection } from '../../../types';
3
+ import type { DroneMotorPropellerLocaleContent } from '../entry';
4
+ import { BIBLIOGRAPHY_ITEMS } from '../bibliography';
5
+
6
+ const slug = 'drone-motor-propeller-calculator';
7
+ const title = '无人机电机与螺旋桨推力计算器';
8
+ const description = '根据电机KV值、电池电压、螺旋桨尺寸和机身重量,估算无人机电机推力、负载转速、螺距速度、功率与电流。';
9
+
10
+ const ui = {
11
+ "presetsHeader": "选择飞行预设",
12
+ "presetTinyCruiser": "轻型微型巡航机 3.5英寸",
13
+ "presetFreestyle": "花飞机 5英寸",
14
+ "presetLongRange": "远航机 7英寸",
15
+ "presetCinelifter": "电影级载重机 8电机",
16
+ "unitHeader": "显示单位",
17
+ "metricUnit": "公制",
18
+ "imperialUnit": "英制",
19
+ "setupHeader": "动力系统与机架",
20
+ "motorKvLabel": "电机KV值 (RPM/V)",
21
+ "batteryVoltageLabel": "电池电压",
22
+ "propDiameterLabel": "螺旋桨直径",
23
+ "propPitchLabel": "螺旋桨螺距",
24
+ "bladeCountLabel": "桨叶数量",
25
+ "motorCountLabel": "电机数量",
26
+ "droneWeightLabel": "起飞全重 (RTF)",
27
+ "benchDataHeader": "厂家测试点数据",
28
+ "benchThrustLabel": "单电机推力",
29
+ "benchVoltageLabel": "测试电压",
30
+ "optionalLabel": "选填",
31
+ "twoBlades": "2叶",
32
+ "threeBlades": "3叶",
33
+ "fourBlades": "4叶",
34
+ "twoMotors": "2电机",
35
+ "fourMotors": "4电机",
36
+ "sixMotors": "6电机",
37
+ "eightMotors": "8电机",
38
+ "resultsHeader": "推力与升力平衡",
39
+ "estimatedLabel": "基于物理模型估算。",
40
+ "benchBasedLabel": "已校准台测数据。",
41
+ "loadedRpmLabel": "负载转速",
42
+ "pitchSpeedLabel": "理论螺距速度",
43
+ "thrustPerMotorLabel": "单电机推力",
44
+ "totalThrustLabel": "总静态推力",
45
+ "totalPowerLabel": "估算功率",
46
+ "totalCurrentLabel": "估算电流",
47
+ "thrustMarginLabel": "升力裕度",
48
+ "hoverThrottleLabel": "悬停油门",
49
+ "sceneCaption": "负载下螺旋桨转速",
50
+ "underpoweredStatus": "裕度不足",
51
+ "workableStatus": "可用裕度",
52
+ "headroomStatus": "充沛裕度",
53
+ "underpoweredAdvice": "总推力不足起飞重量的2倍。应对大风或电压骤降的恢复能力受限。",
54
+ "workableAdvice": "适合正常飞行的实用裕度。建议在长时间悬停后检查电机和电调温度。",
55
+ "headroomAdvice": "充沛的静态升力储备。可显著提升操控响应,但会增加电调与电池的电流负担。",
56
+ "sourceNote": "测试点仅校准推力,功率和电流仍为模型估算值。",
57
+ "modelSourceNote": "无测试点,推力采用透明物理系数模型。",
58
+ "manufacturerNote": "请优先使用同款电机与螺旋桨的厂家测试数据。",
59
+ "modelNote": "静态推力、功率与电流均为估算值,实际性能取决于空气密度与电机损耗。",
60
+ "safetyNote": "飞行前请务必在推力测试台上验证实际电流与温度。",
61
+ "thrustAxisLabel": "推力方向",
62
+ "weightAxisLabel": "机身重量",
63
+ "clearBenchData": "清除测试点"
64
+ };
65
+
66
+ const faq = [
67
+ {
68
+ "question": "这款无人机电机与螺旋桨计算器可以计算什么?",
69
+ "answer": "它可以根据电机KV、电压、桨叶规格和重量,估算负载RPM、理论螺距速度、单电机及总推力、功率和电流。"
70
+ },
71
+ {
72
+ "question": "如何为无人机匹配合适的电机和螺旋桨?",
73
+ "answer": "首先参考厂家推荐的KV和桨叶尺寸,对比总推力与起飞全重,并在飞行前通过推力台验证电流和温度。"
74
+ },
75
+ {
76
+ "question": "为什么厂家测试点比纯物理模型更准确?",
77
+ "answer": "因为测试点包含了真实桨叶几何结构和损耗。计算器会将该数据按指定电压进行等比缩放。"
78
+ },
79
+ {
80
+ "question": "螺旋桨尺寸如何影响无人机推力?",
81
+ "answer": "静态推力高度依赖于直径和转速。更大直径的螺旋桨能推动更多空气,但需要电机提供更大的扭矩。"
82
+ },
83
+ {
84
+ "question": "该计算器能否保证无人机飞行安全?",
85
+ "answer": "不能。它是一个设计规划工具。飞行前请务必在测试台上验证实际电流、温度和推力。"
86
+ }
87
+ ];
88
+
89
+ const howTo = [
90
+ {
91
+ "name": "选择飞行预设",
92
+ "text": "选择最接近的预设,以加载合理的KV、电压、桨叶和重量初始值。"
93
+ },
94
+ {
95
+ "name": "输入机架与螺旋桨数据",
96
+ "text": "输入起飞全重以及电机和螺旋桨规格。支持公制与英制单位切换。"
97
+ },
98
+ {
99
+ "name": "添加台测数据",
100
+ "text": "如果有厂家或测试台数据,请输入单电机推力和测试电压以校准模型。"
101
+ }
102
+ ];
103
+
104
+ const seo: SEOSection[] = [
105
+ {
106
+ type: 'title',
107
+ text: '无人机电机与螺旋桨匹配原理',
108
+ level: 2,
109
+ },
110
+ {
111
+ type: 'paragraph',
112
+ html: '电机与螺旋桨的搭配是转速、直径、螺距、电压和扭矩之间的平衡。本工具估算静态升力和电气负载,方便在购买前评估储备。',
113
+ },
114
+ {
115
+ type: 'title',
116
+ text: '计算器显示的结果',
117
+ level: 2,
118
+ },
119
+ {
120
+ type: 'table',
121
+ headers: ["结果","技术含义"],
122
+ rows: [["负载转速","应用负载系数后的估算RPM"],["静态推力","单电机推力及多轴总升力"],["升力裕度","总静态推力与起飞全重的对比"],["功率与电流","指定电压下的估算用电需求"]],
123
+ },
124
+ {
125
+ type: 'title',
126
+ text: '如何使用无人机推力计算器',
127
+ level: 2,
128
+ },
129
+ {
130
+ type: 'list',
131
+ items: ["输入电机KV值和电池电压。","选择螺旋桨直径、螺距、叶数和电机数。","如有条件,添加厂家测试台数据。","飞行前在测试台上验证电流与温度。"],
132
+ },
133
+ {
134
+ type: 'title',
135
+ text: '测试数据的的重要性',
136
+ level: 2,
137
+ },
138
+ {
139
+ type: 'paragraph',
140
+ html: '螺旋桨推力取决于空气密度和几何形状。使用厂家台测数据能提供最准确的校准。',
141
+ },
142
+ {
143
+ type: 'tip',
144
+ title: '测试建议',
145
+ html: '在首次飞行前,使用测试台测量各油门位置下的电流与电机温度。',
146
+ },
147
+ ];
148
+
149
+ const schemas: DroneMotorPropellerLocaleContent['schemas'] = [
150
+ {
151
+ '@context': 'https://schema.org',
152
+ '@type': 'FAQPage',
153
+ mainEntity: faq.map((item) => ({
154
+ '@type': 'Question',
155
+ name: item.question,
156
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
157
+ })),
158
+ } as WithContext<FAQPage>,
159
+ {
160
+ '@context': 'https://schema.org',
161
+ '@type': 'HowTo',
162
+ name: title,
163
+ description,
164
+ step: howTo.map((step, index) => ({
165
+ '@type': 'HowToStep',
166
+ position: index + 1,
167
+ name: step.name,
168
+ text: step.text,
169
+ })),
170
+ } as WithContext<HowTo>,
171
+ {
172
+ '@context': 'https://schema.org',
173
+ '@type': 'SoftwareApplication',
174
+ name: title,
175
+ description,
176
+ applicationCategory: 'UtilityApplication',
177
+ operatingSystem: 'All',
178
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
179
+ } as WithContext<SoftwareApplication>,
180
+ ];
181
+
182
+ export const content: DroneMotorPropellerLocaleContent = {
183
+ slug,
184
+ title,
185
+ description,
186
+ ui,
187
+ seo,
188
+ faq,
189
+ bibliography: BIBLIOGRAPHY_ITEMS,
190
+ howTo,
191
+ schemas,
192
+ };
@@ -0,0 +1,11 @@
1
+ import { droneMotorPropellerCalculator } from './entry';
2
+ import type { ToolDefinition } from '../../types';
3
+
4
+ export * from './entry';
5
+
6
+ export const DRONE_MOTOR_PROPELLER_CALCULATOR_TOOL: ToolDefinition = {
7
+ entry: droneMotorPropellerCalculator,
8
+ Component: () => import('./component.astro'),
9
+ SEOComponent: () => import('./seo.astro'),
10
+ BibliographyComponent: () => import('./bibliography.astro'),
11
+ };
@@ -0,0 +1,56 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import {
3
+ calculateDroneMotorMetrics,
4
+ calculateLoadedRpm,
5
+ type DroneMotorInputs,
6
+ } from './logic';
7
+
8
+ const baseInputs: DroneMotorInputs = {
9
+ motorKv: 1950,
10
+ batteryVoltage: 22.2,
11
+ propDiameterInches: 5.1,
12
+ propPitchInches: 4.3,
13
+ bladeCount: 3,
14
+ motorCount: 4,
15
+ droneWeightGrams: 700,
16
+ };
17
+
18
+ describe('Drone motor and propeller calculator logic', () => {
19
+ it('estimates loaded RPM from KV and voltage', () => {
20
+ expect(calculateLoadedRpm(baseInputs)).toBeCloseTo(36796.5, 0);
21
+ });
22
+
23
+ it('uses the transparent physics model without a bench point', () => {
24
+ const results = calculateDroneMotorMetrics(baseInputs);
25
+ expect(results.thrustSource).toBe('model');
26
+ expect(results.thrustPerMotorGrams).toBeGreaterThan(900);
27
+ expect(results.totalThrustGrams).toBeGreaterThan(results.thrustPerMotorGrams);
28
+ expect(results.totalPowerWatts).toBeGreaterThan(100);
29
+ expect(results.totalCurrentAmps).toBeGreaterThan(5);
30
+ });
31
+
32
+ it('scales a manufacturer bench point at the selected voltage', () => {
33
+ const results = calculateDroneMotorMetrics({ ...baseInputs, batteryVoltage: 18.5, benchThrustGrams: 1900, benchVoltage: 22.2 });
34
+ expect(results.thrustSource).toBe('bench');
35
+ expect(results.thrustPerMotorGrams).toBeCloseTo(953, 0);
36
+ });
37
+
38
+ it('supports two, three and four blade setups', () => {
39
+ const twoBlade = calculateDroneMotorMetrics({ ...baseInputs, bladeCount: 2 });
40
+ const fourBlade = calculateDroneMotorMetrics({ ...baseInputs, bladeCount: 4 });
41
+ expect(twoBlade.thrustPerMotorGrams).toBeLessThan(fourBlade.thrustPerMotorGrams);
42
+ });
43
+
44
+ it('calculates lift margin and hover throttle', () => {
45
+ const results = calculateDroneMotorMetrics({ ...baseInputs, motorCount: 8, droneWeightGrams: 400 });
46
+ expect(results.thrustToWeight).toBeGreaterThan(2);
47
+ expect(results.thrustMarginPercent).toBeGreaterThan(100);
48
+ expect(results.hoverThrottlePercent).toBeLessThan(71);
49
+ });
50
+
51
+ it('keeps hover throttle within a usable range for a heavy setup', () => {
52
+ const results = calculateDroneMotorMetrics({ ...baseInputs, droneWeightGrams: 50000, motorCount: 2 });
53
+ expect(results.hoverThrottlePercent).toBe(100);
54
+ expect(results.thrustMarginPercent).toBeLessThan(0);
55
+ });
56
+ });