• Nenhum resultado encontrado

3.3 Um Estudo das Representações do Movimento Humano

3.3.5 Conclusões do Estudo

Este Estudo apresentou os modelos existentes de representação dos gestos humanos a fim de melhor fundamentar o domínio da solução proposta. O resultado final é que a descrição do movimento anatômico pode ser melhor apresentado usando a terminologia mais compreendida e aceita pelos envolvidos. Os termos devem ser parte de um vocabulário próprio de trabalho, independente do nível de representação necessário.

Na Biomecânica, um treinador esportivo ou profissional de saúde pode determinar os movimentos mais relevantes do esporte ou auxiliar na correção de uma lesão usando um vocabulário específico de termos para instruir os atletas e avaliar os pacientes.

Enquanto em Laban, o sistema de notação oferece uma rica linguagem analítica para descrever o movimento humano, mas é altamente complexo - um completo domínio da Labano- tationnormalmente exige muitas horas de estudo e sólidos conhecimentos das características do

Tabela 3.1: Resumo dos Trabalhos Relacionados

Linguagem Tipo de Representação do

Movimento

Descritores de

Alto Nível Dispositivo suportado

FAAST -

Suma et al.

(2013)

Baseado nos atributos de espaço-tempo dos membros e articulações do corpo hu- mano.

Sim Microsoft Kinect v1

GDL - Hachaj

e Ogiela

(2013)

Baseado em regras lógicas da trajetória tridimensional dos membros e articulações do corpo humano.

Não Microsoft Kinect v1

PREPOSE -

Figueiredo et al. (2014)

Baseado nos atributos de espaço-tempo dos membros e articulações do corpo hu- mano.

Sim Microsoft Kinect v2

Solução pro-

posta: DSL

LEG

Baseado nos atributos de espaço-tempo dos membros e articulações do corpo hu- mano.

Sim Microsoft Kinect v1 e v2

movimento.

Portanto, a fim de não nos distanciarmos do objetivo principal, a saber, o de desenvolver uma camada de abstração para os desenvolvedores de software que forneça uma representação de movimento acessível para usuários não-técnicos, optamos por buscar na Computação um formato relativamente simples para representar os aspectos cinemáticos do movimento, sem o uso da complexa conceituação da Biomecânica, nem a análise de alto nível de expressividade fornecida por Labanotation.

Diante da análise sobre os trabalhos relacionados, observou-se que, apesar da solução FAAST ter um ambiente gráfico para composição dos gestos, todos os trabalhos utilizam uma notação textual própria para descrição dos gestos. Outro fator concordante nestas soluções está relacionado a como o gesto é interpretado no contexto do reconhecimento. Um gesto é interpretado como uma série de poses a serem reconhecidas em seguida, ou seja, um gesto é uma coleção de poses que são executadas uma após a outra. Caso as validações sejam cumpridas o gesto é reconhecido.

Em relação ao reconhecimento, não foram encontrados trabalhos que tenham como foco propor uma estrutura de representação genérica suficiente para apoiar vários dispositivos de rastreamento, o que tornaria possível reconhecer um conjunto de gestos, tendo limitação apenas as informações disponibilizadas por cada sensor. Isso motivou o desenvolvimento de uma nova linguagem que sugerisse uma solução para este problema, levando em consideração os descritores já mapeados nas soluções existentes.

4

Solução proposta: DSL LEG

Este capítulo descreve em detalhes a DSL de descrição de gestos humanos proposta neste trabalho, denominada Linguagem para Especificação de Gestos (LEG). A LEG é uma linguagem declarativa, projetada para reconhecimento de gestos usando sensores de profundidade e baseada em um modelo semântico que representa os atributos de espaço-tempo dos membros e articulações do corpo humano.

As Seções seguintes apresentam os recursos da linguagem LEG e uma série de exemplos ilustrando sua utilização. Ainda são apresentados detalhes da arquitetura e implementação da linguagem.

4.1

Requisitos da Linguagem

LEG fornece uma completa solução, que vai da descrição em alto nível do gesto até o reconhecimento em tempo de execução na aplicação. Os gestos descritos são utilizados para construir a biblioteca de gestos utilizados em determinada aplicação baseada em gestos, podendo ser os mesmos gestos reutilizados em outras aplicações.

Os principais objetivos a serem alcançados pelo projeto de LEG são:

 Tornar a descrição de um gesto mais simples quando comparado com a abordagem

de Reconhecimento por Algoritmo.

 Permitir o uso de descritores comumente conhecidos para representação de gestos.

Ao permitir uma representação de gestos sem a necessidade de conhecimento prévio de específica disciplina ou notação, os programadores tendem a tornarem-se fluentes na linguagem de forma mais rápida.

 Permitir evoluções do metamodelo de representação dos gestos. Alterações realizadas

no modelo, necessárias ao suporte de novas informações de reconhecimento, podem ser estendidas na gramática pela modificação da sintaxe da linguagem.

 Permitir o uso de estruturas de repetição para simplificação da descrição. Estruturas

de repetição reduzem a quantidade de declarações para descrição de um gesto. A LEG oferece estruturas de repetição, que serão apresentadas no decorrer deste capítulo.

 Suportar diferentes dispositivos de reconhecimento. Se o dispositivo compatível com

a linguagem for substituído por outro mais moderno ou de fabricante diferente, a sintaxe da linguagem não precisará ser refeita.

Com base nos objetivos, buscamos os requisitos para o desenvolvimento da linguagem LEG. Hoste e Signer (2014) identificaram 23 (vinte e três) critérios por meio da análise de funcionalidades comuns entre linguagens para programação de gestos. Uma vez que o nosso trabalho centra-se na especificação de gestos, priorizamos utilizar os critérios referentes a implementação de gestos como conjunto de requisitos para o desenvolvimento da linguagem. Os requisitos adotados são apresentados a seguir:

1. Modularização - Cada especificação de gesto deve ter sua descrição em contexto separado, o que permite ao desenvolvedor ter um código independente.

2. Composição - Permite a combinação de várias especificações modulares para definir gestos mais complexos, sem muito esforço adicional.

3. Customização - Esta função permite ao desenvolvedor modificar ou estender uma especificação de gesto, de modo que ele possa ser usada em um contexto diferente. 4. Legibilidade - Utilização de compreensíveis palavras-chave para tornar as especifica-

ções de gestos mais legíveis. Poucas regras de sintaxe e descrições simples aumentam a legibilidade.

5. Vinculação dinâmica - Recurso que permite aos desenvolvedores definir uma variá- vel. A variável pode representar uma especificação particular ou um valor.

6. Confiabilidade - Fornece um controle encapsulado do processamento das requisições dos fluxos de entrada para evitar desencadear uma negação de serviço quando muitas interações complexas têm de ser processadas ao mesmo tempo.

7. Especificação espacial - Provê abstrações para especificar eventos em dimensão espacial que suporte a variabilidade da execução real dos gestos.

8. Especificação temporal - Permite expressar relações de tempo entre eventos e iden- tificar se dois eventos devem (ou não devem) acontecer dentro de um determinado período de tempo.

Embora os requisitos mencionados são considerados importantes para o desenvolvimento da linguagem proposta, outros, possivelmente, também poderiam ter sido considerados, mas,

devido a limitações de tempo e escopo da proposta priorizamos estes requisitos mais do que outros. No final do Capítulo mostramos como cada requisito esperado foi posto em prática no nosso trabalho.

4.2

A Sintaxe da Linguagem

A LEG é uma linguagem declarativa com sentenças em inglês, idioma padrão no desen- volvimento de software. Não é necessário nenhum conhecimento de programação ou paradigmas avançados para utilizar a linguagem. Sua implementação permite interpretar e reconhecer computacionalmente os gestos descritos quando eles estão sendo realizados.

O código apresentado na Figura 4.1 representa um exemplo introdutório para ilustrar o uso de LEG para descrever o gesto Acenar - também conhecido como tchau, que pode ser descrito, literalmente, da seguinte forma: levantar um antebraço e posicioná-lo ao lado da cabeça, em seguida movimentá-lo para o lado esquerdo e direito duas vezes.

Figura 4.1: Exemplo de código LEG

LEG possui uma legibilidade fácil para seres humanos, utilizando termos que são comuns a maioria das pessoas para descrever o corpo humano. Cada declaração representa uma ação que compõe o gesto, e é separada por ponto e vírgula ";", além de contar com alguns recursos para interpor código, tal como chaves "{}"e parêntesis "()". A linguagem fornece ainda apoio a parâmetros de tempo que são avaliados enquanto o gesto está sendo executado. Isso é discutido com mais profundidade na Seção 4.2.

Uma diferença fundamental de LEG em relação às DSLs existentes é propor descritores do corpo humano com representação genérica suficiente para apoiar vários dispositivos de rastreamento, permitindo ao usuário ter uma descrição única para a maioria dos dispositivos.

Uma vez que a API do dispositivo a ser utilizado seja conhecida por LEG as funções matemáticas originais podem ser inferidas pelo interpretador, tornando-as descritíveis pela sintaxe e consequentemente reconhecíveis pelo framework da linguagem.

O arquivo da linguagem LEG usa formato de texto e inicia com a palavra reservada gestureseguida de um identificador. O identificador deve iniciar com uma letra (maiúscula ou minúscula) ou número, desde que não sejam palavras reservadas da linguagem (apêndice A). Em seguida, usa-se o símbolo para abertura de chave: {, indicando início do bloco de código

utilizado para descrição do gesto. O fim do bloco, e consequentemente do arquivo, é delimitado pelo fechamento das chaves, representado pelo símbolo: }.

As chaves agrupam as declarações e estruturas de repetição da linguagem LEG que seguem uma sequência padrão na interpretação das sentenças descritas. A linguagem LEG é formada por duas cláusulas principais: relation e action. Em qualquer cláusula é possível utilizar estrutura repeat e atribuição de constante. A Figura 4.2 apresenta o diagrama de sintaxe das principais cláusulas de LEG.

Figura 4.2: Diagrama de Sintaxe das Cláusulas Principais de LEG

4.2.1

A Cláusula relation

A cláusula relation descreve uma gesto ao declarar uma relação de posição entre duas partes do esqueleto humano. Para cada declaração uma relação deve estar associada, não sendo permitido mais de uma relação por declaração. As declarações são separadas por ponto e vírgula, sendo permitido o uso de constantes para associação e reuso da pose descrita. Um arquivo da linguagem LEG pode conter várias declarações de relation, e cada linha representa uma pose que compõe o gesto. A estrutura básica da declaração relation é:

JOINT RELATIONS JOINT ;

Os descritores válidos como palavras reservadas da linguagem para descrição de uma relação são:

JOINT: head, neck, torso, waist, left shoulder, right shoulder, left elbow, right elbow, left wrist, right wrist, left hand, right hand, left hip, right hip, left knee, right knee, left ankle, right ankle, left foot, right foot.

RELATIONS: to the left of, to the right of, in front of, behind, above, below.

O exemplo a seguir ilustra uma declaração simples e válida que pode ser escrita usando a cláusula relation:

right hand above head;

Como já discutido antes, um gesto é interpretado como uma série de poses a serem reconhecidas em seguida em determinado espaço de tempo, ou seja, um gesto é uma coleção de poses que são executadas uma após a outra e todas elas possuem uma margem de tempo para execução. Com o gesto descrito desta forma não há limite de tempo máximo para o usuário executar o gesto.

Nesse contexto, identificamos a necessidade de estender a declaração relation para que seja possível definir o tempo máximo e assim controlar a velocidade de execução do gesto descrito. O que também permite descrever que uma relação aconteça de forma simultânea. Portanto, além da forma básica já descrita, também é possível utilizar a seguinte estrutura alternativa:

JOINT RELATIONS JOINT ’for’ NUMERO ’seconds’ ;

O exemplo a seguir ilustra uma declaração válida para descrever o movimento do usuário levantar os dois braços de forma simultânea:

right hand above head;

1

left hand above head for 0 seconds;

2

A linha 1 descreve uma simples declaração de relation. A linha 2, o tempo máximo de execução é de 0 segundo, assim, no mesmo tempo que a pose da linha 1 for identificada, a relação da linha 2 deverá estar presente, ou seja, a mão esquerda também deve estar acima da cabeça para que o gesto seja completamente reconhecido pela aplicação.

A Figura 4.3 apresenta o diagrama de sintaxe da cláusula relation.

Figura 4.3: Diagrama de Sintaxe da Cláusula relation de LEG

A Figura 4.4 apresenta o diagrama da regra de tempo da sintaxe da cláusula relation.

4.2.2

A Cláusula action

A combinação da relação de posição entre pontos de referência do corpo humano oferece uma forma para descrição de muitos gestos humanos. No entanto, há ações do corpo humano que são específicas, e para serem descritas necessitam mais do que uma relação entre partes do corpo humano.

A cláusula action é utilizada para representar ações do corpo humano. Ela permite declarar movimentos de rotação, inclinação e pode ainda descrever o estado de mão aberta ou fechada. O diagrama da sua sintaxe pode ser observado na Figura 4.5.

Figura 4.5: Diagrama de Sintaxe da Cláusula action de LEG

A cláusula rotate é composta da palavra rotate, seguida da parte do corpo e direção de rotação. A direção pode ser à direita (right) ou à esquerda (left). Uma das direções deve ser obrigatoriamente declarada na cláusula rotate, caso contrário um erro de validação é apontado pelo interpretador de LEG.

A cláusula tilt dá suporte à descrição da inclinação de membros do corpo. Isso permite representar, por exemplo, inclinação da cabeça, ou até mesmo do corpo inteiro. É composta da palavra reservada tilt, seguida da parte do corpo e direção de inclinação que pretende-se reconhecer. As direções possíveis são: à direita (right), à esquerda (left), à frente (forward) e para trás (backward).

Além das cláusulas acima descritas, LEG permite declarar se a mão está aberta ou fechada. Para isso, utiliza-se a palavra reservada action seguida de right hand ou left hand e por último define se o estado deve ser open ou close.

As seguintes descrições são exemplos de uso da cláusula action. rotate right hand right;

1

rotate right hand left;

2

rotate left hand left;

3

rotate left hand right;

tilt torso right;

1

tilt torso to forward;

2

tilt head to backward;

3

tilt head left;

4

action right hand open;

1

action right hand close;

2

action left hand open;

3

action left hand close;

4

As 4 primeiras linhas descrevem a rotação da mão esquerda e direta nas duas direções permitidas na linguagem. O segundo conjunto de linhas é utilizado para descrever inclinação, como exemplo a cabeça e o tórax. O terceiro conjunto de linhas descrevem a ação de abrir e fechar das mãos.

4.2.3

Declaração de Constantes

O uso de constantes pode aumentar a legibilidade do código ao introduzir um mecanismo de reuso de declaração visando obter uma melhor composição para gestos complexos, que requerem muitas linhas de código. Cada declaração que compõe um gesto pode ser reutilizada através de uma constante definida.

Ao atribuir uma constante, a descrição é copiada para um identificador de valor fixo, que não pode ser alterado durante a interpretação do código, assim, não pode ser considerado uma variável dinâmica que afeta o programa em tempo de execução. As constantes atribuídas são inseridas em uma lista e sua leitura para interpretação só é realizada a partir da chamada ao identificador utilizado como constante, seguindo a ordem sequencial padrão da linguagem.

Um identificador (ID) representa o nome da constante e a declaração é passada pelo operador básico de atribuição "=". O diagrama da sintaxe pode ser observado na Figura 4.6.

Figura 4.6: Diagrama de Sintaxe da Declaração de Constantes de LEG

São exemplos de atribuição e uso de constantes o seguinte trecho de código: rightHandToRight =right hand to the left of right elbow;

1

rightHandToLeft =right hand to the right of right elbow;

2

rightHandToRight;

3

rightHandToLeft;

Nas linhas 1 e 2 é feito a atribuição utilizando os identificadores rightHandToRight e rightHandToLeft. As linhas 3 e 4 referem-se a utilização das constantes para que a declaração seja reusada várias vezes sem necessidade de reescrita da declaração. A mesma constante pode ser utilizada em qualquer outra parte dentro do bloco de declaração do arquivo de descrição.

4.2.4

Declaração Repeat

A fim de simplificar a declaração de determinados gestos que possuem repetições de cláusulas, a linguagem LEG especifica um procedimento de repetição que permite repetir determinado número de vezes uma sequência de declarações ou chamadas a constantes. Em outras palavras, a declaração repeat corresponde repetir o mesmo trecho um número X de vezes sem ter de escrever o mesmo trecho X vezes.

A sua sintaxe é formada por um bloco de código que deve estar dentro do arquivo de declaração de gesto. A linguagem permite repetir cláusulas de relation e action e chamadas a constantes. O limite de repetições deve ser descrito no início do bloco de código referente a declaração. Mais de um bloco repeat pode ser utilizado no arquivo. A Figura 4.7 apresenta o diagrama de sintaxe da declaração repeat.

Figura 4.7: Diagrama de Sintaxe da Declaração repeat de LEG

Utilizando a declaração repeat, o exemplo seguinte representa a mão movimentado-se três vezes para o lado esquerdo e direito em relação ao cotovelo.

repeat3 {

1

right hand to the left of right elbow;

2

right hand to the right of right elbow;

3

}

4

Caso a declaração repeat não seja utilizada, o trecho de código pode ser reescrito dessa forma:

rightHandToRight =right hand to the left of right elbow;

1

rightHandToLeft =right hand to the right of right elbow;

2

rightHandToRight;

3

rightHandToLeft;

rightHandToRight; 5 rightHandToLeft; 6 rightHandToRight; 7 rightHandToLeft; 8

4.2.5

Comentários

Comentários são recursos bastante utilizados quando desenvolve-se um aplicativo. O uso mais comum é deixar marcas em um determinado trecho de código do programa, pois, para outras pessoas, o código poderá não estar tão objetivo e estes comentários ajudarão a entender e lembrar os detalhes descritos.

Em LEG, os comentários seguem a mesma sintaxe e semântica de linguagens populares como Java e C#. Comentários de linha única são iniciados com barra dupla (//) e podem ser inseridos logo após uma cláusula. Comentários de múltiplas linhas podem ser inseridos utilizando o bloco de código /* ... */. A Figura 4.8 ilustra o diagrama da sintaxe para comentários da linguagem LEG.

Figura 4.8: Diagrama de Sintaxe de Comentários de LEG

São exemplos de comentários o seguinte trecho de código: right hand above head; //comentário simples

1

/* comentário com múltiplas linhas

2

também pode ser útil */

3

4.3

Implementação da Linguagem

Esta Seção apresenta uma visão geral da implementação da linguagem LEG. A versão atual de LEG é formada por dois subprojetos. O primeiro subprojeto é o núcleo da linguagem, responsável pelo serviço de reconhecimento de gesto e rastreamento do usuário através do sensor de profundidade. Esse projeto é denominado Kinect Gesture e foi desenvolvido para atuar como um modelo semântico1da linguagem, permitindo dar semântica computacional as sentenças descritas pelo código da linguagem. O segundo subprojeto refere-se à implementação do interpretador, responsável pela gramática, análise léxica/sintática e, consequentemente, pelo mapeamento das sentenças para o modelo semântico da linguagem LEG.

1No contexto de uma DSL, um modelo semântico é uma representação computacional, tal como um framework,

A implementação do núcleo da linguagem LEG utilizou um conjunto de tecnologias relacionadas a plataforma .NET da Microsoft tal como a LPPG C# e a IDE Visual Studio. LEG é compatível com qualquer aplicação que rode sobre a mesma plataforma. Assim, acreditamos que podemos atingir um maior número de usuários e desenvolvedores em comparação com outras plataformas. Além disso, recentemente, a Microsoft decidiu abrir à plataforma .NET e torná-la compatível com o Mac OS X e Linux2. No entanto, o processo de disponibilização das bibliotecas ainda está no início, mas, no futuro, poderá tornar a linguagem LEG portável para múltiplos sistemas operacionais.

A linguagem LEG possui um modelo de implementação de DSL externa. A construção do interpretador da linguagem LEG, responsável pela análise léxica e sintática, foi feito utilizando a ferramenta Another Tool For Language Recognition (ANTLR) (PARR, 2007).

As seções seguintes descrevem em detalhes a arquitetura de cada módulo e apresenta discussões sobre decisões de implementação.

4.3.1

A Arquitetura da Linguagem

A arquitetura da linguagem LEG funciona no padrão Dynamic-Link Library (DLL), o que permite seu carregamento em tempo de execução por outra aplicação que referencie seus recursos. Com o vínculo dinâmico, a linguagem LEG não precisa conhecer a aplicação final, oferecendo uma integração modular e extensível para qualquer tipo de aplicação.

A DLL da linguagem LEG é formada por dois elementos chaves: o Kinect Gesture,