Realidade Virtual
Aula 10
Remis Balaniuk
Interfaces hápticas
• Permitem simular contato físico do usuário
com objetos virtuais.
• Exige hardware específico.
• Demanda alta velocidade de
processamento.
• Implementação envolve:
– Detecção de colisão
– Cálculo de forças
– Comunicação com o(s) dispositivo(s).
Arquitetura de um sistema de
Geometria
RV háptico
-scanners
imagens
-Elementos Finitos
-Massa-mola
-LEM
30Hz
Método de
Simulação
Sólido
Embasamento
físico
forças
1KHz
Display
gráfico
Display
háptico
Simulação
em tempo real
Sólido embasamento computacional
-ultrasom
-Visual Man
Física
-elasticidade
-dureza
-densidade
-deformações
Modelo
(orgãos)
Sólido
Embasamento
médico
Modelos de interação
• As interfaces hápticas
comerciais no seu
estágio atual
permitem o contato
pontual com os
objetos virtuais.
• É como tocar a cena
virtual segurando
uma caneta.
• Funciona como um
mouse 3D.
Modelos de interação
• O modelo mais usado para simulação do
contato háptico é o proxy.
• O proxy é baseado num método chamado
“penalty-based”, ou baseado em
penalidade.
• A idéia básica é penalizar uma penetração
com uma força de reação do objeto sobre
o usuário de forma a “expulsar” o usuário
de dentro do objeto.
Modelos de interação
• Nos modelos de penalidade a força é
proporcional à penetração e sua direção é
definida pela normal do contato.
Posição do dispositivo
Força de reação
Força de reação
Modelos de interação
• Entretanto o método de penalidade não
funciona bem em algumas situações
particulares, como em objetos finos e nos
cantos onde a penetração não é bem
definida.
Posição em t0
Posição em t1
?
Modelos de interação
• Para resolver esses problemas foi
proposto uma adaptação do método de
penalidade chamado proxy.
• O proxy indica uma posição de referência
na superfície do objeto tocado pelo
dispositivo háptico (chamado de probe).
• O proxy depende da trajetória de entrada
do probe no objeto e da forma do objeto.
Proxy
• a posição do proxy é
calculada por um algoritmo
de minimização que procura
a posição mais próxima ao
probe na superfície do objeto
• o vetor formado pela
diferença entre as posições
do probe e do proxy,
multiplicado por um fator
correspondente à dureza
do objeto tocado define
a força a ser enviada ao
dispositivo háptico.
Haptics no Chai
• O Chai foi concebido com foco nas interfaces
hápticas.
• É a primeira biblioteca 3D totalmente preparada
para interagir com diversos dispositivos hápticos
reais e ainda dispõe de uma dispositivo háptico
virtual.
• Para exemplo abra o projeto “aula7.bpr” e veja
em main.cpp as rotinas:
– void __fastcall
TForm1::ToggleHapticsButtonClick(TObject
*Sender)
– void HapticLoop()
Adicionando uma interface háptica à simulação
tool = new cMeta3dofPointer(world, 0);
camera->addChild(tool);
tool->setPos(-2.0, 0.0, 0.0);
tool->setWorkspace(2.0,2.0,2.0);
// set up the device
tool->initialize();
// open communication to the device
tool->start();
// update initial orientation and position of device
tool->updatePose();
// tell the tool to show his coordinate frame so you can see
tool rotation
tool->visualizeFrames(true);
// I need to call this so the tool can update its internal
// transformations before performing collision detection, etc.
tool->computeGlobalPositions();
tool->setForcesON();
// Enable the "dynamic proxy", which will handle moving objects
cProxyPointForceAlgo* proxy = tool->getProxy();
proxy->enableDynamicProxy(true);
multi-threads
• O objeto cMeta3dofPointer quando criado
tenta se conectar através de memória
compartilhada a outro processo rodando
como servidor de um dispositivo háptico.
• O Chai prevê a comunicação com dois
tipos de dispositivos hápticos: o Phantom
e o Delta.
• Se nenhum servidor estiver ativo o objeto
cMeta3dofPointer lança o executável
dhdvirtual.exe, que é um simulador de
dispositivo háptico.
multi-threads
• Dentro da aplicação Chai é preciso lançar uma thread
que vai ficar se comunicando com o servidor háptico,
lendo a posição do dispositivo e informando as forças
calculadas:
DWORD thread_id;
::CreateThread(0, 0,
(LPTHREAD_START_ROUTINE)(HapticLoop),
this, 0, &thread_id);
// Boost thread and process priority
::SetThreadPriority(&thread_id,
THREAD_PRIORITY_ABOVE_NORMAL);
multi-threads
• Essa thread ao ser lançada chama uma rotina
chamada HapticLoop, que fará a comunicação
com o servidor através de um loop.
• Note que a aplicação poderia usar um timer,
mas como a comunicação precisa ser muito
rápida (em torno de 1KHz ou 1000 vezes por
segundo), uma thread é mais eficiente pois
pode ser configurada com alta prioridade para
ter sua velocidade garantida.
Haptic loop
• O loop háptico roda enquanto a simulação estiver ativa e
consiste de 3 passos principais:
// read position from haptic device
Form1->tool->updatePose();
// compute forces
Form1->tool->computeForces();
// send forces to haptic device
Form1->tool->applyForces();
Haptic loop
• O método updatePose() lê e atualiza a
posição do dispositivo na tela.
• O método computeForces() recalcula a
posição do proxy (para isso detecta antes
se está havendo colisão), e recalcula as
forças de interação.
• O método applyForces() envia as
forças calculadas para o dispositivo.
Haptics no Chai
• Note que a adição de haptics numa
aplicação Chai consiste basicamente em
adicionar os métodos
ToggleHapticsButtonClick(TObjec
t *Sender) e HapticLoop()ao seu
main, não exigindo nenhum outro esforço
de implementação.
Download

Rvaula10 - GEOCITIES.ws