Aller au contenu


Photo
- - - - -

Code de Servomoteur Pour Unity


5 réponses à ce sujet

#1 yougo

yougo

    Habitué

  • Membres
  • PipPip
  • 235 messages

Posté 09 avril 2018 - 05:01

Salut les Makers !

 

Si vous avez déjà essayé de faire votre simulation sur Unity, vous savez probablement qu'il est super-simple de faire des moteurs, mais quand on veut des servos moteurs, ben c'est foutu... On doit les faire tout seul !
 
Ce fut le cas de mon équipe pour simuler notre robot walk-E
walkE.jpg
 
 
Du coup on vous partage ici ce qu'on a fait pour créer des servos moteurs sous Unity. 
 
Donc ci-dessous le code en C# : 
 
//@walk-e Team
//vous pouvez utiliser et modifier ce code comme bon vous semble 
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class ScriptMoteur : MonoBehaviour
{

    public HingeJoint hingeJoint3D;
    GameObject mainServo;
    private JointMotor motor;

    [Tooltip("Angle of the target servo in degrees")]
    [Range(-180f, 180f)]
    public float targetServoAngle;

    private float anglerech; //angle que le moteur cherche à atteindre 

    //boucle qui va s'exécuter au lancement de la simu juste une fois 
    void Start()
    {
        anglerech = targetServoAngle;

        this.motor = hingeJoint3D.motor;
        //unity a déjà prévu d'ajouter des moteurs surs la jointure 
        //donc hingeJoint3D.motor est un moteur que l'on va pouvoir controler
        this.motor.force = 50;
        //on peut changer la force du moteur

        this.motor.targetVelocity = 0;
        //on peut changer la vitesse de rotation 

        this.motor.freeSpin = false;
        //pour le laisser en roue libre
        
        this.hingeJoint3D.motor = motor;
        // hingeJoint3D.motor = motor pour que hingeJoint3D.motor prenne bien les modifs de motors 
        //j'oubliais ca au debut donc forcement ca marche pas trop 

        this.hingeJoint3D.useMotor = true;
        //on lui dit qu'elle doit utiliser le moteur 


        Debug.Log("ServoMoteurEnAction");


    }

    //ici c'est une boucle qui tourne tout le long de le sium à chaque rafraîchissement de l'ecran
    void Update()
    {

        //on calcule la distance entre this.hingeJoint3D.angle (angle actuel) et l'angle cible 
        float distance = Mathf.DeltaAngle(this.hingeJoint3D.angle, targetServoAngle);

        //en fonction de ca on déduit le sens de rotation
        if (distance < 0)
        {
           motorActiv(-1);
        }
        else
        {
           motorActiv(1);
        }


        this.hingeJoint3D.motor = motor;
        //on oublie pas à la fin de void Update() de bien utiliser hingeJoint3D.motor = motor; sinon les modifs appliqués a motor ne s'appliquent pas 
    }


    //un setter si jamais on veut changer l'angle cible dans une classe externe
    public void setAngle(int pvanglerech)
    {
        this.anglerech = pvanglerech;
    }


    //fonction 'principale'   
    private void motorActiv(int way)
    {
        this.motor.targetVelocity = 100 * way;
        this.motor.force = 100;
        UpdateRotationLimits(way);
        hingeJoint3D.useLimits = true;
    }

    //on change juste les limites pour stoper le moteur 
    void UpdateRotationLimits(int direction)
    {
        var limits = new JointLimits();
        if (direction == 1)
        {
            limits.max = targetServoAngle;
            limits.min = 0;
        }
        if (direction == -1)
        {
            limits.min = targetServoAngle;
            limits.max = 0;
        }
        hingeJoint3D.limits = limits;
    }

 //ce qui suit fut trouvé sur internet (Open Source bien sur)  -------------------------

    float AngleFromAngle1ToAngle2Degrees(float angle1, float angle2)
    {
        angle1 = WrapAngleDegrees(angle1);
        angle2 = WrapAngleDegrees(angle2);
        if (angle2 - angle1 < 180 && angle2 > angle1)
        {
            return angle2 - angle1;
        }
        else if (angle2 - angle1 > 180 && angle2 > angle1)
        {
            return -(360 - (angle2 - angle1));
        }
        else if (angle1 - angle2 < 180 && angle1 > angle2)
        {
            return -(angle1 - angle2);
        }
        else if (angle1 - angle2 > 180 && angle1 > angle2)
        {
            return 360 - (angle1 - angle2);
        }
        else if (angle1 - angle2 == 180)
        {
            return 180;
        }
        else if (angle2 - angle1 == 180)
        {
            return 180;
        }
        return 0;
    }
                           

    // Convenience function to keep the angles in range from -360 to 360
    static float WrapAngleDegrees(float angle)
    {
        angle = (float)Math.IEEERemainder(angle, 360);
        if (angle <= 0)
        {
            angle += 360;
        }
        else
        {
            if (angle > 360)
            {
                angle -= 360;
            }
        }
        return angle;
    }








}

 
(J'ai essayé de commenter un max mais bon je peux pas tout expliquer il vous faudra des bases en C# et Unity quand même) 
 
Et ici un projet en .zip Unity déjà tout fait contenant un petit bipède déjà tout fait spécialement pour vous qu'il ne vous reste qu'à faire courir partout :
 
Fichier joint  RobotMaker.zip   4,2 Mo   639 téléchargement(s)
 
Pour ouvrir: décompressez , ouvrez unity, cliquez sur 'open', sélectionnez le dossier.  
Une fois ouvert cliquez dans assets sur la seule scene disponible.
 
 
En espérant que vous appréciez et que ca va vous servir  ;)

  • Oracid , Melmet , Mike118 et 2 autres aiment ceci

Venez check le Twitter : 

 

https://twitter.com/Projet_WALK_E

 


#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 09 avril 2018 - 05:30

Super comme partage ! =) 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 yougo

yougo

    Habitué

  • Membres
  • PipPip
  • 235 messages

Posté 09 avril 2018 - 07:07

Merci beaucoup 


Venez check le Twitter : 

 

https://twitter.com/Projet_WALK_E

 


#4 Melmet

Melmet

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 519 messages
  • Gender:Male
  • Location:Saint-Sozy (46200)

Posté 10 avril 2018 - 05:49

Bravo ca  c'est du partage :) 


Ne demande jamais à un robot de faire ce que tu peux faire toi même. :nono: :laugh1:


#5 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 10 avril 2018 - 07:35

Je vois un petit bipède immobile...
C'est tout ?

#6 yougo

yougo

    Habitué

  • Membres
  • PipPip
  • 235 messages

Posté 10 avril 2018 - 05:03

Non, tu as un GameObject qui flotte en forme de losange, tu cliques dessus et là tu peux modifier manuellement l'angle de chaque moteur !

 

Forcement le but n'est pas de faire ca manuellement mais avec du code c'est pourquoi dans le code il y a : 

    public void setAngle(int pvanglerech)
    {
        this.anglerech = pvanglerech;
    }

//permet de changer l'angle visé 

qui va te permettre d'agir sur le code a partir d'une autre classe ;)

 

j'ai aussi mis le GO 'head' en kinematic, ce qui explique pourquoi le robot flotte dans le vide.


  • Oracid et Melmet aiment ceci

Venez check le Twitter : 

 

https://twitter.com/Projet_WALK_E

 




Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users