Vous n'êtes pas identifié(e).
Futur nouvel inscrit, tu dois au préalable lire l'intégralité des 10 articles des règles, s'il te plaît. Tout nouveau compte qui ne respecte pas les règles sera supprimé par l'administration.
Bonjour à tous,
si je comprends bien c'est dérivé de la pression hydraulique?
Exact. La propriété "engines/engine/oil-pressure-psi", qui n'est pas calculée par Yasim, est recalculée à partir de la propriété "systems/hydraulics/psi-norm".
Il y a effectivement la possibilité de recalculer plus simplement cette pression en xml à partir des rpm moteur. Je le ferai certainement pour la prochaine version du Citation X.
Fg 2020.4.0 - Linux Mint 21.3 Victoria - Cinnamon et Mate en dual boot - CM Asus P8H67 MLE - CPU i7 3770K - 12 Go Ram - Nvidia Geforce GTX 1660TI - Driver Nvidia 525
+ Hp notebook-15 - Linux Mint 21.3 Victoria - CPU i3-7020u - Ram 4Go - Intel Graphics 620.
Hors ligne
Bonjour,
J'ai juste simulé au travers d'un petit fichier nas la fonction manuelle set de /. Cela marche très bien mais je ne comprend pas le message qui apparaît au lancement de FG :
35.36 [ALRT]:nasal Nasal runtime error: function/method call on uncallable object
35.36 [ALRT]:nasal at /home/gerard/fgfs-dev/install/flightgear/fgdata/Nasal/globals.nas, line 119
Le fichier nasal est :
#Affectation de la pression huile
var oil_pressure = func {
var oilp = 25.0;
setprop ("engines/engine[0]/oil-pressure-psi",oilp);
settimer (oil_pressure,0.1);
}
setlistener ("/sim/signals/fdm-initialized",oil_pressure());
J'ai essayé de vérifier si le nom choisi n'était pas déjà utilisé en interne.
Mb Asus Tuf Z390-plus Gaming, Core I9-9900kf, Ram 32 Gb, Cg Nvidia Rtx 3070, Ssd 1 Tb, Hdd 2tb, W11 Home
Dell ALienware 15R3, Core i7-6700hq, Ram 32 gb, Cg Nvidia gtx 1060, SSD 500 gb, HDD 1 tb, linux lmint 21.2
Hors ligne
Cela marche très bien mais je ne comprend pas le message qui apparaît au lancement de FG :
35.36 [ALRT]:nasal Nasal runtime error: function/method call on uncallable object
35.36 [ALRT]:nasal at /home/gerard/fgfs-dev/install/flightgear/fgdata/Nasal/globals.nas, line 119
Erreur due au "setlistener".
Code corrigé :
var oil_pressure = func {
var oilp = 25.0;
setprop ("engines/engine[0]/oil-pressure-psi",oilp);
settimer (oil_pressure,0.1);
}
setlistener ("/sim/signals/fdm-initialized",func{oil_pressure()},0,0);
Le ",0,0" après la parenthèse n'est pas obligatoire mais il est judicieux de l'écrire car il permet quelques possibilités supplémentaires(1,0 ou 0,1 ou 1,1). Voir le wiki à ce sujet.
Il est bon également de déclarer les variables avant les fonctions : dans ta boucle générée par le settimer, la variable "oilp" est recrée à chaque itération, ce qui signifie que l'ancienne (de l'itération précédente) est mise dans le "garbage collector" (corbeille) d'où une perte de temps.
Ton code, pour être propre, devrait donc être
var oilp = nil;
var oil_pressure = func {
oilp = 25.0;
setprop ("engines/engine[0]/oil-pressure-psi",oilp);
print("oilp = ",getprop("engines/engine[0]/oil-pressure-psi"));
settimer (oil_pressure,0.1);
}
setlistener ("/sim/signals/fdm-initialized",func{oil_pressure()},0,0);
J'ai rajouté une ligne "print" qui permet de debugger le code et vérifier dans la console que la boucle fonctionne correctement
Fg 2020.4.0 - Linux Mint 21.3 Victoria - Cinnamon et Mate en dual boot - CM Asus P8H67 MLE - CPU i7 3770K - 12 Go Ram - Nvidia Geforce GTX 1660TI - Driver Nvidia 525
+ Hp notebook-15 - Linux Mint 21.3 Victoria - CPU i3-7020u - Ram 4Go - Intel Graphics 620.
Hors ligne
Bonsoir,
Merci pour la correction mais 1) il y a encore le même message et 2) l'accolade fermante isolée avant les derniers arguments de setlistener est surprenante. Je l'ai supprimé, pensant à une erreur de frappe, mais cela ne change rien et en plus cela fait une parse error à la ligne correspondante.
Bien cordialement
GR
Mb Asus Tuf Z390-plus Gaming, Core I9-9900kf, Ram 32 Gb, Cg Nvidia Rtx 3070, Ssd 1 Tb, Hdd 2tb, W11 Home
Dell ALienware 15R3, Core i7-6700hq, Ram 32 gb, Cg Nvidia gtx 1060, SSD 500 gb, HDD 1 tb, linux lmint 21.2
Hors ligne
Merci pour la correction mais 1) il y a encore le même message et 2) l'accolade fermante isolée avant les derniers arguments de setlistener est surprenante. Je l'ai supprimé, pensant à une erreur de frappe, mais cela ne change rien et en plus cela fait une parse error à la ligne correspondante.
Bizarre, car je n'ai pas d'erreur en console chez moi. L'accolade fermante n'est pas isolée, elle correspond à une accolade ouvrante après "func"
setlistener ("/sim/signals/fdm-initialized",func { oil_pressure() },0,0);
Fg 2020.4.0 - Linux Mint 21.3 Victoria - Cinnamon et Mate en dual boot - CM Asus P8H67 MLE - CPU i7 3770K - 12 Go Ram - Nvidia Geforce GTX 1660TI - Driver Nvidia 525
+ Hp notebook-15 - Linux Mint 21.3 Victoria - CPU i3-7020u - Ram 4Go - Intel Graphics 620.
Hors ligne
Bonsoir,
Je ne comprend pas : je viens de faire un copier - coller et le résultat est le même. De plus je ne vois pas l'accolade ouvrante correspondant à celle dans setlistener.
Mb Asus Tuf Z390-plus Gaming, Core I9-9900kf, Ram 32 Gb, Cg Nvidia Rtx 3070, Ssd 1 Tb, Hdd 2tb, W11 Home
Dell ALienware 15R3, Core i7-6700hq, Ram 32 gb, Cg Nvidia gtx 1060, SSD 500 gb, HDD 1 tb, linux lmint 21.2
Hors ligne
Je ne comprend pas : je viens de faire un copier - coller et le résultat est le même.
Il faut peut-être modifier aussi la ligne setlistener de "converTemp"
setlistener ("/sim/signals/fdm-initialized", func {converTemp()},0,0);
Intel i5-9400F, 16Go Ram, Nvidia GTX1660Ti, Linux Mint
Hors ligne
Bonsoir,
Effectivement cela marche bien maintenant. Cette fonction setlistener est bien complexe et en plus apparemment il faut que dans toutes les routines nasal qui la mettent en oeuvre il y ait cohérence dans le passage de ses arguments. J'espère que la suite sera plus simple à appréhender. En tous cas merci encore pour votre aide.
Bien cordialement.
GR
Mb Asus Tuf Z390-plus Gaming, Core I9-9900kf, Ram 32 Gb, Cg Nvidia Rtx 3070, Ssd 1 Tb, Hdd 2tb, W11 Home
Dell ALienware 15R3, Core i7-6700hq, Ram 32 gb, Cg Nvidia gtx 1060, SSD 500 gb, HDD 1 tb, linux lmint 21.2
Hors ligne
Bonjour à tous, bonjour GR,
Cette fonction setlistener est bien complexe et en plus apparemment il faut que dans toutes les routines nasal qui la mettent en œuvre il y ait cohérence dans le passage de ses arguments.
Non, elle est n'est pas complexe, elle est même simple et très pratique une fois qu'on en a compris le fonctionnement.
Il y a deux catégories d'utilisation :
1 - Au démarrage du système (pour ne pas avoir d'erreurs nasal) avec "/sim/signals/fdm-initialized". Une fois son travail accompli (système démarré), il est bon de l'enlever car elle ne sert plus à rien et prend du temps processeur. Pour cela, ton code devient :
var oilp = nil;
var oil_pressure = func {
oilp = 25.0;
setprop ("engines/engine[0]/oil-pressure-psi",oilp);
settimer (oil_pressure,0.1);
}
var stl = setlistener ("/sim/signals/fdm-initialized",func {
oil_pressure();
removelistener(stl);
},0,0);
2 - Pour capter un évènement qui change peu fréquemment comme dans ce cas (tiré de citationX.nas) :
setlistener(ApuRunning, func(n) {
if (getprop(Bleed)>0) setprop(BleedAir,n.getValue());
else setprop(BleedAir,0);
},0,0);
Dans ce cas, le "setlistener" reste actif en permanence et on ne l'enlève donc pas. Ici, le func(n) permet de récupérer la valeur de ApuRunning. C'est l'équivalent d'un getprop(ApuRunning). On envoie cette valeur dans setprop(BleedAir sous la forme n.getValue().
On aurait pu l'écrire :
setlistener(ApuRunning, func {
if (getprop(Bleed)>0) setprop(BleedAir,getprop(ApuRunning));
else setprop(BleedAir,0);
},0,0);
Pour les évènements qui changent très fréquemment, comme pour les rpm moteurs par exemple, on n'utilise pas de setlistener mais une boucle update avec un settimer.
Fg 2020.4.0 - Linux Mint 21.3 Victoria - Cinnamon et Mate en dual boot - CM Asus P8H67 MLE - CPU i7 3770K - 12 Go Ram - Nvidia Geforce GTX 1660TI - Driver Nvidia 525
+ Hp notebook-15 - Linux Mint 21.3 Victoria - CPU i3-7020u - Ram 4Go - Intel Graphics 620.
Hors ligne
Bonjour,
Merci pour toutes ces précisions.
L'idée de lier la pression d'huile aux rpm est en effet séduisante et semble simple à mettre en oeuvre (quoique dans mon cas je crains le pire). Toutefois sachant qu'il ne s'agit que d'un affichage cela devrait suffire. Une question toutefois ; dans quelles conditions une courbe de réponse (rpm - pression huile) serait elle vraiment représentative de la réalité, courbe établie évidemment à partir des DR400 JSBSim ?
Bien cordialement
GR
PS1 : j'ai remarqué que dans le CitationX la propriété systems/hydraulics/psi-norm était toujours à 1 (d'où une pression d'huile figée à 50 psi). Cela m'a un peu surpris car j'avais cru comprendre que cette propriété était à la base de l'évaluation de la pression d'huile dans le cas de cet appareil YASim.
PS2 : il n'a pas été difficile de trouver une première courbe (oil-press/rpm) qui permet à l'aiguille de l'indicateur de se positionner correctement. Il reste ensuite le problème du remplacement de la propriété oil-press par la valeur interpolée dans le fichier xml. Faut il alors passer par quelques lignes nasal ?
Dernière modification par GR (23/10/2019 17:03:00)
Mb Asus Tuf Z390-plus Gaming, Core I9-9900kf, Ram 32 Gb, Cg Nvidia Rtx 3070, Ssd 1 Tb, Hdd 2tb, W11 Home
Dell ALienware 15R3, Core i7-6700hq, Ram 32 gb, Cg Nvidia gtx 1060, SSD 500 gb, HDD 1 tb, linux lmint 21.2
Hors ligne
Une question toutefois ; dans quelles conditions une courbe de réponse (rpm - pression huile) serait elle vraiment représentative de la réalité
La courbe de réponse rpm - pss d'huile ne sert qu'au démarrage du moteur. Ensuite, que le moteur soit au ralenti ou à pleine vitesse, la pression d'huile ne doit pas varier puisqu'elle est régulée par des clapets de décharge et de surpression.
j'ai remarqué que dans le CitationX la propriété systems/hydraulics/psi-norm était toujours à 1 (d'où une pression d'huile figée à 50 psi).
Elle croit de 0 à 1 pendant la montée en régime du turbofan au démarrage. Lorsque le turbofan est stabilisé au ralenti la propriété est à 1 et le reste même si le régime moteur augmente. C'est une propiété -norm ce qui veut dire qu'elle ne varie que de 0 à 1.
Fg 2020.4.0 - Linux Mint 21.3 Victoria - Cinnamon et Mate en dual boot - CM Asus P8H67 MLE - CPU i7 3770K - 12 Go Ram - Nvidia Geforce GTX 1660TI - Driver Nvidia 525
+ Hp notebook-15 - Linux Mint 21.3 Victoria - CPU i3-7020u - Ram 4Go - Intel Graphics 620.
Hors ligne
Bonsoir,
Concernant le PS2 de mon message précédent la modification de la valeur de la propriété oil-pressure-psi peut elle être faite en nasal à l'intérieur du fichier xml via le bloc CDATA ?
Mb Asus Tuf Z390-plus Gaming, Core I9-9900kf, Ram 32 Gb, Cg Nvidia Rtx 3070, Ssd 1 Tb, Hdd 2tb, W11 Home
Dell ALienware 15R3, Core i7-6700hq, Ram 32 gb, Cg Nvidia gtx 1060, SSD 500 gb, HDD 1 tb, linux lmint 21.2
Hors ligne
Concernant le PS2 de mon message précédent la modification de la valeur de la propriété oil-pressure-psi peut elle être faite en nasal à l'intérieur du fichier xml via le bloc CDATA ?
Oui.
Fg 2020.4.0 - Linux Mint 21.3 Victoria - Cinnamon et Mate en dual boot - CM Asus P8H67 MLE - CPU i7 3770K - 12 Go Ram - Nvidia Geforce GTX 1660TI - Driver Nvidia 525
+ Hp notebook-15 - Linux Mint 21.3 Victoria - CPU i3-7020u - Ram 4Go - Intel Graphics 620.
Hors ligne
Bonsoir,
J'ai fait quelques essais que vous trouverez probablement farfelus mais je suis bloqué malgré de nombreuses recherches sur les différents 'howto'. Voici donc les quelques modifications que j'ai apporté au fichier oil-press.xml :
<blue> 0.04 </blue>
</emission>
</animation>
<nasal>
<load><![CDATA[
var frpm-loc = func {
setprop ("engines/engine[0]/oil-pressure-psi",getprop ("engines/engine[0]/rpm"));
settimer (frpm-loc,0.1);
}
setlistener ("/sim/signals/fdm-initialized",func{frpm-loc()},0,0);
frpm-loc ();
]]></load>
</nasal>
<animation>
<type>rotate</type>
<object-name>needle</object-name>
<property>/engines/engine[0]/oil-pressure-psi</property>
<interpolation>
<entry><ind> 0.0 </ind><dep> 0 </dep></entry> <!-- 0 bar -->
<entry><ind> 500. </ind><dep> 20 </dep></entry> <!-- 2 bar -->
<entry><ind> 750. </ind><dep> 30 </dep></entry> <!-- 4 bar -->
<entry><ind> 1200. </ind><dep> 40 </dep></entry> <!-- 6 bar -->
<entry><ind> 1600. </ind><dep> 50 </dep></entry> <!-- 8 bar -->
<entry><ind> 2500. </ind><dep> 60 </dep></entry> <!-- 10 bar -->
</interpolation>
Si dans l’animation je met directement la propriété rpm en entrée cela permet d’avoir une position correcte de l’aiguille car j’ai changé la table d’interpolation. Mais la proprieté oil-pressure-psi reste à 0 et le voyant est toujours allumé.
Les quelques lignes nasal avaient alors pour but de forcer cette propriété à prendre la valeur interpolée qui semble correcte. Mais manifestement cela ne marche pas. Il y a trop d’éléments que je ne maîtrise pas.
Je pense que la fonction frpm-loc est appelée par FG car dans un essai précédent j’avais créé une autre propriété prenant les valeurs de rpm. Cette autre propriété apparaîssait alors dans l’arbre / mais avec la mention ‘none’ qui normalement signifie qu’il s’agit d’un emplacement vide alors qu’il avait été rempli par un setprop.
Mon problème est donc 1) d'être sûr que la démarche est valable, 2) d'être vraiment sûr que la fonction créée est correctement utilisée (vraisemblabement non) et 3) de récupérer la valeur interpolée et de l’affecter à la propriété concernée.
Merci encore de votre aide.
Bien cordialement.
GR
PS la courbe oil-press vs rpm n'est qu'indicative : à partir de 1700 rpm la pression est comprise entre 50 et 55 psi.
Dernière modification par GR (25/10/2019 23:21:53)
Mb Asus Tuf Z390-plus Gaming, Core I9-9900kf, Ram 32 Gb, Cg Nvidia Rtx 3070, Ssd 1 Tb, Hdd 2tb, W11 Home
Dell ALienware 15R3, Core i7-6700hq, Ram 32 gb, Cg Nvidia gtx 1060, SSD 500 gb, HDD 1 tb, linux lmint 21.2
Hors ligne
Bonjour à tous, bonjour GR,
Pour faire simple, voici ce que je te propose :
1 - calcul de la propriété "engines/engine/oil-pressure-psi" par un setlistener à mettre dans "dr400.nas" vers la ligne 342 (avant"# Global loop function")
setlistener("engines/engine/running", func(n) {
if (n.getValue()) interpolate("engines/engine/oil-pressure-psi",72.5,5);
else interpolate("engines/engine/oil-pressure-psi",0,5);
},0,0);
Les "interpolate" servent à faire monter ou descendre la pression moins brutalement. 72.5 est la valeur à atteindre en 5 secondes.
J'utilise un setlistener car la propriété "running" ne change que sur arrêt/démarrage moteur, donc inutile d'utiliser un "update" ou un "settimer" qui font perdre du temps de calcul.
2 - fonctionnement de l'indicateur qui est en bars. A modifier dans "oil-press.xml".
<animation>
<type>rotate</type>
<object-name>needle</object-name>
<property>engines/engine[0]/oil-pressure-psi</property>
<interpolation>
<entry><ind>0</ind><dep>0</dep></entry> <!-- 0 bar -->
<entry><ind>72.5</ind><dep>32</dep></entry> <!-- 5 bar -->
</interpolation>
<center>
<x-m> -0.001 </x-m>
<y-m> 0.000 </y-m>
<z-m> -0.015 </z-m>
</center>
<axis>
<x> -1 </x>
<y> 0 </y>
<z> 0 </z>
</axis>
</animation>
Le voyant de pression d'huile fonctionne maintenant correctement (déclenchement à 14 psi).
Fg 2020.4.0 - Linux Mint 21.3 Victoria - Cinnamon et Mate en dual boot - CM Asus P8H67 MLE - CPU i7 3770K - 12 Go Ram - Nvidia Geforce GTX 1660TI - Driver Nvidia 525
+ Hp notebook-15 - Linux Mint 21.3 Victoria - CPU i3-7020u - Ram 4Go - Intel Graphics 620.
Hors ligne
Bonsoir,
Merci pour les quelques lignes de correction. L'important pour moi maintenant est surtout de comprendre vraiment ce qu'il y a entre ces quelques lignes. J'ai donc encore pas mal de recherches et d'essais à faire. Concernant mes essais préliminaires j'aimerais bien aussi comprendre pourquoi cela n'a pas marché et notamment pourquoi la fonction locale frpm-loc n'était pas exécutée correctement (soit pas du tout, soit générant une propriété de type string avec le label none).
Bien cordialement.
GR
PS quelques heures plus tard
Il est clai que la recherche d'une documentation vraiment explicite est un vrai parcours du combattant. Pour essayer de comprendre je suis alors passé par des impressions intermédiaires dans dr400.nas et je ne comprend pas pourquoi la pression d'huile est toujours à 0 après le passage dans la fonction interpolate, bien qu'elle soit à 72.5 dans /. Dans l'utilisation qui en est faite ici cette fonction ne fait pas une interpolation : elle affecte seulement la valeur arbitraire de 72.5 (ou n'importe quelle autre) en 5 s pour simuler la montée en pression. Si la variable logique "running" est 1 la valeur de la pression est imposée, autrement elle vaut 0. Cela revient, à la proportionnalité de la réponse près dans le délai spécifié, à faire en interne ce que l'on fait en externe via set dans /.
Mon objectif était ici plutôt d'utiliser des propriétés transmises par YASim pour construire une valeur physique de cette pression. C'était le but de mes essais infructueux mais manifestement j'en suis encore très loin mais j'apprend ce qui est l'objectif principal.
PS2 Pour supprimer l'allumage du warning08 j'ai ajouté les lignes suivantes dans warning.xml
<animation>
<type>select</type>
<object-name>warning08.on</object-name>
<condition>
<not><property>engines/engine/running</property></not>
</condition>
</animation>
Les conditions ne sont probablement pas suffisantes mais cela marche.
Dernière modification par GR (27/10/2019 20:16:43)
Mb Asus Tuf Z390-plus Gaming, Core I9-9900kf, Ram 32 Gb, Cg Nvidia Rtx 3070, Ssd 1 Tb, Hdd 2tb, W11 Home
Dell ALienware 15R3, Core i7-6700hq, Ram 32 gb, Cg Nvidia gtx 1060, SSD 500 gb, HDD 1 tb, linux lmint 21.2
Hors ligne