Outils pour utilisateurs

Outils du site


openscad

Installation version portable à l'IUT

Thingiverse

Notations pour les changements de repères

Choix des notations de: https://www.gdr-robotique.org/cours_de_robotique/online/Khalil-Dombre_Modelisation/Khalil-Dombre_Modelisation.pdf

Matrice de rotation dont les colonnes sont les axes du repère $i$ exprimés dans le repère $j$: $^i_{}R_{j}$

Vecteur translation exprimant l'origine du repère $j$ dans le repère $i$: $^i_{}T_{j}$

Matrice de changement de repère:

$^i_{}M_{j}=\begin{bmatrix}
^i_{}R_{j} & ^i_{}T_{j}\\
0 & 1
\end{bmatrix}
$

Matrice rotation dans le plan

Solution TD1

librepere.scad
////////////////////////////////
module fleche(resolution=60){
    cylinder(h = 0.5, r1 = 0.1, r2 = 0.1, center = false,$fn=resolution);
    translate([0,0,0.5])
        cylinder(h = 0.5, r1 = 0.2, r2 = 0, center = false,$fn=resolution);
}
////////////////////////////////
module repere(){
    color("red")
        rotate(90,[0,1,0])  //équivalent à rotate([0,90,0])
            fleche(10);
    color("green")
        rotate(-90,[1,0,0])
            fleche(10);
    color("blue")
        rotate(0,[0,1,0])
            fleche(10);
}
////////////////////////////////

TD1.scad
use <librepere.scad>
repere();
 
/*
translate([1,2,3]) repere();
//équivalent à:
angle=0;
multmatrix(m = [ [cos(angle), -sin(angle), 0, 1],
                 [sin(angle),  cos(angle), 0, 2],
                 [         0,           0, 1, 3],
                 [         0,           0, 0,  1]
              ]) repere();
*/
/*
rotate([0,0,45]) repere();
//équivalent à: 
angle=45;
multmatrix(m = [ [cos(angle), -sin(angle), 0, 0],
                 [sin(angle),  cos(angle), 0, 0],
                 [         0,           0, 1, 0],
                 [         0,           0, 0,  1]
              ]) repere();
*/
 
scale([0.5,1,2]) repere();
//équivalent à: 
multmatrix(m = [ [0.5, 0, 0, 0],
                 [0, 1, 0, 0],
                 [0, 0, 2, 0],
                 [0, 0, 0,  1]
              ]) repere();
 
 

Exemple de modélisation Denavit-Hartenberg avancé

Matrice de Denavit Hartenberg, notation de Khalil et Kleinfinger page 3 de: https://www.gdr-robotique.org/cours_de_robotique/online/Khalil-Dombre_Modelisation/Khalil-Dombre_Modelisation.pdf

dh.scad
//B. Vandeportaele 2023
 
//les angles sont en degrés!
use <librepere.scad>
//////////////////////////////////
//matrice de Denavit Hartenberg, notation de Khalil et Kleinfinger page 3 de:
//https://www.gdr-robotique.org/cours_de_robotique/online/Khalil-Dombre_Modelisation/Khalil-Dombre_Modelisation.pdf
module matDh(alpha=0,d=0,theta=0,r=0){
    multmatrix(m = [ [cos(theta)           , -sin(theta), 0, d],
                     [cos(alpha)*sin(theta), cos(alpha)*cos(theta), -sin(alpha), -r*sin(alpha)],
                     [sin(alpha)*sin(theta), sin(alpha)*cos(theta),  cos(alpha),  r*cos(alpha)],
                     [         0           ,           0          ,      0     ,    1      ]   ])
        children(); 
    } 
//////////////////////////////////
module robot(tabtheta){
repere();
//exemples d'utilisation de matDh
//matDh(alpha=10,d=0,theta=0,r=0) repere();
//matDh(alpha=0,d=1,theta=0,r=0) repere();
//matDh(alpha=0,d=0,theta=10,r=0) repere();    
//matDh(alpha=0,d=0,theta=0,r=1) repere();        
//matDh(alpha=10,d=1,theta=10,r=1) repere();            
//pour animer:    
//matDh(alpha=10,d=1,theta=180*sin($t*360),r=1) repere();                
 
///////////////////////////////////
 
d3=5;
rl4=6;
 
 
matDh(theta=tabtheta[1-1]){
    repere();                    
    matDh(alpha=90,theta=tabtheta[2-1]){
        repere();   
        matDh(d=d3,theta=tabtheta[3-1]){
            repere();   
            matDh(alpha=-90,theta=tabtheta[4-1],r=rl4){
                repere();   
                matDh(alpha=90,theta=tabtheta[5-1]){
                  repere();   
                  matDh(alpha=-90,theta=tabtheta[6-1]){
                    repere();           
                    }       
                }        
            }        
        }               
    }        
}
}
////////////////////////////////////////////////////////////////
//animer avec angle= $t*360
tabtheta=[$t*360,-10,0,0,0,0];
robot(tabtheta);

A faire pour la seconde séance

Modéliser la molécule d'eau: https://en.wikipedia.org/wiki/Properties_of_water

TD2

Modélisation d'une palette:

Version faite en TD

td2.scad
//B. Vandeportaele 2023
use <librepere.scad>
eps=0.0001;
 
resolution=20;  //paramètre pour régler le niveau de détail du modèle rendu
bords_arrondis=1; //1 pour sphere, 2 pour cylindre
 
/////////////////////
module piece(jeu=0){
rotate([90,0,0])
    translate([0,0,-10])
        cylinder(h=20,r=15+jeu,$fn=resolution);
}
/////////////////////
module palette(){
rotate([90,0,0])    
    union(){
        difference(){
            minkowski(){
                #linear_extrude(height = 400, center = true, convexity = 10, twist =0)
                    polygon([[0,0],[100,0],[100,50],[0,100]], [[0,1,2,3]], convexity = 10);
                if (bords_arrondis==1){
                    sphere(r=4,$fn=resolution);
                } else {
                    //rotate([90,0,0])
                    cylinder(r=4,h=1,$fn=resolution);
                }
            }
        translate([0,104,0]) 
            rotate([0,0,atan2(-50,100)])
                for (b =[1:2]){    
                    for (a =[-4:4]){
                       echo(a+b*9);        // affichage numéro pièce
                       if (((a+b*9) % 4 )!=0){
                            translate([b*42-5,0,a*42])
                            //scale([20,20,20]) repere();
                            piece(0.5);
                        }                
                    }
                 }
        translate([0,104,0]) 
            rotate([0,0,atan2(-50,100)])
                hull(){
                    for (b =[1,2]){    
                        for (a =[-4,4]){
                            echo(a+b*9);     // affichage numéro pièce
                            if (((a+b*9) % 4 )!=0){
                                translate([b*42-5,9,a*42])
                                    //scale([20,20,20]) repere();
                                    piece(0.5);
                            }
                        }
                    }
                }
        }
        translate([15,10,205-eps])
            scale([1.2,2.1,1])
                linear_extrude(height = 10, center = true, convexity = 10, twist =0)
                    text("IUT GEII");
    }
}
//////////////////:
palette();

Version étendue

td2.scad
include <repere.scad>
////////////////////
//Paramètres réglables:
resolution=20; //résolution réglable pour générer le maillage
nbtrouj=7;  //paramètre pour faire varier le nombre de trous sur l'axe j, valeur doit être impaire!
rayoncourbure=10; //rayon de courbure pour arrondir les arêtes,la palette n'est pas agrandie quand on change le rayon
////////////////////
module piece(jeu=0){
    rotate([90,0,0])
        translate([0,0,-10])
            cylinder(h=20,r=15+jeu,$fn=resolution);   
}
////////////////////
module palette(){
    rotate([+90,0,0])
        difference(){
            union(){
               #minkowski(){
                    linear_extrude(height = nbtrouj*42+22-2*rayoncourbure, center = true, convexity = 10)
                       //polygon(points=[[0,0],[100,0],[100,50],[0,100]],paths=[[0,1,2,3]]);                        
                        polygon(points=[[rayoncourbure,rayoncourbure],[100-rayoncourbure,rayoncourbure],[100-rayoncourbure,50-rayoncourbure*0.6],[rayoncourbure,100-rayoncourbure*1.6]],paths=[[0,1,2,3]]);
                    sphere(r=rayoncourbure,$fn=resolution); // ou rotate([90,0,0])  cylinder(r=4,$fn=resolution);
                }
               translate([20,20,((nbtrouj*42+22)/2)])
                    scale([1.2,2.1,1])
                        linear_extrude(height = 5, center = true, convexity = 10)
                            text("IUT GEII");
            }
        //hull()
            {
            translate([0,100,0])
                //rotate([0,0,-atan(50/100)]) 
                rotate([0,0,atan2(-50,100)])
                //rotate([0,0,atan2(-50,100-14)])
                //for (i=[-4:4]){
                for (i=[-floor(nbtrouj/2):floor(nbtrouj/2)]){    
                    for (j=[1:2]){
                        if(((j*9+i)%4)!=0){
                            translate([j*42-5,0,i*42]){
                                repere();
                                #piece();
                            }            
                        }
                        else
                            echo("pas ici");        
                    }
                }
            }
        }
}
////////////////////
palette();
openscad.txt · Dernière modification : 2024/03/16 17:09 de bvandepo