ज़ेफ़िरोस: स्थिरीकरण और Ondas
जायरो से पंख-प्रहार तक पुल का आदर्श डिज़ाइन: Ondas श्वास मॉड्यूलेशन, स्ट्रोक-सिंक्रोनस फीड-फ़ॉरवर्ड, फ़ेज़-लॉक्ड अनुनाद और एयरोइलास्टिक PID गेन मॉड्यूलेशन — और वर्तमान फ़र्मवेयर वास्तव में क्या जोड़ता है इसका ईमानदार नक्शा।
वंश: OrniFlight और एक सरलीकृत Ondas
Ondas PteronautOS का आविष्कार नहीं है। तरंग-मॉड्यूलेशन परिवार — श्वास-विराम कैडेंस नियंत्रण, स्ट्रोक-आकार उग्रता, असममित ड्वेल, और PID अधिकार से पंख-भार का वायुप्रत्यास्थ युग्मन — रहता और विकसित होता है OrniFlight परियोजना में, जिसका विकि और सिम्युलेटर उन्नत एल्गोरिदम रखते हैं(जिनमें servo-efficiency table )।
PteronautOS में एक आंशिक रूप से सरलीकृत कार्यान्वयन अंतर्निहित है: वही गणितीय श्वास ज्यामिति, जो एक ESP8285, एक MPU6050 और अधिकतम नौ सर्वो के लिए स्केल की गई है। जहाँ OrniFlight सतत वायुप्रत्यास्थता का अनुकरण करता है और संपूर्ण एनवेलप परिवारों को ऑफ़लाइन खोजता है, वहीं PteronautOS को 4 ms टिक में, 80 MHz कोर पर, ExpressLRS रेडियो स्टैक के साथ एक ही सिलिकॉन साझा करते हुए निर्णय लेना होता है। इस लेख का हर गेन दोनों परियोजनाओं में है; नीचे के फ़र्मवेयर स्थिरांक वायुगामी उपसमुच्चय हैं।
सिग्नल पाइपलाइन — ज़ेफ़िरोस से Ornithopter तक
जायरो से विंगबीट तक का सेतु जान-बूझकर छोटा है — चार फ़ाइलें, कोई गतिशील आवंटन नहीं, कोई कतार नहीं:
MPU6050 raw (I2C, 1 kHz register reads)
▼
Zephyrus::update() Mahony AHRS → roll°, pitch°, yawRate °/s
▼ dual PID: roll→0°, pitch→0°, yawRate→0°/s
4 raw pitch terms exposed pitchPTerm · pitchITerm · pitchDTerm · pitchErrorRate
▼
ZephyrusFilter.h (250 Hz) copies terms onto ornithopter.gyroPitch*
▼
Ornithopter::_computeServoMixer() / _computeGearboxMixer()
▼ Ondas P → phase · PD → dwell · I → asymmetry · SSFF → next stroke
_f[] → funcMap → wing / crest-rudder / tail servos (µs)
चार कच्चे पद पिच PID द्वारा सुधार की गणना के तुरंत बाद Zephyrus::update() में लिखे जाते हैं:
pitchPTerm = ZEPHYR_PID_PITCH_KP * pitchErr; // raw proportional
pitchITerm = _pidPitch.integrator; // accumulated error
pitchDTerm = ZEPHYR_PID_PITCH_KD * _pidPitch.lastDerivative; // low-pass filtered D
pitchErrorRate = _pidPitch.lastDerivative; // °/s, for SSFF
चारों NaN ट्रैप से सुरक्षित हैं(यदि कोई इनपुट NaN हो तो चारों शून्य हो जाते हैं) ताकि दूषित I²C फ़्रेम मिक्सर अंकगणित तक कभी न पहुँचे। Ornithopter पर सात फ़ील्ड ब्रिज डेटा ग्रहण करते हैं:
| फ़ील्ड | Zephyrus स्रोत | द्वारा उपभुक्त |
|---|---|---|
gyroPitchPTerm
|
pitchPTerm
|
Ondas P → फ़ेज़ अग्रिम(कैडेंस चैनल) |
gyroPitchITerm
|
pitchITerm
|
Ondas I → स्ट्रोक असममिति(संतुलन चैनल) |
gyroPitchDTerm
|
pitchDTerm
|
Ondas D → ड्वेल अनुपात(उग्रता चैनल) |
gyroPitchErrorRate
|
pitchErrorRate
|
SSFF आधा-स्ट्रोक संचय |
gyroRudderCorrection
|
rudderCorrection
|
क्रेस्ट रडर µs ऑफ़सेट(सर्वो और गियरबॉक्स कर्नेल) |
gyroAileronCorrection
|
rollCorrection
× gearbox gain
|
गियरबॉक्स: रोल PID → V-टेल एलेरॉन सतहें |
gyroElevatorCorrection
|
pitchCorrection
× gain ×
aeroGainScale
|
गियरबॉक्स: पिच PID → एलेवॉन/एलेवेटर सतहें |
Ondas मॉड्यूलेशन — तीन-चैनल श्वास
Ondas(पुर्तगाली: "लहरें") तीन-चैनल श्वास प्रणाली है जो पिच PID के कच्चे P, I, D पदों को फ़्लैपिंग वेवफ़ॉर्म के तीन लंबकोणीय आयामों पर मैप करती है। यह एक प्रोप्रियोसेप्टिव लूप है: जायरो की पिच-अनुभूति सीधे पंख की गति को आकार देती है, और पंख की गति जायरो द्वारा महसूस की गई पिच को बदलती है।
कैडेंस — P → फ़ेज़ अग्रिम
धनात्मक पिच त्रुटि(नाक ऊपर) ऑसिलेटर फ़ेज़ को आगे बढ़ाती है, वर्तमान आधा-स्ट्रोक छोटा करती है; ऋणात्मक त्रुटि उसे विलंबित करती है। आदर्श नियम ऑसिलेटर स्प्रिंग को स्केल करता है:
_osc.kGainMod = 1.0f + gyroPitchPTerm * aeroGainScale * cadenceGain * 0.00005f;
// clamped to [0.5, 2.0] — phase can at most double or halve
ऑसिलेटर का advance() इसे error = kGain · kGainMod · cadenceTarget − kDamp · cadence के रूप में उपभोग करता है। ट्यूनिंग रेंज 0–100, डिफ़ॉल्ट 20।
उग्रता — PD ब्लेंड ड्वेल में
P और D पद एक ही उग्रता सिग्नल में मिलते हैं जो वेवफ़ॉर्म के ड्वेल को तेज़ या नरम करता है:
ferocitySignal = (gyroPitchPTerm * ferocityPGain * 0.00015f
+ gyroPitchDTerm * ferocityDGain * 0.0003f) * aeroGainScale;
// clamped to [-0.5, 0.5], added to both stroke and return ferocity
ferocityPGain = 0(डिफ़ॉल्ट) पर व्यवहार केवल-D है — तेज़ पिच बदलाव तीखे स्ट्रोक बनाते हैं जबकि स्थिर उड़ान साइनसॉइडल रहती है।
संतुलन — I असममिति में
समाकल पद स्ट्रोक केंद्र को खिसकाता है: निरंतर नाक-ऊपर पूर्वाग्रह डाउनस्ट्रोक को, निरंतर नाक-नीचे पूर्वाग्रह अपस्ट्रोक को मज़बूत करता है।
float iBias = gyroPitchITerm * aeroGainScale * balanceGain * 0.0001f;
// clamped to [-3.0, 3.0]; added to strokeFer, subtracted from returnFer
संतुलन ऊँचा रखने पर सबसे अस्थिर करने वाला चैनल है — आदर्श ट्यूनिंग गाइड इसे कम(5–15) रखता है और सबसे अंत में जोड़ता है। पायलट कमांड, Ondas और SSFF पूर्वाग्रहों को मिलाते हुए उग्रता अनुप्रयोग, पूरी [1.0, 8.0] विंडो पर पायलट का अधिकार बनाए रखता है:
strokeFer = pilot(stroke) + ferocitySignal + iBias + _ssffFerocityUpBias
returnFer = pilot(return) + ferocitySignal − iBias + _ssffFerocityDownBias
तरंग आकार और PD मिश्रण
वेवफ़ॉर्म स्वयं OrniFlight स्ट्रोक परिवार का अनुसरण करता है: प्रत्येक आधा अपनी उग्रता रखता है, साझा रिवर्सल सीमा बाएँ/दाएँ पंखों को सम-फ़ेज़ रखती है, और प्रति-प्रोफ़ाइल आकार मिश्रण एक सपाट ड्वेल/पठार स्ट्रोक को गोल पिरामिड पथ में निरंतर रूपांतरित करता है। नीचे का इंटरैक्टिव एक्सप्लोरर किसी भी डाउन/अप उग्रता जोड़े के लिए आदेशित ज्यामिति प्रस्तुत करता है — वही वक्र जो मिक्सर हर टिक माँगता है।
फेरोसिटी आधे-स्ट्रोक के चरित्र और समय दोनों को नियंत्रित करती है। आंतरिक रूप से WebUI की 0–100 सेटिंग 0–8 पर मैप होती है। अधिक डाउनस्ट्रोक फेरोसिटी चक्र में डाउनस्ट्रोक का हिस्सा छोटा कर देती है; अधिक वापसी फेरोसिटी वापसी हिस्सा छोटा कर देती है। शेष समय विपरीत आधे में स्थानांतरित हो जाता है — शून्य पर कोई विराम नहीं होता।
प्रति-प्रोफ़ाइल फेरोसिटी आकार नियंत्रण उच्च-फेरोसिटी चरित्र चुनता है। 0% पर यह सीमित पठार/वर्ग आकार को पसंद करता है। 100% पर यह गोल पिरामिडीय पथ को पसंद करता है। प्रत्येक आधा फिर भी अपनी फेरोसिटी का उपयोग करता है, इसलिए निम्न-फेरोसिटी आधा लंबा और साइनसॉइडल रहता है जबकि उच्च-फेरोसिटी आधा सीधे विकर्ण मार्ग के करीब पहुँचता है।
डाउन व अप स्क्यू (±100) प्रत्येक आधे-स्ट्रोक के केंद्र को उसकी अपनी आरंभ–अंत अक्ष पर सरकाते हैं — फेरोसिटी की ही तरह प्रति-आधा दर्पण। धनात्मक स्ट्रोक को आगे भरता है: पंख शिखर वेग जल्दी पा लेता है, जिससे प्रणोद बढ़ता है। ऋणात्मक उसे अंत में सरकाता है: स्ट्रोक अपनी गति अंत में खर्च करता है, जिससे प्रणोद घटता है। विकृति एकदिष्ट है और सिरों को बचाती है, अतः यह ठीक-ठीक असममित वर्ग↔त्रिकोण मिश्रण है, कभी स्थिति-छलांग नहीं।
थ्रॉटल थ्रस्ट आकार युग्मन एक नॉब में स्ट्रोक ठहराव और आगे-पीछे केंद्र को मिलाता है। फुल गैस पर स्ट्रोक वर्गाकार होता है और दोनों अर्ध-स्ट्रोक आगे बढ़ते हैं——नीचे और ऊपर दोनों में पीक गति जल्दी आती है। आइडल में दोनों तटस्थ रहते हैं। एकल आक्रामकता स्केलर ठहराव और केंद्र को साथ चलाता है, जिससे दोनों पंख और दोनों अर्ध-स्ट्रोक एक साथ चलते हैं——थ्रस्ट नियंत्रण, रोल या पिच नहीं।
एलेरॉन→skew युग्मन एक पंख को फ्रंट-लोड करता है और दूसरे को विलंबित करता है — skew अक्ष पर रोल बलाघूर्ण, थ्रॉटल skew का दर्पण जुड़वाँ। बायाँ स्टिक बाएँ पंख में skew जोड़ता है और दाएँ से घटाता है; दायाँ इसके विपरीत। रडर आयाम अंतर के साथ या उसके स्थान पर प्रयोग करें।
स्लू स्टिक की दर पर एक क्षणिक बूस्ट या ब्रेक है। गैस देने पर दोनों आधे-फ्लैप क्षण भर front-load होते हैं, गैस काटने पर दोनों क्षण भर late-load होते हैं; लो-पास फ़िल्टर की गई दर (τ = 0.10 s) किक डालती है जो स्टिक के रुकते ही क्षय हो जाती है। दो युग्मन: थ्रॉटल-रेट स्लू (सममित, थ्रस्ट) और एलेरॉन-रेट स्लू (विभेदक, रोल)।
Zephyrus slew gain वही क्षणिक विचार रडर पर लागू करता है: तीव्र दृष्टिकोण परिवर्तन रडर सुधार (µs) को क्षण भर बढ़ाता है, लो-पास (τ = 0.12 s) करके ±80 µs पर हार्ड क्लैम्प करता है। यह स्थैतिक गेन बढ़ाए बिना तीव्र दृष्टिकोण परिवर्तनों की प्रतिक्रिया को तेज़ करता है।
नियंत्रण-अक्ष मैट्रिक्स
रडर स्टिक का विंग मिक्सर में कोई यॉ अधिकार नहीं है: इसके अंतर नॉब (आयाम और उग्रता) एलेरॉन स्क्यू जैसी ही बाएँ/दाएँ विषमता बनाते हैं — और वह विषमता रोल है। सच्चा यॉ केवल स्वायत्त शिखा पतवार (Zephyrus, केवल जाइरो) में मौजूद है।
| नियंत्रण इनपुट | तरंग पैरामीटर | उड़ान प्रभाव |
|---|---|---|
| एलेरॉन स्टिक | स्क्यू (skew) — अंतर, बाएँ/दाएँ |
रोल |
| रडर स्टिक | आयाम + उग्रता — अंतर, बाएँ/दाएँ |
रोल |
| यॉ — Zephyrus जाइरो | शिखा पतवार | यॉ (स्वायत्त) |
उड़ान संचालन और slew
पूरा चक्र
प्रत्येक आधा समान चौड़ाई तक खींचा गया
चरम संयोजन पढ़ना
7 / 1 संयोजन स्पष्ट रूप से एक छोटा नुकीला डाउनस्ट्रोक और लंबा साइनसॉइडल रिटर्न उत्पन्न करता है। सटीक और लगभग-अधिकतम मानों में सावधानी चाहिए: वर्तमान अवधि नियम फेरोसिटी 8 से नीचे शेष राशि का उपयोग करता है। फलस्वरूप 8 / 0 डाउनस्ट्रोक को चक्र का केवल लगभग 0.125% आवंटित करता है, जबकि 8 / 6 भी लगभग 0.5% आवंटित करता है। स्थिति निरंतर रहती है, परंतु माँगी गई गति और त्वरण भौतिक रूप से अप्राप्य हो सकते हैं।
एंकर डैम्पिंग (k₂)
ऑसिलेटर का अवमंदन एक ट्यूनेबल एंकर के रूप में उजागर है। आधार नियम कैडेंस लक्ष्य की ओर एक अवमंदित स्प्रिंग है:
kDamp = 10.0f + anchorGain; // anchorGain 0 → k₂=10 (tight)
error = kGain * kGainMod * cadenceTarget
- kDamp * cadence;
anchorGain = 0(डिफ़ॉल्ट) पर अवमंदन कड़ा है — आदेशित कैडेंस पर तेज़ अभिसरण। ऊँचे मान गेन 100 पर k₂ को 110 की ओर बढ़ाते हैं, लय को कठोरता से लॉक करते हैं और विक्षोभ को अस्वीकारते हैं। ट्यूनिंग रेंज 0–100।
अनुनाद — फ़ेज़-लॉक्ड पंप
रेज़ोनेंस एक फ़ेज़-लॉक्ड लॉक-इन एम्प्लीफायर है: यह पिच त्रुटि दर को sin(ऑसिलेटर फ़ेज़) से गुणा कर जमा करता है — जब सुधार सबसे प्रभावी होता है तो स्ट्रोक को सटीक रूप से मज़बूत करता है, और जब वह पंख से लड़ता तो उसे अवमंदित करता है।
_resonanceAccum += gyroPitchErrorRate * sinf(_osc.phase)
* resonanceGain * 0.01f * dt;
_resonanceAccum *= expf(-dt / 0.15f); // leaky integrator, τ = 0.15 s
clamp(_resonanceAccum, -2.0f, 2.0f);
संचित मान अगले फ़्रेम के लिए स्ट्रोक और रिटर्न उग्रता में इंजेक्ट होता है। resonanceGain = 0(डिफ़ॉल्ट) पर पूरा पथ अक्षम है। रिसाव क्षय निरंतर विक्षोभ के दौरान भगोड़े संचय को रोकता है।
SSFF — स्ट्रोक-सिंक्रोनस फीड-फ़ॉरवर्ड
स्ट्रोक-तुल्यकालिक फ़ीड-फ़ॉरवर्ड हर PID पद से दार्शनिक रूप से भिन्न है: यह वर्तमान आधे-स्ट्रोक के दौरान जायरो द्वारा मापे गए मान से अगले आधे-स्ट्रोक को सुधारता है। फ़्लैपिंग साइन के हर शून्य-क्रॉसिंग(पंख रिवर्सल) पर, समाप्त आधे-स्ट्रोक की औसत पिच त्रुटि दर विपरीत आधे की उग्रता पर पूर्वाग्रह बन जाती है।
// zero-cross detected: finished one half-stroke, starting the next
meanError = _ssffAccumError / count;
bias = meanError * ssffGain * 0.00001f; // clamped ±2.0
// upstroke just ended → bias feeds the downstroke (power stroke)
// downstroke just ended → bias feeds the upstroke (recovery)
अप-पूर्वाग्रह डाउनस्ट्रोक पर लगता है(पिछले अपस्ट्रोक पर जमा त्रुटि का सुधार); डाउन-पूर्वाग्रह अपस्ट्रोक पर। जब ssffGain शून्य पर गिरता है तो पूर्वाग्रह स्पष्ट रूप से साफ़ हो जाते हैं ताकि WebUI अक्षमता वेवफ़ॉर्म में बासी मान कभी न छोड़े। संचायक 32-बिट है और प्रति आधा-स्ट्रोक रीसेट — 250 Hz पर ओवरफ़्लो के लिए ~24 दिन निरंतर फ़्लैपिंग चाहिए, जो व्यावहारिक चिंता नहीं है।
एयरोइलास्टिक PID गेन मॉड्यूलेशन
सभी Ondas और SSFF मॉड्यूलेशन एक ऐसे गुणांक से स्केल होते हैं जो जानता है कि ऑर्निथॉप्टर फ़्लैपिंग कर रहा है या ग्लाइडिंग — वायुप्रत्यास्थ गेन मॉड्यूलेशन। सर्वो(वेवफ़ॉर्म) कर्नेल में चयनकर्ता 50 µs हिस्टैरिसीस वाला फ़्लैप गेट है:
aeroGainScale = isFlapping ? (aeroFlapCoeff * 0.01f)
: (aeroGlideCoeff * 0.01f);
गियरबॉक्स कर्नेल में चयनकर्ता मोटर अवस्था(armed && throttleNorm > 0.1f) है। डिफ़ॉल्ट:
| गुणांक | डिफ़ॉल्ट | रेंज | सक्रिय होने पर |
|---|---|---|---|
aeroGlideCoeff
|
40 | 0–100 | पंख स्थिर — ग्लाइड, या गियरबॉक्स मोटर बंद |
aeroFlapCoeff
|
40 | 0–100 | पंख फ़्लैपिंग — या गियरबॉक्स मोटर चालू |
0–1 पर स्केल करने से 0–100 स्लाइडर पंख पर जायरो का अधिकार बन जाता है: 100 पर जायरो पूर्ण रूप से मॉड्यूलेशन का स्वामी है, 0 पर बंद। कर्नेल-वार अधिकार:
| अधिकार | सर्वो(वेवफ़ॉर्म) कर्नेल | गियरबॉक्स कर्नेल |
|---|---|---|
| क्रेस्ट रडर | रोल + यॉ संयुक्त | केवल यॉ(रोल/पिच टाँगों को) |
| पंख वेवफ़ॉर्म | पूर्ण Ondas/SSFF श्वास मॉड्यूलेशन | — |
| टाँग एलेरॉन(V-टेल) | — | रोल PID → एलेवॉन मिक्स का एलेरॉन पक्ष |
| टाँग एलेवॉन/एलेवेटर | — | पिच PID × aeroGainScale → एलेवेटर पक्ष |
गियरबॉक्स PID सुधार मिक्सिंग से पहले ±250 µs(ZEPHYR_GEARBOX_CLAMP_US) पर क्लैम्प होते हैं; क्रेस्ट-रडर पथ ±200 µs पर क्लैम्प होता है। एक फ़्रेम का विलंब अंतर्निहित है: aeroGainScale गियरबॉक्स मिक्सर में गणा जाता है पर अगले zephyrusUpdate() द्वारा उपभुक्त होता है — 250 Hz पर 4 ms, यांत्रिक सर्वो के लिए नगण्य।
WebUI पैनल और कॉन्फ़िगरेशन एंडपॉइंट
जब बिल्ड में Zephyrus शामिल होता है तो ऑर्निथॉप्टर पैनल दो स्थिरीकरण समूह दिखाता है। Ondas और SSFF स्लाइडर(0–100): कैडेंस P→फ़ेज़, उग्रता D→ड्वेल, उग्रता P→ड्वेल, संतुलन I→असममिति, एंकर k₂, रेज़ोनेंस, SSFF गेन। वायुप्रत्यास्थ समूह: ग्लाइड गुणांक और फ़्लैप गुणांक। सभी मान POST /pteronautos/config से स्थायी होते हैं और GET /pteronautos/state से वापस स्ट्रीम होते हैं:
{
"ornithopter": {
"cadence_gain": 20.0, "ferocity_d_gain": 20.0, "balance_gain": 10.0,
"ferocity_p_gain": 0.0, "anchor_gain": 0.0, "resonance_gain": 0.0,
"ssff_gain": 0.0,
"aero_glide_coeff": 40.0, "aero_flap_coeff": 40.0,
"aero_gain_scale": 0.4
}
}
aero_gain_scale की गणना होती है और यह केवल-पठन है। POST आंशिक अपडेट स्वीकार करता है और सर्वर-पक्ष पर हर फ़ील्ड को [0, 100] पर क्लैम्प करता है।
ट्यूनिंग गाइड
आदर्श उड़ान-परीक्षण क्रम — हर चरण एक उड़ान है, स्लाइडर खींचना नहीं:
- हर गेन शून्य करें। केवल मैनुअल उड़ें; जायरो को वोट मिलने से पहले एयरफ़्रेम स्थिर और पूर्वानुमेय होना चाहिए।
- Zephyrus का क्रेस्ट रडर सक्षम करें(रोल+यॉ PID)। वेवफ़ॉर्म छूने से पहले सत्यापित करें कि रडर हल्के पंख-हिलाव का प्रतिरोध करता है।
- कैडेंस(P→फ़ेज़) 10 से ऊपर। बहुत ऊँचा = झटकेदार पंख, फ़ेज़ हंटिंग; बहुत कम = कुछ नहीं। सही = पंख पिच से "जुड़े" महसूस होते हैं।
- उग्रता D(D→ड्वेल) 10 से। बहुत ऊँचा = वेवफ़ॉर्म तीखे और नरम के बीच दोलन करता है; सही = तेज़ पिच बदलाव स्ट्रोक को तीखा करते हैं, स्थिर उड़ान साइनसॉइडल रहती है।
- उग्रता P(वैकल्पिक) 5 से — P अधिकार को ड्वेल में मिलाता है।
- संतुलन(I→असममिति) अंत में, कम। यह सबसे अस्थिर करने वाला चैनल है; केवल 5–15। यह निरंतर बहाव का प्रतिकार करता है, क्षणिक झटकों का कभी नहीं।
- SSFF 5 से, केवल कैडेंस और उग्रता स्थिर होने के बाद। बहुत ऊँचा = अति-सुधार और आधा-स्ट्रोक स्पंदन; सही = पिच दोलन आयाम का दृश्य अवमंदन।
- वायुप्रत्यास्थ गुणांक अंत में। पहले ग्लाइड(पंख स्थिर) ट्यून करें, फिर फ़्लैप। जायरो को एक आधिकारिक सह-पायलट रखें, घबराया हुआ पायलट नहीं।
कार्यान्वयन स्थिति और खुली असंगतियाँ
ईमानदार नक्शा, वर्तमान फ़र्मवेयर(Ornithopter.cpp @ 72c63020)। ऊपर के आदर्श नियम डिज़ाइन हैं; कोड में पूर्ण पैरामीटर सतह, स्थिरांक, WebUI स्लाइडर और ब्रिज शिम हैं — पर एक उड़ान-परीक्षण मचान ब्लॉक वर्तमान में अधिकांश जायरो को सर्वो कर्नेल से अलग करता है:
// Ornithopter.cpp:269-275 (inside the flapping branch)
#ifdef ZEPHYRUS_ENABLED
// STEP 7: ALL gyro values hard-zeroed (NaN guard test)
_osc.kGainMod = 1.0f; // cadence channel OFF
gyroRudderCorrection = 0.0f; // crest rudder OFF while flapping
gyroAileronCorrection = 0.0f;
gyroElevatorCorrection= 0.0f;
#endif
i18n कार्य के साथ "STEP 7" NaN-गार्ड परीक्षण के रूप में कमिट और कभी वापस न लिया गया यह ब्लॉक दर्शाता है कि आज का सर्वो-कर्नेल व्यवहार है:
- कैडेंस, उग्रता-PD, संतुलन, रेज़ोनेंस, SSFF — सभी पैरामीटर और ब्रिज में मौजूद हैं, पर उनके उपभोग स्थल(
kGainMod,ferocitySignal,iBias,resonanceBias) शून्य पर पिन हैं या हर फ़्रेम रीसेट होते हैं(Ornithopter.cpp:282–284, 311–313, 354)। - क्रेस्ट रडर स्थिरीकरण फ़्लैपिंग शाखा के भीतर शून्य हो जाता है, इसलिए रडर सुधार वर्तमान में केवल ग्लाइड शाखा में काम करता है — उड़ान की ज़रूरत के विपरीत(अधिकांश विक्षोभ फ़्लैप के बीच आते हैं)।
- गियरबॉक्स कर्नेल जीवित अपवाद है। यह
gyroAileronCorrection/gyroElevatorCorrection/gyroRudderCorrectionपढ़ता है और उन्हें क्लैम्प के साथ लागू करता है(पंक्तियाँ 436–451) — STEP-7 शून्यकरण ब्लॉक केवल सर्वो कर्नेल में रहता है।
यह गणित की आलोचना नहीं है — यह एक ज्ञात, नामित अवस्था है: स्थिरीकरण मॉड्यूल संकलित, पैरामीटरकृत, ब्रिज किए हुए हैं, और STEP-7 मचान हटाकर वास्तविक NaN नीति से बदले जाने की प्रतीक्षा कर रहे हैं(Validatio गार्ड पहले ही MPU डेटा को साफ़ पथ देते हैं)। तब तक, ऊपर के Ondas/SSFF/रेज़ोनेंस ट्यूनिंग गाइड को उड़ान-तैयार विनिर्देश मानें, जो Zephyrus.cpp:729–737 और OrnithopterWaveform.h से सत्यापित है पर अभी वायुगामी नहीं।
आधिकारिक डिज़ाइन रिकॉर्ड STABILIZATION.md ; इसकी सहोदर परियोजना OrniFlight निरंतर उन्नत ONDAS अनुसंधान रखता है।