Contrôle-commande sur le projet LISA

Claude-Alban RANÉLY-VERGÉ-DÉPRÉ, Mathieu DUPONT, Éric KAJFASZ

Le projet LISA

Laser Interferometer Space Antenna (LISA) : Antenne à ondes gravitationnelles

En lien avec la thématique “la physique des astroparticules et la cosmologie” de l’IN2P3

Projet européen ESA

En collaboration avec la NASA (?)

Le projet LISA

Laser Interferometer Space Antenna (LISA) : Antenne à ondes gravitationnelles

En lien avec la thématique “la physique des astroparticules et la cosmologie” de l’IN2P3

Projet européen ESA

En collaboration avec la NASA (?)

La part de la France

IDS : Interferometric Detection System

La part de la France

IDS : Interferometric Detection System

BSIM : Beam Simulator

Le périmètre de notre action

Le contrôle-commande des instruments du BSIM

Cahier des charges

  • Plusieurs sous-systèmes à piloter
  • Système distribué
  • Système stable

Architecture

Retour d’expériences

I

II

III

Perspectives

Différents sous-systèmes indépendants

⇨ Binaires indépendants

Architecture de notre solution

Architecture distribuée

Protocole retenu : MQTT

  • Architecture pub/sub
  • Fonctionnalités avancées (QoS, Last Will)
  • Ouvert
  • Léger

Technologie retenue : JSON

Contenu des paquets

  • Flexibilité des messages
  • Pas de contraintes de taille pour les messages mais BSON est une option
  • Facilement intégrable dans n’importe quel langage de programmation
{
    "menu": {
        "id": 1,
        "value": true,
        "popup": {
            "menuitem": [
                { "value": "New", "onclick": "CreateNewDoc()" },
                { "value": "Open", "onclick": "OpenDoc()" },
                { "value": "Close", "onclick": "CloseDoc()" }
            ]
        }
    }
}

Un format flexible avec aucune spécification c'est un mal de tête pour le prochain à s'en occuper

Albert Einstein Un ingénieur fatigué

Spécifications des messages JSON

Lors de l'écriture de nos structures dans notre langage de programmation, on les génère

1

Génération

Lors de la réception des messages, on peut valider qu'il suit le bon schéma

2

Validation

Si le schéma doit changer c'est juste un seul endroit qui contient la source de vérité

3

Extensibilité

Spécifications des messages JSON

Lors de l'écriture de nos structures dans notre langage de programmation, on les génère

1

Génération

Lors de la réception des messages, on peut valider qu'il suit le bon schéma

2

Validation

Si le schéma doit changer c'est juste un seul endroit qui contient la source de vérité

3

Extensibilité

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
        "menu": {
            "type": "object",
            "properties": {
                "id": {
                    "type": "integer"
                },
                "value": {
                    "type": "boolean"
                },
                "popup": {
                    "type": "object",
                    "properties": {
                        "menuitem": {
                            "type": "array",
                            "items": {
                                "type": "object",
                                "properties": {
                                    "value": {
                                        "type": "string"
                                    },
                                    "onclick": {
                                        "type": "string"
                                    }
                                },
                                "required": ["value", "onclick"]
                            }
                        }
                    },
                    "required": ["menuitem"]
                }
            },
            "required": ["id", "value", "popup"]
        }
    },
    "required": ["menu"]
}

Architecture de notre solution

  • Langage qui est mature (+10 ans depuis 1.0)
  • Intégration avec C facile

  • Multithreading sans bugs

  • Performances quasi-égale au C avec “une syntaxe plus proche de Python”

Le langage de programmation

Langage développé initialement à Mozilla dans le cadre de Firefox pour remplacer C++

"For medium and large changes, the rollback rate of Rust changes in Android is ~4x lower than C++"

(2025)

"we think that Rust represents the best alternative to C and C++ currently available."

(2019)

Études scientifiques de comparaison de langages

Pourquoi ce langage ?

  • Pas de réalisation existante
  • Stabilité
  • Possibilité d'utiliser le même langage pour toutes les utilisations (Binaire, GUI déportée, Application Web)
  • Interaction simple avec librairies constructeurs
    (écrites en C)
{
    "run_id": 0,
    "timestamp": 1727790724,
    "data": {
        "temperature_one": {
            "timestamp_fine": 1727790724,
            "raw_value": 50,
            "value": 20.4,
            "unit": "C"
        },
        "temperature_two": {
            "timestamp_fine": 1727790724,
            "raw_value": 60,
            "value": 20.6,
            "unit": "C"
        }
    }
}
#[derive(Debug, Deserialize, Serialize, JsonSchema)]
pub struct Message {
    /// Date at which the message was sent
    pub run_id: u64,
    /// The number of non-leap nanoseconds since January 1, 
    /// 1970 0:00:00 UTC (aka “UNIX timestamp”) 
    /// in the current date, time and offset from UTC.
    pub timestamp: i64,
    /// The JSON encoded data retrieved from the tas
    pub data: Measurements,
}

/// The named aggregation of the measurements made by the system
#[derive(Debug, Deserialize, Serialize, JsonSchema)]
pub struct Measurements {
    /// The payload of the measurements made by the system
    /// Using a BTreeMap here to be synchronized with `DataloggerSettings`
    #[serde(flatten)]
    pub data: BTreeMap<String, Vec<Measurement>>,
}

Exemple

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Message",
  "type": "object",
  "properties": {
    "data": {
      "description": "The JSON encoded data retrieved from the tas",
      "$ref": "#/$defs/Measurements"
    },
    "run_id": {
      "description": "Date at which the message was sent",
      "type": "integer",
      "format": "uint64",
      "minimum": 0
    },
    "timestamp": {
      "description": "The number of non-leap nanoseconds since January 1, 1970 0:00:00 UTC (aka “UNIX timestamp”) in the current date, time and offset from UTC.",
      "type": "integer",
      "format": "int64"
    }
  },
  "required": [
    "run_id",
    "timestamp",
    "data"
  ],
  "$defs": {
    "Measurement": {
      "description": "Physical measurement made by the system",
      "type": "object",
      "properties": {
        "raw_value": {
          "description": "Raw value sent by the test equipment",
          "type": "number",
          "format": "double"
        },
        "timestamp_fine": {
          "type": "integer",
          "format": "int64"
        },
        "unit": {
          "$ref": "#/$defs/ThermodynamicTemperature"
        },
        "value": {
          "type": "number",
          "format": "double"
        }
      },
      "required": [
        "timestamp_fine",
        "raw_value",
        "value",
        "unit"
      ]
    },

}
#[derive(Debug, Deserialize, Serialize, JsonSchema)]
pub struct Message {
    /// Date at which the message was sent
    pub run_id: u64,
    /// The number of non-leap nanoseconds since January 1, 
    /// 1970 0:00:00 UTC (aka “UNIX timestamp”) 
    /// in the current date, time and offset from UTC.
    pub timestamp: i64,
    /// The JSON encoded data retrieved from the tas
    pub data: Measurements,
}

/// The named aggregation of the measurements made by the system
#[derive(Debug, Deserialize, Serialize, JsonSchema)]
pub struct Measurements {
    /// The payload of the measurements made by the system
    /// Using a BTreeMap here to be synchronized with `DataloggerSettings`
    #[serde(flatten)]
    pub data: BTreeMap<String, Vec<Measurement>>,
}

Exemple

JSON Schema

Un choix souvent peu disponible

Notre choix s'est porté sur un système :

  1. léger

  2. peu intrusif

  3. adaptable à nos besoins (open-source)

le système d'exploitation

Un composant en particulier : systemd

Un outil (système d'initialisation) qui permet de définir un ordre de démarrage pour les applications, tout en offrant de nombreux autres déclencheurs :

  • service : pour un service/démon
  • socket : pour une socket réseau (de tous types : UNIX, fichier …)
  • mount : pour un système de fichiers (exemple : home.mount)
  • swap : comme mount mais pour les partitions d’échanges
  • automount : comme mount mais pour un système de fichiers monté à la demande
  • device : pour un périphérique
  • timer : pour l’activation basée sur une date
  • path : pour l’activation basée sur des fichiers ou des répertoires
  • target : macro-unité qui permet de grouper plusieurs unités
    (exemple : multi-user.target pour définir une cible)

(liste non exhaustive)

Contruire une ISO personalisée d’une machine

Bonus # 1 : Fonctionnalités inattendues — systemd-mkosi  

  • Fichiers de configuration
  • Binaires
  • Mots de passe
  • ...

Interessé(e) ?

Un gestionnaire de mise à jour

avec possibilité de retour en arrière atomique (partition A/B)

Bonus #2 : Fonctionnalités inattendues — systemd-sysupdate

Une version ratée ? Redémarrez votre appareil et c'est comme si rien ne s'était passé!

Interessé(e) ?

Conclusion

Merci!

Questions?

carvd@cppm.in2p3.fr

Journées Online 2025: Contrôle-commande sur le projet LISA

By Claude-Alban RANÉLY-VERGÉ-DÉPRÉ

Journées Online 2025: Contrôle-commande sur le projet LISA

Dans le cadre du projet LISA (Laser Interferometer Space Antenna), un banc de test rassemblant plusieurs instruments doit être produit par plusieurs partenaires du consortium. L'architecture logicielle retenue pour le contrôle-commande, dont le développement a été confié au CPPM, se compose de plusieurs briques logicielles peu conventionnelles associées entre elles : Le langage de programmation système Rust, Le protocole de messagerie publication-abonnement (publish-subscribe) basé sur le protocole TCP/IP, MQTT, Le système d'exploitation libre GNU/Linux La présentation fera un retour d'expériences sur l'usage de ces technologies prises séparément et de leurs synergies prises ensemble.

  • 38