El boton de turbo en OSX

Por , 29 febrero 2008 12:10

Y seguimos hablando de OSX, al final va a resultar que soy maquero y no lo sabia hasta ahora :D

El caso es que acabo de leer en Slashdot que OSX reduce el rendimiento de los programas que no son de Apple, donde se dice que Apple esta usando unas APIs no documentadas para darle una ventaja de rendimiento a Safari sobre otros navegadores.

Como es una cosa muy grave (a Microsoft se le han echado los perros encima por menos que eso), me he ido directamente a la fuente original de la noticia, el blog de un desarrollador de firefox, que habla de que han resuelto un problema de rendimiento en Firefox3 para OSX.

Resulta que la noticia de Slashdot es verdad y mentira al mismo tiempo:

Si, Resulta que Quartz, la capa gráfica de OSX, usa un sistema de refresco unificado que no actualiza la pantalla cuando la aplicación lo pide, sino que debe de esperar a que se produzca la siguiente actualización. Apple usa en Safari una API no documentada que permite a ese programa saltarse esa restricción y de esa manera Safari consigue un rendimiento de unos 60 fps mientras que Firefox3 (y supongo que todos los programas basados en Cocoa y que usen Quartz para presentar cosas en pantalla) se queda en unos 30.77 fps.

Y al mismo tiempo, no. Apple si que avisa de ese problema y da informacion para resolverlo (en una nota publicada hace mas de dos años), asi que las palabras “en secreto” no creo que sean acertadas en este caso, otra cosa es que no sea conocida por el común de los mortales.

La cosa es que debe de haber razones por las que Quartz imponga esas restricciones, no soy experto en ese tipo de tecnologías pero la explicación que se da en la nota técnica tiene algo de sentido y no es muy diferente a como trabajan los buffers gráficos con los que he trabajado (que no son muchos, ya digo que no soy ningún experto ni mucho menos en este tema) y al mismo tiempo proveen de dos maneras de saltarse esa limitación: Una a través de un fichero de configuración que esta perfectamente documentado y otra, de forma programática, a través de un interfaz que no esta documentado y del que no se sabe muy bien la licencia.

Una vez mas enterado de que va el asunto, me parece que el titular de Slashdot es algo tendencioso. Es cierto que este tipo de cosas solo puede ocurrir en sistemas operativos privativos. Que en linux o BSD no se podría esconder una funcionalidad así. Pero también es cierto que Apple provee de una alternativa para resolver ese problema y, como prueba de ello, Firefox3 en OSX ya no tiene esa restricción y tiene un rendimiento similar a Safari.

Entrada publicada orginalmente en Barrapunto

Servidor casero en OSX

Por , 14 febrero 2008 2:14

Buenas, el caso es que a través de una conversación con Noradrex sobre software para servidores caseros, se me ha ocurrido hacer una pequeña recopilación de lo que tengo yo en el mio.

En mi caso tengo un viejo powermac G4 graphite que rescate de la basura, así que pensé, ademas, poner links explicando como instalar dicho software en osx, algo sobre lo que a veces no hay demasiada información. Por cierto, la mayor parte de los programas que uso vienen del mundo linux o BSD, así que se puede hacer esto mismo sin ningun problema (incluso de forma muchísimo mas sencilla en muchos casos) en linux.

- Servidor Web

Algo que no demasiada gente parece saber es que OSX ya viene con un servidor apache de serie (o, si lo saben, no saben como usarlo), pero eso si, si quieres usar PHP, Perl y similares (que también vienen de serie), hay que activarlo.

Otra posibilidad es instalarte por tu cuenta un apache2 con PHP5, no es complicado de hacer y te permite tener mas control sobre que versiones o que funcionalidades instalas.

Una vez hecho esto, si se le añade una base de datos (como MySql, por ejemplo) tienes un servidor bastante majo para poner casi lo que quieras.

- Servidor FTP

Otra vez, OSX viene con un servidor FTP preinstalado que habrá que activar (en el mismo sitio que para activar y controlar el servidor web), el problema es que así por si solo no es demasiado seguro.

Si la maquina no va a estar accesible desde internet, no hay mucho problema, se activa el servidor y automáticamente todos los usuarios de la maquina pueden entrar por FTP.

En cambio, si la maquina va a estar accesible desde internet, es una buena idea el usar algo un poco mas seguro, una opción bastante decente es usar SFTP en una chroot.

- Otros

Aparte de servidor web y FTP, un servidor casero se puede usar para muchas otras cosas, en mi caso tengo instalado el mlDonkey y configurado como cliente de la red eDonkey y Bittorrent.

Elegí mlDonkey porque la otras opciones era tener instalados dos clientes diferentes (como aMule y azureus, por ejemplo) y cada uno con su GUI (algo que para un servidor no es necesario), de esta manera tengo un solo programa que se encarga de ambas redes y, como es un demonio, lo controlo desde otros ordenadores con la interfaz web o con una GUI como sancho.

Lo malo de mlDonkey es que no hay binarios para OSX, pero eso no es ningún problema, instalamos DarwinPorts y después el propio mlDonkey (“sudo port install mldonkey” y listo).

Otra cosa que uso en el día a día es un repositorio de Subversion, empece a usarlo hace tiempo para tener junto y localizable todo el código de mis proyectos personales, pruebas, tests que iba haciendo y demás. Tiempo después leí que Martin Fowler no solo hacia eso sino que también guardaba todos sus documentos (no digo que la idea sea suya ni que fuera el primero, solo que fue donde lo leí por primera vez)… la idea me pareció muy buena; estas trabajando en un ordenador, necesitas irte a otro (por la razón que sea, por ejemplo, para usar una herramienta que el SO que estas usando no tiene)…

No pasa nada, haces un commit, te vas al otro ordenador (o apagas y arrancas con otro SO), haces un update y todos tus documentos estan actualizados y listos.

Lo ultimo que uso en ese servidor es un servidor VNC para administrarlo remotamente (OSXvnc), si, se podría hacer de otras maneras, por consola a través de telnet o SSH por ejemplo, pero lo cierto es que, aunque no soy de las personas a las que les da miedo abrir la consola de comandos y editar en vi (por ejemplo), prefiero, con mucho, una GUI decente y, ademas, hay varias tareas de mantenimiento de un OSX en las que tienes que ver el escritorio (como las actualizaciones, por ejemplo).

Entrada publicada originalmente en Barrapunto

Robots y Laberintos en Java

Por , 12 diciembre 2007 11:54

<Disclaimer>
Desde hace muchos anios me interesa la robotica aunque por motivos de tiempo y espacio, la verdad es que le puedo dedicar mas bien poco tiempo, pero cuando he visto este articulo en portada y la peticion de McPolu de si alguien se atrevia a traducirlo, no me he podido resistir…

Asi que quede claro: yo no he escrito el articulo original, no he probado nada de lo que se dice en el y lo hago con fines puramente academicos

:D

Si alguien tiene algo que comentar, correcciones, notas adicionales y demas, los comentarios estan abiertos, aunque a partir de hoy estare unos 15 dias sin internet asi que no podre leerlos ni contestar.

y, sin mas preambulos, que lo disfruteis.
</Disclaimer>

Robots y Laberintos en Java

Los simuladores de robots pueden ser importantes herramientas de investigacicon y, como muestra el desarrollador de IBM Paul Reiners en este articulo, un camino hacia la diversion con el lenguaje de programacion Java. Descubre como crear robots virtuales que buscan fuentes de luz y resuelven laberintos usando Simbad, un simulador de robots open source basado en la tecnologia Java 3D, para realizar disenios de robots basados en el concepto de arquitectura de subsuncion[1]

Introduccion

La robotica es un campo que dejo de pertenecer a la ciencia-ficcion hace tiempo para pasar a formar parte de los avances de la automatizacion industrial, cuidados medicos, exploracion espacial y otras aplicaciones. Los simuladores de robots por software no solo simplifican el trabajo de desarrollo para los ingenieros en robotica, tambien proveen a los investigadores de una herramienta para estudiar algoritmos de inteligencia artificial y aprendizaje mecanizado. Uno de esos simuladores centrados en la investigacion es el proyecto de codigo abierto Simbad, basado en la tecnologia Java3D. Este articulo muestra como programar robots virtuales usando las herramientas de Simbad para crear disenios roboticos basados en la arquitectura de subsuncion.

Este articulo comienza con una breve descripcion de la robotica y explica el concepto de arquitectura de subsuncion. Despues presenta el entorno Simbad y muestra como implementar con el una arquitectura de subsuncion. Despues, programaras un robot simple usando esta arquitectura. Para terminar, echaremos un vistazo al fascinante mundo de los laberintos y programaras un segundo robot que, a diferencia de Homer Simpson, puede encontrar la salida de un laberinto. Tus robots no seran reales, existiran dentro del mundo virtual de Simbad.

Programacion robotica

La palabra Robot no tiene una definicion universal aceptada. Para el proposito de este articulo, consideraremos que un robot tiene tres partes:

* Una serie de sensores
* Un programa que define el comportamiento del robot
* Una serie de actuadores

Robotica tradicional

En la robotica tradicional (esto es, en la robotica antes de 1986), un robot tendria un “cerebro” central que construye y mantiene un “mapa” del mundo y hace planes basados en dicho mapa. Primero, los sensores del robot, por ejemplo sensores de tacto, de luz o infrarojos, toman informacion de su entorno. El cerebro del robot fusiona toda esa informacion recogida por sus sensores y actualiza el mapa de su mundo. El robot, entonces, decide que accion tomar y la ejecuta a traves de sus actuadores. Los actuadores son, basicamente, motores y estan montados junto a los efectores[2], que interactuan con el entorno del robot. Ejemplos de efectores son ruedas y brazos. (El termino actuador se usa comunmente para indicar tanto actuadores como efectores)

Resumiendo, un robot tradicional toma las entradas de, posiblemente, multitud de sensores, fusiona esa informacion, actualiza su mapa del mundo, traza un plan de acuerdo al punto de vista actual del mundo y despues actua. Aun asi, este metodo es problematico, para empezar porque es computacionalmente intensivo, pero tambien porque mantener un mapa del mundo es dificil porque el mundo esta continuamente cambiando. Ademas, muchos organismos, como los insectos, viven sin un mapa de su mundo externo y hasta sin memoria. Es quizas mejor intentar emularlos? Estos problemas dieron lugar a un nuevo estilo de robotica, llamada robotica basada en el comportamiento (BBR), BBR es, quizas, la filosofia dominante en los laboratorios de robotica actuales.

Arquitectura de Subsuncion

La BBR puede ser implementada usando una arquitectura de subsuncion. Su inventor, Rodney A. Brooks, ahora jefe del laboratorio de IA del MIT, la introdujo en su articulo de 1986, “Los elefantes no juegan al ajedrez”. Los robots basados en el comportamiento se construyen basados en un grupo de comportamientos simples e independientes. Dichos comportamientos estan definidos por los estimulos que los activan (generalmente una lectura de los sensores) y las acciones que toman (que generalmente tienen que ver con efectores). Los comportamientos se definen en capas, unos encima de otros. Cuando dos comportamientos coinciden, un arbitro central decide cual deberia realizarse primero. El comportamiento final del robot es emergente y, de acuerdo a los defensores de la BBR, puede ser mayor que la suma de sus partes. Los comportamientos emergentes de alto nivel asumen a los de bajo nivel. Mas que intentar diseniar un robot, simplemente se definen sus comportamientos y se mira a ver que sale.

Simbad: Un entorno de simulacion de robots

Simbad permite simular robots a base de software. De acuerdo a la pagina web del proyecto, “permite a los programadores escribir sus propios controladores de robots, modificar el entorno y usar los sensores disponibles. Esta dedicado principalmente a investigadores/programadores que quieren una base simple para estudiar Inteligencia Artificial Situada, Aprendizaje Mecanizado y mas algoritmos generales de IA en el contexto de la robotica y los agentes autonomos”.

Simbad esta escrito en el lenguaje Java por Louis Hugues y Nicolas Bredeche. El proyecto, disponible en SourceForge.net, es libre para usar y distribuir de acuerdo a las condiciones de la licencia GNU GPL.

Detalles Tecnicos

Un mundo de Simbad puede contener Agentes (robots) y objetos inanimados (cajas, paredes, luces y demas). El tiempo en el mundo de Simbad esta marcado por untervalos discretos. Simbad planifica y maneja el tiempo compartido entre Agentes. Como los robots fisicos, los Agentes de Simbad tienen sensores (de distancia, tacto, luz y demas) y actuadores (normalmente ruedas). El robot puede actuar en cada intervalo de tiempo.

Los Agentes sobreescriben el metodo performBehaviour() para determinar su comportamiento. En performBehaviour() un robot puede tomar nota de las lecturas de los sensores y cambiar su velocidad de rotacion y translacion. performBehaniour() ocurre en un momento, asi que no puede ejecutar acciones como “recorre un metro hacia delante”. Para resolver esta limitacion, generalmente tendras que tomar nota del estado de tu robot. Tambien puedes usar una variable que mida el numero de intervalos que tu robot ha estado en el actual estado.

La API de Simbad

Para los ejercicios de este articulo solo tendras que conocer dos paquetes de la API de Simbad

* simbad.sim : Las clases de este paquete representan tanto a tu robot como al mundo en el que vive. Incluye (entre otras):
o Agent: Los Agentes son robots.
o Arch: Un arco que tu robot puede rodear o pasar por debajo
o Box: Pueden ser usados como obstaculos en el mundo de tu robot
o CameraSensor: Permite ver el mundo del robot desde su punto de vista.
o EnvironmentDescription: Representa el “mundo” al cual aniades Agentes y objetos como paredes y cajas.
o LampActuator: Una lampara que puedes aniadir a tu robot
o LightSensor: Miden la intesidad de la luz
o RangeSensorBelt: Contiene una serie de sensores de distancia.
o RobotFactory: Se usa para aniadir sensores al robot
o Wall: Otro tipo de obstaculo para el robot.
* simbad.gui : Las clases de este paquete muestran el mundo de tu robot y te permiten controlarlo. Incluye (entre otras):
o Simbad: El marco que muestra el mundo del robot, la entrada de los sensores y sus controles.

Implementar una arquitectura de subsuncion en Simbad

Para empezar a implementar una arquitectura de subsuncion en Simbad tienes que definir una subclase de Agent, llamada BehaviorBasedAgent. BehaviorBasedAgent contiene un array de comportamientos y una matriz booleana que indica que comportamientos suprimen a que otros comportamientos:

private Behavior[] behaviors;
private boolean suppresses[][];

BehaviorBasedAgent actua como un planificador de Behaviours. El siguiente codigo recorre los comportamientos (usando la variable de clase currentBehaviorIndex para tomar nota de que comportamiento deberia ir despues) y arbitra entre ellos:

protected void performBehavior() {
boolean isActive[] = new boolean[behaviors.length];
for (int i = 0; i < isActive.length; i++) {
isActive[i] = behaviors[i].isActive();
}
boolean ranABehavior = false;
while (!ranABehavior) {
boolean runCurrentBehavior = isActive[currentBehaviorIndex];
if (runCurrentBehavior) {
for (int i = 0; i < suppresses.length; i++) {
if (isActive[i] && suppresses[i][currentBehaviorIndex]) {
runCurrentBehavior = false;

break;
}
}
}

if (runCurrentBehavior) {
if (currentBehaviorIndex < behaviors.length) {
Velocities newVelocities = behaviors[currentBehaviorIndex].act();
this.setTranslationalVelocity(newVelocities .getTranslationalVelocity());
this .setRotationalVelocity(newVelocities .getRotationalVelocity());
}
ranABehavior = true;
}

if (behaviors.length > 0) {
currentBehaviorIndex = (currentBehaviorIndex + 1)
% behaviors.length;
}
}
}

Fijate en que performBehavior() sobreescribe simbad.sim.Agent.performBehavior().

Behav ior tiene dos metodos abstractos:
Behavior has two abstract methods:.

* isActive() devuelve un valor booleano dependiendo de si deberia estar activo, teniendo en cuenta el estado actual de los sensores (todos los comportamientos comparten un grupo de sensores)

* act() devuelve un par de velocidades, de translacion y de rotacion (en este orden) que indica la accion que el motor debe tomar.

Ejemplo: Un robot vagabundo en busca de luz

Ahora crearas un robo de ejemplo que tiene cuatro comportamientos (en orden de precedencia descendente), mostrado en los trozos de codigo a continuacion.

* Avoidance: Cambia la direccion despues de chocar o para evitar la colision.
* LightSeeking: Se mueve hacia la luz.
* Wandering: Cambia de direccion al azar de vez en cuando.
* StraightLine: Se mueve en una linea recta.

public boolean isActive() {
return getSensors().getBumpers().oneHasHit()
|| getSensors().getSonars().oneHasHit();
}

public Velocities act() {
double translationalVelocity = 0.8;
double rotationalVelocity = 0;
RangeSensorBelt sonars = getSensors().getSonars();
double rotationalVelocityFactor = Math.PI / 32;
if (getSensors().getBumpers().oneHasHit()) { // if ran into something
translationalVelocity = -0.1;
rotationalVelocity = Math.PI / 8
- (rotationalVelocityFactor * Math.random());
} else if (sonars.oneHasHit()) { // reads the three front quadrants
double left = sonars.getFrontLeftQuadrantMeasurement();
double right = sonars.getFrontRightQuadrantMeasurement();
double front = sonars.getFrontQuadrantMeasurement(); // if obstacle near
if ((front < 0.7) || (left < 0.7) || (right < 0.7)) {
double maxRotationalVelocity = Math.PI / 4;
if (left < right)
rotationalVelocity = -maxRotationalVelocity
- (rotationalVelocityFactor * Math.random());
else
rotationalVelocity = maxRotationalVelocity
- (rotationalVelocityFactor * Math.random());
translationalVelocity = 0;
} else {
rotationalVelocity = 0;
translationalVelocity = 0.6;
}
}

return new Velocities(translationalVelocity, rotationalVelocity);
}

public boolean isActive() {
float llum = getSensors().getLightSensorLeft().getAverageLumina nce();
float rlum = getSensors().getLightSensorRight().getAverageLumin ance();
double luminance = (llum + rlum) / 2.0; // Seek light if it’s near.
return luminance > LUMINANCE_SEEKING_MIN;
}

public Velocities act() { // turn towards light
float llum = getSensors().getLightSensorLeft().getAverageLumina nce();
float rlum = getSensors().getLightSensorRight().getAverageLumin ance();
double translationalVelocity = 0.5 / (llum + rlum);
double rotationalVelocity = (llum – rlum) * Math.PI / 4;

return new Velocities(translationalVelocity, rotationalVelocity);
}

public boolean isActive() {
return random.nextDouble() < WANDERING_PROBABILITY;
}

public Velocities act() {
return new Velocities(0.8, random.nextDouble() * 2 * Math.PI);
}

public boolean isActive() {
return true;
}

public Velocities act() {
return new Velocities(0.8, 0.0);
}

private void initBehaviorBasedAgent(BehaviorBasedAgent behaviorBasedAgent) {
Sensors sensors = behaviorBasedAgent.getSensors();
Behavior[] behaviors = { new Avoidance(sensors),
new LightSeeking(sensors), new Wandering(sensors),
new StraightLine(sensors), };
boolean subsumes[][] = { { false, true, true, true },
{ false, false, true, true }, { false, false, false, true },
{ false, false, false, false } };
behaviorBasedAgent.initBehaviors(behaviors, subsumes);
}

El metodo initBehaviorBasedAgent() especifica que comportamientos suprimen a cuales.

Fijate que aunque los comportamientos en este ejemplo tienen un orden total de precedencia (o supresion), no es necesario que sea asi.

Como ejercicio, quizas podrias probar lo siguiente:

* Aniade un comportamiento social: moverse hacia amigos y huir de enemigos.
* Aniade un comportamiento para evitar la luz.
* Aniade luces a algunos robots, para que se atraigan unos a otros.

Laberintos

“Finalmente! Sabia que podriamos solucionar este laberinto usando el algoritmo de Tremaux!” Lisa Simpson

De todos los algoritmos que solucionan laberintos, los dos mas usados consumen un espacio de memoria constante independientemente del tamanio del laberinto. Estos son “seguir paredes” y el algoritmo de Pledge (inventado por Jon Pledge en Inglaterra a los 12 anios). El algoritmo de Tremaux (el elegido por Lisa Simpson) es un algoritmo excelente pero, para simplificar, este articulo se centra en los dos anteriormente mencionados.

Siguiendo paredes

Seguir paredes es un algortimo de laberitnos simple que puede que hayas aprendido de ninio. todo lo que tienes que hacer para solucionar un laberinto usando este algortimo es mantener tu mano izquierda en la pared izquierda (o la mano derecha en la pared derecha) y simplemente seguir hasta que salgas del laberinto. Es facil ver que este algoritmo siempre funciona si el laberinto tiene una entrada y una salida en el borde. Sin embargo, si el final esta en una isla, una parte del laberinto que esta desconectada del resto este algoritmo no puede encontrar una solucion porque no puede “saltar” a la isla.

El algortimo de Pledge

El algortimo de Pledge es mas sofisticado que el de seguir paredes y resuelve un grupo mayor de laberintos porque permite saltar entre islas. La idea basica del algoritmo de Pledge es que tienes que tomar una direccion absoluta (como norte, sur, este u oeste) y tratar de ir siempre en dicha direccion. Llamaremos a esta direccion la direccion favorita. Cuando te encuentres con un muro, giras a la derecha y sigues las paredes con la mano derecha hasta que vuelvas a estar en la direccion favorita y la suma total de giros sea cero (giros en el sentido de las agujas del reloj son considerados negativos y los contrarios a las agujas del reloj, positivos). En ese punto, continuas recto en la direccion favorita y vuelta a empezar. El requisito de que los giros sumen cero son necesarios para que no te quedes atrapado en ciertos bucles, como por ejemplo uno con forma parecida a la letra G (intentalo sobre el papel para ver de que hablo)

Algernon: Un robot solucionador de laberintos

Es hora de asombrar a tus amigos y construir un robot solucionador de laberintos llamado Algernon

Diseniando el robot

Para implementar tanto a un seguidor de paredes como el algoritmo de Pledge, necesitas saber cuando se llega a una interseccion y las direcciones de los pasillos que salen de ella.

Hay mas de una manera de conseguir esto, pero en este caso lo haras montando un sonar en el lado derecho del robot. Este sensor te avisara cuando el laberinto tenga pasillos que salen de la derecha. Para saber cuando se llega a un callejon sin salida (esto es, cuando el robot choca con una pared), necesitaras aniadir sensores de tacto en la parte delantera del robot.

Programando “Seguir Paredes”

Algernon se programa usando el paquete algernon.subsumption, Algernon es bastante simple, comparado con otros robots y podrias programarle directamente de una manera procedural. Sin embargo, usando programacion subsumida hace que el codigo sea mucho mas claro, mas modular y mas facil de entender hasta en un robot tan simple como este.

Para simplificar la implementacion de algoritmo, asumire que las paredes estan puestas en angulos rectos. Asi todos los giros del robot seran de 90 grados hacia la derecha o de 90 grados a la izquierda.

Si te basas en el algoritmo de seguir paredes (usando la mano derecha), veras que se puede descomponer en cuatro comportamientos

* Ir recto
* Cuando chocas con una pared, girar a la izquierda
* Si ves un pasillo a la derecha, girar a la derecha.
* Parar cuando llegues al final.

Necesitaras decidir la prioridad de los cuatro comportamientos. La anterior lista es correcta en orden de prioridad decreciente. Al final tendras cuatro clases, cada una de ellas extendera Behavior.

* GoStraight
* TurnRight
* TurnLeft
* ReachGoal

GoStraight. TRANSLATIONAL_VELOCITY es una constante inicializada a 0.4):

public boolean isActive() {
return true;
}

public Velocities act() {
double rotationalVelocity = 0.0;

return new Velocities(TRANSLATIONAL_VELOCITY, rotationalVelocity);
}

TurnRight. getRotationCount() devuelve el numero de intervalos (ticks) del reloj que haran falta para girar 90 grados usando la velocidad rotacional que estes usando:

public boolean isActive() {
if (turningRightCount > 0) {
return true;
}

RangeSensorBelt bumpers = getSensors().getBumpers(); // Check the front bumper.
if (bumpers.hasHit(0)) {
backingUpCount = 10;
turningRightCount = getRotationCount();

return true;
} else {
return false;
}
}

public Velocities act() {
if (backingUpCount > 0) { // We back up a bit (we just ran into a wall) before turning right.
backingUpCount–;

return new Velocities(-TRANSLATIONAL_VELOCITY, 0.0);
} else {
turningRightCount–;

return new Velocities(0.0, -Math.PI / 2);
}
}

Cuando Algernon gira a la derecha, primero avanza un poco para que su parte trasera no choque con la pared a su derecha. Despues gira a la derecha y, finalmente, necesita avanzar un poco para que la pared este a su derecha.

public boolean isActive() {
if (postGoingForwardCount > 0) {
return true;
}

RangeSensorBelt sonars = getSensors().getSonars(); // Check the sonar on the left.
if (sonars.getMeasurement(1) > 1.0) { // There is a passageway to the left.
preGoingForwardCount = 20;
postGoingForwardCount = 40;
turnLeftCount = getRotationCount();

return true;
} else {
return false;
}
}

public Velocities act() {
if (preGoingForwardCount > 0) {
preGoingForwardCount–;

return new Velocities(TRANSLATIONAL_VELOCITY, 0.0);
} else if (turnLeftCount > 0) {
turnLeftCount–;

return new Velocities(0.0, Math.PI / 2);
} else {
postGoingForwardCount–;

return new Velocities(TRANSLATIONAL_VELOCITY, 0.0);
}
}

ReachGoal:

public boolean isActive() {
RangeSensorBelt sonars = getSensors().getSonars(); // Is there open space all around us? That is, are we out of the maze?
double clearDistance = 1.2;
return sonars.getMeasurement(0) > clearDistance
&& sonars.getMeasurement(1) > clearDistance
&& sonars.getMeasurement(3) > clearDistance
&& sonars.getMeasurement(2) > clearDistance;
}

public Velocities act() { // Stop
return new Velocities(0.0, 0.0);
}

El codigo principal de los comportamientos de Algernon:

private void initBehaviorBasedAgent(
algernon.subsumption.BehaviorBasedAgent behaviorBasedAgent) {
algernon.subsumption.Sensors sensors = behaviorBasedAgent.getSensors();
algernon.subsumption.Behavior[] behaviors = { new ReachGoal(sensors),
new TurnLeft(sensors), new TurnRight(sensors),
new GoStraightAlways(sensors) };
boolean subsumes[][] = { { false, true, true, true },
{ false, false, true, true }, { false, false, false, true },
{ false, false, false, false } };
behaviorBasedAgent.initBehaviors(behaviors, subsumes);
}
Fijate que tu robot es capaz de solucionar laberintos incluso aunque las partes que lo componen no sepan nada de ellos ni de paredes. Algernon no tiene un cerebro central que calcule su salida del laberinto. Esto es lo que consigues a traves de la arquitectura de subsuncion: comportamientos complejos y con un objetivo aparente a traves de un conjunto de comportamientos simples y en capas.

Conclusion

En este articulo programaste un robot simulado. Programar robots fisicos y reales es mucho mas dificil, el mundo fisico se inmiscuye de un monton de maneras desastrosas. Por ejemplo, fue muy sencillo hacer que el robot que sigue paredes se moviera de forma paralela a la pared de la derecha. En el mundo real con sus superficies imperfecas, conseguir que tu robot no se choque con la pared de la izquierda o de la derecha, o que no se vaya muy lejos de la pared en si es toda una meta por si misma. Aunque te gusta la programacion, es posible que no disfrutes construyendo robots. Crear robots interesantes requiere de habilidades mecanicas, mas que de programacion.

Si estas interesado en construir y programar tus propios robots, LEGO Mindstorms es un kit excelente. Una alternativa mas barata que trabajar con Mindstorms es construir robots con Mecanismos Esteticos Electronicos Biologicos (BEAM). BEAM toma la idea de robots basados en comportamientos y lo lleva un paso mas alla, eliminando la programacion por entero. El comportamiento general proviene de comportamientos basados en respuesas reflejas analogas que estan construidas en el robo. Por unos 30$ podrias construir tu primer robot con un kit BEAM o a traves de planos que puedes encontrar en libros como “Absolute Beginner’s Guide to Building Robots” de Gareth Branwyn. O puedes comprar un Roomba y hackearlo.

Una de las cosas mas sorprendentes que he notado despues de programar robots y mirar por encima el codigo de los robots de otros es que puedes conseguir que un robot haga muchas cosas con solo un poco de codigo. (Sin embargo, puede que tengas que hacer un monton de apanios y de experimentacion con constantes para que ese pequenio trozo de codigo se comporte correctamente). Con el Kit Mindstorms de LEGO, puedes construir tu primer robot, siguiendo las instrucciones, en una tarde.

Hay toda una interesante subcultura basada en robots caseros para explorar: libros sobre robots, campeonatos sobre robots, videos sobre robots y, probablemente, un club de robotica cerca de tu area.

Mas informacion:
- El articulo original

Notas de la traduccion

[1] He traducido “subsumption” como “subsuncion”, pero no estoy nada convencido de que en realidad sea asi, asi que mis disculpas si lo he hecho mal y alguien que sepa mas del tema, por favor que lo diga, si quereis leer mas sobre esto, leed el articulo en la wikipedia

[2] Efectores, mas de lo mismo, yo siempre he usado “Actuadores” mientras que en el articulo se diferencia entre actuadores (actuators) y efectores (effectors), que son un subgrupo de los actuadores, si alguien conoce una traduccion mejor, por favor, que lo diga.

Arbol de navidad del comecocos

Por , 6 diciembre 2007 1:42

Que vergüenza, de verdad…

Vamos a ver, alguien hace un árbol de navidad ambientado en el comecocos (pac-man), lo ponen en medio de Madrid, en Azca…

y me tengo que enterar de ello a través de engadget?

pero, que clase de frikis hay por aquí?

en fin, no tengo mas información aparte de que ese árbol existe y esta en azca, no se quien lo ha puesto ni por que lo han puesto y, en estos tiempos de la PS3, Xbox 360 y demás, hasta me parece raro que hayan usado el come-cocos (me da que pocos niños que lo vean lo reconocerán, aunque los mayores estemos encantados)

pero aun así, seguro que iré allí en peregrinación (y a hacer unas fotos, que demonios) la semana que viene…

Entrada publicada originalmente en Barrapunto

Bug en Ubuntu/Discos duros puede reducir la vida de estos

Por , 31 octubre 2007 10:27

A traves de slashdot veo una noticia sobre un bug de Ubuntu que podría estar estropeando los discos duros de los portátiles.

Leyendo un resumen del asunto, parece que el problema no es tanto de Ubuntu (al menos si contamos como bug el no cambiar un valor por defecto del fabricante) como un problema de la configuración de muchos fabricantes de discos duros para portátiles.

Al parecer, el problema viene porque, por un lado, los fabricantes especifican un valor demasiado agresivo de gestión de la energía y, por otro, porque Ubuntu parece estar accediendo al disco duro de forma regular, lo que causaría un montón de encendidos/apagados en el disco duro (del orden de miles en ciertos sistemas), lo que podría reducir, en mucho, su vida.

Hay que tener en cuenta que es posible que este problema se de también en otros sistemas operativos, así que quizás no este de mas el comprobarlo, aunque no se use Ubuntu.

Entrada publicada originalmente en Barrapunto

Ha muerto Robert Jordan

Por , 18 septiembre 2007 10:41

Como no se ha hablado de esto por aquí, lo pongo en mi bitácora por si a alguien le interesa.

Robert Jordan (su nombre real era James Oliver Rigney, Jr., el otro no es sino uno de sus seudónimos mas conocidos), conocido principalmente por su saga “la rueda del tiempo” y varios de los libros de Conan, falleció el pasado 16 de septiembre después de una larga lucha tras ser diagnosticado de amiloidosis con cardiomiopatía en el 2006.

Desde aquí mi pésame a la familia del escritor que tantos buenos ratos me ha hecho pasar.

R.I.P.

mas info:
- Tributo a Robert Jordan
- Su blog personal y donde se dio la noticia

Entrada publicada originalmente en Barrapunto

lolcode

Por , 20 agosto 2007 9:44

Alguien ha pensado hacer, alguna vez, un lenguaje de programación basado en HOYGAN??

bueno, pues eso exactamente no, pero si que se esta haciendo un lenguaje basado en los lolcats, llamado LOLcode, que tiene bastante parecido con el HOYGAN (por ejemplo, empezar con “HAI” y cosas así).

A continuación, el “hola mundo”:

HAI
CAN HAS STDIO?
VISIBLE “HAI WORLD!”
KTHXBYE

Asi puesto no parece gran cosa, no? pero en cuanto se empiezan a añadir operadores, estructuras de control y demás, la cosa empieza a tomar forma:

HAI
CAN HAS STDIO?
I HAS A VAR
IM IN YR LOOP
UPZ VAR!!1
VISIBLE VAR
IZ VAR BIGR THAN 10? GTFO
KTHX
KTHXBYE

Aparte de eso, se están definiendo palabras reservadas para las construcciones if-then-else, try-catch, para entrada de datos, eventos

Incluso empieza a haber implementaciones del lenguaje, por ejemplo, esta pagina esta escrita en lolcode y se conecta con una base de datos gracias a un parseador PHP (el codigo fuente no tiene desperdicio).

En resumen, en pocos meses, el lolcode se esta convirtiendo en una fiebre a través de internet, con propuestas de libros (lolcode for dummies o la guia completa de lolcode) o noticias desde sitios “serios” como theserverside.com o microsoft (que anuncia soporte para lolcode en su nuevo cheezburger studio ;P)

Entrada publicada originalmente en Barrapunto

Dragones y Mazmorras, cuarta edicion.

Por , 17 agosto 2007 10:28

Parece ser que Wizards of the Coast, la dueña de la marca de Dungeons&Dragons (Dragones y Mazmorras) ha decidido que necesita volver a relanzar sus libros y anuncia la cuarta edición de las reglas.

Al parecer, los cambios en las reglas son simplemente mejoras de las ya existentes en vez de un nuevo sistema (como si hicieron con la tercera edición, creando el sistema D20), los libros básicos continuaran siendo los mismos: una manual del jugador (a la venta en Mayo del 2008), un libro de monstruos (en Junio) y el manual del máster (en Julio).

Entre los cambios se incluyen un nuevo sistema de encuentros y nuevos roles para los monstruos (signifique lo que signifique eso), ademas de simplificaciones que haran el juego mas rápido y fácil de aprender asi como facilitar la labor del máster…

Lo que la compañia si considera cambios revolucionarios es la manera de publicar el juego, que incluirá elementos online y recursos a través del site DnDInsider.com, por ejemplo, cada producto en papel llevara un código para activar (a un “precio nominal”) su versión digital en dicha pagina, ademas, los jugadores podrán usar herramientas y acceder a material nuevo tal y como se hacia en las revistas “Dragon” y “Dungeon” a cambio de una suscripción mensual (que todavía no se dice, aunque si que dicen que sera algo mas caro que la suscripción antigua pero mas barata que la de un MMORPG).

Las reglas se publicaran bajo la licencia Open Gaming License, que permitirá a otros editores publicar juegos y libros basados en esas mismas reglas.

A estas horas, tanto la pagina de D&D de wizards como la de DnDInsider.com están caídas, lo que si funciona son los foros de la cuarta edición.

También hablan de ello en Slashdot

Publicado originalmente en Barrapunto

Primera aplicacion de terceros para iPhone

Por , 30 julio 2007 9:31

Parece ser que un grupo de gente del iPhone Dev Wiki han conseguido desarrollar la primera aplicación casera para el iphone.

Por el momento no es gran cosa (no es mas que un “hola mundo”), pero con el código fuente y los binarios disponibles para cualquiera que quiera echarles un vistazo y un entorno de desarrollo propio, son muy buenas noticias para todo el que quiera desarrollar software para el iphone sin tener la bendición de apple, AT&T o cualquier otra compañia que lo distribuya.

PD: no, no he puesto ningún link al iPhone Dev Wiki, ellos mismos piden que no se haga, si alguien tiene verdadero interés en saber mas, se les puede encontrar en el canal #iphone del IRC o con una pequeña búsqueda en google.

Entrada publicada originalmente en Barrapunto

Timos de telefonicas

Por , 27 julio 2007 3:52

Hacia mucho que no escribía en la bitácora, pero me he encontrado un articulo como mínimo curioso en el blog del teleoperador.

Para el que no lo conozca, el teleoperador es, como su nombre indica, uno que trabaja(ba) de teleoperador y ponía en su web algunas conversaciones curiosas que había tenido, de alli paso, ademas, a contar lios con varias compañias (como Gas natural, Jazztel…).

En este caso, le ha tocado a Tele2, o mejor dicho, a uno de sus comerciales.

La conversación, en la cual el comercial intenta que le enseñe su factura de teléfono (de telefónica) con la excusa de que “los vecinos de su zona tienen derecho a que no se les cobre mantenimiento de linea” para hacer una portabilidad ilegal, no tiene desperdicio, pero os recomiendo que veáis también los dos vídeos de youtube que hay a continuación.

En realidad no son vídeos, sino simplemente la grabación de las llamadas a Tele2 y a la oficina de atención al usuario de la secretaria de estado de telecomunicaciones.

Entrada publicada originalmente en Barrapunto

Panorama Theme by Themocracy