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.
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
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.
Comentários
Entre na sua conta para continuar.
Ainda não há dados.