Reconstruyendo Castillos

Terraza trasera de la torre del homenaje

Terraza trasera de la torre del homenaje

A veces los fines de semana parecen no prometer nada especial más allá del merecido descanso. Y resulta que te levantas y sin saber como ni porqué te encuentras frente al armario de “las cosas que nunca se sacan“, de donde por supuesto terminas sacando algo. En este caso una caja con todas las piezas de EXIN Castillos que aún conservo.

Y poco a poco, pieza a pieza… terminas reconstruyendo un castillo medieval inspirado en unas ruinas que casi me conozco de memoria. Echad un vistazo a ver si os gusta

[Re]Descubre Cosmos

CosmosHace ya más de 20 años que Carl Sagan se coló en casa de mis padres. Lo hizo en forma de libro y se hacía acompañar de trece cintas de VHS como escuderas. Por aquel entonces yo era joven e influenciable (ahora soy menos joven) y devoré aquellas cintas de vídeo (figuradamente, claro está). Estaba enamorado de la astronomía y aquella serie de documentales me abrió un universo enorme y maravilloso.

Luego desvié mi camino y me hice informático… que se la va a hacer.

Aunque desafortunadamente el gran Carl Sagan falleció en 1996, muchos ‘fans’ suyos han permanecido en la sombra para, ahora que todos sabemos de todo y nos miramos el ombligo maravillados, colarse de nuevo en nuestra casa (sin libro ni VHS) para hacernos, una vez más, descubrir el maravilloso ‘punto azul’ en el que vivimos.

Todo esto para decir que en Marzo comienza la emisión de 13 capítulos de lo que han decidido llamar “la continuación de Cosmos”. Por suerte su viuda y un antiguo alumno están metidos en la redacción de los guiones, así que tengo esperanza de poder quedarme sin respiración delante de la pantalla, como hice 20 años atrás.

Aunque parece una película de esas modernas con presupuesto desmesurado y guión ridículo, os aseguro que es un documental. Lo que pasa es que los tiempos cambian…

Nuevo número de Futuroscopias

Futuroscopias 4Hace ya casi un año os hablé de una revista de ciencia ficción en castellano: Futuroscopias. Pues bien, acaba de salir un nuevo número. Yo ya lo tengo en el Kindle a espera de tener un par de ratos tranquilos para disfrutar de una buena lectura.

Para abrir boca y animar a vuestras mentes inquietas a leer la revista, os dejo con un fragmento de la editorial: “Las distopías cotidianas

Amanece. Suena el despertador en tu smartphone e inmediatamente el sistema publica un mensaje en la red social de moda avisando de tu disponibilidad para interactuar. Tus hábitos son compartidos y se activan los mecanismos mercantiles asociados.

Una ducha rápida mientras escuchas música con tu sistema de streaming preferido. La aplicación te ofrece la música que cree que puede gustarte. No se lo has pedido, pero tus datos interesan a los ejecutivos de las grandes discográficas y ellos quieren darte la mejor oferta. Puede que hoy no compres ninguna canción, pero algún día pasarás de cliente potencial a cliente de facto.

Mientras tomas un café miras el periódico en internet y un cartel te avisa del uso de cookies en tu navegador. Nadie te avisa de los usos que van a dar a los datos recopilados durante la navegación.

Después de abrigarte dejas tu hogar y caminas hacia el suburbano. Bajas las escaleras…

Te recomiendo que descargues la revista y continúes leyendo. Toda una nota de reflexión sobre lo que somos y como vivimos. Lamentablemente, eso no es ciencia ficción…

Los amores de Brunilda: Un regalo en forma de 8 bits

brunilda_webCasi de casualidad encontré hace unos días que la gente de Retroworks nos ha traído para las vacaciones de Navidad el estreno mundial de “Los amores de Brunilda“: Un juegazo de 8 bits para el Spectrum 128k.

Y es que en este año en el que Sony y Microsoft nos han presentado la PS4 y la XBox One, en el que aparecen los televisores 4K, cuando ya tenemos en las tiendas el iPhone 5S, los primeros relojes con Android salen de la nada y Apple nos maravilla con un ordenador turbina, un equipo de programadores y aficionados españoles presentan un juego para un ordenador que dejó de venderse hace ya unos cuantos añitos.

¿Qué pasa?, ¿es que en España se sigue anclado en los años 80?. No, en este caso no (No me tiréis de la lengua….). Los Amores de Brunilda es una video-aventura que se lleva gestando tiempo (el proyecto nació hace unos años como aventura conversacional) y que demuestra que la Edad de Oro del Software Español tiene como legado un gran número de aficionados y profesionales cuyas raíces tecnológicas nacen en aquella mágica época en la que se empleaban instrucciones de 8 bits para crear maravillas del entretenimiento.

Y es que Los Amores de Brunilda hace honor a los títulos de los 80 y hace sonrojar a los “juegazos” actuales. He pasado 3 días entretenido cual niño que regresa del cole y merienda su bocata de nocilla mientras espera ansioso que termine de cargar el juego. Gráficos sencillos y música estridente para obligar a nuestras neuronas a poner cara a los personajes de una historia sencilla y atractiva.

Es cierto que en estos casos el elemento nostálgico pesa mucho. Pero pocos juegos desde los 32 bits me han hecho pasar un rato tan bueno. Y procurando ser justos, lo situaría entre las mejores aventuras vividas en un procesador de 8 bits.

Sea como fuere, si tu también disfrutaste de aquellas tardes mágicas frente a monitores de fósforo verde, si peleaste con tu hermano o tus padres por cinco minutos más y comentaste tus hazañas al día siguiente con los amigos del colegio, deja que la nostalgia te llene un momento, descarga un emulador de Spectrum y echa una partida a Los Amores de Brunilda. Para eso están las vacaciones, ¿o no?.

Y si el juego te gusta y lo disfrutas, recuerda que nunca está de más valorar el esfuerzo de la gente, bien como felicitación en su blog o en forma de donación.

Por cierto, esta es la primera vez que echo una partida al Spectrum, porque yo era (y soy) del Amstrad :-)

Entrevista para la revista divulgativa de la UNED y de la UPM

El equipo de e-pucks utilizados en los experimentos

El equipo de e-pucks utilizados en los experimentos

La robótica colaborativa es una de las áreas de esta disciplina que más disfruto. No en vano, mi proyecto fin de Máster se centraba en afrontar el reto de hacer colaborar robots sin apenas comunicaciones entre ellos.

Proyecto en el que trabajé con Félix y Javi, y del cual salieron trabajos complementarios que me he dado cuenta que debería ampliar y documentar decentemente.

Hace poco me hicieron una entrevista para la revista de divulgación científica de la UNED en la que me preguntaron por mi trabajo en robótica colaborativa. Os recomiendo que le echéis un vistazo, la podéis encontrar en la revista de la UNED y en el canal divulgativo de la UPM (versión en inglés) (más completa y con comentarios tanto de Javi como de Félix)

Actualización: Según me comenta Laura Chaparro, autora del artículo, los siguientes medios de comunicación también se han hecho eco de la noticia:

Animals

gato-app[English] Some time ago I had the opportunity to collaborate with GatoBlack Studios into the development of a small application for children: Animals. The application provides a simple interface with cute little animals that reproduce their respective sounds when you touch them.

Simple? yes. No adds, no danger buttons, no settings… leave your mobile phone into the children hands and do not worry about inappropriate content, just sounds.

By the way, check the GatoBlack Studio website, the new web is amazing.

[Español] Hace algún tiempo tuve la oportunidad de colaborar con la gente de GatoBlack Studios en un pequeño proyecto orientado a los más pequeños: Animals. La aplicación es simple a más no poder. Ofrece unos bonitos dibujos de pequeños animales que reproducen sonidos cuando los tocas.

Sin anuncios, sin botones peligrosos, sin opciones de configuración… así puedes dejar tu teléfono o tables a los niños sin preocuparte por uso el posible contenido inadecuado.

Por cierto, echa un vistazo al sitio de GatoBlack Studios, el nuevo diseño es fantástico

Debugging OpenCV images into a Qt Application

Selection_001Getting right to the point: Qt has his own event loop control. So, if you want to use the OpenCV functions to show images you will discover that they do not change. The solution is to do the debugging inside the Qt loop. How?, creating a dialog and drawing the images inside. Lets see how to do it

CVDebugSystem

This class will take control of all debug windows (yes, we want to have more than one debugging window). When we want to debug the image we are processing, we only need to call to one method of this class passing the window name (like in OpenCV imshow function) and the image we want to show.

Probably, we want to debug images from different parts of our code, and create a debug object each time we want to debug could be a problem (after debug, maybe we forget to delete this objects and the code keeps “dirty”). To solve this, we will declare CVDebugSystem as a Singleton. Now, we do not need to create CVDebugSystem objects, the class take care of all the windows and debug a image is as simple as call the method:

CVDebugSystem::getInstance().showimg("Title of debug window", image_to_debug);

The different windows are stored into a QHash list, using the window title as key.

cvdebugsystem.h

#ifndef CVDEBUGSYSTEM_H
#define CVDEBUGSYSTEM_H

#include <QHash>
#include "cvdebugwindow.h"

class CVDebugSystem
{
public:
    static CVDebugSystem &getInstance()
    {
        if(pInstance_ == NULL)
        {
            pInstance_ = new CVDebugSystem();
            atexit(&DestroySingleton);    // At exit, destroy the singleton
        }
        return *pInstance_;
    }
    ~CVDebugSystem();

private:
    // Singleton
    static CVDebugSystem* pInstance_;

    // Delete the singleton instance
    static void DestroySingleton(){
        if(pInstance_ != NULL) delete pInstance_;
    }

    // Private to ensure single instance
    CVDebugSystem();
    QHash<QString, CVDebugWindow* > mWindows;

public:
    void showimg(QString window, cv::Mat *img);
    void showimg(QString window, cv::Mat img);
};

#endif // CVDEBUGSYSTEM_H

cvdebugsystem.cpp

#include "cvdebugsystem.h"
#include <QImage>

CVDebugSystem* CVDebugSystem::pInstance_ = NULL;

CVDebugSystem::CVDebugSystem()
{
    mWindows.clear();
}

CVDebugSystem::~CVDebugSystem()
{
    QHash<QString, CVDebugWindow* >::const_iterator i = mWindows.constBegin();
     while (i != mWindows.constEnd()) {
         delete i.value();
         ++i;
     }
}

void CVDebugSystem::showimg(QString window, cv::Mat *img)
{
    if (!mWindows.contains(window))
    {
        CVDebugWindow *win = new CVDebugWindow();
        mWindows.insert(window, win);
    }
    mWindows[window]->setImage(img);
    mWindows[window]->setWindowTitle(window);
    mWindows[window]->show();
}

void CVDebugSystem::showimg(QString window, cv::Mat img)
{
    this->showimg(window, &img);
}

CVDebugWindow

This is the class that inherits from QDialog. It only has a QLabel where we draw the image. In the code attached I have included some more widgets to help me, like a “Fit the image to the window” or scale the OpenCV image to make it more clear. Usually I use the UI files, if you prefer to code the widgets it is also possible

cvdebugwindow.h

#ifndef CVDEBUGWINDOW_H
#define CVDEBUGWINDOW_H

#include <QDialog>
#include <opencv2/core/core.hpp>

namespace Ui {
class CVDebugWindow;
}

class CVDebugWindow : public QDialog
{
Q_OBJECT

public:
explicit CVDebugWindow(QWidget *parent = 0);
void setImage(cv::Mat *image);
~CVDebugWindow();

private Q_SLOTS:
void on_fitButton_toggled(bool checked);

private:
Ui::CVDebugWindow *ui;
};

#endif // CVDEBUGWINDOW_H

cvdebugwindow.cpp

#include "cvdebugwindow.h"
#include "ui_cvdebugwindow.h"

CVDebugWindow::CVDebugWindow(QWidget *parent) :
QDialog(parent),
ui(new Ui::CVDebugWindow)
{
ui->setupUi(this);
ui->label->setAlignment(Qt::AlignCenter | Qt::AlignHCenter);
}

CVDebugWindow::~CVDebugWindow()
{
delete ui;
}

void CVDebugWindow::setImage(cv::Mat *image)
{
QImage::Format format;
if (image->channels() == 1) format = QImage::Format_Mono;
else                        format = QImage::Format_RGB888;

QImage  img = QImage((const unsigned char*)(image->data),
image->cols,
image->rows,
image->step,
format).rgbSwapped();

QImage aux;
if (ui->fitButton->isChecked())
{
aux = img.scaled(ui->label->size());
}
else
{
if (ui->scaleFactor->value() != 1)
{
aux = img.scaled(img.size()*ui->scaleFactor->value());
}
else
aux = img;
}

ui->label->setPixmap(QPixmap::fromImage(aux));
}

void CVDebugWindow::on_fitButton_toggled(bool checked)
{
if (checked) ui->scaleFactor->setEnabled(false);
else ui->scaleFactor->setEnabled(true);
}

In GitHub you can find the repository with the code. Improvements are welcome.

Nao Robot: Visual debugging of the vision variables

One of the more interesting things of the Nao Robot SDK is, probably,  the Vision Module and all the work it can do for you. For example, Nao can detect faces and provide you the coordinates of the different faces with a lot of face features. However, I have found  few information about how to use the variables provided by Nao, so I have needed to use the old method of try/error to understand the variables.

Accessing the variables

Thanks to the ALMemoryProxy accessing to the FaceDetected variable is very easy:

mMemoryProxy = new AL::ALMemoryProxy("NaoRobotsIP", 9559);
AL::ALValue face = mMemoryProxy->getData("FaceDetected");

Understanding the variables

(Disclaimer) I have not found official documentation about what the information inside FaceDetected means and this explanation is based in my experiments and maybe I have get some mistakes.

All parameters have the centre of the image as origin and they have not units. We will pay attention only to the ShapeInfo variable:

  • alpha: Vertical offset in relation to the image height with origin in the centre of the image
  • beta: Horizontal offset in relation to the image width with origin in the centre of the image
  • sizeX: The face size in relation to the image height. It should be the width (as we are talking about the X axis), but in this case the rectangle around the face is wider than tall
  • sizeY: The face size in relation with the width
Reference system for the Vision Module variables

Reference system for the Vision Module variables

Results

Once we have transformed the variables provided by Nao, we can draw a simple rectangle around the faces detected using OpenCV.

// Face Detected [1]/ First face [0]/ Shape Info [0]/ Alpha [1]
float alpha = face[1][0][0][1];
float beta = face[1][0][0][2];
float sx = face[1][0][0][3];
float sy = face[1][0][0][4];

// sizeX / sizeY are the face size in relation to the image
float sizeX = mImageHeight * sx;
float sizeY = mImageWidth * sy;

// Centre of face into the image
float x = mImageWidth / 2 - mImageWidth * alpha;
float y = mImageHeight / 2 - mImageHeight * beta;

cv::Point p1(x - (sizeX / 2), y - (sizeY / 2));
cv::Point p2(x + (sizeX / 2), y + (sizeY / 2));

cv::rectangle(mImage, p1, p2, cv::Scalar(255,255,255));

Nao camera debugging 1

Conclusions

The docs explain that the face detection algorithm is provided by OKI. It can save you a lot of work (computational work) if you want to avoid to transfer images over the network and use the OpenCV classic face detection algorithm to know how many faces are or where are they.

However, the values related with others features, like eyes, are no so useful:

Eye Centre (X) Eye Centre (Y) Eye Top Limit (X) Eye Top Limit (Y) Eye Bottom Limit (X) Eye Bottom Limit (Y)
0.112876 -0.121094 0.126156 -0.128013 0.126156 -0.114174

As can be appreciated, the values for the TopLimit and TopBottom coordinates are almost the same. The debugging result is a point over the eye and not a rectangle as it could be expected.

After several test with different faces I am not very satisfied with the results obtained. The Nao’s algorithm provide a good approximation of the faces coordinates but the faces features are inaccurate. This implies you will need OpenCV (or any other library) to search for features.

Eye tracking and Nao robot

Some days ago, my colleague Min-Gyu asked me if know of any eye-tracking system. For his project, he needs a way to know where the people look, making effective the experiments (I am sorry, but this is all I can say). I had not any in my pockets, so, I toke a look through the Internet to know how the state of the art was. I have discovered that some companies are applying eye-tracking to advertisements: they are want to know where the people look to know if the money they are spending in publicity has any sense.

In other part of the world, there are people that work on eye-tracking techniques to help people with disabilities (helping them to use a computer, just looking at it) and other just for fun. Searching between these people, I found the work of Tristan Hume, that based in the scientific work of this paper, is implementing an algorithm to make a robust a feasible eye-tracking with a webcam.

I tried the code in worked smooth, as Tristan promised. As I had one free hour and a Nao robot bored, I put some code over code and I have implemented the same eye-tracking system for the Nao robot. Now, when you look to the robot, he can know where are you looking, be careful!

I have uploaded the code to gitHub, maybe someone can find it interesting.

When the ideas have a value

Adrian, Nao, and the Next Nature

Adrian, Nao, and the Next Nature

Some months ago I spoke about the value of ideas. I would like to retake this issue and give a new approach to it. Some days ago, I had the opportunity to assist to an exposition (or showroom) celebrated into the TU/e University (EIndhoven). The idea of the exposition is very simple: students from the University have to work along some months into an idea and present their work and conclusions to professors, colleagues and visitors (like me).

It was a very interesting experience, and I would like to remark two aspects:

1.- The University supports the students ideas. Maybe you do not know or you do not remember, but the University where I come from, you can work in your ideas in your spare time (if you have) and the University, usually, is not interested in that work. Moreover, find a professor to support your ideas with time or resources… is quite difficult (but these professors exists, I assure you). Here, is mandatory (if you want to pass the course) to work in these ideas you have, or maybe others had before you (Is not crazy make the people work in innovative and stupid ideas, making research and spending public money?)

2.- The opportunity the students have to talk about their ideas and how hungry they are to know your opinion. I think, this is the first step to start a project (your own project): believe in it. I saw hungry in their eyes, expectation, appetite for continue, for know your feedback. That is great. These feelings are the foundations of the science.

At the University entrance, I saw a “slogan” I found a bit presumptuous: “Where the innovation starts“. I am starting to think I am wrong. I hope to be wrong. Till now, I have see what Spanish Universities and the central government do not give you: an opportunity

I can not explain how impressed I felt: good ideas, crazy ideas, stupid ideas, mad ideas… all kind of them, all kind of students, all of them brilliants, all of them in the first steps to get something very difficult: work in something you love exploring your own ideas, your own path, your own way.

I would like to talk about all projects presented, but it will take more time I have. I invite you to read about the projects from their owners: the students.