[Jderobot-dev] Problemas con CameraServerAndroid

JoseMaria josemaria.plaza en gmail.com
Jue Feb 28 08:48:54 CET 2013


Enhorabuena Oscar!,

mooola conectar un cameraView al servidor de imágenes corriendo en
android!. Si quieres súbelo al repositorio oficial como
android-cameraserver. Como no está orientado a pc, sino a android, no lo
integramos en la cadena de compilación habitual con sus cmakes
respectivos. Sube también al repo oficial las actualizaciones a
libcolorspaces.

Empezamos a tener una población de componentes Jderobot que corren en
android: mobileTeleoperator *1, Eldercare tiene alguno, Surveillance
también y más que están por venir. En arduino tenemos alguna cosita
también, dentro de Surveillance.

Buen trabajo,

JoseMaria
*1: igual conviene renombrar mobileTeleoperator a android-teleoperator y
cambiar teleoperatorPC a simplemente teleoperator, por tener más
coherencia de nombres.
 
On Wed, 2013-02-27 at 23:06 +0100, Oscar Garcia wrote:
> El 27/01/13 21:22, Oscar Garcia escribió:
> > Pero cuando intento conectar cameraview al servidor android me sale lo
> > siguiente:
> >
> > redstar en greystar:~/Descargas/jderobot/trunk/src/components/cameraview$
> > ./cameraview --Ice.Config=android.cfg
> > Loading glade
> > Invalid proxy
> 
> 
> ¡Conseguido! He encontrado el error. Me había empeñado en implementar 
> ImageProviderI en vez de CameraI por lo que, como es lógico, el proxy no 
> podía crearse para una clase diferente.
> 
> Lo he descubierto con wireshark, pensé en ver el tráfico de red para ver 
> en qué se diferenciaba un cameraserver en C++ con un cameraserver en 
> Android y, sorpresa, wireshark soporta decodificar tráfico ICE (aunque 
> no la carga o payload). Vi entonces que hacía un "Request 
> cameraA.ice_isA()" con carga "::jderobot::Camera".
> 
> Para asegurarme puse un Log.e(TAG, cameraA.ice_id()); para loguear en el 
> logcat el valor de mi interfaz y, como era de esperar, salía:
> 
> E/java.lang.Class(15211): ::jderobot::ImageProvider
> 
> Ahora ya sale:
> 
> E/java.lang.Class(12342): ::jderobot::Camera
> 
> Hasta ayer no me di cuenta de este detalle (de la carga), así que ayer 
> implementé la interfaz correcta y me empezó a dar otro problema la 
> aplicación:
> 
> En el PreviewCallback hacía la siguiente llamada para atender las 
> peticiones "pendientes":
>                      while ((actual = CameraI._jobs.poll()) != null) {
>                          actual.execute();
>                      }
> 
> Al ejecutar el código me salía:
> 
> FATAL EXCEPTION: main
> android.os.NetworkOnMainThreadException
>      at 
> android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1108)
>      at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:168)
>      at libcore.io.IoBridge.sendto(IoBridge.java:490)
>      at java.nio.SocketChannelImpl.writeImpl(SocketChannelImpl.java:369)
>      at java.nio.SocketChannelImpl.write(SocketChannelImpl.java:327)
>      at IceInternal.TcpTransceiver.write(TcpTransceiver.java:108)
>      at Ice.ConnectionI.sendMessage(ConnectionI.java:2064)
>      at Ice.ConnectionI.sendResponse(ConnectionI.java:801)
>      at IceInternal.IncomingAsync.__response(IncomingAsync.java:133)
>      at 
> jderobot._AMD_ImageProvider_getImageData.ice_response(_AMD_ImageProvider_getImageData.java:46)
>      at 
> com.linaresdigital.android.androidcameraserver.CameraI$Job.execute(CameraI.java:108)
>      at 
> com.linaresdigital.android.androidcameraserver.MainActivity$2.onPreviewFrame(MainActivity.java:153)
> ... etc...
> 
> Total, que busco por Internet y encuentro que el problema está en los 
> "nuevos" Android. Con mi viejo Acer Liquid A1 y su Android 2.1 no me 
> ocurría:
> http://developer.android.com/reference/android/os/StrictMode.html
> 
> Lo soluciono sacando el envío de datos fuera del UI thread:
> 
>                      new Thread(new Runnable() {
>                          public void run() {
>                              CameraI.Job actual;
>                              while ((actual = CameraI._jobs.poll()) != 
> null) {
>                                  actual.execute();
>                              }
>                          }
>                      }).start();
> 
> 
> Listo, ya tengo el AndroidCameraServer enviando "basura" si le digo que 
> envía RGB. Lo cambio a YUY2 y YCRCB y empieza a ser "algo" visible 
> (mosaicos de colores, etc).
> 
> Implemento en colorspaces el espacio de color NV21 que usa Android por 
> defecto (mejor que consumir CPU y batería en el móvil y ancho de banda 
> en la red WiFi convirtiendo el fotograma a RGB en el propio móvil).
> 
> Primer intento: fallido. Trato de usar los conversores estándar de 
> OpenCV CV_YUV420sp2RGB (casi, casi) y CV_YUV420RGB_NV21 que no está 
> implementado en la versión de OpenCV de Ubuntu 12.04, por lo que decido 
> implementar un conversor yo mismo (tras varias pruebas/error lo he 
> conseguido).
> 
> Subiré al svn, en cuanto limpie el código, todas las modificaciones (el 
> componente androidcameraserver y la librería colorspaces actualizada).
> 
> Ya podemos usar un móvil Android como cámara remota :)
> 
> Un saludo a todos.
> _______________________________________________
> Jde-developers mailing list
> Jde-developers en gsyc.es
> http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers

-- 
http://gsyc.es/jmplaza 
Universidad Rey Juan Carlos




More information about the Jde-developers mailing list