Programming Robot Behaviors Using Finite State Machines
Table of Contents
Robôs estão se tornando cada vez mais sofisticados, capazes de executar tarefas complexas em vários ambientes. Uma maneira eficaz de programar seus comportamentos é através do uso de máquinas de estado finito (FSMs). Os FSMs fornecem uma abordagem estruturada para gerenciar diferentes estados em que um robô pode estar e como ele se transforma entre eles. Eles são um conceito fundamental em robótica, sistemas incorporados e IA de jogo porque eles transformam comportamentos complexos e reativos em um modelo claro e previsível. Este artigo explora a teoria por trás dos FSMs, técnicas práticas de implementação, armadilhas comuns, variantes avançadas como máquinas de estado hierárquico, e como eles se comparam com alternativas modernas, como árvores de comportamento.
O que é uma máquina estatal finita?
Uma máquina de estado finito é um modelo computacional que consiste num número finito de estados. O robô está sempre em um estado de cada vez, e ele se transforma para outros estados com base em entradas ou condições específicas. Isto torna o FSMs ideal para projetar comportamentos robôs previsíveis e gerenciáveis. Em qualquer momento, toda a história do sistema é capturada pelo seu estado atual; o futuro depende apenas desse estado e da entrada que vem. Esta propriedade, conhecida como propriedade de Markov, é o que dá ao FSMs sua simplicidade e verificação.
O trabalho mais antigo em autômatos finitos data de meados do século XX, e os MSFs têm sido usados na robótica desde os anos 1970. Eles aparecem em tudo, desde robôs simples que seguem linhas até veículos submarinos autônomos. A principal visão é que muitas tarefas robóticas podem ser decompostas em um conjunto de modos discretos, cada um com sua própria lei de controle, estratégia de detecção e critérios de terminação.
Componentes essenciais de uma máquina de estado finito
Estados
Os Estados representam os vários modos ou comportamentos que um robô pode exibir. Cada estado codifica um conjunto específico de ações e respostas. Inactivo, Avançar, Virando, Evitar Obstáculos, Objeto de Obtenção, e A Enviar o Objecto Os Estados são tipicamente desenhados como círculos ou retângulos arredondados em diagramas de estado. Um robô só pode estar em um estado de cada vez – esta exclusão mútua é o que torna o raciocínio sobre o sistema tratável.
Transições
As transições definem as regras que fazem com que o robô mude de um estado para outro. Elas são acionadas por eventos - leituras de sensores, expirações de tempo ou condições internas. Uma transição geralmente inclui uma condição de guarda (por exemplo, "se distância < 0.5 m") and an optional action that executes during the switch. In a deterministic FSM, given a current state and an input, there is exactly one possible next state. Nondeterministic FSMs exist but are less common in robotics because they require backtracking or parallel exploration.
Entradas
As entradas são sinais externos ou dados que influenciam transições de estado. Na robótica, as entradas vêm de sensores (lidar, câmera, pára-choques, IMU) ou de módulos de software internos (objetivos de navegação, nível da bateria). Eles podem ser discretos (sensores de colisão binários) ou contínuos (leitura de distância). Para usar valores contínuos com um FSM, eles devem ser quantizados em eventos discretos – por exemplo, "obstáculo detectado" quando o intervalo < 0.3 m, and "obstacle cleared" when range > 0,5 m. Esta quantização é uma etapa crítica de projeto que pode fazer ou quebrar a robustez do FSM.
Acções
As ações são os comportamentos executados enquanto o robô está em um dado estado. Estas podem ser contínuas (drive em uma velocidade constante) ou de um tiro (envie um comando para a garra). Em máquinas Moore, as ações dependem apenas do estado atual. Em máquinas Mealy, as ações também podem depender da entrada que causou a transição. A maioria das implementações robóticas são híbridas – elas realizam ações contínuas dentro de estados e ações discretas sobre transições.
Mealy vs Moore Machines
Existem dois estilos arquitetónicos clássicos para os FSMs. Máquina Moore, as saídas (ações) estão associadas apenas ao estado. Máquina de mistura, as saídas estão associadas com as transições em si. Por exemplo, considere um robô que precisa tocar um som quando detecta um obstáculo. Com uma abordagem Mealy, o som é emitido durante a transição de "Moving" para "Avoiding".
Com uma abordagem Moore, o som seria continuamente tocado enquanto no estado "Avoiding". As máquinas de Mealy muitas vezes requerem menos estados porque as ações podem ser desencadeadas por eventos em vez de estados habitados, mas podem ser mais difíceis de rastrear durante a depuração. A maioria dos robôs práticos FSMs adotam um estilo Moore com ações explícitas "on entry".
Implementação de FSMs em Software de Robots
Para programar um robô usando um FSM, os desenvolvedores normalmente definem cada estado e seus comportamentos associados. Eles então especificam as condições em que o robô se transforma de um estado para outro. Esta abordagem simplifica a lógica de comportamento complexa e torna a depuração mais fácil. Em software, três padrões de implementação dominam:
1. Caso de mudança (Condições desativadas)
No nível mais simples, um único loop lê a entrada do sensor e usa uma instrução sobre a variável de estado atual. Cada caso contém a lógica específica do estado e condicionais para transições. Embora seja fácil de protótipo, este padrão torna-se descomplicado para mais de um punhado de estados, porque toda a lógica de transição vive em uma função monolítica.
2. Tabela de Estado (Tabela de Consulta)
Uma tabela de estado codifica transições em uma matriz: linhas representam estados atuais, colunas representam eventos e células contêm o estado seguinte e ação opcional. Esta abordagem separa a lógica de transição do código de comportamento, tornando- se fácil de modificar sem recompilar (se carregada da configuração). É a espinha dorsal de muitos controladores de robôs industriais.
3. Padrão de Estado (Object-Oriented)
No padrão de desenho do Estado, cada estado é implementado como uma classe separada derivada de uma interface comum. O contexto do robô contém um ponteiro para o objeto de estado atual. Quando a entrada chega, o contexto delega o método , que pode mudar o estado atual trocando o ponteiro. Este padrão é limpo, extensível e bem adequado para robôs complexos com muitos comportamentos. É amplamente usado no Sistema Operacional de Robôs (ROS) através de frameworks como o SMACH.
Exemplo: Evitação de obstáculos com Pseudocode
Considere um robô que navega em uma sala e deve evitar obstáculos. Mover e Evitar. Quando um obstáculo é detectado (intervalo < threshold), the robot transitions to the Avoiding state, executes a turn, and then returns to Moving. Below is a simplified C++-like pseudocode using the State pattern:
Este exemplo usa um temporizador no estado Evitando para garantir que o robô gira por um segundo antes de retomar o movimento para frente. Em uma implementação real, você pode verificar a folga de costa antes de voltar.
Aplicações Práticas de Robots de FSMs
Seguir a Linha
Um robô que segue linhas pode ter três estados: Seguir a Linha, Procurar por Linha, e Tratamento de Intersecções. Quando a linha é perdida, o robô se transfere para a Pesquisa, onde realiza um padrão de varredura. Uma vez que a linha é recuperada, ela retorna para Seguir. Em uma interseção, ela se transforma para um estado especial que lê um marcador ou executa uma volta pré-programada.
Operações de Escolha e Localização
Manipuladores industriais usam frequentemente um FSM para sequenciar uma pega: Mover para a Posição de Abordagem, Mover para a posição de grasp, Fechar o Apertor, Retrair, Mover para a Abordagem de Locais, Abrir o Gripper. Cada estado tem condições claras de entrada e saída. Sensores (torque de força, proximidade) desencadeiam transições entre esses estados, tornando a tarefa global robusta para a variação de posição da parte.
Exploração Autónoma
Na exploração móvel de robôs, estados como Explorar, Voltar ao Objetivo, Recarregar, e Recuperação são comuns. O robô transições de Explorar para recarregar quando a bateria está baixa. Se ele fica preso, um estado de recuperação executa uma sequência de reversão e voltas antes de voltar para Explorar. FSMs fornecer uma maneira natural de lidar com esses modos de falha explicitamente.
Vantagens e Limitações dos MFM
Vantagens
- Previsibilidade: O comportamento é claramente definido e fácil de entender. Com um diagrama de estado, qualquer membro da equipa pode ver exatamente o que o robô fará em cada situação.
- Modularidade: Novos comportamentos podem ser adicionados introduzindo novos estados e transições sem reescrever a lógica existente, especialmente quando se usa o padrão de Estado ou tabelas de estado.
- Depuração: Os problemas de isolamento são mais simples quando os comportamentos são organizados em estados. Você pode registrar o estado atual e os eventos que desencadearam transições, tornando fácil repetir e rastrear falhas.
- Verificação: Como os MFFs são finitos, métodos formais podem ser aplicados para verificar propriedades como a vida (o robô nunca fica preso) e segurança (ele nunca entra em um estado proibido).
Limitações
- Explosão do Estado: À medida que o número de comportamentos e eventos aumenta, o número de estados e transições pode explodir combinatorialmente. Um robô com 10 entradas binárias independentes poderia teoricamente precisar de 2^10 estados para cobrir todas as combinações, embora na prática os estados sejam agrupados por relevância.
- Escalabilidade: Os FSMs planos clássicos são difíceis de manter além dos estados 20-30. O gráfico de transição torna-se um denso "gramma de espaghetti".
- Falta de concorrência: Os FSMs padrão lidam apenas com um estado de cada vez. Os robôs geralmente precisam executar tarefas simultâneas (por exemplo, navegar enquanto pesquisam por pontos de referência). As máquinas de estado simultâneas ou os FSMs hierárquicos abordam isso.
Variantes avançadas do FSM
Máquinas de estado finito hierárquicas (HFSMs)
Os HFSMs, também conhecidos como statecharts, permitem que um estado contenha um ou mais sub- estados. Navegando o estado pode ser um FSM com sub-estados Avançar, Virando, e Evitar. Se o robô entra em um Bateria Baixa situação enquanto em qualquer sub- estado de navegação, uma transição do pai Navegando estado a Acoplamento HFSMs reduzem a explosão de estado permitindo transições compartilhadas e comportamentos padrão. O formalismo foi introduzido por David Harel em 1987 e é amplamente utilizado em máquinas de estado UML.
Máquinas de estado Finite Fuzzy
Em FSMs clássicos, as transições são nítidas – uma condição é verdadeira ou falsa. FSMs fuzzy substituem a lógica booleana por graus de associação. Por exemplo, em vez de "obstáculo detectado = sim/não", a entrada pode ser "proximidade de obstáculos = 0,7". O robô pode parcialmente se transferir para o estado Evitando enquanto permanece parcialmente em Moving. Isto leva a um comportamento mais suave, mas perde a previsibilidade estrita de FSMs nítidos. FSMs fuzzy são usados na navegação de robôs onde é desejada uma mistura suave de comportamentos.
MF probabilísticos
Os FSMs probabilísticos (também chamados cadeias de Markov) atribuem probabilidades às transições. Numa tarefa de robô, você pode modelar a probabilidade de escolher com sucesso um objeto dado o estado atual. Isto permite ao robô escolher ações que maximizem a recompensa esperada – um tópico no coração da aprendizagem de reforço. Embora não seja tão comum no código de produção determinístico, os FSMs probabilísticos são uma ponte teórica importante.
Comparando os FSMs com as Árvores do Comportamento
As Árvores de Comportamento (BTs) tornaram-se populares na robótica e IA de jogo como uma alternativa aos FSMs. Em um BT, nós compostos (Seletor, Sequência) controlam como os nós filhos executam. Ao contrário dos FSMs, os BTs não têm um único "estado atual", mas, em vez disso, atravessam uma árvore da raiz cada tiquetaque. Isto torna os BTs mais modulares e reutilizáveis; as sub- árvores podem ser facilmente combinadas. Contudo, os BTs podem ser mais difíceis de de depurar devido ao seu fluxo de controle implícito e são menos suscetíveis de verificação formal.
Para muitas tarefas, os FSMs oferecem um modelo mais simples e intuitivo. Muitos sistemas de robôs modernos usam uma abordagem híbrida: um FSM de alto nível que muda entre comportamentos orientados para BT.
Para mais informações sobre esta comparação, ver Artigo da Wikipédia sobre árvores de comportamento.
Ferramentas e Frameworks para FSMs de Robots
Vários motores simplificam a construção e execução de MFFs em robôs:
- ROS SMACH – Uma biblioteca Python que fornece uma estrutura de máquina de estado integrada com tópicos, ações e serviços ROS. Ela suporta estados hierárquicos e introspecção (visando o estado atual através do console ROS). Documentação do SMACH.
- PyRo – Um pacote Python para robótica que inclui uma implementação FSM leve adequada para robôs de pequeno a médio porte.
- QP/C++ – Uma estrutura incorporada em tempo real (de Quantum Leaps) que fornece objetos ativos direcionados a eventos com máquinas de estado hierárquico. É usado em muitas aplicações industriais e aeroespaciais.
- Compiladores de máquinas estatais – Ferramentas como Ragel e podem compilar diagramas de estado em C, C++ ou código Java. Eles geram FSMs eficientes e orientados para tabelas sem sobrecarga de execução.
Conclusão
As máquinas de estado finito são uma ferramenta poderosa na programação de robôs, permitindo aos desenvolvedores criar uma lógica de comportamento confiável e sustentável. À medida que a tecnologia robótica avança, os MSFs continuam sendo uma técnica fundamental para gerenciar comportamentos autônomos complexos. Sua transparência os torna ideais para sistemas críticos de segurança, onde o comportamento deve ser auditado e verificado. Enquanto paradigmas mais novos, como árvores de comportamento, oferecem vantagens na modularidade e escalabilidade, os MSFs continuam sendo o método de ir-to para sistemas com modos bem definidos e transições claras orientadas para eventos. Ao dominar os conceitos centrais – estados, transições, entradas e ações – e aprender a extendê-los com variantes hierárquicas e fuzzy, você pode construir software robótico robusto que se comporta de forma previsível no mundo real imprevisível.