155 lines
6.4 KiB
Lua
155 lines
6.4 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
|
|
------------------------------------------------------------------
|
|
VITESSE_RAMPE = 3.0, -- rampe de consigne d'altitude (blocs/s)
|
|
VITESSE_RSC_MAX = 256, -- borne des rotation speed controllers
|
|
PID = { -- gains par defaut (remplaces par calib)
|
|
montee = { kp = 12, ki = 2.0, kd = 18 },
|
|
descente = { kp = 10, ki = 1.5, kd = 22 },
|
|
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)
|
|
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,
|
|
})
|
|
end
|
|
|
|
return Conf
|