[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