Contents — find the section you need

Change parameters and verify

Open the panel, then press Run to load Python. You can stop execution and reset parameters. Results are computed on this device. No Python installation is required.

Local execution steps below are optional for reproducing the source results; they are not required for the browser experiment.

The experiment controls are in English.

Open experiment panel in a new tab

Download reproduction source

Um pequeno modelo executável facilita a inspeção das alterações de ganho PID e da saturação do atuador. Estes resultados foram calculados em 7 de setembro de 2026 com Python 3.12.3. São simulações numéricas, não medições ou um modelo de motor identificado.

Modelo e condições

A planta é \ddot y+2\dot y+y=u. A saída y e o controle u são normalizados; o tempo está em segundos. A saída inicial, a velocidade e a integral são zero. O alvo é 1 a partir do tempo zero e, em seguida, 0,4 a partir de 6 segundos. O passo é de 0,005 segundos no intervalo de 0 a 12 segundos, resultando em 2.401 amostras por caso.

O controlador é u=K_pe+K_iI-K_d\dot y_m, com e=r-y_m. Aqui, y_m é a saída medida. A derivada atua sobre ela em vez do alvo. Os ganhos de referência são K_p=3 , K_i=2 , K_d=1 . A integração e a diferenciação usam explicitamente o passo de tempo; a planta usa integração de Euler semi-implícita. Consulte Fundamentos de PID para os princípios.

Executar o código

Salve pid_lab.py em um diretório de trabalho vazio e execute o seguinte. Ele requer apenas a biblioteca padrão do Python e sobrescreve os arquivos de resultado com os mesmos nomes.

python3 --version
python3 pid_lab.py

Ele gera o CSV e o JSON de resumo. Para regenerar a figura, salve e execute plot_pid.py no mesmo diretório; a plotagem foi verificada com o matplotlib 3.6.3. As colunas do CSV são: cenário, tempo, alvo, saída, controle e integral.

Comparação de atraso e saturação

Diagram 1 · Use the button to switch views
Saída e controle PID simulados com atraso de medição de 0,4 segundos, limite de controle de 0,8 e integração condicional

O gráfico superior mostra a saída; o gráfico inferior mostra o controle. A linha preta representa o alvo. Os rótulos dos cenários correspondem ao CSV e aw significa anti-windup.

Cenário Mudança Saída em 12 s Erro absoluto integrado
nominal Sem atraso, controle limitado a ±3 0,4008 1,7913
atraso_0,4s Medição atrasada em 0,4 s 0,3883 1,8860
limite_0,8_aw Controle ±0,8, integração condicional 0,4003 3,3424
limite_0,8_no_aw Controle ±0,8, integração irrestrita 0,6602 5,0996

O erro absoluto integrado utiliza integração retangular à esquerda no intervalo de 0 a 12 segundos. Suas unidades são o produto da saída normalizada por segundos, e não o erro de posição física em metros. Inspecione a oscilação e o esforço de controle, bem como a amostra final.

O anti-windup não aumenta a capacidade do atuador

Em equilíbrio, esta planta tem y=u, portanto, um limite de controle de 0,8 não consegue atingir uma meta de 1. Se o erro continuar acumulando, a integral pode exigir entrada excessiva mesmo depois que a meta cair para 0,4. O código rejeita a integração que levaria a uma maior saturação, enquanto permite a integração que ajuda a sair dela.

Isso altera o estado interno do controlador, não a capacidade do motor ou da fonte de alimentação. Tornar a meta atingível é uma decisão separada.

Alterar um ganho por vez

from pid_lab import simulate
for kp in (1., 3., 6.):
    rows = simulate("gain", kp=kp)
    print(kp, max(row[3] for row in rows if row[1] < 6))

Compare o pico durante o intervalo inicial da meta. Em seguida, varie apenas ki e, depois, apenas kd, registrando também o esforço máximo de controle. Ganhos maiores não são universalmente melhores; repita as comparações com atraso e saturação.

Limitações e próximas verificações

O modelo exclui ruído de medição, atrito, quantização, jitter de comunicação e filtragem de derivadas. Reduza o passo de tempo pela metade: se a resposta mudar substancialmente, investigue primeiro a aproximação numérica. Não copie esses ganhos para o hardware sem identificar a planta e adequar as unidades e escalas de tempo. Continue para MPC para estudar as restrições dentro do problema de controle.

Execute o mesmo cálculo localmente

Extraia o arquivo ZIP completo e executável, ou salve o ponto de entrada do experimento, os kernels gerados e o código-fonte original do PID em uma pasta. O PID usa a biblioteca padrão do Python; Kalman e ICP requerem NumPy. Os comandos originais de geração de figuras permanecem disponíveis.

python3 experiment.py pid --parameters '{"kp":3,"ki":2,"kd":1,"delay":0,"limit":3,"antiwindup":true}' > result.json

Ajuste o atraso para 0,4 ou o limite para 0,8 e compare o IAE e a saída final com e sem anti-windup.

Code, data and reproduction

The ZIP contains the same computation code as the browser, synthetic data and comparison cases. These are not physical measurements.

Download reproduction package · Instructions (EN/JA) · Files and experiment conditions (JSON)

Extract the ZIP into a new directory, then run:

python3 reproduce.py --experiment pid

This Lab compares 4 cases. PID uses Python’s standard library; Kalman/ICP require NumPy. See the instructions for dependencies and tested versions.

Related reading

Study control with constraintsIntrodução à Engenharia de Controle: Controle Preditivo por Modelo — Agindo Dentro de RestriçõesExplore another aspect of this fieldLaboratório MPC — resolva novamente uma sequência de curvatura dentro de um horizonte e dos limites de direçãoExplore another aspect of this fieldLaboratório de comparação de rastreamento de trajetória — execute PP, APP, RPP, Stanley e MPC sob as mesmas condições