\chapter{Plataforma de Desarrollo}

Una vez que hemos detallado los requisitos y objetivos de este
proyecto, vamos a describir en este capítulo la plataforma de
desarrollo empleada, tanto hardware como software. Además,
describiremos el repertorio de bibliotecas en las que nos
hemos apoyado para la realización del proyecto. 

\section{Plataforma Hardware}

Presentamos ahora de una manera más detallada los componentes
hardware que hemos utilizado para este proyecto: un par de cámaras
para obtener las imágenes y vídeos, una solución hardware barata y de
bajo consumo para procesamiento y un dispositivo móvil inteligente de
última generación.

\subsection{Tecnología VIA: PicoITX}
\label{subsec:picoitx}

El desarrollo de este proyecto lo hemos realizado pensando en que su
ejecución se realizará en \emph{hardware} básico, de poco consumo, de
bajo coste y de limitado procesamiento. Todo ello, con el fin de
abaratar costes, optimizar algoritmos y ofrecer una solución al mayor
número potencial de usuarios.

\emph{VIA Technologies}, empresa fundada en \emph{Silicon Valley
  (Fremont, California)} se dedica a crear \emph{chipsets} y procesadores de
bajo consumo, altamente eficientes y muy integrables con otros
sistemas. A principio de los años 90 se convierte en uno de los
principales distribuidores de chipsets y procesadores de bajo consumo,
teniendo a día de hoy una oferta de soluciones muy amplia para
diversos necesidades.

Para nuestro proyecto hemos utilizado una de sus últimas soluciones
en bajo coste y consumo. Se trata de la placa \emph{Pico-ITX}
(\ref{fig:pico-itx}), cuyas dimensiones son realmente pequeñas,
\emph{10 x 7.2} cm y monta un procesador \emph{VIA C7} de 1Ghz de
velocidad. Además, esta placa nos provee de 4 conexiones USB, 1
\emph{Firewire}, 1GB de memoria RAM DDR2 533, conector \emph{SATA} donde se
ha colocado un disco duro de 120 GB de capacidad. Además, gracias a su
conexión ethernet 10/100 podremos tener conectividad con ella. Todos
estos componentes los hemos integrado en una caja especial para
\emph{Pico-ITX} denominada \emph{ARTIGO Pico-ITX} (\ref{fig:artigo})
que ofrece una mejor disipación de calor e integración de los
conectores. Este sistema completo tiene un coste aproximado de
300\euro.

\begin{figure}[htbp]
\begin{center}
\subfigure[]{\label{fig:pico-itx}\includegraphics[height=3.2cm]{img/pico-itx}}
\hspace{0.3cm}
\subfigure[]{\label{fig:artigo}\includegraphics[height=3.0cm]{img/via-artigo}}
\hspace{0.3cm}
\subfigure[]{\label{fig:artigo-montado}\includegraphics[height=3.2cm]{img/pico-artigo-montado}}
\end{center}
\caption{ Placa base \emph{Pico-itx} (a), kit ARTIGO (b) y montaje
  final (c)}
\label{fig:pico}
\end{figure}


Una de las características más importantes de este sistema y por la
cual nos hemos decantado por él, es que únicamente necesita 12V para
su correcto funcionamiento. Esto quiere decir, que podemos utilizar el
sistema enganchado a la red normal, o a una batería típica de coche de
12V dando una posibilidad muy alta de integración en cualquier
emplazamiento.


\subsection{Cámaras USB / Cámaras Inalámbricas}
\label{subsec:cameras}

Para este proyecto, como ya hemos explicado, es necesario tener un
conjunto de cámaras como sensores principales del sistema. El sistema
soporta cualquier cámara \emph{video for linux} (\emph{V4L} y
\emph{V4L2}) que es soportada por el kernel de Linux.

Para nuestros prototipos y solución final se han utilizado 2 tipos de
cámaras. La primera de ellas es la Logitech webcam Pro 9000
(\ref{fig:logitech}) que se conecta mediante USB al \emph{pico-itx} y
ofrece una tasa de flujo de vídeo de 25fps. La segunda cámara que
hemos utilizado se trata de una cámara inalámbrica
(\ref{fig:inalam}) alimentada por una pila de 4V cuya señal
analógica la convertimos en digital para que llegue al sistema a
través de conexión USB. Esta cámara ofrece resoluciones pequeñas
(320x240) pero es ideal para colocar en cualquier sitio poco accesible
y sin toma de corriente cercana.

\begin{figure}[htbp]
\begin{center}
\subfigure[]{\label{fig:logitech}\includegraphics[height=3.5cm]{img/logitech-webcam}}
\hspace{0.6cm}
\subfigure[]{\label{fig:inalam}\includegraphics[height=3.5cm]{img/cam-inalambrica}}
%\hspace{0.3cm}
%\subfigure[]{\label{fig:receiver}\includegraphics[height=3.2cm]{img/receiver}}
\end{center}
\caption{ Logitech 9000 (a), cámara inalámbrica (b)}
\label{fig:cameras}
\end{figure}


\subsection{Teléfonos Móviles}
\label{subsec:telefono-movil}

Uno de los requisitos que comentamos en la
sección~\ref{sec:requisitos} es que el sistema tendría como agente
activo un dispositivo móvil inteligente o \emph{smartphone}. A
continuación vamos a detallar el dispositivo móvil seleccionado y el
porqué de su selección.

El dispositivo móvil que hemos utilizado para este proyecto es el
\emph{smartphone} de Google denominado \emph{Nexus One} (fig.~\ref{fig:nexus}). Este
dispositivo, fabricado por \emph{HTC}, incorpora el sistema operativo
\emph{Android} del que más adelante hablaremos. El \emph{Nexus One}
dispone de una pantalla táctil de 3.7 pulgadas lo que hace realmente
fácil su uso y el de las aplicaciones. Permite una resolución de
800x480 píxeles lo que da mucho juego para mostrar información
variada del sistema. Dispone de un procesador \emph{Snapdragon} de
1Ghz y 512 MB de ROM lo que nos permite programar en un dispositivo
móvil aplicaciones bastante exigentes. Además, dispone de múltiples
conexiones para asegurar su conectividad: 2G/3G, WiFi, Bluetooth e
incorpora sensores de última generación como sensor de luz, GPS y
brújula digital.

\begin{figure}[htbp]
\begin{center}
\subfigure[]{\label{fig:nexus1}\includegraphics[height=4.5cm]{img/nexus-one}}
\hspace{0.6cm}
\subfigure[]{\label{fig:nexus2}\includegraphics[height=4.5cm]{img/nexus-one2}}
\end{center}
\caption{Nexus One, smartphone de Google fabricado por HTC.}
\label{fig:nexus}
\end{figure}

\subsubsection{Historia de los Teléfonos Android}

El primer \emph{smartphone} que comercializó Google fue \emph{HTC
  Dream} a finales del años 2008. Este teléfono llevaba \emph{Android}
como sistema operativo, que se desarrolló dentro del
marco de la OHA (\emph{Open Handset Alliance}) y a día de hoy existen
más de 200 móviles diferentes con dicho sistema. Desde luego,
parece una buena plataforma para desarrollar (gracias a que es
software libre) y para distribuir ya que poco a poco va comiendo
mercado a sus directos competidores (\emph{iPhone} y
\emph{BlackBerry}).

Por tanto, no es casualidad que se haya optado por este dispositivo y
este sistema operativo. A principios del año 2010 los responsables de
Google-Android hablaban de las ventas: más de 60.000 unidades vendidas
cada día en todo el mundo. A principios de mayo un estudio de
\emph{NDP} (fig.~\ref{fig:estudio}), grupo dedicado al consumo, mercado y
estadísticas, reveló que por primera vez las ventas de Android en
EE.UU superaron a las ventas de iPhone. Son cifras a tener en cuenta y
a estudiar ya que deseamos que este sistema, que ejecuta sobre
Android, tenga la mayor penetración posible en el mercado.


\begin{figure}[htbp]
\begin{center}
\includegraphics[height=5.5cm]{img/npd-mobile_500}
\end{center}
\caption{ Android superó en ventas al iPhone en el Q1 de 2010}
\label{fig:estudio}
\end{figure}



\section{Plataforma Software}

La implementación de este proyecto consiste en un conjunto de
componentes software que se apoyan unos en otros, ofreciendo así el
comportamiento deseado. Presentamos en esta sección el
software y librerías auxiliares que hemos utilizado para la
realización de este proyecto.

\subsection{Sistema operativo y lenguaje}

Debian\footnote{http://www.debian.org/} es una distribución basada en
GNU/Linux, de libre distribución (software libre), multitarea y
multiusuario. Concretamente hemos utilizado su versión
estable,\emph{Debian Lenny}, apoyándose en la versión
\emph{2.6.30-486} del kernel de Linux. Es un sistema operativo más que
probado en arquitecturas de 32 bits, robusto, ágil y con un número
extenso de aplicaciones y librerías instalables.

En cuanto a los lenguajes de programación utilizados, debemos
diferenciarlos dependiendo de los dispositivos utilizados. Una de las
partes importantes del sistema es la programación con el
\emph{middleware} distribuido ICE (apartado \ref{subsec:jde}). En la parte
del \emph{PicoITX} se ha desarrollado todo en C y C++, utilizando la
arquitectura JDEROBOT (apartado \ref{subsec:jde}), que permite la
reutilización o integración de partes de código gracias a la gran
comunidad que hay alrededor de estos lenguajes de programación. Por
último, en la parte del dispositivo móvil hemos utilizado \emph{JAVA}
para implementar las funcionalidades requeridas en \emph{Android}


\subsection{JDEROBOT suite y ICE} 
\label{subsec:jde}

La plataforma que hemos elegido para la realización de este proyecto
es \emph{JDEROBOT 5.0}\footnote{http://jderobot.org/}. Este entorno,
inicialmente diseñado para crear comportamientos en robots móviles, ha
sido creado y diseñado por el Grupo de
Robótica\footnote{http://www.robotica-urjc.es/} de la Universidad Rey
Juan Carlos a lo largo de más de 5 años de trabajo como proyecto de
software libre. \emph{JDEROBOT} facilita la creación de aplicaciones para que el
robot se comporte de una determinada manera y exhiba conductas
autónomas. Para ello resuelve los aspectos más generales de la
programación de robots, como son el acceso a los sensores y
actuadores, la multitarea, interfaces gráficas y las comunicaciones
entre componentes. Añadiendo a todo esto software inteligente, se puede
conseguir comportamientos avanzados. Los escenarios típicos donde
\emph{JDEROBOT} tiene un uso claro son la robótica, domótica y visión.

Desde hace bastantes años, el uso de \emph{middlewares} resulta
esencial para desarrollar aplicaciones de calidad y dedicar el
esfuerzo en la nueva funcionalidad y no en ``reinventar la
rueda''. Siguiendo esta filosofía, JDEROBOT basa su arquitectura de
comunicación en el middleware\emph{ICE} (\cite{henning04}) que le
provee de una capa de abstracción sobre la red y sus
conexiones. Gracias a este middleware se pueden distribuir
aplicaciones sin necesidad de tener un experto en redes y
comunicaciones. \emph{ICE} provee de serie la interoperabilidad entre
diferentes lenguajes, lo que ayudará en gran medida al desarrollo de
este proyecto.

La arquitectura de JDEROBOT (\cite{lobato10}) se basa en pequeñas unidades de comportamientos
denominadas \emph{componentes}. Estos componentes, interconectados
entre sí mediante \emph{ICE}, son flujos de ejecución
independientes (modulable, iterativo, y que puede ser activado o
desactivado a voluntad) con un determinado objetivo. En cada uno de
estos componentes se encapsula diferente funcionalidad que podrá ser
reutilizada en posteriores ocasiones. Para dicha reutilización es
necesario que los componentes definan un interfaz para que otros
componentes pueda interactuar con él. Siguiendo la línea de
comportamiento basados en componentes, nuestro software en este
proyecto se compondrá de 5 componentes.

La comunicación entre los componentes la provee \emph{ICE} a través de
los interfaces definidos en el lenguaje \emph{SLICE}
(\emph{Specification Language for ICE}), que ayuda a definir la manera
de comunicación y parámetros usados entre componentes. Un ejemplo de
este tipo de definición de interfaces se puede observar en el listado
\ref{list:ejemplointerfazice}. De este interfaz se pueden obtener sus
proxys en diferentes lenguajes como C++, python y JAVA entre otros.

\begin{lstlisting}[language=c++,float=htbp,caption=Definición del
  interfaz Image,label=list:ejemplointerfazice]

module jderobot{
        ...
        interface Image{
                /** 
                 * Returns the image source description.
                 */
                idempotent ImageDescription getImageDescription();

                /**
                 * Returns the latest data.
                 */
                idempotent ImageData getImageData()
                        throws DataNotExistException,
                        HardwareFailedException;
        };
\end{lstlisting}



\subsection{Android}
\label{subsec:android}

Se puede definir \emph{Android} como un conjunto de software para móviles
que incluye un sistema operativo, un \emph{middleware} y un conjunto
de aplicaciones clave. Además, dispone de un kit de desarrollo
denominado \emph{SDK Android}, que provee las herramientas y \emph{APIS}
necesarias para empezar a desarrollar aplicaciones para la plataforma
\emph{Android} usando el lenguaje de programación \emph{JAVA}

\subsubsection{Arquitectura}

La arquitectura general de \emph{Android} se basa en el kernel de
Linux como se puede observar en la figura
\ref{fig:android-arch}. \emph{Android} parte de un kernel 2.6.24 para
sustentar todos los niveles del framework. Su \emph{runtime} se basa
en una máquina virtual java, denominada \emph{DALVIK} que está
optimizada para requerir poca memoria y está diseñada para permitir
ejecutar varias instancias de la máquina virtual simultáneamente,
delegando en el sistema operativo el soporte de aislamiento
de procesos, gestión de memoria e hilos. En este mismo nivel se
encuentran las librerías del sistema típicas en entornos GNU/Linux como
por ejemplo \emph{SGL}, \emph{SSH}, \emph{OpenFL} o
\emph{libc}. Encima de esta capa se encuentra el \emph{framework},
programado en JAVA, que ofrece funcionalidad y acceso al gestor gráfico,
gestor de contenidos, diferentes controladores de teléfono,
localización y conectividad. Todo ello, permite generar
aplicaciones de una manera sencilla y que corran en un dispositivo
móvil (\cite{android2010}).

\begin{figure}[htbp]
\begin{center}
\includegraphics[height=8.0cm]{img/android-architecture}
\end{center}
\caption{Componentes generales del sistema operativo \emph{Android}}
\label{fig:android-arch}
\end{figure}


\subsubsection{Fundamentos de una aplicación Android}

La plataforma de Android proporciona diferentes componentes a la hora
de programar en función del objetivo de tu aplicación. Android provee
cuatro tipos diferentes de componentes:

\begin{itemize}
\item \emph{Activity}: Una actividad es el componente más usado en las
  aplicaciones Android. Típicamente una actividad representa una
  pantalla individual en el terminal y presenta una interfaz gráfica
  al usuario. Por ejemplo, en una aplicación de listado de teléfonos
  utilizaríamos dos actividades. Una para mostrar el listado de
  nombres y teléfonos y la segunda para mostrar la información
  detallada del contacto seleccionado. La navegación entre las
  pantallas se realiza iniciando nuevas actividades. 
  Cuando una actividad es abierta, la actividad previa es puesta en
  pausa y agregada el \emph{history stack} y no volverá al estado de
  ejecución hasta que vuelva a ser invocada.

\item \emph{Services}: Un servicio no tiene interfaz gráfica, pero puede
  ejecutarse en segundo plano por un tiempo indefinido (se asemeja
  mucho al demonio de los sistemas Linux). Por ejemplo, podemos
  utilizar un servicio para que vaya capturando cada cierto tiempo la
  posición GPS y nos avise cuando estemos cerca de algún
  amigo. Mientras tanto el usuario puede seguir realizando otras
  tareas.

\item \emph{Broadcast receivers}: Este tipo de componentes se utilizan para
  recibir y reaccionar ante ciertas notificaciones \emph{broadcast}. Este
  tipo de componentes no tienen interfaz gráfica y pueden reaccionar
  ante eventos como cambio de zona horarias, llamadas, nivel de
  batería ... Todos los \emph{receivers} heredan de la clase base
  \emph{BroadcastReceiver}.

\item \emph{Intent}: Este tipo de componentes es una clase especial que usa
  Android para moverse de una pantalla a otra. Un \emph{Intent}
  describe lo que una aplicación desea hacer. Cualquiera
  \emph{activity} puede reutilizar funcionalidades de otros
  componentes con solo hacer una solicitud en la forma de
  \emph{Intent}.

%\item Content providers: 

\end{itemize}

Para la realización de este proyecto, la aplicación Android se basa en
un conjunto de Actividades que se comunican a través de \emph{Intents}
para realizar el paso de parámetros correspondiente.


\subsubsection{Ciclo de vida de una aplicación Android}


En la mayoría de los casos, una aplicación Android ejecuta dentro de
su propio proceso Linux. El proceso es creado para ejecutar el código
de la aplicación y es el sistema quien pedirá y reclamará su memoria
para reasignarla a otra aplicación.

Una característica peculiar en Android es que el tiempo de vida de un
proceso no es controlado directamente por la aplicación. Es el sistema
quien decide y determina el tiempo de vida basándose en el uso y
capacidades del sistema.

Para determinar qué procesos deberían ser eliminados ante una
condición baja de memoria, Android prioriza los procesos bajo una
jerarquía para asignar a cada proceso una \emph{importancia} en el
sistema.

Existen diferentes procesos de acuerdo a esta jerarquía:

\begin{itemize}

\item \emph{Foreground Process}: Es un proceso de primer plano que aloja una
  \emph{activity} en la pantalla y con la que el usuario está
  interactuando (su método \emph{onResume()} ha sido llamado) ó que un
  \emph{IntentReceiver} está ejecutándose. Este tipo de procesos serán
  eliminados como último recurso si el sistema necesitase memoria.

\item \emph{Visible Process:} Es un proceso que aloja una \emph{activity}
  pero no está en primer plano (su método \emph{onPause()} ha sido
  llamado). Esto ocurre en situaciones donde la aplicación muestra una
  cuadro de diálogo para interactuar con el usuario. Este tipo de
  procesos no será eliminado a caso que sea necesaria la memoria para
  mantener a todos los procesos del primer plano corriendo.

\item \emph{Service Process:} Es un proceso que aloja un \emph{service} que
  ha sido iniciado con el método \emph{startService()}. Este tipo de
  procesos no son visibles y suelen ser importantes para el usuario
  (conexión con servidores, reproducción de música).

\item \emph{Background Process:} Es un proceso que aloja una \emph{activity}
  que no es actualmente visible para el usuario (su método
  \emph{onStop()} ha sido llamado). Normalmente la eliminación de
  estos procesos no suponen un gran impacto para la actividad del
  usuario. Es muy usual que existan numerosos procesos de este tipo en
  el sistema, por lo que el sistema mantiene una lista para asegurar
  que el último proceso visto por el usuario sea el último en
  eliminarse en caso de necesitar memoria.

\item \emph{Empty Process:} Es un proceso que no aloja ningún componente. La
  razón por la que existe este proceso es para tener una cache disponible de la
  aplicación para su próxima activación. Es común, que el sistema
  elimine este tipo de procesos con frecuencia para obtener memoria
  disponible.

\end{itemize}

En el presente proyecto, todas las actividades ejecutadas en la
aplicación \emph{Android} utilizan \emph{Foreground Process} cuando
están activas y \emph{Visible Process} cuando son llevadas a segundo
plano.

\subsubsection{Ciclo de vida de una Activity}

A continuación vamos a hablar del ciclo de vida de una \emph{Activity}
y de cómo influyen en la ejecución de la aplicación. Es muy necesario
comprender bien éste ciclo para poder aprovechar las posibilidades que
nos ofrece la arquitectura de \emph{Android}.

Toda \emph{Activity} sigue un ciclo, el paso entre esos estados se
pueden deber a la ejecución de código o a la intervención del
usuario. Como se puede observar en la figura \ref{fig:act_lifecycle},
hay estados destinados a realizar algunas acciones y algunas que,
simplemente, no se usarán nunca.

\begin{figure}[htbp]
\begin{center}
\includegraphics[height=20.0cm]{img/activity_lifecycle}
\end{center}
\caption{Esquema del ciclo de vida de una \emph{Activity}}
\label{fig:act_lifecycle}
\end{figure}

Una \emph{Activity} es una única y focalizada vista con la que el
usuario puede interactuar. Casi todas las Activity, al interactuar con
el usuario, se encargan de crear una ventana para colocar la intefaz
gráfica. \emph{Android} almacena y ordena las \emph{Activity} creadas
en una pila. Cuando una nueva Activity se crea, se coloca en lo más
alto de la pila y se convierte en la Activity en curso y la
\emph{Activity} anterior permanece justo debajo, en modo pausa, y no
volverá al frente hasta que la nueva \emph{Activity} finalice.


\subsubsection{Desarrollo de una actividad}

A la hora de programar una actividad (una pantalla) en \emph{Android}
resulta bastante sencillo debido a su arquitectura. Para ello, tenemos
que tener en cuenta que el interfaz gráfico se define en un archivo
\emph{XML} y la lógica se programa en una clase \emph{JAVA} (modelo
vista-controlador).

En el listado \ref{list:screen-xml} se muestra el código \emph{XML}
necesario para posicionar 2 botones y un texto en la pantalla.

\begin{lstlisting}[language=xml,float=htbp,caption=Layout definido en XML,label=list:screen-xml]

<?xml version='1.0' encoding='utf-8'?>
<AbsoluteLayout
  android:id='@+id/widget0'
  android:layout_width='fill_parent'
  android:layout_height='fill_parent'
  xmlns:android='http://schemas.android.com/apk/res/android'
>
    <Button
       android:id='@+id/btUpdate'
       android:layout_width='137px'
       android:layout_height='43px'
       android:text='Update GPS'
       android:layout_x='90px'
       android:layout_y='44px'
       >
    </Button>

    <TextView
      android:id='@+id/tvGPS'
      android:layout_width='202px'
      android:layout_height='44px'
      android:textSize='16sp'
      android:layout_x='52px'
      android:layout_y='119px'
      >
    </TextView>
</AbsoluteLayout>

\end{lstlisting}

La parte visual está ya definida, y por tanto lo único que queda
es programar la parte lógica en un clase en \emph{JAVA}, tal como
puede observarse en el listado \ref{list:java-class}.

\begin{lstlisting}[language=java,float=htbp,caption=Clase en Android,label=list:java-class]

public class LocationActivity extends Activity 
{
  private ProgressDialog pd;
  private Button btUpdate;
  private TextView txtLocation;
  private Location currentLocation;

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    btUpdate = (Button)this.findViewById(R.id.btUpdate);
    txtLocation = (TextView) this.findViewById(R.id.tvGPS);
  }
}

\end{lstlisting}

\newpage

\subsubsection{Entorno de programación}

\emph{Android} ofrece un conjunto de herramientas a disposición del
desarrollador que hacen más sencilla la programación en dispositivos
móviles. Para este proyecto hemos utilizado la versión 2.1 del SDK de
desarrollo\footnote{http://developer.android.com/}. Además,
\emph{Android} ofrece una extensión muy completa para el entorno de
desarrollo de \emph{Eclipse} que facilita el acceso al \emph{API}, al
emulador y al depurador. En la figura \ref{fig:android-sdk} se puede
observar el entorno de desarrollo de \emph{Eclipse} con la extensión
para \emph{Android} y el emulador arrancado.

El emulador de \emph{Android} es una herramienta muy potente, ya que
es muy fiable y con un alto porcentaje de robustez. Aunque es algo
lento, como la mayoría de los emuladores, tiene dos grandes puntos a su
favor. El primero es que puedes emular casi todas las características reales del
móvil: fallos en la red, cámara de fotos, SMS, llamadas o
posicionamiento \emph{GPS}. El segundo es su fiabilidad, aplicación
que pruebas y funciona correctamente en el emulador, lo hace igual de
bien en el dispositivo móvil real.

\begin{figure}[htbp]
\begin{center}
\includegraphics[height=8.0cm]{img/android-sdk}
\end{center}
\caption{Entorno de desarrollo \emph{Android}}
\label{fig:android-sdk}
\end{figure}



% LocalWords:  ITX

