Controlador PID para LEGO Mindstorms Robots, vá pid.

Controlador PID para LEGO Mindstorms Robots, vá pid.

Controlador PID para LEGO Mindstorms Robots, vá pid.

Um controlador PID é uma técnica comum utilizado para controlar uma grande variedade de máquinas, incluindo veículos, robots e até foguetes. A descrição matemática completa de um controlador PID é bastante complexo, mas uma compreensão muito mais simples é realmente tudo o que é necessário para usar um PID de forma eficaz.

Este documento é uma descrição de como criar um controlador PID para uso com Lego Mindstorms robôs utilizando a linguagem de programação NXT-G.

Será mais fácil se tivermos uma tarefa real em mente por isso vou descrever como criar um PID para fazer linha a seguir. Uma vez criado, o mesmo PID pode ser utilizado, com apenas pequenas modificações, com qualquer outra aplicação Mindstorms, tais como a obtenção de um robô que pode dirigir o mais reto possível, ou mesmo para um robô que pode equilibrar com nada além de 2 rodas no solo como um Segway.

Então, vamos começar com o layout básico de um robô que seria adequado para a linha seguinte. À direita é um desenho simplificado de uma vista de cima do robô com todos os detalhes que precisamos. O robô é um robô boi diferencial com dois motores, cada um ligado a uma das rodas A e C. O robô tem um sensor de luz montada na frente que aponta diretamente para baixo para que ele não vê nada, mas o tapete (chão, chão, tampo da mesa , seja qual for o robô é ligado). O círculo vermelho representa o bastante pequena mancha no tapete que o sensor de luz pode realmente "Vejo". O resto do robô é o grande retângulo com uma seta, a seta mostra o sentido de marcha normal.

Nosso objetivo é fazer com que o robô para seguir a linha preta gordura. Linha a seguir é um comportamento robótico básico e é frequentemente uma das primeiras coisas que as pessoas aprendem. Um dispositivo móvel que pode seguir uma linha apresenta todas as características de um verdadeiro robô. Ele usa sensores para reunir informações sobre o mundo em torno dele e muda seu comportamento, dependendo essa informação.

seguidores de linha pode ser construído com um sensor de luz, ou dois, ou uma dúzia ou quantos você acontecer ter. Em, os sensores gerais mais luz você tem o melhor que você pode seguir uma linha. Aqui nós vamos nos limitar a um único sensor de luz Mindstorms. Mesmo com um único sensor que deve ser capaz de construir um robô que pode acompanhar a linha de grande precisão, mesmo que a linha tem curvas na mesma. A coisa que você normalmente solto com um único sensor é a capacidade de seguir a linha enquanto se move rápido. Muitas vezes, os mais sensores você tem mais rápido o robô pode se mover enquanto ele segue a linha.

O primeiro truque que vamos usar, o que não está relacionado com um PID, é que não vai tentar realmente seguir a linha. Em vez disso, vamos tentar seguir a borda da linha. Por quê? Porque se nós seguimos a si mesmo (o preto) de linha, em seguida, quando o robô flutua fora da linha eo sensor "vê branco" não sabemos de que lado da linha em que estamos. Será que estamos a esquerda ou direita da linha? Se seguirmos beira da linha, então podemos dizer que a maneira que estamos fora da borda como o robô flutua fora da linha. Se o sensor de luz "vê branco" então sabemos que é deixada de borda da linha (e da linha). Se isso "vê preto" então sabemos que é à direita da borda da linha (e na linha). Isto é chamado um " mão esquerda seguidor de linha " uma vez que está a seguir borda esquerda da linha.

Precisamos saber o que valoriza o sensor de luz retornos quando se "vê branco" e quando "vê preto". Um sensor não calibrada típico pode dar um "branco" leitura de 50 e um "Preto" leitura de 40 (não calibrada, em uma escala de 0 a 100). É conveniente chamar os valores em uma simples linha de números para ajudar a visualizar como nós converter valores do sensor de luminosidade em mudanças no movimento do robô. Abaixo estão os nossos composta valores de luz para branco e preto.

Nós apenas dividir a gama em duas partes iguais e dizer que se o nível de luz é inferior a 45 queremos que o robô para virar à esquerda. Se for superior a 45 nós queremos virar à direita. Eu não vou entrar em exatamente como as voltas deve ser feito. Vou apenas dizer que se transforma suaves funcionam bem para uma linha bastante simples. Uma linha com muitas curvas normalmente precisa ser fazer curvas mais fechadas. Para branda que você pode usar os níveis de energia de 50% na roda rápido e 20% na roda lento. Para curvas mais fechadas em uma linha curvilínea que você pode precisar de usar o poder de 30% para a roda rápido e inércia ou frenagem da roda lento. O que quer que os níveis de poder que você use os números serão as mesmas para os dois turnos, você simplesmente mudar qual o motor obtém o número grande e que obter o menor número (ou um comando de parada).

Este tipo de um seguidor de linha seguirá uma linha, mas não é muito bonita. Parece OK em uma linha reta com os motores programados para curvas suaves. Mas se a linha tem todas as curvas, então você tem dizer o robô para usar curvas mais fechadas para seguir a linha. Que faz o balanço do robô e para trás em toda a linha. O robô única "sabe" como fazer duas coisas; vire à esquerda e vire à direita. Esta abordagem pode ser feito para trabalhar, mas não é muito rápida ou precisa e parece terrível.

Na abordagem acima o robô não leva em linha reta. mesmo se ele está perfeitamente alinhado com a borda da linha ea linha é reta. Isso não parece muito eficiente, não é?

Vamos tentar corrigir isso. Em vez de dividir nossa linha número valor de luz em duas regiões permite dividi-lo em três.

Portanto, agora se o nível de luz é inferior a 43 queremos que o robô para virar à esquerda. Se o valor de luz é entre 44 e 47 nós queremos que ele vá direto (zoom zoom). Se o nível de luz é maior do que 47 nós queremos virar à direita. Isso pode ser facilmente implementado em Mindstorms NXT-G com um interruptor (sim / não) dentro de um switch. Você realmente só tem que fazer dois testes não três.

Esta abordagem funciona melhor do que a primeira. Pelo menos agora o robô é por vezes se movendo para a frente. Tal como acontece com a primeira abordagem você ainda tem que decidir que tipo de voltas que você precisa e que normalmente depende das características da linha que você está seguindo. O robô vai provavelmente ainda caçar volta uma luz um montante justo.

O leitor astuto vai provavelmente ter pensado " bem se três faixas de luz são melhores do que dois do que o que sobre a adição de ainda mais? " Esse é o começo de um PID.

o "P" dentro "PID": Proporção (al) é a chave

Então, o que vai acontecer se nós adicionamos mais divisões para a nossa linha de escala luz? Bem, a primeira coisa que temos de lidar com é o que faz "virar" Quer dizer, com mais de três faixas de luz? Em nossa primeira abordagem o robô poderia fazer apenas duas coisas, virar à esquerda ou à direita. As voltas eram sempre os mesmos apenas em direções opostas. Na segunda abordagem, acrescentou o "Siga em frente" para as duas espiras. Se tivermos mais de três faixas, em seguida, precisamos de mais "tipos" de voltas.

Para ajudar a entender "mais tipos de voltas" vamos refazer ou número de linha um pouco e convertê-lo em um gráfico. Nosso eixo X (horizontal) serão os nossos valores de luz assim como nas linhas numéricas. O eixo Y (vertical) bem ser o nosso "virar" eixo.

Como você deve saber, a equação de uma linha reta é:

Se você não sabe muito sobre as linhas (ou ter esquecido o que você uma vez novo) eu vou expandir um pouco e fazer algumas simplificações para o nosso gráfico e equação. Em primeiro lugar, vamos mudar o centro da nossa linha de número de luz (o eixo X) para zero. Isso é fácil de fazer. Para nosso gama valor de luz 40 e 50 nós apenas subtrair 45 (que é a média de 40 e 50, (40 + 50) / 2) de todos os nossos leituras de luz. Ligamos que resultam de erros. Assim, se o valor de luz é de 47 subtraímos 45 e obter um erro = 2. O erro nos diz quão longe fora da borda da linha somos. Se o sensor de luz é exatamente na borda da linha de nosso erro é zero uma vez que o valor de luz é de 45 e subtrair 45 a partir de todas as nossas leituras. Se o sensor é todo o caminho para fora no branco nosso erro é +5. Todo o caminho para o preto o erro é -5.

ou usar nossos rótulos

Nós ainda não definiu o que o eixo sua vez, significa então por enquanto vamos apenas dizer que as voltas variam de -1 (volta dura à esquerda) para +1 (por sua vez, força para a direita) e uma viragem zero significa que estamos indo direto . A inclinação da linha no gráfico acima pode ser calculado usando os dois pontos marcados em vermelho (quaisquer dois pontos na linha irá funcionar);

declive = m = (mudança em y) / (variação em x) = (1- (-1)) / (-5 – 5) = 2 / -10 = -0,2

o "declive" tem um par de nomes que significam a mesma coisa, pelo menos neste contexto. Nas encostas da literatura PID (constantes de proporcionalidade, m na equação de uma linha) são chamados " K " (Do erro de ortografia da palavra " c onstant"?). mostram vários K s por cima de toda a literatura PID e são um muito importante. Você pode pensar em um K (ou m ou inclinação ou da proporcionalidade constante) como um factor de conversão. Você usa K para converter um número que significa uma coisa (valores de luz ou de erro no nosso caso) em outra coisa como um turno. Isso é tudo o que um K faz. Muito simples e muito poderosa.

Então, usando esses novos nomes para nossas variáveis ​​da equação da linha é;

Na literatura PID do intervalo sobre o qual o sensor dá uma resposta proporcional é chamado o " gama proporcional " (Vai a figura: D). A gama proporcional é outro conceito muito importante no PIDs. No nosso seguidor de linha a gama proporcional para o sensor de luz é de 40 a 50, para o erro é de -5 a +5. Nossos motores também têm uma gama proporcional, de -100 (potência total para trás) a +100 (ala-pivô completo). Vou apenas dizer algumas coisas sobre isso a importância da gama proporcional:

(1) Você quer que a gama proporcional a ser tão amplo quanto possível. gama proporcional do nosso sensor de luz é muito pequena, ou seja, o sensor tem de ser muito perto da borda linha para obter informações proporcional. Exatamente como ampla a gama é depende principalmente de como a elevação dos sensores está acima do tapete. Se o sensor é muito perto do tapete, por exemplo 1/16 de polegada, então o sensor está a ver um círculo muito pequeno sobre o tapete. Um lado pequeno para o lado movimento do sensor de luz vai balançar o erro de -5 a +5, que é todo o caminho através de nossa gama proporcional. Você pode dizer o sensor tem "visão de túnel" uma vez que só pode ver uma parte muito pequena do tapete. O sensor tem de ser muito perto da borda linha para obter uma leitura que não seja "branco" ou "Preto". Se o sensor for mais elevado movido fora do tapete, então ele vê um círculo maior sobre o tapete. A uma altura de cerca de 1/2 polegada o sensor de luz parece estar a olhar para um círculo no tapete que é cerca de 1/2 polegada de diâmetro. Com o sensor esta alta da gama proporcional é muito mais amplo, uma vez que o sensor de luz apenas necessita de permanecer dentro de +/- 1/2 de polegada do bordo linha para manter uma saída proporcional. Infelizmente, há duas desvantagens para um sensor de luz elevada. Em primeiro lugar, um sensor de luz alta "vê"E responde a, as luzes da sala muito mais do que um sensor de baixa. A alta sensor também tem menos diferença entre o preto e branco de um sensor de baixa. Numa suficientemente grande preto e branco distância vai dar a mesma leitura.

De P para níveis de potência real do motor

Como podemos implementar as voltas? Quais devem ser os níveis de potência real do motor ser? Uma maneira de fazer as voltas é definir um " nível p ower arget T", Que chamarei " Tp ". Tp é o nível de potência dos dois motores quando o robô é suposto ir para a frente, o que acontece quando o erro = 0. Quando o erro não é zero usamos o Turn equação = K * (erro) para calcular como alterar os níveis de potência para os dois motores. Um motor irá obter um nível de potência de Tp + Turn. o outro motor terá um nível de potência de Tp-Turn. Note-se que uma vez que o nosso erro é de -5 a 5 que significa sua vez podem ser positivos ou negativos que corresponde a curvas em sentidos opostos. Acontece que isso é exatamente o que queremos, uma vez que irá definir automaticamente o motor correto como o motor rápido eo outro como o motor lento. Um motor (vamos assumir que é o motor do lado esquerdo do robô ligado à porta A) sempre terá o valor Rode Tp + como é o nível de potência. O outro motor (lado direito do robô, porta C) sempre terá Tp – Vire como é o nível de potência. Se o erro for positivo, então sua vez, é positivo e Tp + Turn é maior do que Tp e o motor deixou acelera enquanto o motor direito desacelera. Se o erro muda de sinal e torna-se negativa (o que significa que têm atravessado sobre a borda da linha e são "vendo preto"), Então Tp + Turn é agora menos de Tp e o motor esquerdo fica mais lento eo motor direito acelera desde Tp-Turn é maior do que Tp. (Lembre-se que o negativo de um negativo é um positivo). Simples não é? Esperemos que ele vai ser um pouco mais claro como vamos em frente.

Código Pseudo para um controlador P

Primeiro, precisamos medir os valores dos sensores de luz retorna para branco e preto. Daqueles dois números podemos calcular o deslocamento. ou seja, quanto para subtrair a partir de uma leitura leve cru para convertê-lo para um valor de erro. O deslocamento é apenas a média das leituras de branco e preto. Para simplificar, eu vou assumir que o deslocamento já foi medido e armazenado em uma variável chamada offset. (A atualização agradável seria ter o robô medir os níveis de branco e preto e calcular o deslocamento.)

Assim, em pseudo-código ("pseudo-código" significa que este não é real NXT-G, ou qualquer outro tipo de código do programa, ao contrário, é apenas uma lista detalhada do que queremos que o programa para fazer):

É isso aí, bem, quase. Há um problema sutil que deve ser corrigido. Mas experimentá-lo de qualquer maneira. Se o robô aparece para evitar a borda de linha, em vez de tentar encontrá-lo, a causa mais provável é que você trocou os vez direções. Alterar Kp para -10 e ver o que acontece. Se isso corrige os vez direções, em seguida, mudar Kp volta para +10 e alterar os sinais nas duas linhas de energia para;

Se a linha é bastante simples que você pode usar uma grande Tp para obter o robô correndo em alta velocidade e um pequeno Kp assim as voltas (correções) são suaves.

Se a linha tem curvas afiadas, especialmente aqueles, haverá um valor máximo Tp que vai trabalhar. Se Tp é maior do que a máxima não importa o que Kp é, o robô vai perder a linha quando encontra uma curva porque ele está se movendo muito rápido. Se Tp é realmente pequeno, então quase qualquer valor Kp irá funcionar uma vez que o robô vai estar se movendo muito lentamente. O objetivo é fazer com que o robô se movendo tão rápido quanto possível, enquanto ainda está sendo capaz de seguir a linha de interesse.

Seguindo uma linha reta é geralmente muito fácil. Seguindo uma linha com curvas suaves é um pouco mais difícil. Seguindo uma linha com curvas acentuadas é o mais difícil. Se o robô é lenta o suficiente, então qualquer linha pode ser seguido, mesmo com um controlador muito básico. Queremos obter um bom linha a seguir, uma boa velocidade e a capacidade de lidar com cantos suaves. (Linhas com cantos afiados costumam levar seguidores de linha mais especializados ou velocidades muito baixas do robô.)

É provável que o melhor controlador de P será diferente para cada tipo de linha (largura da linha, a nitidez de curvas etc.) e para robôs diferentes. Em outras palavras, um controlador P (ou um controlador PID para que o assunto) é ajustado para um determinado tipo de linha e robô e não vai necessariamente funcionar bem para outras linhas ou robôs. O código irá funcionar para muitos robôs (e muitas tarefas), mas os parâmetros, KP. Tp e deslocamento. têm que ser ajustados para cada robô e cada aplicação.

Fazer matemática em um computador que não sabe o que é um
ponto decimal é causa alguns problemas

NOTA: Este trabalho foi feito usando NXT-G versão 1.1 que suporta apenas números inteiros. versão 2 suporta números em ponto flutuante de modo a seguir pode não ser necessário se tiver a versão 2 ou posterior NXT-G.

Vire = Kp * (erro)

Assim, o nosso código pseudo novo e melhorado para uma linha seguinte controlador P é:

Espere, o que foi o "Problema subtil" você mencionou com o
primeira versão do controlador P?

Há sempre problemas sutis. Em algum momento eles são importantes e às vezes eles não. 😉

O bloqueio motor recebe o poder (powerA para o Um motor) através de um fio de dados. A direção é definido com as caixas de seleção na janela de parâmetros do motor.

Você vai precisar de um pedaço similar de código para o motor C. Agora, quando o poder calculado vai negativo os motores serão devidamente controlados. Uma coisa isto faz é permitir que o controlador P para percorrer todo o caminho para uma "zero, transformando sua vez raio" eo robô pode girar no lugar, se necessário. Claro, isso não pode realmente ajudar.

Há algumas outras coisas que podem ser problemas sutis. O que acontece quando você envia um nível de potência que é maior que 100 para o motor? Acontece que o motor apenas trata o número como 100. Isso é bom para o programa, mas não a melhor coisa que aconteça em um (ou PID) controlador P. Você realmente prefiro que o controlador nunca tenta pedir aos motores a fazer algo que não pode. Se a energia solicitada não está muito acima de 100 (ou abaixo de -100), então provavelmente você está OK. Se a potência requerida é muito maior do que 100 (ou muito menos do que -100), então ele muitas vezes significa o controlador está fora de controle. Portanto, verifique se você tem um extintor de incêndio à mão!

Resumo P Controlador

controladores de P pode lidar com uma ampla gama surpreendente de problemas de controle, e não apenas seguir uma linha com um robô Lego. Em geral, os controladores P funcionam muito bem quando estiverem reunidas algumas condições.

  1. O sensor precisa ter ampla faixa dinâmica (que, infelizmente, não é verdade para a nossa linha seguinte robô).
  2. A coisa está sendo controlado (motores no nosso caso) também deve ter uma ampla faixa dinâmica, ou seja, devem ter uma ampla gama de "poder" níveis com indivíduo "poder" níveis que estão juntos (os motores NXT são muito bons a este respeito).
  3. Tanto o sensor e a coisa a ser controlado deve responder rapidamente. "Rápido" Neste caso é "muito mais rápido do que qualquer outra coisa que está acontecendo no sistema". Muitas vezes, quando você está controlando os motores que não é possível obter "rápido" resposta desde motores de ter tempo para reagir a uma mudança no poder. Pode demorar alguns décimos de segundo para motores de Lego para reagir a uma mudança nos níveis de energia. Isso significa que as ações do robô estão atrasados ​​comandos do controlador P. Isso faz com que o controle exato difícil com um controlador P.

adicionando "Eu" Para o controlador: O Controlador PI
("Eu": O que você tem feito por mim ultimamente?)

Para melhorar a resposta do nosso controlador P vamos adicionar um novo prazo para a equação. Este termo é denominado o integral. a "Eu" em PID. Integrais são uma parte muito importante da matemática avançada, felizmente, a parte que precisamos é bastante simples.

O integrante é a soma parcial do erro.

Sim, é assim tão simples. Existem algumas questões sutis vamos pular para o momento.

Cada vez que lemos o sensor de luz e calcular um erro, vamos adicionar esse erro para uma variável que chamaremos integral (inteligente eh?).

Essa equação pode parecer um pouco estranho, e é. Não está escrito como uma declaração de matemática, ele é escrito em uma forma comum usado em programação para somar uma série de valores. Matematicamente, não faz qualquer sentido. No computador programação do sinal de igual tem um significado um pouco diferente do que em matemática. (Vou usar a mesma fonte de máquina de escrever que eu usei para os exemplos de código pseudo para destacar que é uma forma de programação e não uma forma matemática adequada.) A "=" significa fazer as contas sobre o direito e salvar o resultado na variável chamada à esquerda. Queremos que o computador para obter o valor antigo integral. adicione o erro a ele, em seguida, salvar o resultado de volta em integral.

Vire = Kp * (erro) + Ki * (integral)

A descrição acima é a equação básica para um controlador PI. Por sua vez, é nossa correção para os motores. O termo proporcional é Kp * (erro) e o termo integral é Ki * (integral).

O que exatamente significa o termo integral fazer por nós? Se o erro mantém o mesmo sinal para vários loops a integral cresce mais e mais. Por exemplo, se verificar o sensor de luz e calcular que o erro é 1, então pouco tempo depois verificamos o sensor novamente e o erro é 2, então da próxima vez que o erro é 2 novamente, então a integral será 1+ 2 + 2 = 5. A integral é 5, mas o erro nesta etapa especial é de apenas 2. A integral pode ser um grande fator na correção, mas, geralmente, leva um tempo para o integrante de construir até o ponto onde começa a contribuir.

Uma maneira de pensar sobre o termo integral é que é o controlador de "memória". A integral é a história cumulativo do erro e dá o controlador de um método para corrigir erros que persistem por um longo tempo.

Alguns problemas sutis com a integral

Yep, a integral tem mais detalhes. Felizmente eles não são muito doloroso.

I anotado sobre uma questão menor (OK, ele realmente não é menor, mas vamos fazê-lo assim), o tempo todo. A integral é realmente a soma do erro * (tempo delta). Delta tempo (dT) é o tempo entre a última vez que verifiquei o sensor e a hora do mais recente verificação do sensor;

Então, cada vez que adicionar ao integrante da coisa que devemos acrescentar é os tempos de erro da dT. É bastante fácil de ter a medida robô da dT. Seria a apenas ler um temporizador cada vez que lemos o sensor de luz. Se subtrairmos a última vez que a partir do momento atual temos o tempo desde a última dT leitura. (Há melhores maneiras de fazer isso, mas eu vou skip’m uma vez que eles não são necessários.) Mas não seria bom se não tivesse que medir a dT e fazer a multiplicação? Bem, e se a dT é sempre o mesmo? Cada vez que adicionar ao integrante temos que mesmo termo dT. Assim, podemos assumir que o fator de dT fora do erro * (dT) e fazer apenas a soma da forma como fizemos antes;

Então temos removido completamente o elemento de tempo para o termo integral com a restrição de que todas as vezes em passos, dt s, são as mesmas (ou quase o mesmo).

O integral tem uma memória de elefante

Pseudo-código para o controlador PI

adicionando "D" Para o controlador: The Full PID Controlador
("D": O que vai acontecer a seguir)?

Nosso controlador agora contém um termo proporcional (P) que tenta corrigir o erro de corrente e um (I) termo integral que tenta corrigir passado erro s, há uma maneira para o controlador de olhar para a frente no tempo e talvez tentar corrigir erro que não tenha ainda ocorrido ainda?

Sim, e a solução é um outro conceito de matemática avançada chamados a derivada. Ahhh, há o "D" em PID. Como o integrante. o derivado pode representar um pouco de matemática muito graves. Felizmente para nós, o que precisamos para o PID é bastante simples.

Isso significa que o seguinte erro é esperado ser o erro de corrente mais a variação no erro entre as duas amostras de sensores anteriores. A variação do erro entre dois pontos consecutivos é chamado o derivado. O derivado é o mesmo como o declive de uma linha.

Isso pode parecer um pouco complexo para calcular, mas realmente não é tão ruim. Um exemplo de conjunto de dados ajudará a ilustrar como funciona. Vamos supor que o erro atual é 2 e o erro antes que era 5. O que podemos prever o próximo erro de ser? Pois bem, a mudança de erro é a que é derivado;

(O erro de corrente) – (o erro anterior)

que para os nossos números é 2-5 = -3. Por conseguinte, o derivado de corrente é -3. Para utilizar o derivado de prever o próximo erro usaríamos

(Próximo erro) = (o erro de corrente) + (o derivado de corrente)

que para os nossos números é 2 + (-3) = -1. Assim podemos prever o próximo erro será -1. Na prática, nós realmente não ir até o fim e prever o próximo erro. Em vez disso, basta usar o derivado directamente na equação controlador.

O termo D, como o termo que eu, realmente deve incluir um elemento de tempo, eo "oficial" D termo é;

Kd (derivado) / (dT)

agora podemos escrever a equação completa para um controlador PID:

Vire = Kp * (erro) + Ki * (integral) + Kd * (derivado)

É bastante óbvio que "prever o futuro" seria uma coisa útil para ser capaz de fazer, mas como é que isso ajuda? E quão preciso é a previsão?

Se o erro actual é pior do que o erro anterior, em seguida, o termo D tenta corrigir o erro. Se ele erro actual é melhor do que o erro anterior, em seguida, o termo D tenta impedir que o controlador de corrigir o erro. É o segundo caso, isto é particularmente útil. Se o erro for chegando perto de zero, então estamos nos aproximando do ponto em que deseja parar de corrigir. Desde que o sistema provavelmente leva um tempo para responder às mudanças no poder dos motores que queremos começar a reduzir a potência do motor antes que o erro tenha realmente ido a zero, caso contrário, vamos ultrapassar. Quando colocado dessa forma, pode parecer que a equação para o termo D teria que ser mais complexa do que é, mas não é. A única coisa que você tem que se preocupar é fazer a subtração na ordem correta. A ordem correta para este tipo de coisa é "atual" menos "anterior". Assim, para calcular a derivada tomamos o erro atual e subtrair o erro anterior.

pseudo-código para o controlador PID

Temos agora o código pseudo para o nosso controlador PID completo para a linha seguinte robô. Agora vem o que é muitas vezes a parte mais complicada, "sintonização" o PID. A sintonia é o processo de encontrar as melhores, ou pelo menos OK, os valores de Kp. Ki e Kd.

Tuning A Controlador PID Sem matemática complexa
(Mas ainda temos que fazer alguma matemática)

Para sintonizar o seu PID controlador que você siga estes passos:

  1. Defina os valores de Ki e Kd a zero, o que transforma esses termos fora e faz com que o ato controlador como um controlador P simples.
  2. Definir o termo Tp para um pequeno. Para os nossos motores 25 pode ser um bom lugar para começar.
  3. Definir o termo Kp a um "razoável" valor. O que é "razoável"?
  1. Eu só tomar o valor máximo que deseja enviar para o controle do motor de potência (100) e dividir pelo valor do erro máximo utilizável. Para nossa linha seguinte robô que já assumiu o erro máximo é de 5 por isso a nossa suposição sobre Kp é 100/5 = 20. Quando o erro é +5 potência do motor vai balançar por 100 unidades. Quando o erro é zero potência do motor vai sentar-se no nível Tp.
  2. Ou então, basta definir Kp a 1 (ou 100) e ver o que acontece.
  3. Se você implementou que a K estão todos inseridos como 100 vezes o seu valor real que você tem que levar isso em conta aqui. 1 é inserido como 100, 20 em 2000, 100 como 10000.
  • Execute o robô e ver o que ele faz. Se não pode seguir a linha e vagueia em seguida, aumentar Kp. Se ele oscila descontroladamente depois diminuir Kp. Manter a alteração do valor Kp até encontrar um que segue a linha e dá oscilação perceptível, mas aqueles não é realmente selvagens. Vamos chamar esse valor Kp "Kc" ("ganho de crítica" na literatura PID).
  • Usando o valor Kc como Kp. executar o robô ao longo da linha e tentar determinar quão rápido ele é oscilante. Isto pode ser complicado, mas, felizmente, a medida não tem de ser tudo o que preciso. O período de oscilação (PC) é o tempo que leva o robô para balançar de um lado da linha para a outra, em seguida, volta para o lado onde começou. Para robôs típicos Lego PC, provavelmente, será na gama de cerca de 0,5 segundos para um ou dois segundos.
  • Você também precisa saber o quão rápido os ciclos de robô através da sua malha de controle. Eu apenas ajuste o circuito para um número fixo de passos (como 10000) e tempo quanto tempo o robô leva para terminar (ou ter o robô fazer o tempo e exibir o resultado.) O tempo por loop (dT) é o tempo medido dividido pelo número de lacetes. Para um controlador PID completo, escrita em NXT-G, sem quaisquer zumbidos ou apitos adicionados, a dT será na gama de 0,015 a 0,020 segundos por ciclo.
  • Use a tabela abaixo para calcular um conjunto de Kp. Ki. e valores de Kc. Se você quer apenas um controlador P, em seguida, usar a linha na tabela marcada P para calcular o "um lugar para outro" Kp (Ki ‘e Kd’ são ambos zero). Se você quer um controlador PI, em seguida, usar a linha seguinte. O controlador PID integral é a linha de fundo.
  • Se você implementou que a K estão todos inseridos como 100 vezes o seu valor real que você não tem que levar isso em conta nestes cálculos. Esse fator de 100 já está ter em conta no valor Kp = Kc você determinou.
  • Execute o robô e ver como ele se comporta.
  • Ajustar o Kp. Ki e valores de Kd para obter o melhor desempenho possível. Você pode começar com bastante grandes ajustes, digamos 30%, em seguida, tente ajustes menores para obter o melhor (ou pelo menos aceitável) o desempenho.
  • Uma vez que você tem um bom conjunto de tentativa de K para impulsionar o valor Tp, que controla a velocidade em linha reta do robô.
  • Re-ajustar o K de ou talvez até mesmo voltar ao passo 1 e repetir todo o processo para o novo valor Tp.
  • Mantenha repetir até que o comportamento do robô é aceitável.
  • Ziegler-Nichols método com valores de K ‘
    (Tempos de loop considerada constante e igual a dT)

    Os números primos (apóstrofes) no K i ‘e K d’ são apenas para lembrá-lo de que eles são calculados assumir dT é constante e dT foi enrolada em valores K.

    Kp = (0,60) (Kc) = (0,60) (300) = 180
    Ki = 2 (Kp) (dT) / (PC) = 2 (180) (0,014) / (0,8) = 6,3 (que é arredondado para 6)
    Kd = (Kp) (Pc) / ((8) (dT)) = (180) (0,8) / ((8) (0,014)) = 1286

    Após nova tentativa e erro ajuste os valores finais foram de 220, 7 e 500 para Kp. Ki e Kd, respectivamente. Lembre-se que todo o meu K do são inseridas como 100x seu valor real para os valores reais são 2,2, 0,07 e 5.

    Como mudanças na Kp, Ki e Kd afetar o comportamento robôs

    A tabela eo método descrito acima é um bom ponto de partida para otimizar o seu PID. Às vezes isso ajuda a ter uma idéia melhor do que o resultado será de aumentar (ou diminuir) uma das três Ks. A tabela abaixo está disponível a partir de vários sites. Esta versão especial é a partir do Wiki em controladores PID.

    Efeitos dos parâmetros crescentes

    Aqui está um pequeno vídeo de um robô básico Lego Mindstorms seguindo a linha na esteira de teste que vem com o jogo. A qualidade do vídeo não é muito bom.

    O sensor de luz é cerca de 1/2" acima da esteira e deslocada para um lado da linha central do robô. O Tp (poder-alvo) foi fixado em 70%. As médias robô cerca de 8 polegadas por segundo sobre este curso. O robô é uma linha de mão seguidor esquerda e está seguindo a borda interna do oval. A borda interna é um pouco mais difícil de seguir do que a borda externa.

    Em geral, o seguidor de linha parece funcionar muito bem. Se você assistir ao vídeo de perto você verá o robô "abanar o rabo" um pouco como ele vem fora os cantos. Esse é o PID oscilando um pouco. Quando o robô está funcionando para a câmera que você pode ver a mancha vermelha na esteira de LED do sensor de luz. Parece estar acompanhando a borda da linha de muito bem.

    O controlador PID básico deve funcionar para muitos problemas de controlo diferentes, e é claro que pode ser utilizado como um controlador P ou PI em vez de um PID. Você precisaria para chegar a uma nova definição do erro e do PID teria que ser ajustado para a tarefa particular.

    Eu poderia dar a você, mas então eu teria que matá-lo.

    Como este documento é direcionado a crianças mais velhas FLL, eu realmente não quero give’m o código. Eles devem ser capazes de escrever o seu próprio.

    O código pseudo tem praticamente tudo que você precisa para o próprio PID. Você pode ter que adicionar algum código de configuração e, talvez, uma forma adequada de paragem do circuito seguidor de linha.

    Como um pouco de ajuda aqui está uma MyBlock que leva duas entradas, o Tp poder-alvo eo valor Turn, e controla os dois motores. Este MyBlock também corretamente lida com níveis de potência negativos. Ele ainda emite um sinal sonoro quando um motor inverte as direções, o que é útil para tuning. A linha a seguir PID devidamente afinado raramente deve ter para reverter as direções do motor.

    Se você realmente gostaria de obter o meu código PID NXT-G enviar-me um e-mail.

    Para um excelente exemplo de outro controlador PID em um robô Mindstorms ver Philos equilíbrio segway como robô. O PID é escrito em NQC ("não completamente C"). Balancing é um problema de controle muito mais complicado do que é seguir uma linha. (Eu sei porque eu tentei!)

    Um controlador PID (ou PI ou P) é um exemplo de um circuito fechado de realimentação. Feedback é a maior coisa desde pickles cortados.

    Existem métodos avançados para sintonizar um controlador PID. Normalmente ele requer hardware e / ou software que um construtor robô Lego não tem.

    Alguns controladores PID são muito mais fáceis de ajustar do que outros. Por exemplo, um controlador PID é muitas vezes utilizada para controlar a temperatura num forno. Este é um trabalho de sintonia bastante fácil desde que o forno é bastante estável, embora possa estar longe de ser a sua temperatura alvo, mesmo quando o PID é mal sintonizado. controladores PID também são usados ​​para controlar robôs balanceamento. Isto é muito mais difícil para sintonizar desde o PID tem de ser ajustado de outro modo muito bem o robô apenas cai. É difícil ajustar o PID se o robô prontamente cai cada vez que é ligado.

    Existem variantes do método de Ziegler-Nichols e outros métodos de ajuste de um PID.

    Existem controladores que são mais complexas do que um PID.

    PIDs foram em torno de um longo tempo e controle de computador precedido. A PID pode, e muitas vezes tem, sido implementada em sistemas puramente mecânicos. Ou seja, nenhum computador ou até mesmo todas as peças elétricas.

    Eu brincava um pouco com a gravação de dados em um arquivo enquanto o PID está em execução. É útil para iniciar o arquivo de dados com uma lista da Tp. offset. Kp. Ki e Kd valores. Bons dados para registrar cada vez que o loop PID é executado é o tempo, erro. saída do PID e o ângulo de um dos eixos do motor. Desde que os dados você pode reconstruir a integral e derivativo para que eles não precisam ser registradas.

    Não está claro para mim o quão rápido o PID tem de ciclo, que é o quão pequeno dT precisa ser, para obter um bom controlador. Eu suspeito que o PID tem de ciclo mais rápido do que o tempo de resposta dos motores. Talvez várias vezes mais rápido. Ciclismo o PID muito mais rápido do que provavelmente não ajuda muito, uma vez que as coisas não estão mudando tão rápido. O tempo de resposta dos motores NXT, quando eles são, na verdade, movendo um robô, está no intervalo de alguns décimos de segundo. O PID deve provavelmente ciclo no exemplo 1/5 a 1 / 10th esse tempo, ou cerca de 0,010 a 0,030 segundos por loop. O programa PID básico descrito acima tem um dT de cerca de 0,015 segundos, o que deve ser rápido o suficiente. Se o programa também registra dados como ele é executado em seguida, a dT sobe para cerca de 0,030 segundos por loop.

    Usando luz valores brutos (0-1023 escala), em vez de valores de luz não calibrados, pode aumentar a gama dinâmica dos sensores de luz. Para o nosso exemplo valores de luz negra seria 400 e branco 500. O desvio seria de 450 com uma gama de +/- 50 em vez de +/- 5. Os valores de luz matérias está disponível a partir de uma porta de dados no bloco sensor de luz. Se você calibrar o sensor de luz sob as condições de iluminação e usar os valores calibrados depois branco será de cerca de 100 e preto será de cerca de 0. Esta é outra maneira de aumentar a gama proporcional do sensor de luz. Em ambos os modos brutos e calibrados os valores de luz, provavelmente, não são precisos no último dígito, mas espero que os valores são um pouco mais preciso do que usando um intervalo de valores de luz de apenas 10 ou assim.

    Ao criar um controlador PID muitas vezes há um par de maneiras diferentes para definir o erro. Para o nosso seguidor de linha o erro é proporcional ao quão longe o sensor é da borda da linha. A derivada é o quão rápido o sensor está se movendo em direção ou longe de, borda da linha. A integral é soma das distâncias da beira da linha, o que realmente não tem muito significado físico (embora ainda não ajuda o controlador). Há outras maneiras de fazer as coisas. Poderíamos definir o erro como o quão rápido estamos nos movendo em direção ou para longe da borda linhas. Em outras palavras, o erro é agora o que era o derivado no nosso seguidor de linha. Para esta nova definição de erro, o derivado torna-se o quão rápido estamos acelerando em direção ou longe de, borda da linha. A integral torna-se quão longe estamos da beira da linha, que faz sentido físico. Qual o método funciona melhor, muitas vezes depende de quão preciso você pode medir o erro e quanto ruído (flutuação aleatória) que existe. Se usarmos a velocidade como o erro, tem que ser calculada a partir da luz de leitura e é a derivada da luz de leitura. Para obter o derivado para o PID nós temos que tomar a derivada de um derivado. O derivado de um derivado provavelmente não vai funcionar muito bem com a nossa gama proporcional limitado de valores de luz.

    Para o "três níveis seguidor de linha" as três faixas não precisam ser do mesmo tamanho. Se este tipo de seguidor é bom o suficiente, então muitas vezes é melhor fazer a gama de centro maior do que as duas faixas exteriores. Algo como 42 a 47, talvez para os nossos valores de exemplo. A única coisa que você tem que se preocupar é que esta torna-se muito sensível a pequenas mudanças na iluminação da sala. As três faixas até mesmo (e a abordagem de dois intervalo original) são relativamente insensíveis às mudanças na iluminação da sala. Se você fizer a faixa centro muito grande você corre o risco de ter uma pequena mudança na iluminação da sala mover sua faixa de luz de fora o que você esperava. O sensor de luz pode nunca mais voltar em qualquer dos números da gama mais baixa ou mais alta e o robô nunca se transformar em um dos dois sentidos.

    Algumas realidades de PIDs.

    1. Quando o erro sai da gama proporcional a derivada tende para zero.
    2. O derivado é sensível ao ruído.
    3. O derivado funciona melhor quando a precisão de erro é elevada. Para o nosso seguidor de linha o erro é um número inteiro entre -5 e +5. Isso é muito baixa precisão. Talvez usar o derivado da velocidade do eixo dos motores em vez disso?

    posts relacionados

    • Robots, autor Michael Sellick …

      Aprenda a Crochet Um Lenço dentro Um Lenço Lenço dentro de um padrão Scarf Crochet O que é grande sobre este projeto é a velocidade na qual um lenço pode ser malha. Há um monte de trabalho em cadeia para …

    • Robots, autor Michael Sellick …

      Crochet Tartan afegãos são realmente fáceis de completar. Toda vez que eu ter explicado o conceito em um show ao vivo, momentos de “Ah Hah ‘são altos e claros, porque crocheters pensam que é …

    • Robots, autor Michael Sellick …

      Padrão Crochet Duplo borboleta lenço Duplo borboleta lenço O lenço original no prazo de um padrão Scarf foi criado. Nós se perguntou o que o cachecol olhar como se dobrou a largura para criar …

    • PLS Green Dot Laser PLS3 – Green …

      Sistemas Laser Pacific acaba de lançar 2 novos lasers verdes da PLS3 Green Laser ($ 329, Ohio ferramenta de potência) e PLS180 Green Laser ($ 479, Ohio ferramenta de potência). Estes lasers verdes maior visibilidade tem …

    • Fotos de infecção fúngica em …

      levedura infecção Ele examinou meu pênis e imediatamente diagnosticou como uma infecção por fungos. que era algo que eu nem sabia que era possível para os homens. I expressa ainda mais as minhas preocupações e ele disse …

    • Levantando Memórias Tutorial (Easy …

      Aí vem o tutorial prometeu passo-a-passo de como fazer uma almofada janela estilo assento para o topo do armazenamento TROFAST da IKEA! (Você pode fazer isso para qualquer bancada plana embora!) 1. Eu queria a 2 …