Difference between revisions of "HectorQ-RV-proy2"

From robotica.unileon.es
Jump to: navigation, search
(FASES DEL PROYECTO)
m
 
(5 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
* '''Project Name:''' RovioCWarpProject
 
* '''Project Name:''' RovioCWarpProject
 
 
* '''Authors:'''  Héctor Quintián Pardo and Francisco J. Lera
 
* '''Authors:'''  Héctor Quintián Pardo and Francisco J. Lera
 
 
* '''Academic Year:''' 2009-2010
 
* '''Academic Year:''' 2009-2010
 
 
* '''Degree:''' Graduate
 
* '''Degree:''' Graduate
 
* '''SVN Repository:''' http://robotica.unileon.es/svn/Projects/PFC/Rovio/RovioCWrapProject
 
 
 
* '''Tags:''' Rovio, wrap  
 
* '''Tags:''' Rovio, wrap  
 
+
* '''Technologies:''' c, opencv
* '''Technology:''' c, opencv
+
* '''Status:''' Developing
 
 
* '''State:''' Developing
 
 
 
 
* '''Source License:''' [http://www.gnu.org/licenses/gpl-3.0-standalone.html GPLv3]
 
* '''Source License:''' [http://www.gnu.org/licenses/gpl-3.0-standalone.html GPLv3]
  
* '''Document License:'''
 
  
----
+
=Fases del proyecto=
  
----
+
==Inmersión en el manejo de Rovio y OpenCV==
  
== FASES DEL PROYECTO ==
+
En esta fase, simplemente se ha utilizado la documentación adjunta del Rovio, para conocer su manejo y saber así las posibilidades que ofrecía el Rovio para este proyecto, como pueden ser adquisición de imágenes, teleoperación, información de sensores...
'''1. INMERSION EN EL MANEJO DEL ROVIO Y OPENCV'''
 
  
En esta fase, simplemente se ha utilizado la documentación adjunta del Rovio, para conocer su manejo y saber así las posibilidades que ofrecía el Rovio para este proyecto, como pueden ser adquisición de imagenes, teleoperación, información de sensores...
+
En cuanto al manejo de OpenCV, en mi caso ya había trabajado previamente con él, sin embargo me documenté acerca de entre otras una función para el reconocimiento de caras en imágenes, con objeto de usarlo en el proyecto así como para extrapolarlo al reconocimiento de otros objetos, como puede ser el reconocimiento de otro Rovio para su seguimiento. Básicamente se ha utilizado la documentación presente en Willowgarage, "Learning OpenCV"[http://www.amazon.com/Learning-OpenCV-Computer-Vision-Library/dp/0596516134] y se han consultado distintos artículos referentes al reconocimiento facial, y en concreto al método de Viola and John, simplemente para la comprensión de su funcionamiento, ya que este método viene ya implementado en OpenCv.
  
En cuanto al manejo de OpenCV, en mi caso ya había trabajado previamente con él, sin embargo me documenté acerca de entre otras una función para el reconocimiento de caras en imagenes, con objeto de usarlo en el proyecto así como para extrapolarlo al reconocimiento de otros objetos, como puede ser el reconocimiento de otro Rovio para seguimiento. Basicamente se ha utilizado la documentación presente en Willowgarage, "Learning OpenCV"[http://www.amazon.com/Learning-OpenCV-Computer-Vision-Library/dp/0596516134] y se han consultado distintos articulos referentes al reconocimiento facial, y en concretro al método de Viola and John, simplemente para la comprensión de su funcionamiento, ya que este metodo viene ya implementado en OpenCv.
+
==Configuración con el Rovio==
  
'''2. CONFIGURACION CON EL ROVIO'''
+
El Rovio ha sido configurado para la comunicación con el ordenador a través de router, siguiendo los pasos indicados en la documentación para la configuración del Rovio. También existe la posibilidad de una comunicación directa con el Rovio a través de Wifi.
 +
Aunque el proyecto se ha realizado sobre sistema operativo LINUX, la configuración del Rovio se tuvo que hacer en Windows.
  
El Rovio ha sido configurado para la comunicación con el ordenador a traves de un router, simplemente siguiendo los pasos indicados en la documentación de configuración del Rovio. También existe la posibilidad de una comunicación directa con el Rovio a traves de Wifi.
+
[[Image:Rovio-Router.jpeg]]
Aunque el proyecto se ha realizado en el sistema operativo LINUX, la configuración del Rovio se tuvo que hacer en Windows.
 
  
[[Imagen:Rovio-Router.jpeg]]
+
==Obtención de imágenes==
  
 +
El proceso que se ha utilizado para tener "visión" con el Rovio ha sido el de solicitar imágenes e ir mostrándolas de forma secuencial, pudiéndose hacer a una velocidad de 12 frames/seg.
  
'''3. OBTENCION DE IMAGENES'''
+
Existe también la posibilidad de obtener vídeo del Rovio, sin embargo el formato en que es entregado el vídeo, no es soportado por OpenCv, de modo que se optó por la primera alternativa.
  
El proceso que se ha utilizado para tener "visión" con el Rovio ha sido la de solicitar imagenes e ir mostrandolas de forma secuencial, pudiendose hacer a una velocidad de 12 frames/seg.
+
Para obtener imágenes del Rovio lo normal es escribir en la línea del navegador la siguiente instrucción:
 +
    192.168.1.100/Jpeg/CamImg.jpg              Donde 192.168.1.100 es la dirección IP asignada al Rovio por el router.
  
Existe también la posibilidad de obtener video del Rovio, sin embargo el formato en que es entregado el video, no es soportado por OpenCv, de modo que se optó por la primera alternativa.
+
COMUNICACIÓN MEDIANTE SOCKETS
  
Para obtener imagenes del roivo lo normal es escribir en la linea del navegador la siguiente instruccion:
+
La comunicación con el Rovio se realiza mediante peticiones CGI, utilizando el protocolo HTTP, para realizar el negociado y controlar el flujo de comunicación, se puede utilizar el comando CURL que funciona como un navegador y es él el que realiza el negociado y controla el flujo, el problema que plantea es que tiene dependencias de librerías externas, por lo que dependería de que estas estuviesen instaladas en el equipo.
    192.168.1.100/Jpeg/CamImg.jpg              Donde 192.168.1.100 es la dirección IP asignada al rovio por el Router.
 
  
COMUNICACION MEDIANTE SOCKETS
+
Por ello en este proyecto se ha optado por utilizar sockets. Con los sockets somos nosotros quienes realizamos el negociado y controlamos el flujo de comunicación y de esta forma el programa realizado sería portable a cualquier equipo, ya que no tendría dependencias de librerías extrenas. Mediante sockets, se envía en una petición CGI con el siguiente formato, recibiendo a continuación los datos que componen la imagen:
 
 
Para la petición de imagenes se ha optado por la comunicación mediante sockets (también sería posible usar curl), ya que de esta forma el programa realizado sería portable a cualquier sistema operativo (curl sólo es valido con sockets). Mediante sockets, se envia en una petición GET el mensaje anterior, recibiendo a continuación los datos que componen la imagen:
 
 
     "GET /Jpeg/CamImg.jpg HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n",HOST
 
     "GET /Jpeg/CamImg.jpg HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n",HOST
  
 
Una vez que se han almacenado los datos que componen la imagen, tendríamos 2 posibilidades:
 
Una vez que se han almacenado los datos que componen la imagen, tendríamos 2 posibilidades:
- Guardar los datos en formato IplImage com una imagen y luego cargar dicha imagen con OpenCV.
+
- Guardar los datos en formato IplImage, como una imagen, y luego cargar dicha imagen con OpenCV.
 
- Realizar una conversión directa de los datos.
 
- Realizar una conversión directa de los datos.
  
La conversión directa requiere una implementar una función para la conversión de los datos, pero el tiempo que se tarda en obtener la imagen es menor que en el primer caso, y debido a que necesitamos la mayor rapidez posible para la obtención de tiempo real, se ha utilizado la segunda opción.
+
La conversión directa requiere implementar una función para la conversión de los datos, pero el tiempo que se tarda en obtener la imagen es menor que en el primer caso. Debido a que necesitamos la mayor rapidez posible para tener tiempo real, se ha utilizado la segunda opción.
 
 
<wikiflv width="640" height="480" logo="true">/videos/VideoRovio.flv</wikiflv>
 
  
 +
<wikiflv width="640" height="400" logo="true">/videos/VideoRovio.flv</wikiflv>
  
'''4. MOVIMIENTO'''
+
==Movimiento==
  
Una vez que ya disponemos de imagenes, se ha procedido a la realización de una función para el manejo del Rovio, todos los desplazamientos posibles asi como movimiento de cabeza y recepción de información de los distintos sensores.
+
Una vez que ya disponemos de imágenes, se ha procedido a la realización de una función para el manejo del Rovio, todos los desplazamientos posibles así como el movimiento de cabeza y la recepción de información de los distintos sensores.
  
El proceso es similar al de obtención de una imagen, ya que también es necesario enviar mediante un GET la siguiente instrucción:
+
El proceso es similar al de obtención de una imagen, ya que también es necesario enviar una petición CGI con la siguiente estructura:
  
     /rev.cgi?Cmd=nav&action=18&drive=d_value&speed=s_value
+
     "GET /rev.cgi?Cmd=nav&action=18&drive=d_value&speed=s_value\r\nHost: %s\r\nConnection: close\r\n\r\n"
  
 
     donde:
 
     donde:
     d_value puede tomar valores entre 0 y 18 dependiendo de la acción que se quiere que realice el rovio.
+
     d_value puede tomar valores entre 0 y 18 dependiendo de la acción que se quiera que realice el Rovio.
 
     s_value puede tomar valores entre 0 y 10, siendo 0 la máxima velocidad y 10 la mínima.
 
     s_value puede tomar valores entre 0 y 10, siendo 0 la máxima velocidad y 10 la mínima.
  
 +
==Teleoperación del Rovio==
  
'''5. TELEOPERACIÓN DEL ROVIO'''
+
Una vez que ya podemos enviar instrucciones de desplazamiento al Rovio, lo que se ha hecho es un sistema de teleoperado del Rovio mediante teclado, para ello a cada una de las teclas se le ha asignado una acción, tal y como se recoge en el API creada, al mismo tiempo que se muestra la "visión" del Rovio en tiempo real.
 
 
Una vez que ya podemos enviar instrucciones de desplazamiento al rovio, lo que se ha hecho es un sistema de teleoperado mediante teclado, para ello a cada una de las teclas se le ha asignado una accción, tal y como se recoge en la API creada, al mismo tiempo que se muestra la "visión" de Rovio en tiempo real.
 
 
 
 
 
<wikiflv width="640" height="480" logo="true">/videos/Teleoperator.flv</wikiflv>
 
  
  
 +
<wikiflv width="640" height="400" logo="true">/videos/Teleoperator.flv</wikiflv>
  
'''6. PRINCIPALES FUNCIONES IMPLEMENTADAS'''
+
==Principales funciones implementadas==
  
Una vez que ya disponemos de las herramientas básicas para el manejo del Rovio, lo que se ha hecho es implementarlo en funciones, de manera que de forma sencilla puedan ser llamadas, y estas devuelvan los datos necesarios, o realicen las acciones pertinentes, de forma que el proceso de envio y recepción de información sea transparente para la persona que utilice dicha función. Las principales funciones implementadas son:
+
Una vez que ya disponemos de las herramientas básicas para el manejo del Rovio, lo que se ha hecho es implementarlo en funciones, de manera que de forma sencilla puedan ser llamadas, y estas devuelvan los datos necesarios, o realicen las acciones pertinentes, siendo el proceso de envío y recepción de información transparente para quien que utilice dicha función. Las principales funciones implementadas son:
  
 
ENLACE AL API
 
ENLACE AL API
Line 91: Line 75:
 
''"rovioAccion"''
 
''"rovioAccion"''
  
Con esta función se podrá enviar ordenes cualquier tipo de desplazamiento al Rovio así como recibir imagenes del Rovio. Para ello sólo habrá que llamar a la fución pasandole un parámetro, que según la tabla presente en la API creada, indicará la acción a realizar. De este modo todo el proceso de utilización de sockets y conversión de datos en imagenes es transparente para quien use la función.
+
Con esta función se podrán enviar órdenes de cualquier tipo para desplazamiento del Rovio, así como recibir imágenes. Para ello sólo habrá que llamar a la función pasándole un parámetro, que según la tabla presente en el API creada, indicará la acción a realizar. De este modo, todo el proceso de comunicación usando sockets y la conversión de datos en imágenes, es transparente para quien use la función.
  
  
 
''"teclas"''
 
''"teclas"''
  
Se le pasa como parámetro la tecla pulsada y en función de ella envia al Rovio distintas ordenes de movimiento, la correspondencia entre el teclado y las distintas ordenes de movimiento está disponible en el API del proyecto.
+
Se le pasa como parámetro la tecla pulsada y en función de ella envía al Rovio distintas órdenes de movimiento a través de la función '''rovioAccion''', la correspondencia entre el teclado y las distintas órdenes de movimiento está disponible en el API del proyecto.
  
  
Line 106: Line 90:
 
''"rovio_head_up"''
 
''"rovio_head_up"''
  
Permite levantar la cabeza del Rovio un pequeño angulo, de modo que se puedan tener posiciones intermedias de las que trae el Rovio por defecto.
+
Permite levantar la cabeza del Rovio un pequeño ángulo, de modo que se puedan tener posiciones intermedias de las que trae el Rovio por defecto.
  
  
 
''"rovio_head_down"''
 
''"rovio_head_down"''
  
Permite levantar la cabeza del Rovio un pequeño angulo, de modo que se puedan tener posiciones intermedias de las que trae el Rovio por defecto.
+
Permite bajar la cabeza del Rovio un pequeño ángulo, de modo que se puedan tener posiciones intermedias de las que trae el Rovio por defecto.
  
  
 
''"blue_lights"''
 
''"blue_lights"''
  
Enciende o apaga las luces azules de la parte superior del rovio con la combinación que se desee, es decir, 1, 2, 3, ... luces de forma individual. Para ello se necesita enviar un parámetro en forma de número hexadecimal. Los valores de dicho parametro se encuentran en el API.
+
Enciende o apaga las luces azules de la parte superior del Rovio con la combinación que se desee, es decir, 1, 2, 3, ... luces de forma individual. Para ello se necesita enviar un parámetro en forma de número hexadecimal. Los valores de dicho parámetro se encuentran en el API.
  
  
 
''"detect_and_draw"''
 
''"detect_and_draw"''
  
Detecta las carás que se encuentren delante del rovio, enmarcandolas con un cuadro rojo, y devolviendo el centroide de la cara más proxima al Rovio para que si se desea pueda hacerse un seguimiento de la misma mediante la función "tracking".
+
Detecta las caras que se encuentren delante del Rovio, enmarcándolas con un cuadro rojo, y devolviendo el centroide de la cara más próxima al Rovio para que si se desea pueda hacerse un seguimiento de la misma mediante la función "tracking".
  
  
Line 130: Line 114:
 
  (r>150)&&(g<90)&&(b<65)
 
  (r>150)&&(g<90)&&(b<65)
  
Estos valores sólo podrán ser modificados en el propio codigo de la función.
+
Estos valores sólo podrán ser modificados en el propio código de la función.
  
  
 
''"tracking"''
 
''"tracking"''
  
Realiza el seguimiento de las coordenadas que se le pasan y que identifica como centroide del objeto que se quiere seguir. El procedimiento que sigue la función es el de realizar pequeños movimientos para conseguir centrar las coordenadas del centroide en una "ventana" entorno al centro de la imagen, almacenando la dirección que sigue la pelota (derecha o izquierda), por diferencia de las posiciones entre dos imagenes consecutivas y de este modo en el momento en que se pierda la posición del objecto se sabrá la dirección que llevaba, haciendo que el Rovio inicialmente gire pocos grados (para evitar que oscile entorno al objeto) y en caso de continuar sin detectar el objecto, gire a mayor velocidad. Para más detalle consultar el API.
+
Realiza el seguimiento de las coordenadas que se le pasan como parámetro, las cuáles las interpreta como el centroide del objeto que se quiere seguir. El procedimiento que sigue la función (con el movimiento del Rovio) es el de realizar pequeños movimientos para conseguir centrar las coordenadas del centroide en una "ventana" entorno al centro de la imagen, almacenando la dirección que sigue la pelota (derecha o izquierda), por diferencia entre las posiciones de dos imágenes consecutivas. De este modo en el momento en que se pierda la posición del objeto se sabrá la dirección que llevaba, haciendo que el Rovio inicialmente gire pocos grados (para evitar que oscile entorno al objeto) y en caso de continuar sin detectar el objeto, gire a mayor velocidad. Para más detalle consultar el API.
  
  
<wikiflv width="640" height="480" logo="true">/videos/Tracking.flv</wikiflv>
+
<wikiflv width="640" height="400" logo="true">/videos/Tracking.flv</wikiflv>

Latest revision as of 10:51, 25 June 2014

  • Project Name: RovioCWarpProject
  • Authors: Héctor Quintián Pardo and Francisco J. Lera
  • Academic Year: 2009-2010
  • Degree: Graduate
  • Tags: Rovio, wrap
  • Technologies: c, opencv
  • Status: Developing
  • Source License: GPLv3


Fases del proyecto

Inmersión en el manejo de Rovio y OpenCV

En esta fase, simplemente se ha utilizado la documentación adjunta del Rovio, para conocer su manejo y saber así las posibilidades que ofrecía el Rovio para este proyecto, como pueden ser adquisición de imágenes, teleoperación, información de sensores...

En cuanto al manejo de OpenCV, en mi caso ya había trabajado previamente con él, sin embargo me documenté acerca de entre otras una función para el reconocimiento de caras en imágenes, con objeto de usarlo en el proyecto así como para extrapolarlo al reconocimiento de otros objetos, como puede ser el reconocimiento de otro Rovio para su seguimiento. Básicamente se ha utilizado la documentación presente en Willowgarage, "Learning OpenCV"[1] y se han consultado distintos artículos referentes al reconocimiento facial, y en concreto al método de Viola and John, simplemente para la comprensión de su funcionamiento, ya que este método viene ya implementado en OpenCv.

Configuración con el Rovio

El Rovio ha sido configurado para la comunicación con el ordenador a través de router, siguiendo los pasos indicados en la documentación para la configuración del Rovio. También existe la posibilidad de una comunicación directa con el Rovio a través de Wifi. Aunque el proyecto se ha realizado sobre sistema operativo LINUX, la configuración del Rovio se tuvo que hacer en Windows.

Rovio-Router.jpeg

Obtención de imágenes

El proceso que se ha utilizado para tener "visión" con el Rovio ha sido el de solicitar imágenes e ir mostrándolas de forma secuencial, pudiéndose hacer a una velocidad de 12 frames/seg.

Existe también la posibilidad de obtener vídeo del Rovio, sin embargo el formato en que es entregado el vídeo, no es soportado por OpenCv, de modo que se optó por la primera alternativa.

Para obtener imágenes del Rovio lo normal es escribir en la línea del navegador la siguiente instrucción:

   192.168.1.100/Jpeg/CamImg.jpg              Donde 192.168.1.100 es la dirección IP asignada al Rovio por el router.

COMUNICACIÓN MEDIANTE SOCKETS

La comunicación con el Rovio se realiza mediante peticiones CGI, utilizando el protocolo HTTP, para realizar el negociado y controlar el flujo de comunicación, se puede utilizar el comando CURL que funciona como un navegador y es él el que realiza el negociado y controla el flujo, el problema que plantea es que tiene dependencias de librerías externas, por lo que dependería de que estas estuviesen instaladas en el equipo.

Por ello en este proyecto se ha optado por utilizar sockets. Con los sockets somos nosotros quienes realizamos el negociado y controlamos el flujo de comunicación y de esta forma el programa realizado sería portable a cualquier equipo, ya que no tendría dependencias de librerías extrenas. Mediante sockets, se envía en una petición CGI con el siguiente formato, recibiendo a continuación los datos que componen la imagen:

   "GET /Jpeg/CamImg.jpg HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n",HOST

Una vez que se han almacenado los datos que componen la imagen, tendríamos 2 posibilidades: - Guardar los datos en formato IplImage, como una imagen, y luego cargar dicha imagen con OpenCV. - Realizar una conversión directa de los datos.

La conversión directa requiere implementar una función para la conversión de los datos, pero el tiempo que se tarda en obtener la imagen es menor que en el primer caso. Debido a que necesitamos la mayor rapidez posible para tener tiempo real, se ha utilizado la segunda opción.

<wikiflv width="640" height="400" logo="true">/videos/VideoRovio.flv</wikiflv>

Movimiento

Una vez que ya disponemos de imágenes, se ha procedido a la realización de una función para el manejo del Rovio, todos los desplazamientos posibles así como el movimiento de cabeza y la recepción de información de los distintos sensores.

El proceso es similar al de obtención de una imagen, ya que también es necesario enviar una petición CGI con la siguiente estructura:

   "GET /rev.cgi?Cmd=nav&action=18&drive=d_value&speed=s_value\r\nHost: %s\r\nConnection: close\r\n\r\n"
   donde:
   d_value puede tomar valores entre 0 y 18 dependiendo de la acción que se quiera que realice el Rovio.
   s_value puede tomar valores entre 0 y 10, siendo 0 la máxima velocidad y 10 la mínima.

Teleoperación del Rovio

Una vez que ya podemos enviar instrucciones de desplazamiento al Rovio, lo que se ha hecho es un sistema de teleoperado del Rovio mediante teclado, para ello a cada una de las teclas se le ha asignado una acción, tal y como se recoge en el API creada, al mismo tiempo que se muestra la "visión" del Rovio en tiempo real.


<wikiflv width="640" height="400" logo="true">/videos/Teleoperator.flv</wikiflv>

Principales funciones implementadas

Una vez que ya disponemos de las herramientas básicas para el manejo del Rovio, lo que se ha hecho es implementarlo en funciones, de manera que de forma sencilla puedan ser llamadas, y estas devuelvan los datos necesarios, o realicen las acciones pertinentes, siendo el proceso de envío y recepción de información transparente para quien que utilice dicha función. Las principales funciones implementadas son:

ENLACE AL API

"rovioAccion"

Con esta función se podrán enviar órdenes de cualquier tipo para desplazamiento del Rovio, así como recibir imágenes. Para ello sólo habrá que llamar a la función pasándole un parámetro, que según la tabla presente en el API creada, indicará la acción a realizar. De este modo, todo el proceso de comunicación usando sockets y la conversión de datos en imágenes, es transparente para quien use la función.


"teclas"

Se le pasa como parámetro la tecla pulsada y en función de ella envía al Rovio distintas órdenes de movimiento a través de la función rovioAccion, la correspondencia entre el teclado y las distintas órdenes de movimiento está disponible en el API del proyecto.


"turn_degrees"

Permite enviar un ángulo de giro determinado al Rovio, con ciertas salvedades debidas a la precisión del Rovio. Para más detalle consultar el API.


"rovio_head_up"

Permite levantar la cabeza del Rovio un pequeño ángulo, de modo que se puedan tener posiciones intermedias de las que trae el Rovio por defecto.


"rovio_head_down"

Permite bajar la cabeza del Rovio un pequeño ángulo, de modo que se puedan tener posiciones intermedias de las que trae el Rovio por defecto.


"blue_lights"

Enciende o apaga las luces azules de la parte superior del Rovio con la combinación que se desee, es decir, 1, 2, 3, ... luces de forma individual. Para ello se necesita enviar un parámetro en forma de número hexadecimal. Los valores de dicho parámetro se encuentran en el API.


"detect_and_draw"

Detecta las caras que se encuentren delante del Rovio, enmarcándolas con un cuadro rojo, y devolviendo el centroide de la cara más próxima al Rovio para que si se desea pueda hacerse un seguimiento de la misma mediante la función "tracking".


"centroide_pelota"

Obtiene el centroide de una pelota de muestra de color naranja, cuyos valores de RGB cumplan la siguiente condición:

(r>150)&&(g<90)&&(b<65)

Estos valores sólo podrán ser modificados en el propio código de la función.


"tracking"

Realiza el seguimiento de las coordenadas que se le pasan como parámetro, las cuáles las interpreta como el centroide del objeto que se quiere seguir. El procedimiento que sigue la función (con el movimiento del Rovio) es el de realizar pequeños movimientos para conseguir centrar las coordenadas del centroide en una "ventana" entorno al centro de la imagen, almacenando la dirección que sigue la pelota (derecha o izquierda), por diferencia entre las posiciones de dos imágenes consecutivas. De este modo en el momento en que se pierda la posición del objeto se sabrá la dirección que llevaba, haciendo que el Rovio inicialmente gire pocos grados (para evitar que oscile entorno al objeto) y en caso de continuar sin detectar el objeto, gire a mayor velocidad. Para más detalle consultar el API.


<wikiflv width="640" height="400" logo="true">/videos/Tracking.flv</wikiflv>