Академический Документы
Профессиональный Документы
Культура Документы
Abstract
We introduce in this tutorial a rapid prototyping
tool that facilitates the full-body control of games
and software. FAAST [FAAST 2011] (Flexible
Action and Articulated Skeleton Toolkit) is this
middleware that allows the integration with
Microsoft Kinect. We also present some
programming examples of Kinect control using
the Processing programming language.
Resumo
Este tutorial tem como objetivo principal
apresentar uma ferramenta de prototipao rpida
que facilita o controle de jogos e programas
atravs do uso de gestos feitos pelo corpo e
capturados por sensores de profundidade. O
FAAST [FAAST 2011] (Flexible Action and
Articulated Skeleton Toolkit) este middleware
que permite a integrao, atualmente, com o
Microsoft Kinect e similares. Tambm
apresentaremos alguns exemplos de programao
do Kinect em linguagem Processing.
Palavras-chave:
Natural
Kinect,
FAAST,
Interface
Contato:
campagnolo@tecpar.br
1. Introduo
Uma das principais caractersticas da ltima
gerao de videogames foi a revoluo
proporcionada por novas formas de interao com
2. Interfaces naturais
Uma interface natural para o usurio (NUI Natural User Interface) o prximo passo de
evoluo na maneira como um usurio interage
com o computador. Nos primeiros sistemas
computadorizados, o usurio limitava-se a
interagir com os sistemas atravs da combinao
de comandos limitados (CLI - Command Line
Interface). Neste mecanismo de interao,
caracterizado, por exemplo, pelas interfaces de
shell dos sistemas operacionais, o sistema espera
que o usurio fornea um comando, recebe o
Figura 2: Exemplos de dispositivos de interface natural: WiiMote, Playstation Eye Toy, Sega Activator e Tapete de
Dana. Abaixo, trabalhos pioneiros de Myron Krueger [Krueger 1988].
3. Arquitetura do Kinect
Neste tutorial, utilizaremos o dispositivo de
interface natural Microsoft Kinect [Microsoft
2010]. Embora este aparelho tenha sido criado
originalmente para o Microsoft XBOX, ele
facilmente integrvel a um computador pessoal
com sistemas Windows / Mac OS X ou Linux. ,
sem dvida, o aparelho de interface natural mais
vendido e popular no mundo. At maro de 2011
cerca de 10 milhes de unidades foram vendidas
[Microsoft 2011]. O Kinect destaca-se,
principalmente, por sua performance em
reconhecimento de gestos. Na prxima seo,
discorreremos brevemente sobre os seus recursos
e funcionamento bsico.
5. Instalao do FAAST
Para usar o FAAST com o Kinect ser necessria
a instalao de diversos pr-requisitos. Deve-se
destacar que cada um destes requisitos est em
suas verses preliminares e instveis. Desta
forma, ocorrendo alguma instabilidade, tente
instalar a verso anterior. Por segurana, no site
deste tutorial, colocamos as verses exatas de
cada um dos pr-requisitos.
Left Bound: 5;
Right Bound: 5;
Bottom Bound: 5;
Top Bound: 5.
6.2 Calibrao
Para calibrar, o usurio deve segurar a pose de psi
por alguns segundos. Aps detectada, exibida
uma imagem similar a Figura 8. Sem
esta
etapa de calibrao, no possvel interagir com
o FAAST. Diferente do SDK Oficial do Kinect,
sem a calibrao o esqueleto no detectado.
Nesta interface tambm possvel salvar na
memria e em arquivos os dados de calibrao de
um certo usurio.
6.3 Configuraes de mouse
O FAAST permite a associao da posio da
mo esquerda ou mo direita posio do mouse.
H dois tipos de controle de mouse: absoluto e
relativo. No caso do controle absoluto a posio
da mouse determinada a partir da posio da
mo dentro de um retngulo (bounding rectangle)
delimitado pelos parmetros Left Bound, Right
Bound, Bottom Bound e Top Bound. Cada um
destes parmetros indica a distncia entre a
origem e, respectivamente, os lados esquerdo,
Significado
lean_right
Inclinao direita
lean_forwards
Inclinao
frente
lean_backwards
turn_left
Girar esquerda
turn_right
Girar direita
left_arm_forwards
Brao
frente
left_arm_down
left_arm_up
left_arm_out
left_arm_across
Brao
esquerdo
atravs do corpo
right_arm_forwards
right_arm_down
Brao
baixo
direito para
right_arm_up
Brao
cima
direito para
right_arm_out
right_arm_across
left_foot_forwards
P esquerdo
frente
left_foot_sideways
P esquerdo ao lado
left_foot_backwards
left_foot_up
Inclinao esquerda
para
esquerdo
esquerdo
para
para
Limiar
limiar_ao
ngulo
em
graus
de
inclinao
esquerda
ngulo
em
graus
de
inclinao
direita
ngulo
em
graus
de
inclinao
para frente
ngulo
em
graus
de
inclinao
para trs
ngulo
em
graus
de
rotao
ngulo
em
graus
de
rotao
direita
Distncia em
polegadas da
mo esquerda
at o ombro
Distncia em
polegadas da
mo esquerda
at o ombro
Distncia em
polegadas da
mo esquerda
at o ombro
Distncia em
polegadas da
mo esquerda
at o ombro
Distncia em
polegadas da
mo esquerda
at o ombro
Distncia em
polegadas da
mo
direita
at o ombro
Distncia em
polegadas da
mo
direita
at o ombro
Distncia em
polegadas da
mo
direita
at o ombro
Distncia em
polegadas da
mo
direita
at o ombro
Distncia em
polegadas da
mo
direita
at o ombro
Distncia em
polegadas do
quadril
esquerdo at o
p
Distncia de
lado
em
polegadas do
quadril
esquerdo at o
p
Distncia para
trs
em
polegadas do
quadril
esquerdo at o
p
Altura
em
cima
right_foot_forwards
right_foot_sideways
P direito ao lado
right_foot_backwards
right_foot_up
jump
Pulo
crouch
Agachamento
walk
Andando
polegadas do
p esquerdo
em relao ao
p que est no
cho
Distncia em
polegadas do
quadril direito
at o p
Distncia de
lado
em
polegadas do
quadril direito
at o p
Distncia para
trs
em
polegadas do
quadril direito
at o p
Altura
em
polegadas do
p direito em
relao ao p
que est no
cho
Altura
em
polegadas dos
ps acima do
cho
Diferena
entre a altura
do usurio e o
quanto
ele
agachou em
polegadas
Altura
em
polegadas de
cada
passo
acima do cho
quando
andando na
mesma
posio.
Significado
Valores possveis
nome_evento_virtual
Tecla
pressionada
key_hold
Tecla
sendo
pressionada
mouse_click
Boto do
mouse
pressionado
mouse_double_click
Boto do
mouse
pressionado
duas vezes
mouse_hold
Boto do
mouse
sendo
pressionado
faast
Controla o
incio
da
entrada de
dados
a
partir
do
FAAST
Tecla
que
ser
pressionada uma vez
quando a ao for
detectada.
Pode ser um caractere (a,
b, c, etc), ou uma tecla
especial.
Tecla que ser mantida
pressionada enquanto a
ao
estiver
sendo
executada. Pode ser um
caractere (a, b, c, etc), ou
uma tecla especial.
left_button:
boto
esquerdo do
mouse;
right_button:
boto direito
do mouse;
middle_button:
boto
do
meio
do
mouse.
left_button:
boto
esquerdo do
mouse;
right_button:
boto direito
do mouse;
middle_button:
boto
do
meio
do
mouse.
O boto permanecer
pressionado enquanto a
ao
estiver
sendo
executada.
left_button:
boto
esquerdo do
mouse;
right_button:
boto direito
do mouse;
middle_button:
boto
do
meio
do
mouse.
pause:
interrompe
temporariame
nte
a
execuo do
emulador;
resume:
continua
a
execuo, se
em modo de
pausa.
stop: sai do
emulador.
Significado
swipe_up
circle
Rolagem
cima
Rolagem
cima
Rolagem
esquerda
Rolagem
direita
Crculo
wave
Onda
swipe_down
swipe_left
swipe_right
Empurrar
para
para
para
para
Limiar
limiar_ao
Velocidade
em
polegadas por segundo
Velocidade
em
polegadas por segundo
Velocidade
em
polegadas por segundo
Velocidade
em
polegadas por segundo
Velocidade
em
polegadas por segundo
Raio do crculo feito em
polegadas
Deixar como zero, liga
o reconhecimento
Ao
reconhecer
alguma
das
aes
programadas, um evento de teclado ou mouse
disparado. A tabela seguinte sumariza os
possveis tipos de evento e valores possveis para
10
import SimpleOpenNI.*;
SimpleOpenNI context;
import SimpleOpenNI.*;
SimpleOpenNI context;
void setup()
{
// Cria a instncia do objeto associado
// ao Kinect
context = new SimpleOpenNI(this);
// Habilita a gerao do mapa de
// profundidade
context.enableDepth();
// Habilita a gerao da imagem RGB
context.enableRGB();
// Habilita a obteno da informao do
// usurio
context.enableScene();
// Faz com que o tamanho da tela
// permita a exibio da imagem de
// profundidade e RGB
size(context.depthWidth()*3,
context.depthHeight());
}
void setup()
{
context = new SimpleOpenNI(this);
// Habilita a profundidade e a gerao
// do esqueleto para parte de cima do
// corpo
context.enableDepth();
context.enableUser(
SimpleOpenNI.SKEL_PROFILE_UPPER);
// Cria a tela a partir do capturado pelo
// Kinect
size(context.depthWidth(),
context.depthHeight());
}
void draw()
{
// Atualiza o Kinect
context.update();
// Desenha a imagem de profundidade
image(context.depthImage(),0,0);
// Desenha a imagem RGB
image(context.rgbImage(),
context.depthWidth(),0);
// Desenha a cena com o usurio
image(context.sceneImage(),
context.depthWidth()*2,0);
}
void draw()
{
stroke(255,0,0);
strokeWeight(10);
context.update();// Atualiza a cmera
// Desenha a imagem de profundidade
image(context.depthImage(),0,0);
//Caso esteja disponvel, desenha o esqueleto
if(context.isTrackingSkeleton(1)){
drawEllipse(1);
drawSkeleton(1);
}
}
// Desenha elipse
void drawEllipse(int userId)
{
// Obtm a posio da articulao da cabea e
//a posio da articulao da mo esquerda
PVector neckPos = new PVector();
context.getJointPositionSkeleton(1,
SimpleOpenNI.SKEL_HEAD,neckPos);
PVector leftHandPos = new PVector();
context.getJointPositionSkeleton(1,
SimpleOpenNI.SKEL_LEFT_HAND,leftHandPos);
// Distncia entre as duas
float d = dist(neckPos.x, neckPos.y,
leftHandPos.x, leftHandPos.y);
// Altera a cor a partir da distncia
fill(map(d, 0, 1000, 0, 255));
ellipse(30,30, 60, 60);
}
// Desenha cada uma das partes do corpo
// (superior)
void drawSkeleton(int userId)
{
context.drawLimb(userId,
SimpleOpenNI.SKEL_HEAD,
SimpleOpenNI.SKEL_NECK);
context.drawLimb(userId,
SimpleOpenNI.SKEL_NECK,
SimpleOpenNI.SKEL_LEFT_SHOULDER);
context.drawLimb(userId,
SimpleOpenNI.SKEL_LEFT_SHOULDER,
SimpleOpenNI.SKEL_LEFT_ELBOW);
context.drawLimb(userId,
SimpleOpenNI.SKEL_LEFT_ELBOW,
SimpleOpenNI.SKEL_LEFT_HAND);
context.drawLimb(userId,
11
SimpleOpenNI.SKEL_NECK,
SimpleOpenNI.SKEL_RIGHT_SHOULDER);
context.drawLimb(userId,
SimpleOpenNI.SKEL_RIGHT_SHOULDER,
SimpleOpenNI.SKEL_RIGHT_ELBOW);
context.drawLimb(userId,
SimpleOpenNI.SKEL_RIGHT_ELBOW,
SimpleOpenNI.SKEL_RIGHT_HAND);
context.drawLimb(userId,
SimpleOpenNI.SKEL_LEFT_SHOULDER,
SimpleOpenNI.SKEL_TORSO);
context.drawLimb(userId,
SimpleOpenNI.SKEL_RIGHT_SHOULDER,
SimpleOpenNI.SKEL_TORSO);
}
// --------------// Eventos SimpleOpenNI
void onNewUser(int userId)
{
context.startPoseDetection("Psi",userId);
}
void
onEndCalibration(int
userId,
boolean
successfull)
{
if (successfull)
{
context.startTrackingSkeleton(userId);
}
else
{
context.startPoseDetection("Psi",userId);
}
}
void onStartPose(String pose,int userId)
{
context.stopPoseDetection(userId);
context.requestCalibrationSkeleton(userId,
true);
}
Agradecimentos
O autor gostaria de agradecer ao Instituto de
Tecnologia do Paran (TECPAR) e Pontifcia
Universidade Catlica do Paran (PUCPR) pelo
apoio a esta pesquisa. Tambm agradeo aos
meus alunos da Ps-Graduao de Jogos da
PUCPR pela reviso inicial deste material.
Referncias
BLAKE, J., 2011. Natural User Interfaces in .Net.
Captulo 1. p. 6. Disponvel em:
http://www.manning.com/blake/MEAP_Blake_ch0
1.pdf [Acesso em: 14 Agosto 2011]
8. Consideraes finais
Este tutorial objetivou apresentar a ferramenta
FAAST e sua possvel aplicao na criao de
jogos que utilizem como interface o Kinect.
Pode-se perceber, portanto, que o FAAST
uma ferramenta de uso bastante prtico na fase
inicial da criao de um jogo. Pode-se vislumbrar,
at mesmo, sua aplicabilidade em ambientes
relacionados prototipao rpida de jogos e
aplicativos como Game Jams e Hackdays.
Todavia, para aplicaes mais complexas, sugerese o uso de uma ferramenta mais avanada como
12
SIMPLE-OPENNI,
2011.
Disponvel
em:
http://code.google.com/p/simple-openni/ [Acesso
em: 10 Setembro 2011].
Disponvel
em:
[Acesso em: 10
13