DIY - FFB Effets : questions théoriques - Pour mise à jour d'openFFB

  • Bonjour à tous,

    je viens de me plonger dans de la lecture sur le calcul des effets Spring/Damper/Inertia/Friction, et j'ai des questions d'ordre théorique :)

    J'ai lu les specs USB-HID, le site de microsoft (Direct Input) et le site de neurobs.com

    Je n'arrive pas à me forger une idée sur les sujets suivants (je passe avec les anglissimes pour ne pas mélanger les notions) :

    • Est ce que le deadBand (qui annule un effet dans une range autour de l'offset) doit décaler l'application des effets Damper/Inertia/Friction qui n'utilisent pas la position comme métric ? J'ai l'impression que oui d'après les specs et les formules, mais ce n'est pas clair pour moi. J'ai vu des implémentations qui le font, d'autres non...
    • Est ce que l'effet de Friction est réellement constant avec comme valeur "magnitude", dès lors que la position n'est plus dans le range offset/deadRange ?

    Je vous remercie par avance pour votre aide.

    Vincent

    Volant DIY (OpenFFBoard + BusCAN + VESC + Mige15015 + BissC c.f. forum pour plus d'info), Pédales DIY (LoadCell, capteur à effet hall, impression 3d, sans fil), Roue DIY (16 boutons, 4 encodeurs, sans fil)

  • Bon et bien j'ai fait des choix :)

    Je suis tombé sur votre code messieurs et du coup, je ne suis pas trop loin de ce que vous avez fait :)

    Pour détaillé ce que j'ai codé :

    • le deadband et l'offset sur tous les effets conditionnels
    • il n'y a pas valeur de magnitude sur un effet conditionnel uniquement un coefficient qui affaibli l'effet, rien pour le booster
    • j'ai codé la friction pour appliquer la force constante (coefficient) capé par saturation (au cas ou il y aurait 2 valeurs différentes, meme si ca devrait pas)
    • j'ai travaillé sur la saturation des effets conditionnels en faisant attention à ce qu'il reste linéraire :
      • le spring : linéarisation du l'ensemble de l'erreur entre la position/offset et la fin de la course du volant : le plus surprenant c'est sur le spring qui obtient max torque au endstop.
      • l'inertia / damper : linéarisation sur la vitesse max et l'accel max que peut donner mon moteur. Là je me pose plein de question, parce que meme si mon moteur ne peut electriquement pas aller plus vite de 250rpm, j'arrive à aller bien plus vite à la main... Mais j'ai quand meme linéarisé sur les caractériques de mon moteur.

    Je vais changer le titre de l'article, car ces questions ont pour vocations à implémenter au "juste" niveau les forces dans OpenFFB.

    magicfr , Etienne, Mizoo et tous les mondes : si vous voyez des bêtises, n'hésitez pas à me corriger pour que le moteur FFB soit le plus pret de la norme ! :)

    Apres on pourra rajouter les tweaks qui vont bien si nous avons besoins de réponses spécifiques à certain matériels (boost de gain, etc.)

    Vincent

    Volant DIY (OpenFFBoard + BusCAN + VESC + Mige15015 + BissC c.f. forum pour plus d'info), Pédales DIY (LoadCell, capteur à effet hall, impression 3d, sans fil), Roue DIY (16 boutons, 4 encodeurs, sans fil)

  • Carlton 23 septembre 2021 à 20:50

    A changé le titre de la discussion du forum de “DIY - FFB Effets : questions théoriques” à “DIY - FFB Effets : questions théoriques - Pour mise à jour d'openFFB”.
  • Je n'avais pas vu ce sujet.

    Pas loin de 10 ans (!) ce sont écoulés depuis que j'ai écrit mon firmware FFB, j'avoue ne pas pouvoir t'aider pour l'instant, il faut que je me replonge dedans. Mais de ce que j'ai vu dans le firmware d'OpenFFB, ce n'était pas déconnant.

    Le dead-band est utilisé dans les jeux actuels ?

    Si ton moteur agit en générateur supérieur à ton alim tu vas devoir passer par la case résistance de freinage, ou court-circuiter le moteur. Je ne sais pas trop ce qui est implémenté dans VESC.

    Tu as dû tomber sur le code source d'Etienne, le mien n'a jamais été mis en ligne.

    Message modifié 1 fois, dernière modification par Mizoo (24 septembre 2021 à 08:49).

  • Merci pour ton retour :)

    Et bien je suis dans les algos et ca se passe plutot bien :D

    Par contre je commence à comprendre ce que disait Etienne a propos de la mise au point de la friction avec des encodeurs ABI de 2500cpr... c'est la m.... :pp :coucou2:

    Pour la résistance, je ne suis pas ennuyé, j'alimente avec une batterie, le jus retourne dans la batterie qui agit comme un super condo infini.

    Par contre sur le principe, y'a un truc sur lequel je n'arrive pas à me faire un avis : les effets qui sont conditionnés par la vitesse et l'accel...

    J'ai codé un truc à partir de la vitesse max et l'accel max que peut avoir un moteur lorsqu'il tourne electriquement. Mais en fait je me dis que ce serait peut etre mieux de le faire par rapport à ce que le pilote peut faire au max avec ses petits bras ? :) un avis ?

    Volant DIY (OpenFFBoard + BusCAN + VESC + Mige15015 + BissC c.f. forum pour plus d'info), Pédales DIY (LoadCell, capteur à effet hall, impression 3d, sans fil), Roue DIY (16 boutons, 4 encodeurs, sans fil)

  • Oui, 2500 PPR (donc 10.000 CPR) c'est un peu juste, j'avais monté un 10.000 PPR pour faciliter les choses.

    Les avis sur le forum de GD sont unanimes quant au gain sur les effets conditionnels quand on passe à un encodeur plus précis.

    Mais j'ai aussi cru comprendre qu'ils avaient travaillé dessus depuis et que c'est maintenant plus acceptable.

    Il y a donc du boulot de ce côté là en ce qui nous concerne.

    Je sais pour ton accu, mais à mon avis ça ne conviendra pas à tout le monde.

    Oui, les effets conditionnels entre surtout en jeu pour contrer l'action du joueur. Encore une fois, avec une alim sous dimensionnée ça ne va pas être évident de réguler le courant correctement.

    EDIT: Justin LE (le Mr derrière Grin Tech) sur le forum endless-sphere a partagé pas mal d'infos sur le sujet, réguler le courant de régénération sur un VAE.

    Message modifié 3 fois, dernière modification par Mizoo (24 septembre 2021 à 09:48).

  • merci pour ce feedback.

    Il y a une personne sur le discord d'OpenFFBoard (Adilrepas) qui a fait un petit schema avec un ampliop en comparateur de tension, un mofset qui commute la resistance de freinage pour absorber le surplus en cas d'utilisation d'Alim.

    Volant DIY (OpenFFBoard + BusCAN + VESC + Mige15015 + BissC c.f. forum pour plus d'info), Pédales DIY (LoadCell, capteur à effet hall, impression 3d, sans fil), Roue DIY (16 boutons, 4 encodeurs, sans fil)

  • Le problème est de dimensionner correctement la résistance, et de faire en sorte que ça n'interfère pas avec la régulation de courant.

    Le piloter depuis le MCU a donc plus de sens.

    Je n'ai toujours pas compris comment GD a réussi à utiliser une résistance de seulement 10W. Soit ils partent du principe que le délestage dure si peu de temps que la résistance peut l'encaisser, ou alors ils court-circuitent aussi le moteur. A un moment il faut bien que l'énergie soit absorbée quelque part si elle ne repart pas dans l'alim ou les condo.

    Et une valeur d'OVP trop faible devrait la faire cramer, ou alors ils mesurent au démarrage le VBUS et désactivent la résistante si VBUS < OVP ?

    EDIT: Quel MOSFET/driver il préconise sur discord ? J'envisageais un FR120N dont des cartes sont dispo partout.

    Message modifié 5 fois, dernière modification par Mizoo (24 septembre 2021 à 09:59).

  • Premier test du moteur FFB que j'ai tweaker pour normaliser les effets et les scaler sur les capacités du pilote sous dirt 2... :inlove: :sleurp2:
    soit c'est génialissime, soit c'est une daube sans nom.

    facile de tenir la voiture : avec 15Nm dans les bras, ca se conduit bien! la trajectoire est précise et ne résiste pas trop... Quand la voiture part en drift, c'est pas la même, attention au couple :hihihi:

    Aucune vibration dans le volant contrairement à ce que j'ai pu avoir avec MMOS et le vesc en PWM.

    :bounce2:

    Volant DIY (OpenFFBoard + BusCAN + VESC + Mige15015 + BissC c.f. forum pour plus d'info), Pédales DIY (LoadCell, capteur à effet hall, impression 3d, sans fil), Roue DIY (16 boutons, 4 encodeurs, sans fil)

  • Je n'ai jamais testé Dirt 2, il utilise quels effets ?

    Idéalement, les effets conditionnels devraient être implémentés dans le contrôleur moteur, et non dans la partie USB FFB, ce serait plus précis. C'est le cas dans la Ioni par ex, mais impossible sur la carte driver OpenFFB. Vesc doit pouvoir être modifié pour.

    Tu as un github pour tes modifs ? De mon côté, je viens de porter OpenFFB sur une Nucleo F412, mais je dois encore rajouter un driver SimpleMotion pour piloter un VSD en SPI, puis la carte IHM08.

    Message modifié 4 fois, dernière modification par Mizoo (30 septembre 2021 à 10:10).

  • dirt rally 2 utilise la friction sur directinput mais, perso, je vois pas la différence entre 0 et 100%

    Core I5-12600K - ASUS Z690 - Sound BlasterX AE-5 Plus - RTX 3080 FE - 32Go RAM - Châssis Motedis X-Dream - Volant Thomconcept Simucube 1 small mige 130ST-M10010 (20 Nm) Biss-c - Samsung 32/9 G9 49" 5120x1440 - Bass-shakers - Heusinkveld Pédales Sim Ultimate+ - Heusinkveld Handbrake - Shifter Manu-Factory SSH14 - OSP Simpro Vocore 5"

    Mon cockpit     Mon SimXperience G-Belt      Mes Dash

  • Dirt2 doit aussi utiliser du damping, je vais tester cela.

    Le fait de rescaller les effets sur les capacités du pilote change clairement la donne, je trouve sinon que les effets sont sous dimensionnés.

    Pour le passage des effets dans l'IONI, jai l'impression qu'ils ont fait machine arriere : leur code source de 2016 était dans ce sens, mais pas le code de 2019. Je pense que c'est à pour pouvoir normalisation les effets entre eux pour éviter le clipping.

    Et je ne comprends pas comment le STM32 de l'IONI (de mémoire un F1 à 72Mhz) est capable de faire tourner un FOC + les effets à un PWM de 25khz...

    Volant DIY (OpenFFBoard + BusCAN + VESC + Mige15015 + BissC c.f. forum pour plus d'info), Pédales DIY (LoadCell, capteur à effet hall, impression 3d, sans fil), Roue DIY (16 boutons, 4 encodeurs, sans fil)

  • Au temps pour moi, les effets conditionnels sont bien dans le module USB FFB sur Simucube, ce sont les filtres qui sont dans le contrôleur.

    Côté OpenFFB, je pense que l'on doit pouvoir améliorer la gestion des effets en adhérent à un fonctionnement vraiment temps réel, ce qui n'est pas encore le cas de ce que j'ai pu voir.

    Le MCU sur la Ioni est un F303 à core M4@72Mhz, et comme indiqué sur leur blog la boucle dure un peu moins de 25µs, 20kHz donc.

    EDIT: on pourrait mesure et comparer l'algo de ST sur un MCU équivalent.

    Message modifié 1 fois, dernière modification par Mizoo (30 septembre 2021 à 17:17).

  • Une vidéo de partage de l'avancement des développement sur les effets... En jeu c'est juste GENIAL (quand ils les gèrent :) !

    Bon une chose quand meme : je suis une chèvre en anglais, encore plus quand je bouge un volant régler à 10Nm, ca commence à tirer dans les bras :)

    External Content www.youtube.com
    Content embedded from external sources will not be displayed without your consent.
    Through the activation of external content, you agree that personal data may be transferred to third party platforms. We have provided more information on this in our privacy policy.

    Volant DIY (OpenFFBoard + BusCAN + VESC + Mige15015 + BissC c.f. forum pour plus d'info), Pédales DIY (LoadCell, capteur à effet hall, impression 3d, sans fil), Roue DIY (16 boutons, 4 encodeurs, sans fil)

  • Comment sont fixées les constantes de gain d'origine ?

    Je suppose que l'on a tous, plus ou moins, la même vitesse max. Donc si elles sont bien calculées on devrait pouvoir se passer de la calibration, non ?

    Si j'ai bien compris cette, calibration n'ajuste que le gain des effets pour éviter qu'ils ne saturent.

    J'ai lu, je ne sais plus où, que dans les simu modernes il n'y a que Dirt 2 et AC (pour les basses vitesses) qui utilisent les conditionnels, la friction en l'occurrence.

    Dès que j'ai un peu de temps je fais en sorte d'afficher les effets en cours dans le configurateur. Sauf si tu veux le faire ;)

    EDIT: je ne me souviens plus, c'est un Mige 10 N.m que tu as ?

    Message modifié 3 fois, dernière modification par Mizoo (1 octobre 2021 à 23:41).

  • Je ne fixe pas les coeff de normalisation à partir des caractéristique de rotation du moteur (vitesse et accel) mais à partir des caractéristiques du pilote.

    Ce qui est ecrit dans la spécification USB-HID :

    • Les effets conditionnels sont la pour donner la force maximum lorsque la métrique associée arrive à cette vitesse max.
    • Tous les facteurs (coefficient, saturation et force) sont normalisés
    • Les effets sont utilisés pour contrer l'action du pilote, pas celle du système électrique

    La question est quelle Vmax retenir : celle du joueur ou celle du moteur ? :?

    J'ai interprété la spec de la même manière que toi dans ta réponse au dessus : les effets sont la pour contrer l'action du joueur et pas l'action électrique. :euh2:

    J'ai retenu la Vmax et l'Accelmax du joueur, et cela me semble encore plus logique avec les moteur Brushless.

    En prenant l'exemple du damper : ce que j'attends du moteur FFB c'est qu'il me contre moi lorsque j'atteins ma limite : si je peux tourner à max 120rpm max, j'attends de lui de m'envoyer le couple max de 10Nm à 120rpm.

    Comme j'ai un moteur brushless, la Vmax moteur est de 200rpm pour 36V. Cette vitesse de rotation est lié à la tension de mon alim moteur. Que je passe de 24V à 48V, j'aurai besoin du même couple de contre à 120rpm (de mes mains) et ca quelque soit la vitesse de rotation de mon moteur. Si l'alim ne lui permet de tourner qu'à 100rpm, je ne veux pas le savoir, je veux mes 10Nm à 120rpm, parce que je les vaut bien :hihihi:

    A l'usage, j'ai remarquée que quand ma fille prends le volant et le calibre pour elle, le jeu lui envoie bien 100% de couple de ce qu'elle peut gérer quand elle tourne le volant à sa Vmax à elle. Un système adaptable à son utilisateur : que vouloir de plus :)

    J'ai un mige 15015, je peux envoyer 30A, ce qui donne 45Nm :rip: Pour le moment, j'ai configuré le vesc pour avoir un +-20A (30Nm), mais je limite à dans le configurateur le FFB max. Comme j'envoie le couple au vesc par le CAN avec un float normalisé sur -1..1, je garde mes 0.01A de précision de commande de couple.

    Je n'ai pas prévu de faire la récupération des effets dans le jeu, j'attaque l'intégration de l'encodeur absolu de mige dans le vesc et dans OpenFFBoard... J'ai vu que dans le couche HID, il a commencé à implémenter un système de rapport USB pour les utilisateurs. Je ne sais pas s'il l'utilise, mais je me suis dit que ce serait cool si on avait un graphe cumulé qui montre le volume de couple de chaque type d'effet : ca permettrait de visualiser le clipping et les effets en cause :D Mais bon c'est luxe :jesors:

    Pour dirt2 et AC, ca tombe bien, ce sont les simu auxquelles je joue :)

    Volant DIY (OpenFFBoard + BusCAN + VESC + Mige15015 + BissC c.f. forum pour plus d'info), Pédales DIY (LoadCell, capteur à effet hall, impression 3d, sans fil), Roue DIY (16 boutons, 4 encodeurs, sans fil)

  • Je n'ai pas prévu de faire la récupération des effets dans le jeu, j'attaque l'intégration de l'encodeur absolu de mige dans le vesc et dans OpenFFBoard... J'ai vu que dans le couche HID, il a commencé à implémenter un système de rapport USB pour les utilisateurs. Je ne sais pas s'il l'utilise, mais je me suis dit que ce serait cool si on avait un graphe cumulé qui montre le volume de couple de chaque type d'effet : ca permettrait de visualiser le clipping et les effets en cause :D Mais bon c'est luxe :jesors:

    Tu parles de l'encodeur au protocole Biss-C ? Je suis curieux de connaitre sa latence.

    Tu as encore des pins de libre sur le VESC ?

    De mon côté j'attends des composants pour m'attaquer à l'encodeur Yaskawa, s'il fonctionne encore ...

    Le graph par effets, je l'avais fait à l'époque, la saturation arrive sur le cumul, c'est rarement un seul effet qui la provoque.

    Message modifié 1 fois, dernière modification par Mizoo (2 octobre 2021 à 16:09).

  • Pour le Biss-C je compte utiliser l'UART1 à 500bps, voir au dela si ca passe... tu as les pin rx/tx dispo sur le connecteur principal

    Volant DIY (OpenFFBoard + BusCAN + VESC + Mige15015 + BissC c.f. forum pour plus d'info), Pédales DIY (LoadCell, capteur à effet hall, impression 3d, sans fil), Roue DIY (16 boutons, 4 encodeurs, sans fil)

  • Alors, l'uart 1, ca ne marche pas :D le signal est tout caca à cause du bit start/stop de serial.

    Du coup je suis passé en SPI et là j'y vois beaucoup plus clair, si on peut dire :D

    Je suis en DMA pour éviter de surcharger ce CPU pour rien.

    Le capteur BISS-C du mige à une latence de 10us au début et 8.5us à la fin, j'arrive à avoir une lecture stable à 32us tout compris, donc 14us de lecture réelle pour le moment.

    https://photos.app.goo.gl/J5BKwPtFpruYtBV16

    Volant DIY (OpenFFBoard + BusCAN + VESC + Mige15015 + BissC c.f. forum pour plus d'info), Pédales DIY (LoadCell, capteur à effet hall, impression 3d, sans fil), Roue DIY (16 boutons, 4 encodeurs, sans fil)

  • 32 µsec, ok, donc on a toujours un cycle PWM de retard, à faible vitesse je doute qu'on ait à le compenser.

    Je ne vois pas ce que tu comptais faire avec l'UART, simuler le signal d'horloge avec les données ?

    En tout cas le Biss-C est autrement plus simple à implémenter que le protocole du Yaskawa (HDLC avec encodage Manchester à 8MHz).

    Message modifié 1 fois, dernière modification par Mizoo (3 octobre 2021 à 21:06).