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

Ajuste de PID no Betaflight a partir do Blackbox: corrija a causa, não o sintoma

Seu drone passa do ponto depois de um flip. A resposta no fórum é "reduza P" ou "aumente D". O problema: o mesmo overshoot pode ter três causas, e duas delas exigem correções opostas. Se o feedforward estiver causando isso, reduzir P piora o problema. Se faltar amortecimento no loop, reduzir FF não muda nada. O log mostra qual é o seu caso. Veja como o bbdoctor interpreta os dados, com validação em seis logs reais do Betaflight 3.1.5 ao 2026.6.

Ordem do trabalho: mecânica → ruído → PID

  1. Mecânica. Hélices boas, motores sem folga, frame firme e bateria que não se desloca. Nenhum PID corrige uma hélice empenada.
  2. Ruído e filtros. Filtro RPM (DShot bidirecional), filtragem sensata e motores frios depois do voo. Veja o guia de ruído e filtros.
  3. PID. Primeiro roll e pitch (P/D e feedforward), depois I, TPA e anti-gravity.

Por quê? D é a derivada do giroscópio, então amplifica o ruído de alta frequência e o envia direto aos motores. O bbdoctor não sugere aumentar D quando o ruído de alta frequência dos motores passa de 2.5% da faixa dos motores, quando o ruído do PID vem principalmente do termo D ou quando o ruído bruto do giroscópio acima de 80 Hz chega a 10 deg/s. No caso 4.2.5 abaixo, o loop precisava de mais D, mas o ruído bruto do giroscópio, de 35.8 deg/s, mudou a recomendação para P −10% (p_roll 42 → 38) e revisão da mecânica primeiro.

O log necessário

Como ler a resposta ao degrau

A resposta ao degrau mostra como o drone giraria se você movesse o stick instantaneamente para uma determinada taxa. 1.0 é a taxa solicitada. Uma boa curva sobe rápido, passa um pouco de 1.0 e se estabiliza logo em seguida.

Overshoot

Quanto o pico ultrapassa 1.0; até 15% é normal. O diagnóstico usa o intervalo de 90%, não um único número:

Amortecimento ζ

O bbdoctor ajusta um modelo de segunda ordem à curva e calcula sua razão de amortecimento ζ, que indica quanto overshoot o loop P/D produz sozinho:

ζOvershoot do loopAparência
0.36~30%Queda profunda após o pico, várias oscilações
0.5~16%Queda evidente, uma ou duas oscilações
0.6~9%Pequeno ressalto, quase nenhuma queda
0.7–0.95% ou menosUm ressalto e depois uma linha reta — é isso que você quer

O bbdoctor só aponta oscilação quando dois sinais coincidem: ζ de no máximo 0.5 e queda abaixo do alvo de pelo menos 4% (pelo menos 2% com 90% de confiança). O nível é warn com ζ de até 0.40 ou queda de 15% ou mais. Se o modelo se ajusta mal, ζ não aparece e só a queda determina o resultado, no máximo em nível info. Oscilação abaixo de 6 Hz em um drone de 5 polegadas aponta para o termo I ou uma aeronave pesada, não D.

Velocidade

Como a curva é construída

Ninguém move o stick em degraus perfeitos, então a resposta é reconstruída de trás para frente (deconvolução): para cada janela de 1 segundo, qual reação a um degrau instantâneo transforma esta entrada do stick neste traçado do giroscópio? Há duas armadilhas:

A curva é a mediana entre janelas; o intervalo vem de um bootstrap (200 reembaralhamentos aleatórios das janelas), daí "47% (90%: 44–53%)" no relatório. Portanto, 10% de "overshoot" em uma ferramenta com corte acentuado pode ser puro artefato.

Um overshoot, três causas

CausaO que o log mostraO que fazerO que evitar
Feedforward (no 3.x, peso do setpoint D)FF faz 45% ou mais do trabalho em movimentos bruscos do stick, P quase não acrescenta nada e o giroscópio acompanha ou se adianta ao setpointReduza f_roll/f_pitch em 15% (no 3.x, dterm_setpoint_weight). É um primeiro passo seguro: não aquece os motoresNão mexa em P nem D
Loop subamortecidoFF faz menos de 45%, o drone não se adianta ao stick, ζ abaixo de 0.5, queda depois do pico e oscilaçãoAumente o D base em 15% (junto com seu limite) se os motores estiverem frios; se houver ruído, reduza P em 10%Não reduza FF: isso não ajuda. Não reduza P se o eixo já for lento (20 ms ou mais)
AntecipaçãoO loop tem bom amortecimento (ζ ≥ 0.6, sem queda), mas o overshoot é mais que o dobro do esperado para esse loop; FF faz 35% ou mais do trabalhoReduza FF. Se nada mudar, reverta: nesse caso, é o termo I que está empurrandoNão reduza P: com menos P, o loop puxa de volta com menos força e o overshoot aumenta

Mais três padrões, verificados separadamente:

Três respostas ao degrau de roll: um bom ajuste com 2% de overshoot, o ajuste padrão do Betaflight 3.1.5 com 87% e um drone 4.5.2 com 47% causado por feedforward
Resposta de roll de três drones, normalizada ao nível estabilizado. A: ajuste de referência (Betaflight 3.1.5), pico 1.05, 2% após subtrair o viés do método. B: ajuste padrão do 3.1.5 (log de 7.9 kHz), pico perto de 1.9, queda para 0.8 e oscilação: 87%, devido ao peso do setpoint D. C: drone de 3.5 polegadas no 4.5.2, pico 1.49 (47%) e queda suave: feedforward faz 60% do trabalho.

Cinco casos reais

A referência: 2% com ζ 0.73

O log plasmatree_good_tune (Betaflight 3.1.5) é a referência de bom ajuste entre os logs usados para calibrar os limites do bbdoctor. Roll 2% (90%: 1–3%), pitch 5%, sem overshoot em yaw. Roll ζ 0.73, sem queda, t50 9 ms, atraso entre setpoint e rotação 10 ms. Não copie P 19, I 12, D 18 para o 4.x: filtragem, D e feedforward funcionam de outra forma nessa versão.

Ajuste padrão 3.1.5: 87% pelo peso do setpoint

O log 18_stock_tune, 7.9 kHz. Roll 87% (79–93%), pitch 65%. O 3.x não registra o setpoint, então ele é reconstruído a partir dos sticks e das taxas. Nos movimentos mais bruscos, o giroscópio se adianta ao setpoint, algo que um loop sem impulso do stick não consegue fazer; o impulso vem de dterm_setpoint_weight = 190, substituto do feedforward no 3.x. A recomendação é 190 → 100, uma configuração para todos os eixos. Roll também oscila (ζ 0.36), mas aumentar D é apenas o próximo passo: d_roll 20 → 23 se a oscilação continuar.

Drone de 3.5 polegadas no 4.5.2: 47%, quase tudo FF

O log vx35_18-23. Roll 47% (44–53%), t50 7 ms. Feedforward faz 60% do trabalho, com erro de tracking quase zero nos movimentos mais bruscos. Com ζ 0.62, o loop sozinho teria cerca de 9% de overshoot; FF acrescenta o restante. Pitch: 27%, FF faz 59%. A recomendação altera apenas FF:

set f_roll = 102
set f_pitch = 106
set simplified_pids_mode = OFF
save

A linha do slider é necessária porque os PIDs deste log já não correspondem aos sliders e seriam substituídos ao salvar. Além disso, o boost de D só sobe até ×1.15 do valor configurado ×1.67, então o drone voa principalmente com d_min_roll = 30, não 50.

Betaflight 2026.6: 35% causado pelo próprio loop

Log de um GEPRC F405 gravado a 247 Hz. Roll 35% (33–38%). FF faz apenas 29% do trabalho e o drone não se adianta ao stick, então não é feedforward. Depois do pico, a resposta cai 5% abaixo do alvo e oscila a ~9 Hz, ζ 0.49 (provavelmente 0.42–0.50). Pitch é parecido (ζ 0.50), então os dois eixos recebem uma correção: D base +15%.

set d_roll = 39
set d_max_roll = 46
set d_pitch = 53
set d_max_pitch = 63
set simplified_pids_mode = OFF
save

Reduzir P está fora de questão: roll já leva 24 ms e pitch 28 ms, além dos ~12 ms do link de rádio de 50 pacotes/s antes de o stick sequer chegar ao setpoint. A 247 Hz, o log não mostra ruído de D, então toque nos motores depois de um primeiro voo de 1–2 minutos.

Duas respostas ao degrau de roll: um loop subamortecido que cai e oscila e uma resposta saudável; tracejada, a resposta perfeita processada pelo mesmo método
A: Betaflight 2026.6, log de 247 Hz: pico 1.39 em ~50 ms, queda para 0.95 e oscilação a ~9 Hz, ζ 0.49. B: Betaflight 4.5.1, 1 kHz: pico 1.16, 12% em roll e pitch, t50 10–12 ms; não precisa mexer. Tracejada: o traçado produzido pelo método para uma resposta perfeita com o mesmo atraso; seu ressalto de 4% é subtraído do overshoot. Sombreamento: variação entre janelas individuais, da qual vêm a mediana e o intervalo.

Betaflight 4.2.5: 32% em movimentos suaves, 1% nos bruscos

O log v0002, 2 kHz. Roll 23%, causado pelo loop. Separando por tamanho do movimento do stick, movimentos suaves (até 101 deg/s) têm overshoot de 32%, os bruscos (a partir de 800 deg/s), 1%. D chega ao limite de ×1.52 nos movimentos bruscos (d_min_roll 23 → d_roll 35), enquanto os suaves usam o D base 23. A correção clássica seria aumentar o D base, mas este giroscópio tem muito ruído (veja a primeira seção), então a recomendação é P −10%.

P, I e D, um de cada vez

Quando roll e pitch respondem de forma diferente

No mesmo log VX3.5, o atraso de roll é 3.8 ms (90%: 2.9–5.0) e o de pitch é 9.5 ms (8.5–10.6). Os intervalos não se sobrepõem, então a diferença é real, e os ganhos explicam isso: P de pitch 42, P de roll 59. Quando o P do eixo mais lento é inferior a 85% do eixo mais rápido, o bbdoctor diz que isso, por si só, explica a diferença. Conclua primeiro os ajustes de overshoot; depois reduza P de roll em direção a ~50 em vez de aumentar pitch, que já tem overshoot. Sem diferença de P, uma causa comum é a distribuição de peso: uma bateria longe do centro aumenta a inércia de pitch.

Nomes de D por versão e a armadilha dos sliders

VersãoD baseLimite do boost
4.0–4.2d_min_rolld_roll
4.3–4.5d_min_roll ("Derivative")d_roll ("D Max")
4.6 / 2025.12+d_roll ("Derivative")d_max_roll ("D Max")

A mesma recomendação, "aumente d_roll", aumenta o D base no 2025.12, mas apenas o limite no 4.5, que o drone talvez raramente alcance. Exemplo para 4.5 (base 30, limite 50), +10% de amortecimento em roll:

set d_min_roll = 33
set d_roll = 55
set simplified_pids_mode = OFF
save

Sliders. Enquanto simplified_pids_mode estiver ON, o Configurator recalcula os PIDs a partir dos sliders ao salvar e apaga as mudanças manuais. Nunca execute simplified_tuning apply sobre um ajuste manual: isso reconstrói os PIDs usando os multiplicadores dos sliders aplicados aos padrões de fábrica.

INAV, ArduPilot, PX4

Segurança

Confira seu próprio log

Envie seu log para o bbdoctor, grátis. O relatório mostra o overshoot por eixo e seu intervalo, ζ, a queda, a participação do FF no trabalho, o atraso e a diferença entre eixos, além de comandos CLI gerados a partir dos seus valores atuais com os nomes corretos para sua versão. Veja um relatório de exemplo e confira suas configurações sem voar usando um diff all na página de verificação da configuração.

Perguntas frequentes

Como diferencio overshoot de feedforward de overshoot de P?

Veja quem faz o trabalho durante movimentos bruscos do stick. Se o feedforward responde por 45% ou mais e, nos movimentos mais bruscos, o giroscópio acompanha ou se adianta ao setpoint, o overshoot vem do FF: reduza f_roll e f_pitch em 15% e deixe P e D como estão. Se o FF faz menos de 45% e a resposta cai abaixo do alvo depois do pico e oscila (ζ abaixo de 0.5), o problema está no loop P/D.

Qual D devo alterar no Betaflight 4.5 e no 2025.12?

O D base usado na maior parte do voo. No 4.3–4.5, é d_min_roll (a coluna Derivative), e d_roll é apenas o limite do boost (D Max). A partir do 4.6/2025.12, os nomes correspondem às colunas: d_roll base, d_max_roll limite. Altere os dois na mesma proporção, como o slider faz.

Quanto devo alterar os PIDs de cada vez?

Um parâmetro por voo, 10–15% por etapa. Depois do primeiro minuto no ar, toque nos motores: se estiverem claramente mais quentes do que antes da mudança, reverta. Uma etapa de 10–15% aparece no log acima da variação de medição de alguns por cento e é pequena o suficiente para não passar do ponto ideal.

O que significa ζ (amortecimento) no relatório?

É a rapidez com que a oscilação depois do pico desaparece. Com ζ 0.5, o próprio loop provoca cerca de 16% de overshoot e oscila visivelmente; com 0.7, cerca de 5%, quase sem oscilação. Um bom ajuste fica entre 0.6–0.9. Abaixo de 0.5, com uma queda depois do pico, falta amortecimento (D) para o P atual.

Atualizado:

Mais guias