Installer le Raspberry Pi
S’applique à : Robot réel
Cette page installe le logiciel embarqué sur le Raspberry Pi d’un robot. Elle fait partie de la mise en service d’un robot neuf : suivez-la dans l’ordre donné par Mettre en service un nouveau robot. Pour préparer le PC, voir Installer le PC.
Mettre en service un Raspberry Pi
Tout passe par une fiche d’identité, un petit fichier YAML qui décrit ce robot, et une seule commande.
cp deploy/ratbot.example.yaml mon-robot.yaml
$EDITOR mon-robot.yaml
robot_id: 2 # -> ratbot-2, /ratbot_2/, 192.168.1.172
version: 1
network:
gateway: 192.168.1.254 # la box du réseau
time_server: 192.168.1.190
lidar: true
ros_distro: humble
L’adresse du robot ne se donne pas : elle découle de son numéro,
192.168.1.(170 + N). Une fiche qui en indique une autre est refusée.
Puis, sur la Raspberry :
./scripts/ratbot install mon-robot.yaml --dry-run # ce qu'il ferait
./scripts/ratbot install mon-robot.yaml
Astuce
Le script est idempotent : relancez-le autant de fois que vous voulez, il ne refait que ce qui manque. C’est aussi la façon de vérifier qu’une installation a bien pris.
Il ne redémarre jamais la machine. Il vous dit ce qui reste à faire.
Les deux façons d’installer
Carte neuve, écrite par Raspberry Pi Imager. Renseignez le WiFi dans l’imageur — le script ne s’en occupe pas et aucun mot de passe n’entre dans la fiche d’identité.
Le compte du robot, à créer dans l’imageur, est le même sur tous les robots du parc :
utilisateur |
|
mot de passe par défaut |
|
Avertissement
Ce mot de passe est public : il est écrit ici. Changez-le dès la mise en
service (passwd sur le robot), surtout si le réseau du robot n’est pas
isolé. Les outils du parc n’en ont pas besoin : ils passent par une clé
SSH (ssh-copy-id ratbot@192.168.1.17N, voir Travailler à plusieurs robots). Il ne
sert qu’à la première connexion et aux commandes sudo.
Clone d’une carte existante, la méthode rapide pour équiper un parc. Le script détecte que la machine porte encore l’identité de l’ancien robot et efface ce qui ne doit surtout pas être partagé :
Ce qui est régénéré |
Sinon |
|---|---|
|
deux machines identiques obtiennent le même bail DHCP et se coupent l’une l’autre |
clés d’hôte SSH |
deux robots avec la même empreinte ; les clients refusent la connexion en criant à l’attaque |
nom de machine |
il décide de tout le reste : espace de noms ROS, adresse fixe |
adresse fixe netplan |
celle de l’ancien robot |
Avertissement
Après un clonage, vos clients SSH signaleront un changement de clé pour cette adresse. C’est normal et voulu. Retirez l’ancienne entrée :
ssh-keygen -R 192.168.1.172
Cloner une carte, pas à pas
C’est la méthode conseillée pour un nouveau robot : ROS 2 et l’agent micro-ROS sont déjà installés et compilés sur la carte d’origine, ce qui évite une longue compilation sur la Raspberry. Les exemples clonent ratbot-1 pour faire ratbot-2.
1. L’image de la carte d’origine, une fois. Mettre son dépôt à jour, puis l’éteindre proprement :
ssh ratbot@192.168.1.171 'cd ~/ratbot_ws && git pull --ff-only'
ssh -t ratbot@192.168.1.171 'sudo shutdown now'
Retirer la carte SD, la mettre dans le lecteur du PC, et en faire une image :
lsblk # repérer la carte, par exemple /dev/sdb
sudo dd if=/dev/sdX of=ratbot1.img bs=4M status=progress
Danger
Vérifier trois fois le nom du périphérique (/dev/sdX) avec
lsblk : la carte se reconnaît à sa taille. dd écrit sans rien
demander, et une erreur de nom efface un disque du PC.
2. L’écrire sur chaque nouvelle carte, au moins aussi grande que l’originale :
sudo dd if=ratbot1.img of=/dev/sdY bs=4M status=progress conv=fsync
Raspberry Pi Imager sait aussi écrire ce fichier (« Use custom »).
3. Donner son identité au nouveau robot. Au premier démarrage, le clone se croit encore ratbot-1, à la même adresse :
Avertissement
Le robot d’origine reste éteint tant que le clone n’a pas reçu son identité : deux machines à la même adresse et sous le même nom se coupent l’une l’autre.
Brancher le lidar du nouveau robot (sa règle udev dépend du matériel réellement branché), y mettre la carte, l’allumer, puis depuis le PC :
ssh ratbot@192.168.1.171 # le clone, encore sous l'identité de ratbot-1
cd ~/ratbot_ws
cp deploy/ratbot.example.yaml ratbot2.yaml # robot_id: 2
./scripts/ratbot install ratbot2.yaml --dry-run
./scripts/ratbot install ratbot2.yaml
sudo reboot
Après le redémarrage, le robot répond à sa propre adresse, 192.168.1.172.
Sur le PC, retirer les empreintes devenues fausses :
ssh-keygen -R 192.168.1.171
ssh-keygen -R 192.168.1.172
Le robot d’origine peut alors être rallumé. Recommencer l’étape 2 et 3 pour chaque robot, avec son numéro.
Ce que le clone garde, et c’est voulu : la clé SSH du PC, donc
ratbot fleet fonctionne aussitôt (voir Travailler à plusieurs robots) ; le mot de passe du
compte ratbot, à changer ; ROS 2, le dépôt et sa compilation.
Ce que le script règle
Étape |
Détail |
|---|---|
vérifications |
modèle de carte, et surtout la distribution ROS : si ce n’est pas celle de la fiche, il s’arrête |
identité |
nom de machine, |
liaison série |
|
source de temps |
le serveur déclaré dans la fiche (voir L’heure du robot) |
lidar |
règle udev qui lui donne le nom stable |
sources |
les sources de l’agent micro-ROS, qui n’existe pas en paquet
( |
le reste |
il passe la main à |
Important
Pourquoi la liaison série demande ces réglages. Sur une Raspberry neuve,
/dev/ttyAMA0 est pris par la console de connexion et par le Bluetooth.
Tant que les deux ne sont pas écartés, la carte est injoignable — et
rien ne le dit clairement : le robot démarre, mais reste muet.
Astuce
Branchez le lidar avant de lancer le script. Il lit l’identifiant USB de l’adaptateur présent ; s’il n’en trouve aucun, il prévient et ne pose aucune règle — plutôt que d’en écrire une au hasard, qui ne nommerait rien et vous ferait croire le lidar configuré.
Si le lidar n’est pas encore là, renseignez lidar_usb_id dans la fiche
(format vendeur:produit, tel que le rend lsusb).
Note
Le script est écrit et éprouvé pour une Raspberry Pi 4. Sur un autre modèle il prévient mais continue : le découpage des ports série diffère, et la partie liaison sera à vérifier à la main.
Et ensuite
Le nom de machine et la liaison série ne prennent effet qu’après un redémarrage. Le script le dit, puis :
sudo reboot
./scripts/ratbot install mon-robot.yaml # vérifie que tout a pris
./scripts/ratbot role
ros2 node list # /ratbot_N/ratbot_controller
Le ratbot_controller apparaît sous le numéro enregistré dans la carte,
pas sous celui de la Raspberry : une carte neuve se présente en ratbot_1
tant qu’on ne l’a pas renumérotée. Voir Mettre en service un nouveau robot, qui donne la
mise en service complète d’un robot, dans l’ordre.
Avertissement
micro_ros_agent n’existe pas en paquet apt. Ses sources sont
déclarées dans ros2_ws/ratbot.repos ; l’installation les récupère
(étape sources), ce qui demande un accès à Internet. Sans elles, la
Raspberry ne peut pas parler à la carte.
Mises à jour du robot
Le Raspberry Pi d’un robot ne se met jamais à jour tout seul : les minuteries automatiques d’Ubuntu y sont désactivées. C’est délibéré — une bibliothèque qui change entre deux séances, sans que personne ne l’ait décidé, rend un problème impossible à reproduire, et la mise à jour se déclenchait justement au moment où l’on allume le robot.
L’installation (ratbot install, ratbot deps) n’en fait pas non plus :
elle installe les paquets qui manquent, sans toucher à ceux qui sont déjà là.
Un robot cloné garde ainsi exactement les versions de la carte d’origine.
La mise à jour se fait donc quand vous le décidez, robot au repos, sur un réseau qui a accès à Internet, et sur tous les robots du parc à la fois, pour qu’ils gardent les mêmes versions :
sudo apt update # rafraîchit les listes, n'installe rien
apt list --upgradable # à lire avant : ce qui va changer
sudo apt upgrade # installe, sans retirer de paquet
sudo reboot # si le noyau a changé
Si la mise à jour touche à ROS, reconstruisez ensuite l’espace de travail, puis vérifiez que la carte répond toujours :
./scripts/ratbot build
ros2 node list # /ratbot_1/ratbot_controller doit apparaître
Avertissement
Évitez apt full-upgrade sur un robot : il peut retirer des paquets
pour résoudre un conflit, y compris une brique ROS dont le robot dépend.