cctweaked_drone/lib/conf.lua

188 lines
8.2 KiB
Lua

--------------------------------------------------------------------
-- lib/conf.lua : fichier de configuration utilisateur (drone.conf)
-- Cree le fichier avec des valeurs par defaut commentees s'il
-- n'existe pas; avertit tant que `verifie` n'est pas passe a true.
--------------------------------------------------------------------
local Conf = {}
local CHEMIN = "drone.conf"
local MODELE = [[
-- drone.conf : parametres utilisateur du quadricoptere.
-- RELIRE ET AJUSTER chaque valeur, puis passer verifie a true.
-- NB: les mappages (gimbal, joystick, typewriter, capteurs, RSC)
-- ne sont PAS ici: ils sont calibres en jeu et stockes dans drone.etat.
return {
verifie = false, -- passer a true apres relecture
------------------------------------------------------------------
-- Altitudes (plan de l'altitude sensor du PC central)
------------------------------------------------------------------
Y_VOL = 90, -- altitude de croisiere du mode auto
Y_MINI = 70, -- plancher de securite: en dessous, la
-- descente exige un sol POSABLE detecte
-- (evite d'atterrir dans un ocean)
------------------------------------------------------------------
-- Assiette
------------------------------------------------------------------
ANGLE_MAX = 1.5, -- inclinaison max toleree hors mode drone (deg)
ANGLE_DRONE_MAX = 15, -- inclinaison commandee max en mode drone (deg)
------------------------------------------------------------------
-- Sol
------------------------------------------------------------------
DIST_SOL = 1.2, -- optical sensor: distance <= => au sol
-- (15.5 = aucun bloc detecte)
VITESSE_ATTERRISSAGE = 1.0, -- descente du mode atterrissage (blocs/s)
BLOCS_INTERDITS = { -- blocs sur lesquels ne PAS se poser
["minecraft:water"] = true,
["minecraft:lava"] = true,
},
------------------------------------------------------------------
-- Position reelle affichee = position GPS + ces offsets
------------------------------------------------------------------
OFFSET_X = 0,
OFFSET_Y = 0,
OFFSET_Z = 0,
------------------------------------------------------------------
-- Regulation (cascade altitude -> vitesse verticale -> rpm)
------------------------------------------------------------------
VITESSE_RAMPE = 3.0, -- rampe de consigne d'altitude (blocs/s)
VITESSE_RSC_MAX = 256, -- borne des rotation speed controllers
V_MONTEE_MAX = 3.0, -- vitesse verticale max en montee (b/s)
V_DESCENTE_MAX = 2.0, -- vitesse verticale max en descente (b/s)
-- Feedforward de sustentation: le rpm d'equilibre est calcule
-- depuis le poids et la poussee, le PID ne corrige qu'autour.
-- Transport a charge variable: POIDS est le poids A VIDE; la
-- charge est estimee en vol (adaptation) et la poussee est
-- corrigee par la pression mesuree (elle diminue avec l'altitude).
POIDS = 32000, -- poids A VIDE du drone (pixelNewton)
POUSSEE_HELICE_MAX = 10000, -- poussee d'UNE helice a
-- VITESSE_RSC_MAX et PRESSION_REF (pN)
POUSSEE_EXPOSANT = 1, -- poussee ~ rpm^exp (1 lineaire, 2 carre)
PRESSION_REF = 1.0, -- pression a laquelle POUSSEE_HELICE_MAX
-- est mesuree (getAirPressure)
RATIO_CHARGE_MAX = 0.60, -- poids total max = ratio * 4 * poussee
-- de reference (alerte SURCHARGE au dela)
-- Adaptation en vol (le drone se pese et se trime en stationnaire)
ADAPTATION = {
TAUX_POIDS = 0.05, -- vitesse de transfert vers le
-- feedforward (1/s); petit = stable
TAUX_TRIM = 0.05, -- idem pour le trim d'assiette
SEUIL_DESEQUILIBRE = 15, -- |trim| (rpm) declenchant l'alerte
-- "chargement desequilibre"
},
PID = { -- gains par defaut (remplaces par calib)
alt = { kp = 1.2 }, -- erreur alt -> v cible (1/s)
montee = { kp = 40, ki = 60, kd = 5 }, -- v -> delta rpm
descente = { kp = 40, ki = 60, kd = 5 },
tangage = { kp = 4, ki = 0.5, kd = 8 },
roulis = { kp = 4, ki = 0.5, kd = 8 },
},
------------------------------------------------------------------
-- Ecrans (faces des deux Create_DisplayLink sur le PC)
------------------------------------------------------------------
ECRANS = {
conduite = "front", -- vitesse, altitudes, invites
carburant = "back", -- reserve + autonomie estimee
},
------------------------------------------------------------------
-- Carburant (2 cuves create:fluid_tank sur le reseau)
------------------------------------------------------------------
CARBURANT = {
CAPACITE_TANK = 8000, -- mB par cuve, si tanks() ne donne pas
-- la capacite
SEUIL_ALERTE = 0.15, -- alerte sous ce ratio de reserve
PERIODE = 5, -- periode d'echantillonnage (s)
LISSAGE = 0.1, -- apprentissage glissant de la conso
-- (EMA: 0.1 = lent et stable, 0.5 = reactif)
},
------------------------------------------------------------------
-- Moteur (sortie redstone bottom: 15=arret, 14=mini, 0=maxi)
-- Le moteur est dimensionne pour suffire; en cas de surcharge
-- malgre tout, les PROPULSEURS sont reduits en priorite + alerte.
------------------------------------------------------------------
MOTEUR = {
STRESS_HAUT = 0.90, -- au dela: augmenter le moteur
STRESS_BAS = 0.60, -- en deca: reduire le moteur (economie)
SURCHARGE = 0.98, -- au dela: reduire les propulseurs + alerte
PERIODE = 1.0, -- periode de l'asservissement (s)
BOOST = 4.0, -- pre-boost a pleine puissance lors des
-- changements de regime exigeants (s)
},
------------------------------------------------------------------
-- Navigation (modes auto / position, points enregistres)
------------------------------------------------------------------
NAV = {
SEUIL_ARRIVEE = 2.0, -- distance a la cible consideree atteinte
VITESSE_GPS_MIN = 0.5, -- vitesse mini pour estimer le cap (b/s)
MAX_POINTS = 10, -- points nommes enregistrables
},
------------------------------------------------------------------
-- Calibration (voir README)
------------------------------------------------------------------
CALIB = {
AMPLITUDE = 4, -- pid: hauteur des echelons de test (blocs)
TOL_DEPASSEMENT = 0.0, -- pid: depassement tolere (0 = strict)
BANDE = 0.3, -- pid: bande de convergence (blocs)
DELAI_STABLE = 2.0, -- pid: duree dans la bande = converge (s)
TIMEOUT = 25, -- pid: duree max d'un echelon (s)
MAX_ITER = 6, -- pid: essais par direction
IMPULSION_PAS = 16, -- rsc: increment de vitesse (rpm)
RPM_MANUEL = 10, -- rsc manuel: vitesse de reperage (rpm)
IMPULSION_SEUIL = 0.8, -- rsc/gimbal: variation d'angle declarante (deg)
JOYSTICK_SEUIL = 8, -- joystick: niveau declarant une face (0..15)
},
}
]]
function Conf.charger(journal)
if not fs.exists(CHEMIN) then
local f = fs.open(CHEMIN, "w")
f.write(MODELE)
f.close()
journal.alerte(CHEMIN .. " cree avec les valeurs par defaut: A PERSONNALISER")
end
local chargeur, err = loadfile(CHEMIN)
if not chargeur then
error("drone.conf invalide: " .. tostring(err), 0)
end
local conf = chargeur()
if type(conf) ~= "table" then
error("drone.conf doit retourner une table", 0)
end
if conf.verifie ~= true then
journal.alerte("drone.conf non verifie: relire les parametres puis passer verifie a true")
end
return conf
end
-- Empreinte des parametres dont dependent les gains PID calibres.
-- Si elle change, la calibration PID est invalidee.
function Conf.empreintePid(conf)
return textutils.serialize({
vmax = conf.VITESSE_RSC_MAX,
rampe = conf.VITESSE_RAMPE,
angle = conf.ANGLE_MAX,
poids = conf.POIDS,
poussee = conf.POUSSEE_HELICE_MAX,
exposant = conf.POUSSEE_EXPOSANT,
vmont = conf.V_MONTEE_MAX,
vdesc = conf.V_DESCENTE_MAX,
})
end
return Conf