Ana Sayfa

MYCA Drone Reflex Core (C99 SDK)

libmyca_drone.a • 564B Static RAM • malloc=0

Pixhawk / STM32H7 / ArduPilot / PX4 için Gerçek Derlenmiş C99 IMU Titreşim, EMI Kırpma ve PWM Denge Refleksi

Bu C99 Kütüphanesi Gerçekte Ne Yapar?
  • • ESC 30x EMI Sıçraması Kırpma: Motor sürücülerinden IMU hattına binen yüksek voltajlı ark darbelerini 0 faz gecikmesiyle (clip * tanhf(x/clip)) kırpar.
  • • Quadrature Harmonik Faz Kilidi (PLV): Motor devrine ($f_0$ ve $2f_0$) kilitlenerek pervane ucu kırılması veya rulman dağılmasını gürültü altında yakalar.
  • • 4-Motor PWM Karşı-Faz Dengeleme: İtki kaybeden motoru (M1..M4) tespit ettiği anda sağlam motorlara mikro-saniye (pwm_delta_us[4]) dengeleme ofseti üretir.
Mühendislik Sınırları (Ne Yapmaz?)
  • • Görüntü İşleme Yapmaz: Kamera, video veya optik hedef takibi içermez; tamamen 1D IMU jiroskop (gx, gy, gz) ve ESC RPM telemetrisi üzerinde çalışır.
  • • Tam Otopilot Değildir: GPS rota planlaması yapmaz; mevcut PX4, ArduPilot veya STM32 uçuş kontrolcünüzün 1000 Hz IMU okuma döngüsüne 3 satır kodla eklenen 564 baytlık alt-seviye denge refleksidir.

Canlı C99 Binary Giriş Parametreleri

clang -O3 -std=c99
Hızlı Test Senaryoları:
Motor Temel Frekansı (f0):82.0 Hz (2f0: 164 Hz)
Pervane Hasar / İtki Kaybı Oranı:%45
Hasarlı / Dengesiz Motor Seçimi:Motor #2
ESC Elektriksel Ark / EMI Darbesi:24.0 rad/s
Sensör Gürültü Standart Sapması:0.85 rad/s
Kendi IMU Logunu (.CSV) Test EtÖrnek CSV İndir ↗
MYCA Drone Reflex C99 Core
0x03 KRİTİK MOTOR #undefined İTKİ KAYBI & PWM DENGELEME
Statik Bellek (RAM)
564 Bayt
malloc = 0 (Sıfır Heap)
Örnek Başına Süre
...
Harmonik Faz Kilidi (PLV)
...
Kırpılan Ark: 0 darbe
IMU RMS Hata Düşüşü
...
rad/s (Ham vs MYCA)
1. IMU Gyro Roll Akışı (Ham Gürültülü/Ark Sıçramalı vs. MYCA C99 Çıkışı)
Ham Gyro (gx) MYCA Temiz Gyro
2. Quadrature Harmonik Faz Kilidi (PLV [0.00 - 1.00] • Eşik: 0.38)Rezonans Yok (Nominal)
3. Otonom Quad-X Motor PWM Dengeleme Çıktısı (out.pwm_delta_us[4])Tespit Edilen Hasarlı Motor: Yok (Tüm Motorlar Sağlam)
M1 (Ön-Sağ)
0 µs
Nominal (1500 µs)
M2 (Arka-Sol)
0 µs
Nominal (1500 µs)
M3 (Ön-Sol)
0 µs
Nominal (1500 µs)
M4 (Arka-Sağ)
0 µs
Nominal (1500 µs)

C99 Başlık Dosyası (myca_drone_reflex.h) & PX4 / ArduPilot 3-Satır Entegrasyon Kodu

// include/myca_drone_reflex.h
#ifndef MYCA_DRONE_REFLEX_H
#define MYCA_DRONE_REFLEX_H

#include <stdint.h>
#include <stdbool.h>

#define MYCA_DRONE_PLV_WINDOW 64

typedef enum {
    MYCA_FLIGHT_NOMINAL         = 0,
    MYCA_FLIGHT_EMI_SPIKE_CLAMP = 1,
    MYCA_FLIGHT_PROP_IMBALANCE  = 2,
    MYCA_FLIGHT_MOTOR_LOSS_CRIT = 3
} myca_flight_status_t;

typedef struct {
    float    f0_norm, f1_norm, alpha_leak, clip_limit, plv_threshold;
    float    I0, Q0, I1, Q1;
    float    plv_cos_buf[MYCA_DRONE_PLV_WINDOW];
    float    plv_sin_buf[MYCA_DRONE_PLV_WINDOW];
    float    plv_sum_cos, plv_sum_sin;
    uint16_t plv_idx;
    uint32_t sample_seq;
} MycaDroneState; /* Toplam: 564 Bayt Statik RAM (0 Malloc) */

typedef struct {
    myca_flight_status_t status;
    float                clean_gyro_roll, clean_gyro_pitch, clean_gyro_yaw;
    float                plv_coherence, resonance_score;
    uint8_t              faulty_motor_id;    /* 0 = Yok, 1..4 = Hasarlı Motor */
    int16_t              pwm_delta_us[4];    /* M1..M4 PWM Dengeleme (µs)     */
    bool                 emi_clamped;
} MycaDroneReflexOut;

void myca_drone_init(MycaDroneState *st, float sample_rate_hz, float motor_freq_hz);
void myca_drone_step(
    MycaDroneState *st,
    float gx_rad_s, float gy_rad_s, float gz_rad_s,
    const uint16_t motor_rpm[4],
    MycaDroneReflexOut *out
);

#endif
// examples/px4_ardupilot_hook_demo.c
#include "myca_drone_reflex.h"

/* Statik BSS bellekte 564 Bayt (Heap / malloc kullanılmaz) */
static MycaDroneState g_myca_imu_state;

void px4_fast_imu_init(void) {
    /* 1000 Hz IMU döngüsü, 82.0 Hz nominal motor temel frekansı */
    myca_drone_init(&g_myca_imu_state, 1000.0f, 82.0f);
}

void px4_fast_imu_1khz_hook(float gx, float gy, float gz, const uint16_t esc_rpm[4]) {
    MycaDroneReflexOut reflex;
    myca_drone_step(&g_myca_imu_state, gx, gy, gz, esc_rpm, &reflex);

    /* 1. ESC EMI darbelerinden arındırılmış temiz Gyro'yu EKF2 / PID'ye gönder */
    ekf2_feed_clean_gyro(reflex.clean_gyro_roll, reflex.clean_gyro_pitch, reflex.clean_gyro_yaw);

    /* 2. Pervane kırılması veya motor kaybı varsa PWM dengeleme ofsetini uygula */
    if (reflex.status == MYCA_FLIGHT_MOTOR_LOSS_CRIT) {
        for (int m = 0; m < 4; m++) {
            pwm_motor_set_us(m, current_pwm_us[m] + reflex.pwm_delta_us[m]);
        }
    }
}