[Jderobot-dev] Problemas con CameraServerAndroid

Oscar Garcia oscar.robotica en linaresdigital.com
Mie Feb 27 23:06:31 CET 2013


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.


More information about the Jde-developers mailing list