13 — Visualiser avec agentview

agentview est le serveur de visualisation web intégré à gAgent. Il affiche en temps réel la carte de l’environnement et les agents qui s’y déplacent, directement dans votre navigateur.

Lancer agentview

./bin/agentview

Par défaut, agentview écoute sur le port 8080. Ouvrez votre navigateur à l’adresse :

http://localhost:8080

Vous verrez une carte vide. Dès que vous lancez une simulation avec un environnement, les agents apparaissent et se déplacent en temps réel.

Ordre de lancement recommandé

# Terminal 1 — plateforme FIPA (optionnel, pour AMS/DF)
./bin/agentplatform

# Terminal 2 — visualisation
./bin/agentview

# Terminal 3 — votre simulation
./build/ma_simulation

Comment ça fonctionne

agentview interroge l’environnement toutes les 100 ms via un socket Unix en envoyant la commande GET_AGENTS. L’environnement répond avec un JSON décrivant tous les agents visuels :

{
  "width": 600,
  "height": 300,
  "agents": [
    {
      "id": "orbite",
      "name": "Orbite",
      "shape": "circle",
      "color": "#4fc3f7",
      "x": 342.5,
      "y": 198.3,
      "size_x": 24.0,
      "size_y": 24.0,
      "size": 1.0,
      "val": ""
    }
  ]
}

agentview dessine ensuite chaque agent sur le canvas HTML5 en utilisant les attributs shape, color, x, y, et size.

Personnaliser l’apparence des agents

Tout se passe dans les attributs que l’agent publie via setAttribut() et attributUpdated().

Changer la forme :

setAttribut("shape", "star");      // étoile violette
setAttribut("shape", "diamond");   // losange orange
setAttribut("shape", "triangle");  // triangle vert

Changer la couleur :

setAttribut("color", "#e94560");            // rouge vif
setAttribut("color", "rgba(76,175,80,0.8)"); // vert semi-transparent

Afficher une valeur textuelle :

setAttribut("val", "42°C");   // affiché sous l'agent
setAttribut("val", "danger"); // étiquette d'état

Changer la taille en cours de simulation :

void onTick() override {
    // L'agent grossit progressivement
    taille_ += 0.5f;
    char buf[16];
    snprintf(buf, sizeof(buf), "%.0f", taille_);
    this_agent->setAttribut("size_x", buf);
    this_agent->setAttribut("size_y", buf);
    set_pos(this_agent, x_, y_);
}

Exemple — agent qui change de couleur selon son état

class AgentAlerte : public Agent {
    int energie_ = 100;
public:
    void setup() override {
        addAttribut("id");    addAttribut("name");
        addAttribut("x");     addAttribut("y");
        addAttribut("shape"); addAttribut("color");
        addAttribut("size_x");addAttribut("size_y");
        addAttribut("val");

        setAttribut("id",     "alerte");
        setAttribut("name",   "Alerte");
        setAttribut("shape",  "circle");
        setAttribut("size_x", "20");
        setAttribut("size_y", "20");
        setAttribut("x",      "300");
        setAttribut("y",      "150");
        attributUpdated();

        addBehaviour(new AlerteBehaviour(this));
    }
};

class AlerteBehaviour : public TickerBehaviour {
    int& energie_;
public:
    AlerteBehaviour(Agent* ag, int& e)
        : TickerBehaviour(ag, 500), energie_(e) {}

    void onTick() override {
        energie_--;

        // Couleur selon le niveau d'énergie
        if      (energie_ > 66) this_agent->setAttribut("color", "#4caf50"); // vert
        else if (energie_ > 33) this_agent->setAttribut("color", "#ff9800"); // orange
        else                    this_agent->setAttribut("color", "#e94560"); // rouge

        char buf[16];
        snprintf(buf, sizeof(buf), "%d%%", energie_);
        this_agent->setAttribut("val", buf);
        this_agent->attributUpdated();

        if (energie_ <= 0) done_ = true;
    }
};

Dans agentview, vous verrez l’agent passer du vert à l’orange puis au rouge, avec le pourcentage affiché en direct.

Ce qu’affiche agentview

Élément affiché

Source

Forme de l’agent

attribut shape

Couleur

attribut color

Position

attributs x, y

Taille

attributs size_x / size_y (ou size)

Étiquette texte

attribut val

Nom au survol

attribut name

Dimensions de la carte

map_width / map_height dans init_env()