bbdoctor
Diagnóstico de drones pelo log: Betaflight, INAV, ArduPilot, PX4
RUENESPTUA

Análise do Blackbox do INAV: ajuste de PIDs e filtros com base no seu log

Muita gente usa o INAV para navegação: manutenção de posição, retorno ao ponto de partida e missões. Tudo isso depende do loop interno de taxa. Se o giroscópio tiver ruído e os PIDs estiverem mal ajustados, o quadricóptero mantém pior a altitude, oscila no POSHOLD e superaquece os motores. A seguir: como gravar um log que valha a pena analisar, o que fazem as configurações do INAV e o que revelaram nove logs reais do INAV 6–8 analisados pelo bbdoctor.

Configuração da gravação: taxa, giroscópio bruto e motores

O INAV define a taxa de gravação como uma fração da taxa do loop: 1,000,000 / looptime × blackbox_rate_num / blackbox_rate_denom. Com o valor padrão looptime = 500 (2 kHz), 1/2 resulta em 1 kHz e 1/32, em aproximadamente 62 Hz. Dois quads com INAV 7.1 da nossa coleção gravaram a 60 e 58 quadros por segundo.

blackbox GYRO_RAW
blackbox MOTORS
set blackbox_rate_num = 1
set blackbox_rate_denom = 2
save

Se a memória flash for pequena, mantenha 500 Hz e faça voos de teste curtos, de 30 a 60 s. Para localizar uma ressonância com precisão, grave um log curto em 1/1 (2 kHz). Veja as orientações gerais no guia de configuração do blackbox.

INAV 8 e versões mais recentes gravam activeFlightModeFlags, que indica os modos realmente ativos. Assim, é fácil distinguir ACRO dos modos de autonivelamento e navegação. O INAV 7 e versões anteriores gravam apenas flightModeFlags, que indica as chaves de modo acionadas; um modo de navegação selecionado pode nunca ser ativado (por exemplo, se não houver sinal GPS).

Como voar para obter o log

Os PIDs só podem ser avaliados em ACRO. Nos modos ANGLE, HORIZON e de navegação, o stick comanda um ângulo; há um loop de ângulo entre o stick e o loop de taxa, então a resposta revela pouco sobre os PIDs. O bbdoctor exclui esses trechos da avaliação dos PIDs. No segundo voo do quad H743 abaixo (73 s, 78% em ANGLE/HORIZON), o relatório analisa ruído, filtros e distribuição de carga, mas não avalia o overshoot: não há dados adequados para isso.

  1. Faça de 6 a 8 rolls e flips rápidos, trazendo o stick de volta ao centro num movimento seco e mantendo-o ali por meio segundo. Com menos de seis paradas por eixo, não é possível verificar o rebote; o bom log do H743 teve uma por eixo.
  2. Faça de 5 a 8 cortes limpos de aceleração: suba com mais de 35% de throttle, corte para zero e mantenha os sticks centralizados por um segundo. Um corte que termina em um flip não serve para avaliar o propwash.
  3. Faça algumas aceleradas a fundo, do pairado até o throttle máximo, e voe de forma estável em diferentes níveis de throttle para mapear o ruído.

Aeronaves grandes não precisam de flips: inclinações curtas e rápidas, em altura segura, são suficientes. Deixe a navegação desligada.

Configurações do INAV ajustadas com base no log

ConfiguraçãoPadrãoFunção e quando alterar
mc_p_roll, mc_i_roll, mc_d_roll (os valores de pitch são iguais)40 / 30 / 23PIDs principais. Overshoot causado pelo loop P/D: reduza P ou aumente D. I compensa forças constantes, como CG descentralizado e vento.
mc_p_yaw, mc_i_yaw, mc_d_yaw85 / 45 / 0D de yaw é zero, então o log não tem o campo axisD[2].
mc_cd_roll, mc_cd_pitch, mc_cd_yaw60Control Derivative, o feedforward do INAV, controlado pela velocidade do stick. Gravado como axisF.
gyro_main_lpf_hz60 HzPassa-baixa principal do giroscópio (gyro_lpf_hz no cabeçalho). Um valor menor reduz o ruído, mas torna a resposta mais lenta.
dterm_lpf_hz, dterm_lpf_type110 Hz, PT2Passa-baixa do termo D. Se os motores esquentarem e houver ruído passando pelo D, reduza cerca de 15%.
dynamic_gyro_notch_enabled, dynamic_gyro_notch_min_hz, dynamic_gyro_notch_qON, 50 Hz, 120Notches dinâmicos (Matrix Filter). O limite inferior precisa ficar abaixo da ressonância; caso contrário, o notch não consegue alcançá-la.
rpm_gyro_filter_enabled, rpm_gyro_min_hzOFF, 100 HzUsa a telemetria do ESC; ative somente se ela (geralmente por um fio separado) fornecer RPM válidas.
setpoint_kalman_enabled, setpoint_kalman_qON, 100Filtro de Kalman no giroscópio. Um q mais alto filtra menos e acrescenta menos atraso.
d_boost_min, d_boost_max0.5 / 1.25D é reduzido (×0,5) em movimentos rápidos do stick e aumentado (×1,25) diante de perturbações externas bruscas.
tpa_rate, tpa_breakpoint, tpa_on_yaw0 / 1500 / OFFAcima do ponto de ativação, o TPA reduz P, D e CD (FF); 0 = desligado. Se houver overshoot ou tremores apenas com throttle alto, ative-o.
mc_iterm_relax, mc_iterm_relax_cutoffRP / 15Impede que I se acumule durante movimentos rápidos do stick. Se houver rebote, altere o cutoff de 15 para 10; para incluir yaw, use mc_iterm_relax = RPY.
antigravity_gain, antigravity_accelerator1 / 1Anti-gravity; 1 significa desligado. Se o nariz baixar em acelerações bruscas, defina como 2.
airmode_typeSTICK_CENTERSTICK_CENTER impede que I aumente com throttle zerado e sticks centralizados. A documentação do INAV recomenda THROTTLE_THRESHOLD para hélices de até 7 polegadas.
throttle_idle8 (%)Marcha lenta dos motores. Se houver propwash com um motor em marcha lenta, aumente 2 pontos.
ez_enabledOFFEzTune: quando ativado, os PIDs, filtros e rates são definidos pelos controles ez_filter_hz, ez_response, ez_damping e outros; alterações manuais são sobrescritas.

Os valores padrão vêm do Settings.md do INAV; confirme os seus com get. Muitos não aparecem no cabeçalho do log: ele contém as sequências de PID, gyro_lpf_hz, dterm_lpf_hz, dynamicGyroNotchMinHz, TPA e rpm_gyro_*, mas não inclui d-boost, anti-gravity, I-term relax, airmode_type nem nenhuma configuração do EzTune. O bbdoctor reconstrói throttle_idle a partir de minthrottle. Por isso, para esses valores o relatório recomenda conferir com get. Salve primeiro os valores atuais:

get mc_
get dterm_lpf
get dynamic_gyro_notch
get antigravity
get mc_iterm_relax
get throttle_idle
get airmode_type

Para verificar toda a configuração, cole o resultado de diff all na verificação de configuração.

Logs reais do INAV e o que revelaram

INAV 7.1 a 60 Hz: sem dados de vibração nem de PIDs

Uma Matek F722SE com 6S (voos de 213 e 171 segundos) e uma SpeedyBee F7 V3 (26 segundos), ambas com blackbox_rate_denom = 32 em um loop de 2 kHz: 60 e 58 quadros por segundo. A F722SE também não gravava GYRO_RAW, e todos os voos foram inteiramente em ANGLE/HORIZON. Só é possível ver de 0 a 30 Hz, então ruído dos motores, ressonâncias e filtros ficam fora da faixa; além disso, os PIDs não podem ser avaliados por dois motivos: taxa e modo incorretos.

Ainda é possível analisar a distribuição de carga entre os motores (na F722SE, os motores da direita trabalham 17% mais: o CG está deslocado para a direita; confira a bateria e qualquer componente pesado fora do centro), a tensão da bateria sob carga, eventos de failsafe e a cronologia de uma queda. São processos lentos; 60 Hz bastam.

Espectro do giroscópio de pitch: acima, um log do INAV 8 a 995 Hz com pico de 117 Hz no giroscópio bruto; abaixo, um log do INAV 7.1 a 60 Hz cujo espectro termina em 30 Hz
A: INAV 8 a 995 Hz, giroscópio de pitch bruto (cinza) e filtrado (azul): pico de 117 Hz e uma elevação perto de 147 Hz que os filtros quase eliminam. B: INAV 7.1 a 60 Hz, na mesma escala: o espectro termina em 30 Hz; a área hachurada nem chegou a ser registrada.

INAV 8, Matek H743, 6S: ressonância de 117 Hz e overshoot que não é causado pelo FF

Um bom log: 995 Hz, GYRO_RAW, 55 segundos em ACRO, com ganhos bem acima dos valores de fábrica: roll P 80, I 22, D 32, FF 100; pitch 88 / 24 / 35 / 110.

A lógica do relatório: reduza P do pitch em 10%. Mantenha P do roll, pois o eixo já responde com 31 ms de atraso; aumente D do roll em 10% (32 para 35) somente depois de eliminar o ruído dos motores, ou os motores podem esquentar mais.

set dterm_lpf_hz = 157
set mc_p_pitch = 79
save

Mas confira primeiro o EzTune. Os filtros deste log correspondem exatamente à fórmula do EzTune para ez_filter_hz = 190: gyro_lpf_hz em 190, dterm_lpf_hz 5 Hz abaixo, limite mínimo do notch em dois terços (126) e Q do notch em 250. Os ganhos de pitch são 1,1 vez os de roll, que corresponde a ez_axis_ratio 110. Se get ez_enabled indicar ON, o EzTune vai sobrescrever os comandos acima. Você pode usar set ez_enabled = OFF (os PIDs e filtros atuais permanecem) e então aplicar as alterações, ou usar o controle deslizante: alterar ez_filter_hz de 190 para 160 define dterm_lpf_hz como 155, mas também baixa o passa-baixa do giroscópio para 160 Hz (mais atraso) e o limite do notch para 106 Hz.

O escRPM deste log está ativo e acompanha o throttle, mas rpm_gyro_filter_enabled = 0. O filtro de RPM eliminaria parte do ruído dos motores, mas não a ressonância de 117 Hz, que não varia com a rotação deles.

Mapa do ruído do giroscópio de pitch em função do throttle: à esquerda, o giroscópio bruto com uma faixa vertical brilhante em 117 Hz; à direita, após a filtragem, com a faixa mais fraca e o ruído acima de 200 Hz eliminado
INAV 8.0, Matek H743, 995 Hz: ruído de pitch em função do throttle. À esquerda, giroscópio bruto: faixa de 117 Hz em todos os níveis de throttle, 12 dB acima do ruído de fundo. À direita, após a filtragem: o ruído acima de 200 Hz foi eliminado; a faixa de 117 Hz está cerca de 17 dB mais fraca, mas permanece.

INAV 8, BetaFPV F411, whoop 1S: D doze vezes mais forte que P

Dez segundos a 973 Hz com GYRO_RAW. PID de roll: P 17, I 86, D 50, FF 60; pitch 40 / 90 / 35 / 60. D do roll é três vezes maior que P, enquanto no INAV padrão D é 23 e P é 40. No log, o termo D do roll é 12 vezes mais forte que P e absorve quase todo o ruído dos motores: 5,5% nos motores (M4, crítico), 22,1 graus/s de ruído bruto de roll e 4,8 graus/s após a filtragem. Parece um erro de digitação ou valores trocados; é por aí que o relatório começa:

set mc_d_roll = 35
save

Mais três observações. O filtro de RPM está ativado (rpm_gyro_filter_enabled = 1), mas escRPM mantém o mesmo valor sem sentido durante todo o voo; aparentemente, o filtro funcionou sem dados de RPM. A diagonal M1+M4 trabalha mais o tempo todo (46%): o mixer está corrigindo yaw continuamente; procure um motor inclinado ou hélices incompatíveis. O propwash foi de 9,4 graus/s, mas com apenas três cortes limpos (uma avaliação confiável precisa de cinco); em dois deles, o motor mais fraco ficou em marcha lenta por pelo menos 150 ms durante a janela de meio segundo após o corte. Não é falta de D: não resta força de frenagem para o controlador de voo. Se o próximo voo confirmar isso, ajuste throttle_idle de 8 para 10 e use airmode_type = THROTTLE_THRESHOLD. Veja mais no guia de propwash.

INAV 6.x: o giroscópio filtrado zerou enquanto o bruto continuou funcionando

Dois quads, ambos caíram. INAV 6.1.1 em uma AocodaRC H7 Dual (3S): o giroscópio filtrado fica em zero por 0,9 s quando o failsafe é acionado, embora os pacotes RC continuem chegando. INAV 6.0.0 em uma iFlight Blitz F7 (6S): fica em zero por 1,5 s; o failsafe ocorre 1,4 s antes de um impacto de 9 g, o throttle cai de 32% para 4% e, novamente, os pacotes RC continuam chegando. Nos dois casos, o giroscópio bruto continuou detectando rotação: o sensor estava funcionando e o zero foi causado pelo firmware.

O bbdoctor identifica um congelamento quando os três eixos do giroscópio permanecem exatamente iguais por 0,3 s ou mais durante o voo. Sem GYRO_RAW, não dá para distinguir uma falha do firmware de um defeito no sensor. O que fazer: atualize o firmware, confira se o failsafe está associado a uma chave do rádio e verifique failsafe_procedure. Se isso também acontecer sem failsafe, confira as soldas e a alimentação de 3,3 V da controladora de voo.

Ordem de ajuste para o INAV

  1. Gravação. 500 Hz ou mais, GYRO_RAW e MOTORS. Decida como usar o EzTune: ajuste pelos controles deslizantes ou defina ez_enabled = OFF e ajuste manualmente.
  2. Mecânica. Ruído bruto acima de 4 graus/s em roll ou pitch, picos que aumentam com o throttle (hélices, motores) ou um pico fixo em frequência (estrutura): comece pelas hélices, parafusos e pelo stack com montagem antivibração. Filtros não corrigem problemas mecânicos. Veja mais no guia de ruído e filtros.
  3. Filtros. Ruído dos motores de 2,5% ou mais e motores quentes: reduza dterm_lpf_hz em 15%. Se ainda houver ruído, reduza gyro_main_lpf_hz em 15%. Ressonância abaixo de dynamic_gyro_notch_min_hz: reduza o limite depois de confirmar a frequência com um log de 2 kHz. Se a telemetria do ESC estiver funcionando, ative o filtro de RPM. Pouco ruído e motores frios: alivie um pouco os filtros para reduzir o atraso.
  4. P e D. Se houver overshoot, confira primeiro a contribuição do FF. Se for pequena, o overshoot vem de P/D: reduza P e, com ζ abaixo de 0,6 e motores frios, aumente D em etapas de 10%.
  5. I, relax, anti-gravity e TPA. Rebote: reduza mc_iterm_relax_cutoff de 15 para 10 e depois reduza I em 10%. Nariz baixa em acelerações bruscas: use antigravity_gain = 2. Overshoot ou tremores apenas com throttle alto: altere tpa_rate de 0 para 20 ou aumente 15 se o TPA já estiver ativado (no INAV, ele reduz P, D e CD).
  6. Propwash. Se um motor ficar em marcha lenta durante os cortes, aumente throttle_idle em 2 e use airmode_type = THROTTLE_THRESHOLD; não aumente D. O próprio Airmode precisa estar ativado com feature AIRMODE ou pela chave AIR MODE.
  7. FF e suavização do stick ficam por último, depois que o loop parar de apresentar overshoot.

Faça uma alteração por voo e toque nos motores para verificar a temperatura depois de cada uma. Veja como interpretar a resposta ao degrau em ajuste de PID com blackbox.

Quando não alterar nada. Se o log estiver abaixo de 500 Hz, deixe os filtros como estão. Se o voo foi em ANGLE ou em um modo de navegação, não mexa nos PIDs. Com menos de cinco cortes limpos, não ajuste o propwash; com menos de seis paradas bruscas por eixo, não mexa em relax nem em I. Se houver perda significativa de quadros, faça outro voo. Com ruído bruto abaixo de 4 graus/s, ruído dos motores abaixo de 2,5% e amortecimento entre 0,6 e 0,9, mantenha o ajuste: mais filtragem acrescenta atraso e mais D esquenta os motores.

Diferenças entre os logs do INAV e do Betaflight

Ajuste a navegação somente depois de corrigir o loop interno

Os controladores de posição e altitude do INAV geram um ângulo e um throttle de referência, que os loops de ângulo e taxa ajustados acima precisam executar. Se o roll tem overshoot de 30% e oscila a 7 Hz, o POSHOLD vai oscilar; nesse caso, alterar nav_mc_pos_xy_p ou nav_mc_vel_xy_p significa corrigir o loop errado. Siga esta ordem:

  1. Um loop interno estável, avaliado com um log em ACRO.
  2. Throttle de pairado: encontre o throttle (campo rcCommand[3]) em que o quad paira sem subir nem descer e defina nav_mc_hover_thr com esse valor (mesmas unidades de 1000 a 2000); o controlador de altitude parte desse valor.
  3. Depois, ajuste os ganhos de altitude (nav_mc_pos_z_p, nav_mc_vel_z_*) e de posição (nav_mc_pos_xy_p, nav_mc_vel_xy_*), um por voo.

O bbdoctor analisa o loop interno, não os controladores de navegação.

Verificação automática

O bbdoctor analisa gratuitamente e online logs blackbox do INAV (.txt e .bbl): mede tudo o que foi mencionado nos exemplos acima e sugere comandos na sintaxe do CLI do INAV, calculados a partir dos seus valores atuais. Como os limites foram ajustados com quads FPV Betaflight, o relatório avisa que são aproximados para drones grandes. Veja um exemplo de relatório.

Perguntas frequentes

Como gravo o giroscópio bruto no INAV?

No CLI, digite blackbox GYRO_RAW e depois save. Digitar apenas blackbox lista os campos gravados; MOTORS também precisa estar ativado. A taxa é definida por blackbox_rate_num e blackbox_rate_denom: para analisar vibração e filtros, use 500 Hz ou mais; com looptime 500, isso significa 1/2 (cerca de 1 kHz). Na prática, 1/4 fica um pouco abaixo de 500 Hz, então as verificações de vibração não são executadas.

O INAV tem autotune para multirrotores?

O modo AUTOTUNE integrado ao INAV é para aeronaves de asa fixa. Multirrotores são ajustados manualmente com base no log ou, de forma simples, com o EzTune (ez_enabled), que calcula PIDs e filtros a partir de alguns controles deslizantes. Com o EzTune ativado, as alterações manuais de PID são sobrescritas.

O que é mc_cd_roll no INAV?

Control Derivative, o equivalente do feedforward do Betaflight no INAV. Ele antecipa o movimento da aeronave com base na velocidade com que o stick se move, antes da ação de P. O padrão é 60 em todos os eixos. No cabeçalho do log, é o quarto número de rollPID; nos dados do log, é o campo axisF.

Por que meu log do INAV foi gravado a 60 Hz?

A taxa de gravação é a taxa do loop multiplicada por blackbox_rate_num / blackbox_rate_denom. Com looptime 500 (2 kHz) e proporção 1/32, você obtém cerca de 62 Hz, então o log mostra apenas de 0 a 30 Hz. Defina blackbox_rate_num = 1 e blackbox_rate_denom = 2 para obter 1 kHz.

Atualizado:

Mais guias