Viewing 56 reply threads
  • Author
    Posts
    • #8716
      laurent
      Participant

      bonjour a tous , aller ont va faire un peux vivre le forum, j’ai plein de questions qui me gratte alors je les pose en espérant avoir des réponses

      1- j’ai une Lenovo dans le dos de ma chose, ma question est il est vraiment possible de faire fonctionner la kinect 360 sur la Lenovo ?

      2-J’ai vue que certain utilisé leurs iphone pour contrôler chaque servo moteur, ou puis je trouver l’apps pour iphone, et comment le faire fonctionner ?

      3- j’ai remarquer que certains avez une bouche qui se fermer totalement, pourtant mécaniquement la mienne ne peux pas se fermer totalement , y a t’il une astuce pour la fermer totalement ?

    • #8720
      Gael Langevin
      Keymaster

      Bonjour,
      -La kinect 360 peut fonctionner sur la tablette Lenovo, mais elle n’est pas auto alimentée par l’USB, mais par le secteur.
      Par contre dans le cas la nouvelle Kinect V2, c’est compliqué car en USB3, il faut updater vers windows10 en espérant que la tablette que tu as, est une 64 bits. La tablette Lenovo existe en 32 bits et 64 bits…

      -Lorsque j’ai fait fonctionner InMoov avec mon iPhone, j’ai utilisé des codes que j’avais trouvé sur internet grâce à un Brézilien qui s’appelle Brancante.
      Les codes sont disponibles sur le forum Anglosaxon.
      https://groups.google.com/forum/#!topic/inmoov/qunRiG4u9S0
      https://groups.google.com/forum/#!topic/inmoov/2tvncAZPljk

      -Mécaniquement la bouche peut se fermer totalement. Vérifie ton montage, afin de t’assurer que la barre transversale ne vient pas en buté contre le servo moteur avant que la bouche soit totalement fermée.

    • #8722
      Dominique
      Participant

      Salut Laurent,

      Oui, effectivement, plus personnes ne postent ici, c’est bizarre.

      Bon, après tous les tests que j’ai fait, je peux te dire que les tablettes, latte panda ou autre système à base d’Atom ne tiennent pas la route. Si l’on veut que le robot puisse évoluer il faut un vrai PC.

      Je suis donc en train de réfléchir à installer une carte mère mini itx dans le dos de mon robot. Surement avec un processeur I5. Le gros problème est la consommation.

      Pour les commandes à distance, regarde le post sur les commandes HTTP.

      Pour la bouche, c’est bizarre, la mienne se ferme bien. Maintenant j’ai du adapté un peu et poncer.

      Dom.

    • #8726
      Gael Langevin
      Keymaster

      @Dominique, avec la version inmoov-master cela simplifie énormément les configurations d’InMoov sur MyRobotLab, donc il n’y a plus de question.
      🙂
      Moins de question répétitive, c’est bon signe, cela veut dire que les tutoriels sont plus compréhensible.
      Pour ma part, entre les conférences à l’étranger, le travail, et la mise en place avec Anthony et christian de la nouvelle config, je n’ai pas beaucoup de temps pour discuter.

      Pour info je construis mon troisième InMoov pour une exposition à la Monnaie de Paris en Septembre, j’ai reçu mes 14 servo moteurs PDI-HV2060MG.
      Mes premiers tests sont concluants, mais je ne pense sincèrement pas qu’ils puissent soulever 60kg comme indiqué dans les specs.
      La transformation et démontage du potentiomètre est simple si on est muni d’une pompe ou de tresse à dessouder. L’ergo de blocage de rotation (90°) peut s’avérer difficile à extraire de l’engrenage. Somme toute, il faut être plus outillé qu’avec le 805bb Hitec.
      Ces servos se déconnectent proprement sous MyrobotLab et ne sont pas trop bruyants.

      Je vais modifier le torse afin d’utiliser une Astra au lieu d’une kinect Microsoft. Plusieurs avantage, et cela fait déjà trois ans que je veux le faire.
      Je vais également modifier plusieurs éléments afin de rajouter des capteurs à infrarouge sur le torse et la possibilité d’installer des enceintes de plus gros volumes.
      J’ai également créer une nouvelle main plus simple de construction. Il me reste encore à la tester avec les HK15298B.

      • This reply was modified 7 years, 6 months ago by Gael Langevin.
    • #8728
      laurent
      Participant

      Bonjour , alors Gaël, bon pour la lenovo, trop tard je vient de m’apercevoir que celle que j’ai acheter est une 32 bit ;(

      je revient sur la kinect 360, j’utilise pour l’instant un core i3 Windows 10, une carte graphique Radeon HD 7400M ! il detect bien la kinect mais impossible d’installer le pack kinectSDK V1.8 et bien il il me maque des chose d’après vous mon pc est il assez puissant ?

    • #8729
      laurent
      Participant

      donc je revient vers vous pour ma kinect
      -dans gestionnaire de périphérie, j’ai bien mes drivers vois photo
      -quand j’ouvre kinect studio v1.8 il ne detect pas la kinect voir photo pourquoi d’après vous ?

      Attachments:
      You must be logged in to view attached files.
    • #8731
      laurent
      Participant

      photo

      Attachments:
      You must be logged in to view attached files.
    • #8733
      laurent
      Participant

      photos

    • #8735
      laurent
      Participant

      bon visiblement la kinect fonctionne sous MRL, quand je lui dit capture gestuelle je me vois en gris , et un ta de ligne ce dessine sur moi (squelette) par contre question bête, il peux pas faire les mème mouvements que moi en live avec ça ? si oui merci de me dire comment.

    • #8737
      Dominique
      Participant

      Bah voilà, finalement tu y arrive tout seul. Tes un chef…

      Pour que les bras bougent, il faut envoyé les valeurs obtenus dans tes servos. Il manque l’appel aux fonctions dans la base d’Anthony (surement en cours).

      Fait une recherche de la fonction “def onOpenNIData(data):”
      et ajoute ceci… normalement tu a déjà tous ça dans ce que je t’ai donnée.

      ` if data:
      skeleton = data.skeleton

      leftElbow = round(skeleton.leftElbow.getAngleXY())
      leftOmoplate = round(skeleton.leftShoulder.getAngleXY())
      leftShoulder = round(skeleton.leftShoulder.getAngleYZ())

      rightElbow = round(skeleton.rightElbow.getAngleXY())
      rightOmoplate = round(skeleton.rightShoulder.getAngleXY())
      rightShoulder = round(skeleton.rightShoulder.getAngleYZ())

      try:
      leftElbow = int(leftElbow)
      leftOmoplate = int(leftOmoplate)
      leftShoulder = int(leftShoulder) – 50

      rightElbow = int(rightElbow)
      rightOmoplate = int(rightOmoplate)
      rightShoulder = int(rightShoulder) – 50
      except ValueError:
      print “Erreur de conversion: “, ValueError

      if leftElbow>0 and leftOmoplate>0 and leftShoulder>0:
      if DEBUG_KINECT==1:
      print “Coude gauche : “, leftElbow
      print “Omoplate gauche: “, leftOmoplate
      print “Epaule gauche : “, leftShoulder

      moveArm(“left”, leftElbow, 90, leftShoulder, leftOmoplate)

      if rightElbow>0 and rightOmoplate>0 and rightShoulder>0:
      if DEBUG_KINECT==1:
      print “Coude droit : “, rightElbow
      print “Omoplate droite: “, rightOmoplate
      print “Epaule droite : “, rightShoulder

      moveArm(“right”, rightElbow, 90, rightShoulder, rightOmoplate)

      La kinect commande omoplate, épaule et biceps. Rotate reste à 90. Mets DEBUG_KINECT=1 en haut de ton fichier. Ainsi tu pourra voir les valeurs dans l’onglet python. Ils sont fonctions du positionnement de ton squelette.

      @Gael: Super pour les PDI. Moi j’en suis content. Pour les 60Kg, je pense comme toi mais pour y arriver, il faut 7.4V. De plus, les 60Kg données se situent sur l’axe de sorti du servo. Evidemment cette force diminue plus le bras de levier augmente. C’est pareil pour tout les servo.
      J’ai reçu 2 modèles différents pour les PDI HV2060MG. Les premiers que j’ai reçu avez la clavette très facilement démontable. Le dernier modèle reçu avait la clavette intégré au pignon… impossible à enlever. J’ai du scier la clavette et finir à la lime. Bon j’y suis arriver mais c’est pas évident.
      Pour le potar, je dessoude les 3 fils a son niveau puis je chauffe les soudures de l’autre cotés du circuit et les fils s’enlève sans problème. Pas besoin de pompe à dessoudé.

      Pour les évolutions, je lance un nouveau post, afin que chacun puisse donner ces idées…

    • #8740
      laurent
      Participant

      bonjour Dominique, tu parle de ça ,,?(fichier joint)? et ton script il va a la suite ? c’est vraiment pas mon truc ce genre de modif

      Attachments:
      You must be logged in to view attached files.
    • #8742
      Dominique
      Participant

      aprés la ligne 61…

      normalement tu a cela:

      def onOpenNIData(data):
      #####################################################
      # This is openni functions that do jobs
      #####################################################
        global KinectStarted
        if data and not KinectStarted:
          KinectStarted=1

      et bien tu mets mon code à la suite. Mets les fonctions moveArm en commentaire dans un premier temps afin de voir si cela fonctionne.

    • #8745
      Gael Langevin
      Keymaster

      Bonsoir,
      Merci Dominique, je l’ai rajouté au inmoov_develop:
      https://github.com/MyRobotLab/inmoov/blob/develop/InMoov/services/E_OpenNI.py

      Je l’ai adapté pour que cela soit compatible.

      Pas encore testé sous cette version par contre.

    • #8750
      laurent
      Participant

      bonjour, bon Dominique j’ai modifié ce fameux fichier voir image joint, cela ne bouge pas plus, quand je dit démarre kinect, ok il démarre la kinect, quand je dit capture gestuelles OK il démarre dans mrl openni, et la je vois mon squelette suivre mes mouvements, met l’inmoove ne répercute pas ces mouvement ! quand tu parle de laisser les fonctions moveArm en commentaire, cela donne quoi ? et pour ne plus les mettre en commentaire il faut juste enlevé les les parenthèses ? bon en gros avec cette modif de fichier mrl ne met aucune erreur et démarre correctement, mais la bête ne bouge pas ! quand je fait des mouvement

      Attachments:
      You must be logged in to view attached files.
    • #8757
      Dominique
      Participant

      @Gael

      J’ai regardé l’update du fichier E_OpenNI.py.

      J’ai constaté des problèmes d’indentation, peut tu vérifier ? a la ligne 90 et 97 il faut retirer une indentation.

      De 100 à 104 également.

    • #8758
      Dominique
      Participant

      Oui, il faut aussi remplacer moveArm par i01.moveArm pour être compatible avec le service InMoov.

    • #8759
      anthony
      Moderator

      chouette cette fonctionnalité les gars !
      il faudrait peut être conditionner l’action pour ne pas qu’elle se lance à chaque démarrage du kinect. Si le kinect est utilisé pour autre chose comme le position d’un élément dans l’espace utilisé par le service IK. hâte de tester ça

    • #8763
      laurent
      Participant

      bonjour, pffff merci pour vos réponse mais je pense pas qu’elle me serve beaucoup 🙁 une indentation c quoi CA ?? )

      conditionner l’action?,ba la non plus je sait pas ce que c’est .

    • #8768
      Dominique
      Participant

      @Anthony, s’il te plait, pour les idées d’évolutions, il faut les mettre dans le post correspondant. Ici, c’est juste pour que Laurent puisse faire bouger les bras avec la kinect, il ne faut donc pas l’embrouiller…

      Mais tu a raisons, la kinect peut servir à beaucoup de choses.

      Bon MakerFaire…

    • #8798
      Dominique
      Participant

      Bon, j’ai fait des tests avec la dernière version de MRL et la gestuelle avec la kinect fonctionne parfaitement.

      Après les tests que j’ai effectué chez Laurent sur la nouvelle base, j’ai constaté que la fonction def onOpenNIData(data): n’était jamais appelé. Du coup le problème de Laurent vient de la.

      @Gael ou Anthony: Pourquoi n’utilisez vous pas la fonction kinect gestuelle intégrée dans le service InMoov ?

    • #8799
      anthony
      Moderator

      je vais tester cela quand j aurais ressuscité Rachel. la fonction onOpenNIData() est censée être appelée si le kinect a été activé dans la config : isKinectActivated=True

    • #8800
      laurent
      Participant

      bonjour, Rachel n’a pas survécu au salon ? ,??

    • #8815
      laurent
      Participant

      bon ba rien a faire la kinect montre bien le squelette mais l’inmoove ne bouge absolument pas :((

    • #8816
      Dominique
      Participant

      Slt, Anthony a mis à jour le service InMoov. Tout est maintenant intégré a ce service. Tu doit donc installer la dernière version.

    • #8817
      Dominique
      Participant

      Slt,

      Anthony a mis à jour le service InMoov. Tout est maintenant intégré a ce service. Tu doit donc installer la dernière version.

    • #8818
      laurent
      Participant

      bonjour,Dominique ha c’est cool ça euu c’est ou ?

    • #8820
      anthony
      Moderator

      Hello les gars c’est pas encore au point, j’ai l’impression que openni override les mappings. je validerais ça ce soir. ( mes biceps ont chauffé )
      Pour les mise à jour tu replace le jar simplement par le nouveau. https://github.com/MyRobotLab/inmoov/wiki/HOWTO—SETUP-&-PREREQUISITES

    • #8823
      laurent
      Participant

      excellent ça fonctionne ;))) merci Anthony trop fort 😉 il bat des ailles comme un nouveau née 🙂 par contre la tete ne bouge pas en kinect ni rollneck normal ?

    • #8825
      Gael Langevin
      Keymaster

      Content que cela marche pour toi Laurent!
      Ravi de t’avoir rencontré à la Makerfaire de Paris.
      La tête et rollneck ne sont pas encore pris en charge par la kinect sous MyRobotLab.

    • #8826
      laurent
      Participant

      Bonjour Gaël, ce fut également un plaisir pour moi, je vais essayer d’aller a Nantes en juillet, avec un autres constructeur, jespert que j’aurais l’occasion de remercier Anthony de vive voix 😉

    • #8832
      laurent
      Participant

      je ne sait pas si cela peux aider, mais c’est très curieux! quand je démarre mrl, avant et meme avec la new version, il me dit open cv ne peux pas démarrer la camera 0 ! bref et il continue, et a ce moment la, la kinect démarre et fonctionne.

      Par contre si au démarrage je débranche USB de la kinect, alors la open cv s’allume sans erreur, mais le commande démarre la kinect n’opère plus (la kinect ne démarre plus)

      si je reboot mon pc, alors j’ai a nouveau alerte open cv n’arrive pas a démarrer camera 0, et la kinect re-fonctionne, ça ressemble a un conflit entre opencv et openni,

    • #8847
      Gael Langevin
      Keymaster

      C’est un pb de camera.
      La kinect contient également une caméra, ce qui fait que OpenCv détecte deux caméras et ne sait sur laquelle démarrer. Les deux sont certainement considérer comme Camera=0
      dans la config OpenCv essaye de remplacer 0 par 1.

      CameraIndex=1
      DisplayRender=default
      ;use SarxosFrameGrabber if problems like on lattepanda computer
      streamerEnabled=False

      Dis nous si cela solutionne ton pb.
      Sinon il faudrait que l’on ajoute une variable sous OpenNI.config pour déterminer la caméra.

    • #8854
      laurent
      Participant

      Bonjour Gael,bon après avoir essayer camera 1 après 2 toujours pareil alerte apencv ne peux pas démarrer camera 1 ou 2, , tous le reste du fichier est conforme au tien.

      j’ai un autre soucis enfin 2 autres.

      1- après avoir démarrer la kinect et fait joujou avec, le truc c’est que la commande arrête la kinect, ne fonctionne pas, donc obligé de sauter sur l’usb de l’arduino ,pour mettre fin a la gestuelle sinon aie ( en gros, le processus de démarrage kinect nickel, mais le processus d’arrêt ne fonctionne pas.

      2-Mon deuxième soucis, est plus curieux ! dans le fichier skeleton_LiftArm.config, j’ai besoin de rentrer la coordonner maxi du servo omoplate 90, et j’enregistre avec Notepad, (fichier 1 joint)
      Le truc c’est que dans MRL, la coordonnée maxi de ce servo reste toujours a 180, et donc déboitage de vis omoplate,

      par contre pour la partie skeleton rigtharm. config j’ai du mettre maxi 46, et pas de soucis, MRL est caler a 46 maxi donc vis en cours maxi a la limite de l’écrou (très bien 🙂

      ma question est, pourquoi MRL refuse de prendre en compte ma coordonné maxi du skeleton_LiftArm.config, et donc la laisse a 180, et qu’il accepte de modifié ma partie RIGTH ,,??

    • #8855
      laurent
      Participant

      FICHIER 1

      Attachments:
      You must be logged in to view attached files.
    • #8857
      laurent
      Participant

      FICHIER 2

      Attachments:
      You must be logged in to view attached files.
    • #8869
      laurent
      Participant

      curieux ce truc

    • #8870
      Gael Langevin
      Keymaster

      @Laurent,
      1-La fonction pour stopper la kinect STOP LA KINECT Est-ce que cette fonction génère une erreur sur MRL? Celle-ci n’a pas vocation d’arrêter les servo moteurs mais d’arrêter la capture kinect et de mettre le robot en pose “rest”(repos).
      Par contre ces deux fonctions de démarrage et d’arrêt on étés codées il y a presque 4 ans pour mon InMoov01 et il y a un mapping qui s’opère sur les shoulder, et je ne sais pas si ces mappings sont encore nécessaire. Il faudrait que je teste.

      2-Verifie tes configs au niveau des INPUT pour voir si tu as une différence entre le skeleton_LeftArm et le skeleton_RightArm dans la section:

      ;———————————– ADVANCED CONFIGURATION —–

      [MINIMUM_MAP_INPUT]
      bicep=0
      rotate=0
      shoulder=0
      omoplate=0

      [MAXIMUM_MAP_INPUT]
      bicep=180
      rotate=180
      shoulder=180
      omoplate=180

    • #8871
      laurent
      Participant

      OK gael c’était bien dans ;———————————– ADVANCED CONFIGURATION —–,

      une autre question, en mode kinect, quand je lève les bras ,ceci ont pas de limite haut, la position 0 bras contre le corps OK, par contre si j’ai le malheur de monter mes bras trop haut ( comme un oiseau qui prend sont envole), alors la il y a pas de valeur maxi, et mes vis se déboîte des épaules, ou puis je brider le maxi de mes bras en mode kinect pour ne plus qu’il se déboîte quand je lève les bras ?

    • #8872
      anthony
      Moderator

      hello quelques lignes plus haut je suspectais openni ne pas respecter les maping. Mes biceps ayant brulé. tu le confirme donc 🙂
      A creuser

    • #8873
      laurent
      Participant

      tes biceps ont brulée pourquoi Anthony?

    • #8874
      Dominique
      Participant

      Hey les gars, chez moi ça marche nickel sans jamais dépassé les limites.

      Anthony, j’ai vu que tu avais viré les tests que j’avais fait sur les valeurs données pas openni. Du coup c’est fort possible qu’il y a des valeurs négatives qui passent…(problème qui s’est passé à la première lancé d’ariane 5 lol)…maintenant avec le mapping des servos, les limites ne devrait jamais être dépassé…

    • #8875
      anthony
      Moderator

      c’était po fini maintenant c’est testable, le mot clé est “TRACKING SQUELETTE”

    • #8876
      laurent
      Participant

      euu c’est quoi tracking squelette,,??

    • #8877
      laurent
      Participant

      quand je lui dit TRACKING SQUELETTE il ne prend pas cela comme un ordre, mais comme une simple phrase

    • #8879
      anthony
      Moderator

      Fais une petite mise à jour

    • #8881
      Gael Langevin
      Keymaster

      STOP LA KINECT est a nouveau fonctionnel, j’ai supprimé les anciens mappings.

    • #8883
      anthony
      Moderator

      cool, je l’avais pas vu celui la, un coup a te faire flamber quelques composants !

    • #8886
      laurent
      Participant

      bonjour, oui mais il y a une mise a jour a faire ?? car moi cette commande vocale fonctionne pas ! comment l’activé ?

      a propos c’est bon en mode kinect mes omoplates ont maintenant une limite maxi,

    • #8888
      Gael Langevin
      Keymaster

      @Laurent, soit tu fais une mise à jour(plus long à faire), ou soit tu copies/colles dans InMoov/gestures/offkinect.py

      https://github.com/MyRobotLab/inmoov/blob/develop/InMoov/gestures/offkinect.py

      def offkinect():
        openni.stopCapture()
        i01.copyGesture(False)
        rest()
    • #8889
      laurent
      Participant

      ok, gael, je veux bien faire une mise a jour, car il y en aura d’autre je suppose, mais comment je fait une mise a jour?

    • #8890
      laurent
      Participant

      c’est de copier tous les répertoire de ton lien pour remplacer les miens ?

    • #8950
      laurent
      Participant

      bonjour, et bien apres avoir modifié le fichier offkinect.py, l’ordre stop la kinect ne fonctionne toujours pas :_

    • #8951
      Gael Langevin
      Keymaster

      Bonjour Laurent,
      lorsque tu dis STOP LA KINECT, est-ce que tu as une erreur qui s’affiche en bas de MRL en rouge?
      Tu as bien fait un copié/collé de mon offkinect.py?

    • #8954
      laurent
      Participant

      bonjour, rien il ne prend pas stop la kinect comme un ordre mais comme une simple phrase

    • #8956
      Gael Langevin
      Keymaster

      Je pense que tu devrais faire un update de inmoov-develop, il doit te manquer la commande dans programAB.
      Je conserve toujours ma précédente version intacte afin d’éviter de perdre ou écraser quoique ce soit, c’est pour cela que je créer pour chaque nouvelle version, un nouveau dossier qui comporte la référence de la version MRL.

      -Créer un nouveau dossier C:/mrl/myrobotlab.1.0.22XX (tu modifies afin de mettre le n°de version)
      -Télécharge la dernière version de MRL: https://s3.amazonaws.com/mrl-bucket-02/current/develop/myrobotlab.jar
      -Télécharge la dernière version de inmoov-develop: https://github.com/MyRobotLab/inmoov/archive/develop.zip
      -Copie/colle le dossier “InMoov” de ton ancienne version dans ton nouveau dossier.
      -Glisse myrobotlab.jar dans ton nouveau dossier
      -Décompresse ce qui est dans inmoov-develop.zip/inmoov-develop/InMoov dans ton nouveau dossier, cela va te demander si tu veux remplacer les fichiers existant, accepte.(InMoov, START_INMOOV.bat start.imoov.sh et les autres fichiers…)
      -Une fois les éléments remplacés, dans ton nouveau dossier, double clique sur START_INMOOV.bat et laisse faire toute l’installation.

      Tes configs personnelles seront sauvegardées ainsi que ce qui est dans ton dossier “custom”.

      NOTA: Il y a également moyen de lancer un update automatique via la commande python updateMe(), mais de mon côté ça ne marche pas encore. (Anthony avait mis cela en place, mais il y a certainement eu une modif qui fait que cela ne fonctionne plus)

    • #8976
      laurent
      Participant

      Bonjour Gael, merci beaucoup pour les liens et la procédure, et bien c’est OK j’ai réussi à le faire ! donc sur mon PC, cela fonctionne bien, j’ai beaucoup plus de commande vocal fonctionnel, par contre, des difficultés avec le démarrage de la kinect, l’ordre démarre la kinect ne faite par, apparaître le squelette, par contre defois, il apparaît au bout de quelques minutes, et le stop kinect, ne marche pas car, quand je dis stop kinect! il interprète constamment comme top kinect ou stoppe kinect donc cela ne marche pas, il y a un endroit où je peux changer l’ordre stop kinect ,par top kinect dans le programme ?.
      je l’ai installé également sur ma lenovo ! cela fonctionne, sauf que, quand je parle avec lui il me dit pas le début des phrases ! surement un manque de mémoire, ou de rapidité du processeur! qu’en penses-tu ?
      en tout cas merci beaucoup, grasse à toi, je sais faire une mise à jour maintenant, petit à petit çà rentre tous çà

    • #8995
      Gael Langevin
      Keymaster

      Bon c’est super!
      STOP LA KINECT n’est peut-être pas bien reconnu par la reconnaissance vocale de Google.
      J’ai rajouté deux fonctions SRAI dans le fichier InMoov/chatbot/bots/fr/aiml/_inmoovGestures.aiml
      Ligne 629.
      https://github.com/MyRobotLab/inmoov/blob/develop/InMoov/chatbot/bots/fr/aiml/_inmoovGestures.aiml

      Tu peux les ajouter manuellement dans ton fichier. Ces commandes vocales peuvent être dites à la place de STOP LA KINECT:

      Attachments:
      You must be logged in to view attached files.
Viewing 56 reply threads
  • You must be logged in to reply to this topic.