O PSL-PI tem por objetivo incentivar o uso e a produção de software livre no Piauí como política de combate à exclusão digital. Acreditamos que a distribuição de conhecimentos proporcionada pelo Open Source/Software Livre tornará nossa sociedade mais justa e próspera, exatamente por dar a todos as mesmas condições de conhecimento e desenvolvimento.
Software Livre é uma grande oportunidade de construirmos uma sociedade produtora de ciência, independente e efetivamente competitiva. Estamos reconstruindo as bases da nossa sociedade, não mais calcados nos braços do Estado, mas sim, amparados pela iniciativa própria, pela auto-determinação. Nós somos capazes de nos auto-governar. Somos capazes de construir uma sociedade efetivamente Livre. Esta é a essência do PSL-PI.
O PSL-PI é formado pela articulação de indivíduos que atuam em instituições publicas e privadas, grupos de usuários e desenvolvedores de software livre, empresas, governos ou ONGs, e demais setores da sociedade. O importante é a consciência e disposição para propagar o uso de software livre e a cultura colaborativa nas diferentes esferas da sociedade.
Aracele Torres: Uma sociedade digital livre – Parte 2
29 de Setembro de 2012, 0:00 - sem comentários aindaEssa é a segunda parte do texto A free digital society de Richard Stallman, traduzido aqui no Cibermundi. Esse texto discute as ameaças de uma sociedade digital e o que podemos fazer para contorná-las. Nesta segunda parte, Stallman aborda outras duas ameaças que estão presentes na nossa sociedade: a censura e os formatos de dados que restringem os usuários.
Leia aqui a primeira parte deste texto: Uma sociedade digital livre – Parte 1
Censura
A segunda ameaça é a censura. A censura não é nova, já existia muito antes dos computadores. Mas 15 anos atrás, nós pensávamos que a internet nos protegeria da censura, que a derrotaria. Então, China e algumas outras tiranias óbvias não mediram esforços para impor a censura na internet, e nós dissemos: “bem isso não é surpreendente, o que mais governos gostariam de fazer?”
Mas hoje vemos censura imposta em países que não são normalmente pensados como ditaduras, como, por exemplo, o Reino Unido, França, Espanha, Itália, Dinamarca…
Eles todos têm sistemas de bloqueio de acesso a alguns sites. Dinamarca criou um sistema que bloqueia o acesso a uma longa lista de páginas web, que era secreto. Os cidadãos não deveriam saber como o governo os censurava, mas a lista foi divulgada e publicada no Wikileaks. Depois disso, a Dinamarca adicionou a página do WikiLeaks à sua lista de censura.
Assim, todo o resto do mundo pode descobrir como os dinamarqueses estão sendo censurados, mas os dinamarqueses não deveriam saber.
Há alguns meses atrás, a Turquia, que afirma respeitar alguns direitos humanos, anunciou que todos os usuários da internet teriam que escolher entre censura e mais censura. Entre quatro diferentes níveis de censura! Mas a liberdade não é uma das opções.
A Austrália quis impor filtragem sobre internet, mas isso foi bloqueado. No entanto, a Austrália tem um tipo diferente de censura: tem censura de links. Ou seja, se um site na Austrália tem um link para algum site censurado fora da Austrália, o que está na Austrália pode ser punido.
Electronic Frontier Austrália, que é uma organização que defende os direitos humanos no domínio digital, na Austrália, postou um link para um site estrangeiro de política. Ela recebeu ordens para excluir o link ou então enfrentaria uma multa de US $ 11.000 por dia. Então eles apagaram, o que mais poderiam fazer? Este é um sistema muito dura de censura.
Na Espanha, a censura que foi adotada no início deste ano permite às autoridades fechar um site arbitrariamente no país ou impor filtragem para bloquear o acesso a um site fora da Espanha. E eles podem fazer isso sem qualquer tipo de julgamento. Essa foi uma das motivações para os Indignados, que foram protestar na rua.
Houve protestos nas ruas na Turquia também, após o anúncio, mas o governo recusou-se a mudar sua política.
Temos de reconhecer que um país que impõe a censura sobre a Internet não é um país livre. E não é um governo legítimo também.
Formato de dados restritos
A próxima ameaça à nossa liberdade vem de formatos de dados que restringem os usuários.
Às vezes é porque o formato é secreto. Existem muitos softwares que salvam os dados do usuário em um formato secreto, que se destina a impedir que o usuário pegue esses dados e utilize-os em algum outro programa. O objetivo é evitar a interoperabilidade.
Agora, é claro, que se o programa implementa um formato secreto é porque ele não é software livre. Portanto, este é um outro tipo de recurso malicioso. A vigilância é um tipo de recurso malicioso que você encontra em alguns softwares não livres, usar formatos secretos para restringir os usuários é um outro tipo de recurso malicioso que você encontra também em alguns programas não livres.
Mas se você tem um software livre que tem suporte a um determinado formato, ipso facto que o formato não é secreto. Este tipo de recurso malicioso só existe em um software não livre. Recursos de vigilância poderiam teoricamente existir em um software livre, mas você não vê isso acontecendo. Porque os usuários iriam consertá-lo. Os usuários não iriam gostar disso, então eles iriam consertar.
Em todo caso, também podemos encontrar formatos de dados secretos em uso para a publicação de obras. Você encontra formatos de dados secretos usados por áudio, tais como a música, por vídeo, por livros … E estes formatos secretos são conhecidos como Digital Restrictions Management, ou DRM, ou algemas digitais (numériques les menottes).
Assim, as obras são publicadas em formatos secretos de modo que apenas softwares proprietários podem executá-las, e então esses softwares proprietários podem ter o recurso malicioso de restringir os usuários, impedindo-os de fazer algo que seria natural fazer.
E isso é utilizado até mesmo por entidades públicas para se comunicar com as pessoas. Por exemplo, a TV pública italiana disponibiliza seus programas na rede em um formato chamado VC-1, que supostamente é um padrão, mas é um padrão secreto.
Agora eu não consigo imaginar como qualquer entidade que tenha apoio público poderia justificar o uso de um formato secreto para se comunicar com o público. Isso deveria ser ilegal. Na verdade, eu acho que todo o uso de Digital Restrictions Management (DRM) deveria ser ilegal. Nenhuma empresa deveria ser autorizada a fazer isso.
Há também formatos que não são secretos, mas é quase como se fossem, como, por exemplo, o Flash. O Flash realmente não é secreto, mas a Adobe continua a fazer novas versões, que são diferentes entre si, mais rápido do que qualquer um possa mantê-las e torná-las software livre, de modo que ele tem quase o mesmo efeito dos formatos secretos.
Depois, há os formatos patenteados, tais como o MP3, para áudio. É ruim distribuir áudio em formato MP3! Há software livre com suporte ao formato MP3, que pode executá-lo e gerá-lo, mas pelo fato de ser patenteado em muitos países, muitos distribuidores de software livre não se atrevem a incluir esses programas, assim se eles distribuírem o sistema GNU+Linux, seus sistemas não incluem um leitor de MP3.
Como resultado disso, se alguém distribui alguma música em MP3 isso está colocando pressão sobre as pessoas para não usar o GNU/Linux. Claro, se você é um especialista pode encontrar um software livre e instalá-lo, mas existem muitos não-especialistas, e eles podem ver que instalaram uma versão do GNU/Linux que não tem esse software e não reproduzirão arquivos MP3, e eles podem achar que a culpa é do sistema. Eles não percebem que é culpa do formato MP3. Mas este é o fato.
Portanto, se você quer apoiar a liberdade, não distribua arquivos MP3. É por isso que eu digo, se você está gravando o meu discurso e quer distribuir cópias, não faça isso em um formato patenteado como MPEG-2 ou MPEG-4, ou MP3. Use um formato amigável ao software livre, como o formato Ogg ou WebM. E, a propósito, se você for distribuir cópias da gravação, por favor, coloque-a sob uma licença Creative Commons-No derivatives. Esta é uma declaração de minhas visões pessoais. Se fosse uma palestra para um curso, se fosse algo didático, então deveria ser livre, mas declarações de opinião são diferentes.
AJ O. Alves: eFLL – Uma Biblioteca Fuzzy para Arduino e Sistemas Embarcados
28 de Setembro de 2012, 0:00 - sem comentários aindaLógica Fuzzy é uma extensão da lógica booleana tradicional que através de variáveis linguísticas permite expressar valores lógicos intermediários entre o FALSO e VERDADEIRO, descrevendo com maior eficiência o princípio da incerteza do mundo real.
Sistemas Fuzzy são aplicações praticas que empregam a Lógica Fuzzy nas tomadas de decisões com base nos termos e variáveis linguísticas, tendo na robótica e na eletrônica um grande espaço e utilidade.
Desenvolvida pelo Robotic Research Group (RRG) na Universidade Estadual do Piauí (UESPI-Teresina) a biblioteca eFLL (Embedded Fuzzy Logic Library) é uma opção versátil, leve e eficiente de trabalhar com a Lógica Fuzzy em sistemas embarcados.
Por favor, reporte Bugs e sugestões via comentários ou na página oficial do projeto no GitHub.
Como instalar
1º Passo: Vá a página oficial do projeto no GitHub: eFLL
2º Passo: Faça um clone do projeto usando o Git ou faço o download em Donwload pelo botão “Downloas as zip“.
3º Passo: Clone ou descompacte os arquivos para a pasta de bibliotecas do Arduino:
no Ubuntu (/usr/share/arduino/libraries/) caso instalado via apt-get;
no Windows, Mac ou Linux (Onde você baixou o IDE Arduino, a pasta de biblioteca está dentro)
Pronto, a biblioteca está pronta para ser usada.
Como importar
Caso a instalação da biblioteca tenha sido realizada com sucesso, para importar a biblioteca é fácil:
1º Passo: Abra o seu Arduino IDE, vá a aba no menu superior SKETCKS → BIBLIOTECA → Importar eFLL
Características
Escrita em C++/C, usa apenas a biblioteca padrão da linguagem C “stdlib.h“, por isso a eFLL é uma biblioteca destinada não somente ao Arduino, mas qualquer Sistema Embarcado ou não que tenham seus comandos escritos em C.
Não possui limitações explicitas de quantidade de Conjuntos Fuzzy, Regras Fuzzy, Entradas ou Saídas, estas limitam-se a capacidade de processamento e armazenamento de cada microcontrolador
A biblioteca utiliza o processo:
(MAX-MIN) e (Mínimo de Mamdani) para a inferência e composição e (Centro de Área) para a desfuzzyficação, no universo contínuo.
Testes realizados utilizando a biblioteca GTest para C, Google Inc
Exemplo simples:
Controle de velocidade de um robô, entrada: Distância obstáculo frontal.
#include <FuzzyRule.h>#include <FuzzyComposition.h>#include <Fuzzy.h>#include <FuzzyRuleConsequent.h>#include <FuzzyOutput.h>#include <FuzzyInput.h>#include <FuzzyIO.h>#include <FuzzySet.h>#include <FuzzyRuleAntecedent.h> // Passo 1 - Instanciando um objeto da bibliotecaFuzzy* fuzzy = new Fuzzy(); void setup(){ Serial.begin(9600); // Passo 2 - Criando o FuzzyInput distancia FuzzyInput* distance = new FuzzyInput(1);// Como parametro seu ID // Criando os FuzzySet que compoem o FuzzyInput distancia FuzzySet* small = new FuzzySet(0, 20, 20, 40); // Distancia pequena distance->addFuzzySet(small); // Adicionando o FuzzySet small em distance FuzzySet* safe = new FuzzySet(30, 50, 50, 70); // Distancia segura distance->addFuzzySet(safe); // Adicionando o FuzzySet safe em distance FuzzySet* big = new FuzzySet(60, 80, 80, 80); // Distancia grande distance->addFuzzySet(big); // Adicionando o FuzzySet big em distance fuzzy->addFuzzyInput(distance); // Adicionando o FuzzyInput no objeto Fuzzy // Passo 3 - Criando o FuzzyOutput velocidade FuzzyOutput* velocity = new FuzzyOutput(1);// Como parametro seu ID // Criando os FuzzySet que compoem o FuzzyOutput velocidade FuzzySet* slow = new FuzzySet(0, 10, 10, 20); // Velocidade lenta velocity->addFuzzySet(slow); // Adicionando o FuzzySet slow em velocity FuzzySet* average = new FuzzySet(10, 20, 30, 40); // Velocidade normal velocity->addFuzzySet(average); // Adicionando o FuzzySet average em velocity FuzzySet* fast = new FuzzySet(30, 40, 40, 50); // Velocidade alta velocity->addFuzzySet(fast); // Adicionando o FuzzySet fast em velocity fuzzy->addFuzzyOutput(velocity); // Adicionando o FuzzyOutput no objeto Fuzzy //Passo 4 - Montando as regras Fuzzy // FuzzyRule "SE distancia = pequena ENTAO velocidade = lenta" FuzzyRuleAntecedent* ifDistanceSmall = new FuzzyRuleAntecedent(); // Instanciando um Antecedente para a expresso ifDistanceSmall->joinSingle(small); // Adicionando o FuzzySet correspondente ao objeto Antecedente FuzzyRuleConsequent* thenVelocitySlow = new FuzzyRuleConsequent(); // Instancinado um Consequente para a expressao thenVelocitySlow->addOutput(slow);// Adicionando o FuzzySet correspondente ao objeto Consequente // Instanciando um objeto FuzzyRule FuzzyRule* fuzzyRule01 = new FuzzyRule(1, ifDistanceSmall, thenVelocitySlow); // Passando o Antecedente e o Consequente da expressao fuzzy->addFuzzyRule(fuzzyRule01); // Adicionando o FuzzyRule ao objeto Fuzzy // FuzzyRule "SE distancia = segura ENTAO velocidade = normal" FuzzyRuleAntecedent* ifDistanceSafe = new FuzzyRuleAntecedent(); // Instanciando um Antecedente para a expresso ifDistanceSafe->joinSingle(safe); // Adicionando o FuzzySet correspondente ao objeto Antecedente FuzzyRuleConsequent* thenVelocityAverage = new FuzzyRuleConsequent(); // Instancinado um Consequente para a expressao thenVelocityAverage->addOutput(average); // Adicionando o FuzzySet correspondente ao objeto Consequente // Instanciando um objeto FuzzyRule FuzzyRule* fuzzyRule02 = new FuzzyRule(2, ifDistanceSafe, thenVelocityAverage); // Passando o Antecedente e o Consequente da expressao fuzzy->addFuzzyRule(fuzzyRule02); // Adicionando o FuzzyRule ao objeto Fuzzy // FuzzyRule "SE distancia = grande ENTAO velocidade = alta" FuzzyRuleAntecedent* ifDistanceBig = new FuzzyRuleAntecedent(); // Instanciando um Antecedente para a expresso ifDistanceBig->joinSingle(big); // Adicionando o FuzzySet correspondente ao objeto Antecedente FuzzyRuleConsequent* thenVelocityFast = new FuzzyRuleConsequent(); // Instancinado um Consequente para a expressao thenVelocityFast->addOutput(fast);// Adicionando o FuzzySet correspondente ao objeto Consequente // Instanciando um objeto FuzzyRule FuzzyRule* fuzzyRule03 = new FuzzyRule(3, ifDistanceBig, thenVelocityFast); // Passando o Antecedente e o Consequente da expressao fuzzy->addFuzzyRule(fuzzyRule03); // Adicionando o FuzzyRule ao objeto Fuzzy} void loop(){ float dist = getDistanceFromSonar(); // Passo 5 - Informar o valor das entradas, passando seu ID e valorfuzzy->setInput(1, dist); // Passo 6 - Executar a fuzzyficação fuzzy->fuzzify(); // Passo 7 - Executar a desfuzzyficação para cada saída, passando seu ID float output = fuzzy->defuzzify(1); setRobotSpeed(output); delay(100);}
Breve documentação
Objeto Fuzzy – Este objeto engloba todo o Sistema Fuzzy, através dele, é possível manipular os Conjuntos Fuzzy, as Regras Linguísticas, entradas e saídas.
Objeto FuzzyInput – Este objeto literalmente agrupa todos os Conjuntos Fuzzy de entradas que pertencem ao mesmo domínio
Objeto FuzzyOutput – Este objeto é semelhante ao FuzzyInput, é usado para agrupa todos os Conjuntos Fuzzy de saída que pertencem ao mesmo domínio.
Objeto FuzzySet – Este é um dos principais objetos da Biblioteca Fuzzy, com é possível modelar cada conjunto do sistema em questão. Atualmente a biblioteca suporta as funções de pertinência triangular, trapezoidal e singleton, que são montadas com base nos pontos A, B, C e D que são passados por parâmetro no construtor FuzzySet(float a, float b, float c, float d), exemplos:
Função de pertinência triangular:
Função de pertinência trapezoidal:
Função de pertinência Singleton:
Objeto FuzzyRule – Este objeto é usado para montar a base de regras do objeto Fuzzy, que contem um ou mais deste. Instanciado com FuzzyRule fr = new FuzzyRule(ID, antecedent, consequente)
Objeto FuzzyRuleAntecedent – Este objeto é usado para compor o objeto FuzzyRule, responsável por montar a expressão condicional do antecedente de um FuzzyRule, exemplos:
FuzzyRuleAntecedent* ifDistanceSmall = new FuzzyRuleAntecedent(); ifDistanceSmall->joinSingle(small);
O método joinSingle(FuzzySet* fuzzySet); é usado para montar expressões simples de SE isto ENTÃO aquilo. Para compor expressões mais complexas existem outros métodos especiais.
FuzzyRuleAntecedent* ifTemperatureHotAndPressureHight = new FuzzyRuleAntecedent();ifTemperatureHotAndPressureHight->joinWithAND(hot, hight);
FuzzyRuleAntecedent* ifTemperatureHotAndPressureHight = new FuzzyRuleAntecedent();ifTemperatureHotAndPressureHight->joinWithOR(hot, hight);
Os métodos joinWithAND(FuzzySet* fuzzySet1, FuzzySet* fuzzySet2); e joinWithOR(FuzzySet* fuzzySet1, FuzzySet* fuzzySet2); podem fazer composições logicas entre os Conjuntos Fuzzy. Estes métodos possuem ainda variações mais avançadas que permitem aprimorar mais ainda a expressão, são eles:
bool joinWithAND(FuzzySet* fuzzySet, FuzzyRuleAntecedent* fuzzyRuleAntecedent);bool joinWithAND(FuzzyRuleAntecedent* fuzzyRuleAntecedent, FuzzySet* fuzzySet);bool joinWithOR(FuzzySet* fuzzySet, FuzzyRuleAntecedent* fuzzyRuleAntecedent);bool joinWithOR(FuzzyRuleAntecedent* fuzzyRuleAntecedent, FuzzySet* fuzzySet);bool joinWithAND(FuzzyRuleAntecedent* fuzzyRuleAntecedent1, FuzzyRuleAntecedent* fuzzyRuleAntecedent2);bool joinWithOR(FuzzyRuleAntecedent* fuzzyRuleAntecedent1, FuzzyRuleAntecedent* fuzzyRuleAntecedent2);
exemplos:
FuzzyRuleAntecedent* speedHightAndDistanceSmall = new FuzzyRuleAntecedent();speedHightAndDistanceSmall->joinWithAND(hight, small); FuzzyRuleAntecedent* fuelLow = new FuzzyRuleAntecedent();fuelLow->joinSingle(low); // Este objeto FuzzyRuleAntecedente é que será usada para compor o objeto FuzzyRule FuzzyRuleAntecedent* ifSpeedHightAndDistanceSmallOrFuelLow = new FuzzyRuleAntecedent();ifSpeedHightAndDistanceSmallOrFuelLow->joinWithOR(speedHightAndDistanceSmall, fuelLow);
Se fazendo valer destes métodos, qualquer expressão pode ser montada, pois um objeto FuzzyRuleAntecedent pode ser usado para compor outro objeto FuzzyRuleAntecedent, das mais diversas formas. OBS:. no exemplo anterior, o antecedente final foi composto pelos objetos speedHightAndDistanceSmall e
fuelLow mas este último poderia ser substituído sem perda pelo objeto FuzzySet low, já que o mesmo é uma expressão simples, sem nenhum operador condicional:
FuzzyRuleAntecedent* speedHightAndDistanceSmall = new FuzzyRuleAntecedent();speedHightAndDistanceSmall->joinWithAND(hight, small); // Este objeto FuzzyRuleAntecedente é que será usada para compor o objeto FuzzyRule FuzzyRuleAntecedent* ifSpeedHightAndDistanceSmallOrFuelLow = new FuzzyRuleAntecedent();ifSpeedHightAndDistanceSmallOrFuelLow->joinWithOR(speedHightAndDistanceSmall, low);
Objeto FuzzyRuleConsequente – Este objeto é usado para compor o objeto FuzzyRule, responsavel por montar a expressão de saída de um FuzzyRule, exemplos:
FuzzyRuleConsequent* thenSpeedSlow = new FuzzyRuleConsequent(); thenSpeedSlow->addOutput(slow);
O que resultaria em um objeto FuzzyRule:
FuzzyRule* fuzzyRule = new FuzzyRule(2, ifDistanceSmall, thenSpeedSlow);
FuzzyRuleConsequent* thenSpeedSmallAndFeedTine = new FuzzyRuleConsequent(); thenSpeedSmallAndFeedSmall->addOutput(small); thenSpeedSmallAndFeedSmall->addOutput(tine);
Para o objeto FuzzyRuleConsequent toda a expressão é montada com o método addOutput(FuzzySet* fuzzySet);
O que resultaria em um objeto FuzzyRule:
FuzzyRule* fuzzyRule = new FuzzyRule(2, ifSpeedHightAndDistanceSmallOrFuelLow, thenSpeedSmallAndFeedTine);
Após montar um objeto FuzzyRule, use o método addFuzzyRule(FuzzyRule* fuzzyRule); do objeto Fuzzy para adicionar a regra na base de regras, repita o mesmo processo para todas as regras.
Dica
Estes são todos os objetos da biblioteca eFLL que são utilizados no processo. O passo seguinte, e geralmente interativo é manipulado por três métodos do objeto Fuzzy, o primeiro:
bool setInput(int ID, float valor);
É utilizado para repassar o valor de entrada crispe para o sistema, note que o primeiro parâmetro é o ID do objeto FuzzyInput ao qual o parâmetro valor é destinado.
bool fuzzify();
É utilizado para iniciar o processo de fuzzyficação, composição e inferência.
E por fim: float defuzzify(int ID);
É utilizado para finalizar o processo de fuzzyficação, note que o ID que é passado por parametro é o ID do FuzzyOutput ao qual se deseja obter o valor desfuzzificado.
Dica: Algumas vezes é necessário conhecer a pertinência com a qual algum, ou cada Conjunto Fuzzy foi ativado. Para isso, utilize o método float getPertinence(); do objeto FuzzySet para objet esse valor, exemplo:
FuzzySet* hot = new FuzzySet(30, 50, 50, 70);...... // Após a fuzzyficação com ->fuzzyfy();...float pertinenceOfHot = hot->getPertinence();
Ou saber se determinada regra foi ativada, utilize o método bool isFired() do objeto FuzzyRule
FuzzyRule* fuzzyRule = new FuzzyRule(2, ifDistanceSmall, thenSpeedSlow);...... // Após a fuzzyficação com ->fuzzyfy();...bool wasTheRulleFired = fuzzyRule->isFired();
Exemplo avançado:
#include <FuzzyRule.h>#include <FuzzyComposition.h>#include <Fuzzy.h>#include <FuzzyRuleConsequent.h>#include <FuzzyOutput.h>#include <FuzzyInput.h>#include <FuzzyIO.h>#include <FuzzySet.h>#include <FuzzyRuleAntecedent.h> // Instanciando um objeto da bibliotecaFuzzy* fuzzy = new Fuzzy(); FuzzySet* close = new FuzzySet(0, 20, 20, 40);FuzzySet* safe = new FuzzySet(30, 50, 50, 70);FuzzySet* distante = new FuzzySet(60, 80, 100, 100); FuzzySet* stoped = new FuzzySet(0, 0, 0, 0);FuzzySet* slow = new FuzzySet(1, 10, 10, 20);FuzzySet* normal = new FuzzySet(15, 30, 30, 50);FuzzySet* quick = new FuzzySet(45, 60, 70, 70); FuzzySet* cold = new FuzzySet(-30, -30, -20, -10);FuzzySet* good = new FuzzySet(-15, 0, 0, 15);FuzzySet* hot = new FuzzySet(10, 20, 30, 30); void setup(){ Serial.begin(9600); // FuzzyInput FuzzyInput* distance = new FuzzyInput(1); distance->addFuzzySet(close); distance->addFuzzySet(safe); distance->addFuzzySet(distante); fuzzy->addFuzzyInput(distance); // FuzzyInput FuzzyInput* inputSpeed = new FuzzyInput(2); inputSpeed->addFuzzySet(stoped); inputSpeed->addFuzzySet(slow); inputSpeed->addFuzzySet(normal); inputSpeed->addFuzzySet(quick); fuzzy->addFuzzyInput(inputSpeed); // FuzzyInput FuzzyInput* temperature = new FuzzyInput(3); temperature->addFuzzySet(cold); temperature->addFuzzySet(good); temperature->addFuzzySet(hot); fuzzy->addFuzzyInput(temperature); // FuzzyOutput FuzzyOutput* risk = new FuzzyOutput(1); FuzzySet* minimum = new FuzzySet(0, 20, 20, 40); risk->addFuzzySet(minimum); FuzzySet* average = new FuzzySet(30, 50, 50, 70); risk->addFuzzySet(average); FuzzySet* maximum = new FuzzySet(60, 80, 80, 100); risk->addFuzzySet(maximum); fuzzy->addFuzzyOutput(risk); // FuzzyOutput // adicionando speed como output também FuzzyOutput* outputSpeed = new FuzzyOutput(2); FuzzySet* stopedOut = new FuzzySet(0, 0, 0, 0); outputSpeed->addFuzzySet(stopedOut); FuzzySet* slowOut = new FuzzySet(1, 10, 10, 20); outputSpeed->addFuzzySet(slowOut); FuzzySet* normalOut = new FuzzySet(15, 30, 30, 50); outputSpeed->addFuzzySet(normalOut); FuzzySet* quickOut = new FuzzySet(45, 60, 70, 70); outputSpeed->addFuzzySet(quickOut); fuzzy->addFuzzyOutput(outputSpeed); // Building FuzzyRule FuzzyRuleAntecedent* distanceCloseAndSpeedQuick = new FuzzyRuleAntecedent(); distanceCloseAndSpeedQuick->joinWithAND(close, quick); FuzzyRuleAntecedent* temperatureCold = new FuzzyRuleAntecedent(); temperatureCold->joinSingle(cold); FuzzyRuleAntecedent* ifDistanceCloseAndSpeedQuickOrTemperatureCold = new FuzzyRuleAntecedent(); ifDistanceCloseAndSpeedQuickOrTemperatureCold->joinWithOR(distanceCloseAndSpeedQuick, temperatureCold); FuzzyRuleConsequent* thenRisMaximumAndSpeedSlow = new FuzzyRuleConsequent(); thenRisMaximumAndSpeedSlow->addOutput(maximum); thenRisMaximumAndSpeedSlow->addOutput(slowOut); FuzzyRule* fuzzyRule1 = new FuzzyRule(1, ifDistanceCloseAndSpeedQuickOrTemperatureCold, thenRisMaximumAndSpeedSlow); fuzzy->addFuzzyRule(fuzzyRule1); // Building FuzzyRule FuzzyRuleAntecedent* distanceSafeAndSpeedNormal = new FuzzyRuleAntecedent(); distanceSafeAndSpeedNormal->joinWithAND(safe, normal); FuzzyRuleAntecedent* ifDistanceSafeAndSpeedNormalOrTemperatureGood = new FuzzyRuleAntecedent(); ifDistanceSafeAndSpeedNormalOrTemperatureGood->joinWithOR(distanceSafeAndSpeedNormal, good); FuzzyRuleConsequent* thenRiskAverageAndSpeedNormal = new FuzzyRuleConsequent(); thenRiskAverageAndSpeedNormal->addOutput(average); thenRiskAverageAndSpeedNormal->addOutput(normalOut); FuzzyRule* fuzzyRule2 = new FuzzyRule(2, ifDistanceSafeAndSpeedNormalOrTemperatureGood, thenRiskAverageAndSpeedNormal); fuzzy->addFuzzyRule(fuzzyRule2); // Building FuzzyRule FuzzyRuleAntecedent* distanceDistanteAndSpeedSlow = new FuzzyRuleAntecedent(); distanceDistanteAndSpeedSlow->joinWithAND(distante, slow); FuzzyRuleAntecedent* ifDistanceDistanteAndSpeedSlowOrTemperatureHot = new FuzzyRuleAntecedent(); ifDistanceDistanteAndSpeedSlowOrTemperatureHot->joinWithOR(distanceDistanteAndSpeedSlow, hot); FuzzyRuleConsequent* thenRiskMinimumSpeedQuick = new FuzzyRuleConsequent(); thenRiskMinimumSpeedQuick->addOutput(minimum); thenRiskMinimumSpeedQuick->addOutput(quickOut); FuzzyRule* fuzzyRule3 = new FuzzyRule(3, ifDistanceDistanteAndSpeedSlowOrTemperatureHot, thenRiskMinimumSpeedQuick); fuzzy->addFuzzyRule(fuzzyRule3);} void loop(){ fuzzy->setInput(1, 10); fuzzy->setInput(2, 30); fuzzy->setInput(3, -15); fuzzy->fuzzify(); Serial.print("Distancia: "); Serial.print(close->getPertinence()); Serial.print(", "); Serial.print(safe->getPertinence()); Serial.print(", "); Serial.println(distante->getPertinence()); Serial.print("Velocidade: "); Serial.print(stoped->getPertinence()); Serial.print(", "); Serial.print(slow->getPertinence()); Serial.print(", "); Serial.print(normal->getPertinence()); Serial.print(", "); Serial.println(quick->getPertinence()); Serial.print("Temperatura: "); Serial.print(cold->getPertinence()); Serial.print(", "); Serial.print(good->getPertinence()); Serial.print(", "); Serial.println(hot->getPertinence()); float output1 = fuzzy->defuzzify(1); float output2 = fuzzy->defuzzify(2); Serial.print("Saida risco: "); Serial.print(output1); Serial.print(", Saida velocidade: "); Serial.println(output2); delay(100000);}
AJ Alves: eFLL – Uma Biblioteca Fuzzy para Arduino e Sistemas Embarcados
28 de Setembro de 2012, 0:00 - sem comentários aindaLógica Fuzzy é uma extensão da lógica booleana tradicional que através de variáveis linguísticas permite expressar valores lógicos intermediários entre o FALSO e VERDADEIRO, descrevendo com maior eficiência o princípio da incerteza do mundo real.
Sistemas Fuzzy são aplicações praticas que empregam a Lógica Fuzzy nas tomadas de decisões com base nos termos e variáveis linguísticas, tendo na robótica e na eletrônica um grande espaço e utilidade.
Desenvolvida pelo Robotic Research Group (RRG) na Universidade Estadual do Piauí (UESPI-Teresina) a biblioteca eFLL (Embedded Fuzzy Logic Library) é uma opção versátil, leve e eficiente de trabalhar com a Lógica Fuzzy em sistemas embarcados.
Por favor, reporte Bugs e sugestões via comentários ou na página oficial do projeto no GitHub.
Como instalar
1º Passo: Vá a página oficial do projeto no GitHub: eFLL
2º Passo: Faça um clone do projeto usando o Git ou faço o download em Donwload pelo botão “Downloas as zip“.
3º Passo: Clone ou descompacte os arquivos para a pasta de bibliotecas do Arduino:
no Ubuntu (/usr/share/arduino/libraries/) caso instalado via apt-get;
no Windows, Mac ou Linux (Onde você baixou o IDE Arduino, a pasta de biblioteca está dentro)
Pronto, a biblioteca está pronta para ser usada.
Como importar
Caso a instalação da biblioteca tenha sido realizada com sucesso, para importar a biblioteca é fácil:
1º Passo: Abra o seu Arduino IDE, vá a aba no menu superior SKETCKS → BIBLIOTECA → Importar eFLL
Characteristics
Escrita em C++/C, usa apenas a biblioteca padrão da linguagem C “stdlib.h“, por isso a eFLL é uma biblioteca destinada não somente ao Arduino, mas qualquer Sistema Embarcado ou não que tenham seus comandos escritos em C.
Não possui limitações explicitas de quantidade de Conjuntos Fuzzy, Regras Fuzzy, Entradas ou Saídas, estas limitam-se a capacidade de processamento e armazenamento de cada microcontrolador
A biblioteca utilza o processo:
(MAX-MIN) e (Mínimo de Mamdani) para a inferência e composição e (Centro de Área) para a desfuzzyficação, no universo contínuo.
Testes realizados utilizando a biblioteca GTest para C, Google Inc
Exemplo simples:
Controle de velocidade de um robô, entrada: Distância obstáculo frontal.
#include <FuzzyRule.h>#include <FuzzyRule.h>#include <FuzzyComposition.h>#include <Fuzzy.h>#include <FuzzyRuleConsequent.h>#include <FuzzyOutput.h>#include <FuzzyInput.h>#include <FuzzyIO.h>#include <FuzzySet.h>#include <FuzzyRuleAntecedent.h> // Passo 1 - Instanciando um objeto da bibliotecaFuzzy* fuzzy = new Fuzzy(); void setup(){ Serial.begin(9600); // Passo 2 - Criando o FuzzyInput distancia FuzzyInput* distance = new FuzzyInput(1);// Como parametro seu ID // Criando os FuzzySet que compoem o FuzzyInput distancia FuzzySet* small = new FuzzySet(0, 20, 20, 40); // Distancia pequena distance->addFuzzySet(small); // Adicionando o FuzzySet small em distance FuzzySet* safe = new FuzzySet(30, 50, 50, 70); // Distancia segura distance->addFuzzySet(safe); // Adicionando o FuzzySet safe em distance FuzzySet* big = new FuzzySet(60, 80, 80, 80); // Distancia grande distance->addFuzzySet(big); // Adicionando o FuzzySet big em distance fuzzy->addFuzzyInput(distance); // Adicionando o FuzzyInput no objeto Fuzzy // Passo 3 - Criando o FuzzyOutput velocidade FuzzyOutput* velocity = new FuzzyOutput(1);// Como parametro seu ID // Criando os FuzzySet que compoem o FuzzyOutput velocidade FuzzySet* slow = new FuzzySet(0, 10, 10, 20); // Velocidade lenta velocity->addFuzzySet(slow); // Adicionando o FuzzySet slow em velocity FuzzySet* average = new FuzzySet(10, 20, 30, 40); // Velocidade normal velocity->addFuzzySet(average); // Adicionando o FuzzySet average em velocity FuzzySet* fast = new FuzzySet(30, 40, 40, 50); // Velocidade alta velocity->addFuzzySet(fast); // Adicionando o FuzzySet fast em velocity fuzzy->addFuzzyOutput(velocity); // Adicionando o FuzzyOutput no objeto Fuzzy //Passo 4 - Montando as regras Fuzzy // FuzzyRule "SE distancia = pequena ENTAO velocidade = lenta" FuzzyRuleAntecedent* ifDistanceSmall = new FuzzyRuleAntecedent(); // Instanciando um Antecedente para a expresso ifDistanceSmall->joinSingle(small); // Adicionando o FuzzySet correspondente ao objeto Antecedente FuzzyRuleConsequent* thenVelocitySlow = new FuzzyRuleConsequent(); // Instancinado um Consequente para a expressao thenVelocitySlow->addOutput(slow);// Adicionando o FuzzySet correspondente ao objeto Consequente // Instanciando um objeto FuzzyRule FuzzyRule* fuzzyRule01 = new FuzzyRule(1, ifDistanceSmall, thenVelocitySlow); // Passando o Antecedente e o Consequente da expressao fuzzy->addFuzzyRule(fuzzyRule01); // Adicionando o FuzzyRule ao objeto Fuzzy // FuzzyRule "SE distancia = segura ENTAO velocidade = normal" FuzzyRuleAntecedent* ifDistanceSafe = new FuzzyRuleAntecedent(); // Instanciando um Antecedente para a expresso ifDistanceSafe->joinSingle(safe); // Adicionando o FuzzySet correspondente ao objeto Antecedente FuzzyRuleConsequent* thenVelocityAverage = new FuzzyRuleConsequent(); // Instancinado um Consequente para a expressao thenVelocityAverage->addOutput(average); // Adicionando o FuzzySet correspondente ao objeto Consequente // Instanciando um objeto FuzzyRule FuzzyRule* fuzzyRule02 = new FuzzyRule(2, ifDistanceSafe, thenVelocityAverage); // Passando o Antecedente e o Consequente da expressao fuzzy->addFuzzyRule(fuzzyRule02); // Adicionando o FuzzyRule ao objeto Fuzzy // FuzzyRule "SE distancia = grande ENTAO velocidade = alta" FuzzyRuleAntecedent* ifDistanceBig = new FuzzyRuleAntecedent(); // Instanciando um Antecedente para a expresso ifDistanceBig->joinSingle(big); // Adicionando o FuzzySet correspondente ao objeto Antecedente FuzzyRuleConsequent* thenVelocityFast = new FuzzyRuleConsequent(); // Instancinado um Consequente para a expressao thenVelocityFast->addOutput(fast);// Adicionando o FuzzySet correspondente ao objeto Consequente // Instanciando um objeto FuzzyRule FuzzyRule* fuzzyRule03 = new FuzzyRule(3, ifDistanceBig, thenVelocityFast); // Passando o Antecedente e o Consequente da expressao fuzzy->addFuzzyRule(fuzzyRule03); // Adicionando o FuzzyRule ao objeto Fuzzy} void loop(){ float dist = getDistanceFromSonar(); // Passo 5 - Informar o valor das entradas, passando seu ID e valorfuzzy->setInput(1, dist); // Passo 6 - Executar a fuzzyficação fuzzy->fuzzify(); // Passo 7 - Executar a desfuzzyficação para cada saída, passando seu ID float output = fuzzy->defuzzify(1); setRobotSpeed(output); delay(100);}
Breve documentação
Objeto Fuzzy – Este objeto engloba todo o Sistema Fuzzy, através dele, é possível manipular os Conjuntos Fuzzy, as Regras Linguísticas, entradas e saídas.
Objeto FuzzyInput – Este objeto literalmente agrupa todos os Conjuntos Fuzzy de entradas que pertencem ao mesmo domínio
Objeto FuzzyOutput – Este objeto é semelhante ao FuzzyInput, é usado para agrupa todos os Conjuntos Fuzzy de saída que pertencem ao mesmo domínio.
Objeto FuzzySet – Este é um dos principais objetos da Biblioteca Fuzzy, com é possível modelar cada conjunto do sistema em questão. Atualmente a biblioteca suporta as funções de pertinência triangular, trapezoidal e singleton, que são montadas com base nos pontos A, B, C e D que são passados por parametro no construtor FuzzySet(float a, float b, float c, float d), exemplos:
Função de pertinência triangular:
Função de pertinência trapezoidal:
Função de pertinência Singleton:
Objeto FuzzyRule – Este objeto é usado para montar a base de regras do objeto Fuzzy, que contem um ou mais deste. Instanciado com FuzzyRule fr = new FuzzyRule(ID, antecedent, consequente)
Objeto FuzzyRuleAntecedent – Este objeto é usado para compor o objeto FuzzyRule, responsavel por montar a expressão condicional do antecedente de um FuzzyRule, exemplos:
FuzzyRuleAntecedent* ifDistanceSmall = new FuzzyRuleAntecedent(); ifDistanceSmall->joinSingle(small);
O método joinSingle(FuzzySet* fuzzySet); é usado para montar expressões simples de SE isto ENTÃO aquilo. Para compor expressões mais complexas existem outros métodos especiais.
FuzzyRuleAntecedent* ifTemperatureHotAndPressureHight = new FuzzyRuleAntecedent();ifTemperatureHotAndPressureHight->joinWithAND(hot, hight);
FuzzyRuleAntecedent* ifTemperatureHotAndPressureHight = new FuzzyRuleAntecedent();ifTemperatureHotAndPressureHight->joinWithOR(hot, hight);
Os métodos joinWithAND(FuzzySet* fuzzySet1, FuzzySet* fuzzySet2); e joinWithOR(FuzzySet* fuzzySet1, FuzzySet* fuzzySet2); podem fazer composições logicas entre os Conjuntos Fuzzy. Estes métodos possuem ainda variações mais avançadas que permitem aprimorar mais ainda a expressão, são eles:
bool joinWithAND(FuzzySet* fuzzySet, FuzzyRuleAntecedent* fuzzyRuleAntecedent);bool joinWithAND(FuzzyRuleAntecedent* fuzzyRuleAntecedent, FuzzySet* fuzzySet);bool joinWithOR(FuzzySet* fuzzySet, FuzzyRuleAntecedent* fuzzyRuleAntecedent);bool joinWithOR(FuzzyRuleAntecedent* fuzzyRuleAntecedent, FuzzySet* fuzzySet);bool joinWithAND(FuzzyRuleAntecedent* fuzzyRuleAntecedent1, FuzzyRuleAntecedent* fuzzyRuleAntecedent2);bool joinWithOR(FuzzyRuleAntecedent* fuzzyRuleAntecedent1, FuzzyRuleAntecedent* fuzzyRuleAntecedent2);
exemplos:
FuzzyRuleAntecedent* speedHightAndDistanceSmall = new FuzzyRuleAntecedent();speedHightAndDistanceSmall->joinWithAND(hight, small); FuzzyRuleAntecedent* fuelLow = new FuzzyRuleAntecedent();fuelLow->joinSingle(low); // Este objeto FuzzyRuleAntecedente é que será usada para compor o objeto FuzzyRule FuzzyRuleAntecedent* ifSpeedHightAndDistanceSmallOrFuelLow = new FuzzyRuleAntecedent();ifSpeedHightAndDistanceSmallOrFuelLow->joinWithOR(speedHightAndDistanceSmall, fuelLow);
Se fazendo valer destes métodos, qualquer expressão pode ser montada, pois um objeto FuzzyRuleAntecedent pode ser usado para compor outro objeto FuzzyRuleAntecedent, das mais diversas formas. OBS:. no exemplo anterior, o antecedente final foi composto pelos objetos speedHightAndDistanceSmall e
fuelLow mas este último poderia ser substituído sem perda pelo objeto FuzzySet low, já que o mesmo é uma expressão simples, sem nenhum operador condicional:
FuzzyRuleAntecedent* speedHightAndDistanceSmall = new FuzzyRuleAntecedent();speedHightAndDistanceSmall->joinWithAND(hight, small); // Este objeto FuzzyRuleAntecedente é que será usada para compor o objeto FuzzyRule FuzzyRuleAntecedent* ifSpeedHightAndDistanceSmallOrFuelLow = new FuzzyRuleAntecedent();ifSpeedHightAndDistanceSmallOrFuelLow->joinWithOR(speedHightAndDistanceSmall, low);
Objeto FuzzyRuleConsequente – Este objeto é usado para compor o objeto FuzzyRule, responsavel por montar a expressão de saída de um FuzzyRule, exemplos:
FuzzyRuleConsequent* thenSpeedSlow = new FuzzyRuleConsequent(); thenSpeedSlow->addOutput(slow);
O que resultaria em um objeto FuzzyRule:
FuzzyRule* fuzzyRule = new FuzzyRule(2, ifDistanceSmall, thenSpeedSlow);
FuzzyRuleConsequent* thenSpeedSmallAndFeedTine = new FuzzyRuleConsequent(); thenSpeedSmallAndFeedSmall->addOutput(small); thenSpeedSmallAndFeedSmall->addOutput(tine);
Para o objeto FuzzyRuleConsequent toda a expressão é montada com o método addOutput(FuzzySet* fuzzySet);
O que resultaria em um objeto FuzzyRule:
FuzzyRule* fuzzyRule = new FuzzyRule(2, ifSpeedHightAndDistanceSmallOrFuelLow, thenSpeedSmallAndFeedTine);
Após montar um objeto FuzzyRule, use o método addFuzzyRule(FuzzyRule* fuzzyRule); do objeto Fuzzy para adicionar a regra na base de regras, repita o mesmo processo para todas as regras.
Dica
Estes são todos os objetos da biblioteca eFLL que são utilizados no processo. O passo seguinte, e geralmente interativo é manipulado por três métodos do objeto Fuzzy, o primeiro:
bool setInput(int ID, float valor);
É utilizado para repassar o valor de entrada crispe para o sistema, note que o primeiro parâmetro é o ID do objeto FuzzyInput ao qual o parâmetro valor é destinado.
bool fuzzify();
É utilizado para iniciar o processo de fuzzyficação, composição e inferência.
E por fim: float defuzzify(int ID);
É utilizado para finalizar o processo de fuzzyficação, note que o ID que é passado por parametro é o ID do FuzzyOutput ao qual se deseja obter o valor desfuzzificado.
Dica: Algumas vezes é necessário conhecer a pertinência com a qual algum, ou cada Conjunto Fuzzy foi ativado. Para isso, utilize o método float getPertinence(); do objeto FuzzySet para objet esse valor, exemplo:
FuzzySet* hot = new FuzzySet(30, 50, 50, 70);...... // Após a fuzzyficação com ->fuzzyfy();...float pertinenceOfHot = hot->getPertinence();
Ou saber se determinada regra foi ativada, utilize o método bool isFired() do objeto FuzzyRule
FuzzyRule* fuzzyRule = new FuzzyRule(2, ifDistanceSmall, thenSpeedSlow);...... // Após a fuzzyficação com ->fuzzyfy();...bool wasTheRulleFired = fuzzyRule->isFired();
Exemplo avançado:
#include <FuzzyRule.h>#include <FuzzyRule.h>#include <FuzzyComposition.h>#include <Fuzzy.h>#include <FuzzyRuleConsequent.h>#include <FuzzyOutput.h>#include <FuzzyInput.h>#include <FuzzyIO.h>#include <FuzzySet.h>#include <FuzzyRuleAntecedent.h> // Instanciando um objeto da bibliotecaFuzzy* fuzzy = new Fuzzy(); FuzzySet* close = new FuzzySet(0, 20, 20, 40);FuzzySet* safe = new FuzzySet(30, 50, 50, 70);FuzzySet* distante = new FuzzySet(60, 80, 100, 100); FuzzySet* stoped = new FuzzySet(0, 0, 0, 0);FuzzySet* slow = new FuzzySet(1, 10, 10, 20);FuzzySet* normal = new FuzzySet(15, 30, 30, 50);FuzzySet* quick = new FuzzySet(45, 60, 70, 70); FuzzySet* cold = new FuzzySet(-30, -30, -20, -10);FuzzySet* good = new FuzzySet(-15, 0, 0, 15);FuzzySet* hot = new FuzzySet(10, 20, 30, 30); void setup(){ Serial.begin(9600); // FuzzyInput FuzzyInput* distance = new FuzzyInput(1); distance->addFuzzySet(close); distance->addFuzzySet(safe); distance->addFuzzySet(distante); fuzzy->addFuzzyInput(distance); // FuzzyInput FuzzyInput* inputSpeed = new FuzzyInput(2); inputSpeed->addFuzzySet(stoped); inputSpeed->addFuzzySet(slow); inputSpeed->addFuzzySet(normal); inputSpeed->addFuzzySet(quick); fuzzy->addFuzzyInput(inputSpeed); // FuzzyInput FuzzyInput* temperature = new FuzzyInput(3); temperature->addFuzzySet(cold); temperature->addFuzzySet(good); temperature->addFuzzySet(hot); fuzzy->addFuzzyInput(temperature); // FuzzyOutput FuzzyOutput* risk = new FuzzyOutput(1); FuzzySet* minimum = new FuzzySet(0, 20, 20, 40); risk->addFuzzySet(minimum); FuzzySet* average = new FuzzySet(30, 50, 50, 70); risk->addFuzzySet(average); FuzzySet* maximum = new FuzzySet(60, 80, 80, 100); risk->addFuzzySet(maximum); fuzzy->addFuzzyOutput(risk); // FuzzyOutput // adicionando speed como output também FuzzyOutput* outputSpeed = new FuzzyOutput(2); FuzzySet* stopedOut = new FuzzySet(0, 0, 0, 0); outputSpeed->addFuzzySet(stopedOut); FuzzySet* slowOut = new FuzzySet(1, 10, 10, 20); outputSpeed->addFuzzySet(slowOut); FuzzySet* normalOut = new FuzzySet(15, 30, 30, 50); outputSpeed->addFuzzySet(normalOut); FuzzySet* quickOut = new FuzzySet(45, 60, 70, 70); outputSpeed->addFuzzySet(quickOut); fuzzy->addFuzzyOutput(outputSpeed); // Building FuzzyRule FuzzyRuleAntecedent* distanceCloseAndSpeedQuick = new FuzzyRuleAntecedent(); distanceCloseAndSpeedQuick->joinWithAND(close, quick); FuzzyRuleAntecedent* temperatureCold = new FuzzyRuleAntecedent(); temperatureCold->joinSingle(cold); FuzzyRuleAntecedent* ifDistanceCloseAndSpeedQuickOrTemperatureCold = new FuzzyRuleAntecedent(); ifDistanceCloseAndSpeedQuickOrTemperatureCold->joinWithOR(distanceCloseAndSpeedQuick, temperatureCold); FuzzyRuleConsequent* thenRisMaximumAndSpeedSlow = new FuzzyRuleConsequent(); thenRisMaximumAndSpeedSlow->addOutput(maximum); thenRisMaximumAndSpeedSlow->addOutput(slowOut); FuzzyRule* fuzzyRule1 = new FuzzyRule(1, ifDistanceCloseAndSpeedQuickOrTemperatureCold, thenRisMaximumAndSpeedSlow); fuzzy->addFuzzyRule(fuzzyRule1); // Building FuzzyRule FuzzyRuleAntecedent* distanceSafeAndSpeedNormal = new FuzzyRuleAntecedent(); distanceSafeAndSpeedNormal->joinWithAND(safe, normal); FuzzyRuleAntecedent* ifDistanceSafeAndSpeedNormalOrTemperatureGood = new FuzzyRuleAntecedent(); ifDistanceSafeAndSpeedNormalOrTemperatureGood->joinWithOR(distanceSafeAndSpeedNormal, good); FuzzyRuleConsequent* thenRiskAverageAndSpeedNormal = new FuzzyRuleConsequent(); thenRiskAverageAndSpeedNormal->addOutput(average); thenRiskAverageAndSpeedNormal->addOutput(normalOut); FuzzyRule* fuzzyRule2 = new FuzzyRule(2, ifDistanceSafeAndSpeedNormalOrTemperatureGood, thenRiskAverageAndSpeedNormal); fuzzy->addFuzzyRule(fuzzyRule2); // Building FuzzyRule FuzzyRuleAntecedent* distanceDistanteAndSpeedSlow = new FuzzyRuleAntecedent(); distanceDistanteAndSpeedSlow->joinWithAND(distante, slow); FuzzyRuleAntecedent* ifDistanceDistanteAndSpeedSlowOrTemperatureHot = new FuzzyRuleAntecedent(); ifDistanceDistanteAndSpeedSlowOrTemperatureHot->joinWithOR(distanceDistanteAndSpeedSlow, hot); FuzzyRuleConsequent* thenRiskMinimumSpeedQuick = new FuzzyRuleConsequent(); thenRiskMinimumSpeedQuick->addOutput(minimum); thenRiskMinimumSpeedQuick->addOutput(quickOut); FuzzyRule* fuzzyRule3 = new FuzzyRule(3, ifDistanceDistanteAndSpeedSlowOrTemperatureHot, thenRiskMinimumSpeedQuick); fuzzy->addFuzzyRule(fuzzyRule3);} void loop(){ fuzzy->setInput(1, 10); fuzzy->setInput(2, 30); fuzzy->setInput(3, -15); fuzzy->fuzzify(); Serial.print("Distancia: "); Serial.print(close->getPertinence()); Serial.print(", "); Serial.print(safe->getPertinence()); Serial.print(", "); Serial.println(distante->getPertinence()); Serial.print("Velocidade: "); Serial.print(stoped->getPertinence()); Serial.print(", "); Serial.print(slow->getPertinence()); Serial.print(", "); Serial.print(normal->getPertinence()); Serial.print(", "); Serial.println(quick->getPertinence()); Serial.print("Temperatura: "); Serial.print(cold->getPertinence()); Serial.print(", "); Serial.print(good->getPertinence()); Serial.print(", "); Serial.println(hot->getPertinence()); float output1 = fuzzy->defuzzify(1); float output2 = fuzzy->defuzzify(2); Serial.print("Saida risco: "); Serial.print(output1); Serial.print(", Saida velocidade: "); Serial.println(output2); delay(100000);}
Adriel Lucas: Slide da oficina apresentada no Software Freedom Day 2012
20 de Setembro de 2012, 0:00 - sem comentários aindadia 15 de Setembro de 2012 acontece o Software Freedom Day 2012 aqui na cidade
de Teresina-PI e eu não podia ficar de fora. Ministrei um minicurso que
mostrava como criar um ambiente de alta disponibilidade utilizando o software
livre. Não fui muito detalhista no slide mas segue um pequeno roteiro. Todos os
detalhes sobre esse assunto estão aqui no meu blog, tem vários posts. Té mais…
Aracele Torres: Uma sociedade digital livre – Parte 1
14 de Setembro de 2012, 0:00 - sem comentários ainda
Quem conhece Richard Stallman sabe que ele não é um hacker bitolado em coisas técnicas e causas tecnicistas, é mais que isso. A militância de Stallman extrapola o campo particular do software livre e opera em campos bem mais amplos como, por exemplo, o campo político. Hoje vou publicar pra vocês parte de um desses textos de Stallman que abordam de forma ampla a questão da liberdade, seja ela relacionada ao software, à internet, à política. A minha ideia é publicar a tradução feita por mim do texto A Free Digital Society – What Makes Digital Inclusion Good or Bad?, que na verdade é a transcrição de uma palestra que Stallman ministrou em Paris, em outubro de 2011, sob esse mesmo título. Pretendo postar a tradução do texto em, pelo menos, cinco partes, devido a sua extensão. Sintam-se à vontade para sugerir correções na tradução ou mesmo correções gramaticais do texto.
Nessa primeira parte, Stallman introduz o tema da inclusão digital questionando seus benefícios à sociedade e falando sobre as ameaças que a inclusão digital pode oferecer à nossa liberdade. Portanto, nesse primeiro post, Stallman fala da vigilância como um perigo na sociedade digital.
Vamos ao texto!
Uma sociedade digital livre: o que faz da inclusão digital boa ou ruim?
Por Richard Stallman
Projetos com objetivo de inclusão digital estão criando uma grande pressuposição. Eles pressupõem que a participação em uma sociedade digital é boa; mas isso não é necessariamente verdade. Estar em uma sociedade digital pode ser bom ou ruim, dependendo se essa sociedade digital é justa ou injusta. Há muitas formas nas quais nossa liberdade está sendo atacada pela tecnologia digital. A tecnologia digital pode piorar as coisas, e irá, a menos que lutemos para impedi-la. Portanto, se temos uma sociedade digital injusta, nós deveríamos cancelar esses projetos de inclusão digital e iniciar projetos de extração digital. Temos que extrair as pessoas da sociedade digital se ela não respeita sua liberdade; ou temos que fazê-la respeitar.
Vigilância
Quais são as ameaças? Primeiro, vigilância. Os computadores são o sonho de Stalin: são ferramentas ideais para vigilância, porque tudo que fazemos com os computadores, eles podem gravar. Eles podem gravar as informações em uma forma pesquisável perfeitamente indexada em uma base de dados central, ideal para qualquer tirano que queira esmagar a oposição.
A vigilância, às vezes, é feita com nossos próprios computadores. Por exemplo, se você tem um computador que está executando Microsoft Windows, esse sistema está praticando a vigilância. Há funcionalidades no Windows que enviam dados para algum servidor. Dados sobre o uso do computador. Um recurso de vigilância foi descoberto no Iphone há alguns meses, e as pessoas começaram a chamá-lo de “telefone espião” (spy-phone). O Flash Player tem um recurso de espião também, assim como a Amazon “Swindle”. Eles o chamam de Kindle, mas eu o chamo Swindle (o trapaceiro), porque ele é feito para enganar os usuários sobre sua liberdade. Ele faz as pessoas se identificarem sempre que compram um livro, e isso significa que a Amazon tem uma lista gigante de todos os livros que cada usuário leu. Tal lista não deveria existir em nenhum lugar.
A maioria dos celulares irá transmitir a sua localização, calculada através de GPS, por comando remoto. A companhia telefônica está acumulando uma lista enorme de lugares que o usuário esteve. Um alemão MP no Partido Verde [correção: Malte Spitz está na esquipe do Partido Verde, não é um politico eleito] solicitou à companhia telefônica os dados que ela tinha sobre onde ele esteve. Ele teve que processar, que ir ao tribunal para obter essa informação. E quando conseguiu, recebeu quarenta e quatro mil pontos de localização por um período de seis meses! Isso é mais que 200 por dia! O que isto significa é que alguém poderia formar um quadro muito bom de suas atividades apenas olhando para esses dados.
Nós podemos impedir que os nossos próprios computadores façam essa vigilância sobre nós se tivermos o controle do software que eles executam. Mas o software que essas pessoas estão executando, elas não tem controle sobre ele. Eles não são software livre, e é por isso que tem recursos maliciosos, como a vigilância. Entretanto, a vigilância nem sempre é feita com os nossos próprios computadores, ela também é feita a distância. Por exemplo, ISP’s na Europa são obrigados a manter os dados sobre as comunicações dos usuários da internet por um longo tempo, caso o Estado resolva investigar essa pessoa mais tarde por qualquer razão imaginável.
Com um celular – mesmo se você puder impedir o telefone de transmitir sua localização GPS, o sistema pode determinar a localização aproximada do telefone, através da comparação entre o tempo em que os sinais chegam em torres diferentes. Assim, o sistema do telefone pode fazer a vigilância mesmo sem a cooperação especial do próprio telefone.
Da mesma forma são as bicicletas que as pessoas alugam em Paris. Claro que o sistema sabe onde você pega a bicicleta e onde você a devolve, e eu tenho ouvido relatos de que ele segue as bicicletas quando elas estão se movendo também. Então elas não são algo em que podemos realmente confiar.
Mas também existem sistemas que não têm nada a fazer com a gente, que só existem para o rastreamento. Por exemplo, no Reino Unido todas as viagens de carro são monitoradas. Os movimentos de cada carro estão sendo gravados em tempo real e podem ser acompanhados pelo Estado em tempo real. Isso é feito com as câmeras que ficam ao lado da estrada.
Agora, a única maneira de evitar a vigilância que é feita a distância ou por sistemas independentes é através da ação política contra o poder aumentado do governo para rastrear e monitorar a todos, o que significa, claro, que temos que rejeitar qualquer desculpa que eles podem dar. Para fazer tais sistemas, nenhuma desculpa é válida – para monitorar a todos.
Em uma sociedade livre, quando você sai em público você não tem garantia de anonimato. É possível que alguém o reconheça e se lembre. E mais tarde essa pessoa poderia dizer que viu você em um determinado lugar. Mas essa informação é pública. Não é convenientemente montada para rastrear a todos e investigar o que fizeram. Coletar essas informações dá muito trabalho, por isso é feito somente em casos especiais, quando é necessário.
Mas a vigilância computadorizada torna possível centralizar e indexar todas essas informações de modo que um regime injusto possa encontrar tudo isso e descobrir tudo sobre todos. Se um ditador toma o poder, o que poderia acontecer em qualquer lugar, as pessoas percebem isso e reconhecem que não devem se comunicar com outros dissidentes de uma forma que o Estado poderia descobrir. Mas se o ditador tem vários anos de registros armazenados, de quem fala com quem, é tarde demais para tomar todas as precauções então. Porque ele já tem tudo o que precisa saber: “OK esse cara é um dissidente, e ele falou com ele. Talvez ele seja um dissidente também. Talvez devêssemos agarrá-lo e torturá-lo.”
Então nós precisamos fazer uma campanha para pôr fim à vigilância digital agora. Você não pode esperar até que haja um ditador e isso seja realmente importante. E, além disso, não é preciso uma ditadura absoluta para começarem a atacar os direitos humanos.
Não seria exagero chamar o governo do Reino Unido de ditadura. Ele não é muito democrático, e uma das formas através das quais ele esmaga a democracia é usando a vigilância. Alguns anos atrás, as pessoas acreditavam estar a caminho de um protesto, elas estavam indo protestar. E foram presas antes que pudessem chegar lá, porque seus carros foram rastreados através deste sistema universal de rastreamento de carro.