231 lines
12 KiB
Markdown
231 lines
12 KiB
Markdown
# Quadricoptere Create Aeronautics : controleur centralise
|
|
|
|
Nouvelle architecture: un SEUL ordinateur (PC central) pilote tout via
|
|
le reseau filaire. Les anciens scripts multi-PC (helice.lua,
|
|
central.lua, input.lua, console.lua, propulsion.lua) sont obsoletes.
|
|
|
|
## Materiel
|
|
|
|
Directement sur le PC central:
|
|
- altitude_sensor, Create_DisplayLink (affichage de conduite)
|
|
- ender modem (uniquement pour le GPS)
|
|
- sortie redstone BOTTOM vers le moteur (15 = arret, 14 = vitesse
|
|
minimale, 0 = vitesse maximale)
|
|
|
|
Via le reseau filaire (wired modems):
|
|
- 6 Create_RotationSpeedController: 4 helices + 2 propulseurs
|
|
(roles affectes par `calib rsc`, persistes dans drone.etat)
|
|
- 3 velocity_sensor, un par composante (axes affectes par
|
|
`calib capteurs`)
|
|
- 1 gimbal_sensor, 1 optical_sensor (vers le sol, 15.5 = rien),
|
|
1 stressometer, 1 redstone_relay (joystick), 1 advanced monitor
|
|
(tactile), 1 linked typewriter (EN ATTENTE: relever ses signatures
|
|
avec test_signatures, voir lib/ihm.lua)
|
|
|
|
## Installation
|
|
|
|
1. Copier drone.lua sur le PC, puis: `drone maj <url_base>` pour
|
|
telecharger les modules depuis votre depot (Forgejo: URL "raw" du
|
|
dossier). Autoriser le domaine dans la config http de CC:Tweaked.
|
|
Ou copier a la main drone.lua + lib/*.lua.
|
|
2. Premier lancement: `drone` cree `drone.conf`. RELIRE chaque
|
|
parametre (Y_VOL, Y_MINI, ANGLE_MAX, DIST_SOL, offsets, joystick,
|
|
moteur...) puis passer `verifie = true`. Un warning s'affiche tant
|
|
que ce n'est pas fait.
|
|
3. Calibrations depuis l'onglet CALIB, en mode CALIBRAGE pour
|
|
celles au sol, DANS CET ORDRE (les modes non calibres sont
|
|
verrouilles en rouge). Toutes sont RE-EXECUTABLES (recablage:
|
|
relancer la calibration remet ses affectations a zero et prend
|
|
effet sans relancer le programme). La calib rsc verifie la
|
|
coherence (retour de l'assiette a l'etat initial entre chaque
|
|
impulsion, detection des conflits deux RSC -> une meme helice)
|
|
et s'annule proprement en cas d'incoherence. Les calibrations
|
|
assistees affichent leurs consignes sur l'ecran de conduite et se
|
|
valident en touchant le moniteur:
|
|
- `gimbal` (assistee, en premier): incliner le nez vers le bas
|
|
puis pencher a gauche; associe les 2 angles bruts au tangage et
|
|
au roulis (l'association CHANGE d'un vaisseau a l'autre).
|
|
- `joystick` (assistee): pousser a fond dans chaque direction pour
|
|
identifier les faces du redstone relay.
|
|
- `typew` (assistee, OPTIONNELLE): le typewriter emet des codes
|
|
ASCII (qwerty), le mappage est integre par defaut (0..9,
|
|
Entree = valider, Backspace = effacer, + / - = consigne +-1).
|
|
Ne calibrer que si le clavier a un mappage exotique.
|
|
- `rsc` (drone pose): impulsion sur chaque RSC; l'effet
|
|
d'assiette designe le coin; sans effet = propulseur. prop_l /
|
|
prop_r arbitraires: si un virage gauche part a droite, les
|
|
echanger dans drone.etat. Pour un DRONE TROP LOURD (impulsions
|
|
sans effet), utiliser `rscman`.
|
|
- `rscman` (drone pose, manuelle): chaque RSC tourne a
|
|
CALIB.RPM_MANUEL (10 rpm); regarder quelle helice tourne et
|
|
toucher sa position sur l'art (4 coins + prop_l / prop_r);
|
|
unicite garantie, ANNULER restaure l'etat precedent. Fiabilise
|
|
aussi prop_l / prop_r (plus d'affectation arbitraire).
|
|
- `capteurs` (en vol): montee, avancee puis translation gauche
|
|
identifient l'axe ET la direction de chaque velocity sensor
|
|
(repere du drone: avant / lateral / vertical, positif =
|
|
avant / gauche / haut).
|
|
- `pid` (en vol stationnaire, marge d'altitude): recherche
|
|
iterative, critere ZERO depassement + temps de reponse minimal +
|
|
assiette <= ANGLE_MAX. EXPERIMENTAL. Toute modification des
|
|
parametres de conf dont dependent ces gains (VITESSE_RSC_MAX,
|
|
VITESSE_RAMPE, ANGLE_MAX) INVALIDE la calibration au prochain
|
|
demarrage (retour aux gains de la conf + alerte).
|
|
|
|
## Interface (moniteur tactile)
|
|
|
|
Echelle de texte automatique (la plus grande qui loge le contenu).
|
|
Navigation par onglets:
|
|
- PARAM : edition tactile des parametres (depassement tolere, angles
|
|
max, POIDS et POUSSEE de l'helice en pixelNewton, vitesses
|
|
verticales max, rampe, Y_VOL, Y_MINI). Les valeurs modifiees sont
|
|
persistees dans drone.etat et PRIMENT sur drone.conf sans
|
|
l'ecraser; modifier un parametre dont depend la calibration PID
|
|
affiche un rappel de recalibration.
|
|
- MODE : boutons de modes + contenu adapte au mode courant (voir
|
|
ci-dessous), art du quadricoptere (cercles des helices: blanc
|
|
rpm=0, rouge rpm max, jaune en changement, vert stable; rpm des
|
|
propulseurs sur les cotes)
|
|
- CALIB : boutons des calibrations (gris = a faire, jaune = en
|
|
cours, vert = faite), consignes et barre de progression, art avec
|
|
le RSC en cours en VIOLET
|
|
- JOURNAL : dernieres lignes du journal de vol
|
|
|
|
## Modes (verrouilles en rouge si une calibration manque, la raison
|
|
s'affiche au toucher)
|
|
|
|
- `off` : moteur coupe (bottom a 15), tous les RSC a 0
|
|
- `inactif` : moteur ALLUME, tous les RSC a 0, commandes desactivees.
|
|
Dans tous les modes sauf off, une erreur s'affiche si le moteur ne
|
|
tourne pas (stressometer a capacite nulle) alors qu'il le devrait
|
|
- `calibrage` : identique a inactif mais AUTORISE les calibrations
|
|
au sol (gimbal, joystick, typew, rsc); capteurs et pid se lancent
|
|
en mode vol
|
|
- `stationnement` : helices a pleine puissance inversee (plaquage),
|
|
propulseurs a 0, commandes desactivees. Conditions d'entree: au sol
|
|
(optical <= DIST_SOL) ET horizontal (<= ANGLE_MAX). Sortie
|
|
automatique vers `vol` si les conditions sont perdues.
|
|
- `vol` : assiette maintenue horizontale (PID tangage/roulis a 0),
|
|
altitude au PID double regime, deplacement horizontal au joystick
|
|
via les PROPULSEURS (avance/virage differentiels)
|
|
- `drone` : le joystick commande l'INCLINAISON (jusqu'a
|
|
ANGLE_DRONE_MAX), deplacement par les helices, propulseurs a 0
|
|
- `atterrissage` : descente douce (VITESSE_ATTERRISSAGE) jusqu'au
|
|
sol, puis stationnement. Sous Y_MINI, la descente exige un sol
|
|
POSABLE (optical: bloc detecte, ni eau ni lave): garde-fou ocean
|
|
- `auto` : cible a 2 coordonnees (`auto <x> <z>` au clavier, pave
|
|
tactile, ou bouton d'un point enregistre): decollage a Y_VOL,
|
|
ralliement en avancant (cap estime par GPS), atterrissage sur
|
|
place. Cible a 3 coordonnees (`auto <x> <y> <z>`): rallie le point
|
|
et s'y MAINTIENT a l'altitude y (bornee par le sol et Y_MINI).
|
|
Bouton ANNULER: retour en vol stabilise a la position courante
|
|
|
|
La consigne d'altitude se regle aux boutons +-1/+-10 du moniteur ou
|
|
au TYPEWRITER: taper les chiffres (la saisie s'affiche sur l'ecran
|
|
de conduite) puis Entree; Backspace corrige; + et - ajustent la
|
|
consigne de 1 quand aucune saisie n'est en cours.
|
|
|
|
Points nommes (clavier du PC, 10 max):
|
|
`pt save <nom>` | `pt go <nom>` | `pt del <nom>` | `pt list` | `rtb`
|
|
(retour au point de decollage de la derniere mission auto).
|
|
|
|
## Regulation
|
|
|
|
- ASSERVISSEMENT EN CASCADE + FEEDFORWARD, ADAPTATIF (transport a
|
|
charge et centrage variables a chaque vol):
|
|
1. feedforward de sustentation: rpm d'equilibre calcule depuis
|
|
POIDS (A VIDE) et POUSSEE_HELICE_MAX (poussee ~ rpm^EXPOSANT),
|
|
CORRIGE EN CONTINU PAR LA PRESSION mesuree (la poussee diminue
|
|
avec l'altitude): pousseeEffective = POUSSEE * pression /
|
|
PRESSION_REF. Mesurer poids a vide et poussee d'une helice et
|
|
les saisir (conf ou page PARAM).
|
|
1b. ADAPTATION DE POIDS: en quasi-stationnaire, le residu du PID
|
|
de vitesse est transfere lentement vers le feedforward: le
|
|
drone SE PESE tout seul (poids estime affiche en vol). Remise a
|
|
zero a chaque decollage (nouvelle cargaison). Plafond: poids
|
|
total max = RATIO_CHARGE_MAX (60%%) * 4 * poussee de reference,
|
|
alerte SURCHARGE au dela.
|
|
1c. TRIM D'ASSIETTE ADAPTATIF: en stationnaire, la composante
|
|
statique des corrections d'assiette (centre de gravite decale
|
|
par la cargaison) est absorbee par un trim par axe; alerte
|
|
"chargement desequilibre" si |trim| depasse
|
|
ADAPTATION.SEUIL_DESEQUILIBRE.
|
|
1d. GAIN SCHEDULING: la boucle de vitesse est mise a l'echelle du
|
|
ratio poids estime / poids memorise a la calibration (borne
|
|
0.5..2): calibrer avec n'importe quelle charge, les gains
|
|
suivent la cargaison.
|
|
Procedure par vol: charger -> mode vol -> 5-10 s de stationnaire
|
|
(pesee + trim + alertes) -> partir. Aucune recalibration.
|
|
2. boucle externe: erreur d'altitude -> consigne de vitesse
|
|
verticale (P, bornee V_MONTEE_MAX / V_DESCENTE_MAX)
|
|
3. boucle interne: PID sur la vitesse verticale mesuree (velocity
|
|
sensor vertical calibre; a defaut, derivee filtree de
|
|
l'altitude), deux jeux de gains montee / descente
|
|
Consigne rampee (VITESSE_RAMPE), derivee sur la mesure et
|
|
integrale conditionnelle (zero-depassement).
|
|
- Deux calibrations PID complementaires (onglet CALIB, mode vol):
|
|
- `pid` (auto-tune): recherche iterative en boucle fermee, garde
|
|
le meilleur essai valide (zero depassement, assiette bornee)
|
|
- `pidmath` (methodes mathematiques): identification du modele en
|
|
boucle ouverte autour du feedforward (echelon -> K, tau, L),
|
|
gains candidats par COHEN-COON et ZIEGLER-NICHOLS, validation en
|
|
boucle fermee des deux, conservation du meilleur valide (version
|
|
adoucie appliquee si aucun ne passe)
|
|
Conseil: regler POIDS/POUSSEE d'abord, puis pidmath (rapide), puis
|
|
pid si besoin d'affiner.
|
|
- PID assiette: tangage et roulis vers leurs cibles; mixage par coin:
|
|
base + corrections signees.
|
|
- Moteur asservi au stressometer: augmente si l'utilisation depasse
|
|
STRESS_HAUT, diminue sous STRESS_BAS (economie). Le moteur est
|
|
dimensionne pour suffire; en cas de SURCHARGE malgre le maximum,
|
|
les PROPULSEURS sont reduits en priorite (facteur 0.3) + alerte,
|
|
puis retablis quand le stress redescend.
|
|
- Carburant: deux valeurs sur le 2e display link: POURCENTAGE de
|
|
reserve (ligne 1) et AUTONOMIE en minutes (ligne 2), estimee par
|
|
apprentissage glissant (EMA, CARBURANT.LISSAGE) de la
|
|
consommation; les ravitaillements et le mode off sont exclus de
|
|
l'apprentissage. Alerte sous SEUIL_ALERTE.
|
|
- Moteur PREDICTIF (apres `calib moteur`, au sol en mode calibrage):
|
|
la calibration mesure la capacite produite a chacun des 15 niveaux
|
|
redstone puis les coefficients de consommation Kh (helices) et Kp
|
|
(propulseurs) en su/rpm. En vol, le besoin est PREVU d'apres les
|
|
rpm commandes et le moteur est regle au PLUS PETIT niveau couvrant
|
|
besoin * (1 + MARGE): capacite au plus pres de la consommation,
|
|
donc carburant minimal. Apprentissage continu de la table, montee
|
|
immediate, descente d'un cran par periode. Repli sur le servo
|
|
reactif tant que la calib n'est pas faite.
|
|
- LIMITEUR DE STRESS (anti-overstress transitoire): a chaque pas de
|
|
pilotage, les commandes sont bornees pour que le besoin prevu
|
|
reste sous la capacite MESUREE * SECURITE, par priorites: la
|
|
sustentation n'est jamais reduite, puis la montee, puis les
|
|
propulseurs. Pendant la montee en regime du diesel, le drone
|
|
grimpe exactement aussi vite que la capacite le permet: le
|
|
depassement transitoire devient structurellement impossible.
|
|
Alerte STRESS INSUFFISANT si meme la sustentation depasse le
|
|
budget (moteur sous-dimensionne pour la charge).
|
|
- Pre-boost a pleine puissance (MOTEUR.BOOST secondes) conserve aux
|
|
changements de regime, et garde-fou ultime SURCHARGE (delestage
|
|
propulseurs) sur la mesure.
|
|
- TYPE DE MOTEUR: le diesel repond instantanement au signal; avec
|
|
lui, BOOST peut etre mis a 0, MARGE reduite (~0.10) et
|
|
CALIB.ATTENTE_NIVEAU a 0.5 s (calib moteur en ~15 s). Ces trois
|
|
valeurs sont sur la page PARAM. Pour un moteur A TRANSITION,
|
|
garder BOOST et MARGE plus larges: le limiteur de stress couvre le
|
|
delai de montee en regime, l'architecture est inchangee.
|
|
- Reactivite: le GPS (appel bloquant jusqu'a 2 s) est isole dans une
|
|
tache dediee alimentant un cache; l'interface et la navigation ne
|
|
bloquent jamais dessus. Messages longs de l'ecran de conduite:
|
|
defilement par segments de mots entiers (indicateur i/n).
|
|
|
|
## Fichiers
|
|
|
|
- `drone.conf` : parametres utilisateur (cree si absent)
|
|
- `drone.etat` : mode, consigne, roles RSC, axes capteurs, gains
|
|
calibres, point de decollage (restaures au reboot; en vol, la
|
|
consigne repart de l'altitude reelle)
|
|
- `drone.log` : journal de vol (rotation a 64 Ko)
|
|
|
|
## Points d'attention
|
|
|
|
- tanks(): si la capacite n'est pas fournie par le jeu, la conf
|
|
CARBURANT.CAPACITE_TANK sert de repli.
|