[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