VRML Preparation for Robot Simulation/es

Este tutorial explica como utilizar FreeCAD y el entorno de simulación de Robots para simular los movimientos de un robot de 6 ejes. El tutorial se centra en la creación de un archivo VRML utilizado como visualización. La base del archivo VRML es el modelo de FreeCAD. La versión de FreeCAD utilizada es 0.11.4252ppa1 en Ubuntu 32bit.

Abrir un archivo o crear uno con FreeCAD
El tutorial está basado en un archivo STEP de un Stäubli TX40 (TX40-HB.stp). Puedes descargar el archivo de https://secure.staubli.com/Intranet_Applications/Robotics/Group/RobDoc.nsf/ea05b3f4b301f597c1256d5f005665e8/bc3707ec036c9f6bc12576c700327958/$FILE/page.html. Sin embargo, aunque aún no he tenido tiempo para comprobarlo, el método debería también aplicarse a un modelo creado completamente en FreeCAD. Después de abrir el archivo deberías tener esto:



Observa, que en la importación, el robot es creado en 8 formas, directamente en la raíz del árbol del documento. La estructura del archivo VRML exportado debe cambiarse si se utilizan grupos. Las formas están ordenadas desde la base a la herramienta. La última forma contiene los ejes de rotación de todos los ejes del robot. Los nombres de las formas son dados de forma correlativa (de momento, marzo de 2011, FreeCAD no importa los nombres incluidos en los archivos STEP):

Cambia el “modo de visualización” de cada forma, excepto TX40_HB007, de “líneas planas” a “sombreado” para que la exportación a VRML tenga un buen aspecto. Yo también he cambiado el color a [245, 196, 0] y [204, 204, 204] para corresponderse mejor con el amarillo de Stäubli. Oculta TX40_HB007 porque contiene los ejes de todas las uniones y no puede cogerse aparte.

Medición de características geométricas
Para construir la tabla Denavit-Hartenberg (mira http://sourceforge.net/apps/mediawiki/free-cad/index.php?title=6-Axis_Robot) y preparar el archivo VRML, necesitas obtener las características del robot. De momento, la herramienta de medición de FreeCAD aún no está disponible, puedes utilizar los ejes incluidos en TX40_HB007 (las coordenadas son indicadas en la parte inferior izquierda cuando apuntas un objeto con el ratón) o tienes que utilizar la consola de Python para obtener algo de información sobre la geometría. Observa que la tabla DH-table sólo es requerida si necesitas utilizar cinemática inversa, por ejemplo obtener las coordenadas cartesianas o conducir el robot con coordenadas cartesianas. La tabla DH-table para este robot es la siguiente (mm, deg y deg/s):

El archivo CSV es entonces:

a, alpha, d  , theta, rotDir, maxAngle, minAngle, AxisVelocity 0,   -90, 320,     0,      1,      180,     -180, 555 225,     0,  35,   -90,      1,      125,     -125, 475 0  ,    90,   0,    90,      1,      138,     -138, 585 0  ,   -90, 225,     0,      1,      270,     -270, 1035 0  ,    90,   0,     0,      1,    133.5,     -120, 1135 0  ,     0,  65,     0,      1,      270,     -270, 1575

Exportar a VRML
Exportar el documento a un archivo VRML. La estructura del archivo VRML es la siguiente:

Group { children Group { children [ Group { …        },         Group { …        },         Group { …        },         Group { …        },         Group { …        },         Group { …        },         Group { …        },         Group { …        } ]     } }
 * 1) VRML V2.0 utf8

Puedes observar que tenemos 8 grupos independientes correspondientes a las 8 formas.

Preparación del archivo VRML
All shapes in the vrml file are expressed in the base frame, independently from each other. For the Robot Simulation Workbench, we need to create a structure where a movement of a shape induces a movement of all shapes situated afterwards in the structure. The placement of the shapes will be relative to the preceding shape, so we need to include some translations from the absolute reference system to the relative one. The translations are described in the following picture:



With
 * A=(0, 0, 168)
 * B=(0, 107.8, 320)
 * C=(0, 104.15, 545)
 * D=(0, 35, 601)
 * E=(0, 35, 770)
 * F=(0, 35, 835).

Let's take the example of axis 4 between ELBOW and FOREARM, situated at D=(xd, yd, zd). The anchor for the FreeCAD axis is "DEF FREECAD_AXIS4 Transform { rotation 0 1 0 0 children [" This corresponds to a rotation about the y-axis. In the CAD model, the rotation is about the z-axis. Thus, we need to a rotation about the x-axis of $$\pi$$ before the FreeCAD axis definition and of $$-\pi$$ after it. Also, a translation of (-xd, -yd, -zd) is needed just before the Group corresponding to the definition of FOREARM to express it in the relative reference frame centered at D. This means that a translation of (xd, yd, zd) must be inserted before the first rotation. At the end, the vrml-file from the definition of ELBOW to the definition of FOREARM looks like this:

# ELBOW Group { … here comes the unmodified definition of ELBOW },      Transform { translation 0 35 601 rotation 1 0 0 1.5707963 children DEF FREECAD_AXIS4 Transform { rotation 0 1 0 0 children Transform { rotation 1 0 0 -1.5707963 children Transform { translation 0 -35 -601 children [ # FOREARM Group { ... here comes the unmodified definition of FOREARM }, At the end of the document, the appropriate closing brackets must be inserted: “ ]}}}},” for each of the 6 axes. Eventually, the document looks like this (I don't know if I can link the file here because of copyrights):

Group { children Group { children [ # HORIZONTAL BASE CABLE OUTLET Group { ... here comes the unmodified definition of HORIZONTAL BASE CABLE OUTLET },      Transform { translation 0 0 168 rotation 1 0 0 1.5707963 children DEF FREECAD_AXIS1 Transform { rotation 0 1 0 0 children Transform { rotation 1 0 0 -1.5707963 children Transform { translation 0 0 -168 children [ # SHOULDER Group { ... here comes the unmodified definition of SHOULDER },      Transform { translation 0 107.8 320 #rotation 0 0 1 0 children DEF FREECAD_AXIS2 Transform { rotation 0 1 0 0 children Transform { #rotation 0 0 1 0 children Transform { translation 0 -107.8 -320 children [ # ARM Group { ... here comes the unmodified definition of ARM },      Transform { translation 0 104.15 545 #rotation 0 0 1 0 children DEF FREECAD_AXIS3 Transform { rotation 0 1 0 0 children Transform { #rotation 0 0 1 0 children Transform { translation 0 -104.15 -545 children [ # ELBOW Group { ... here comes the unmodified definition of ELBOW },      Transform { translation 0 35 601 rotation 1 0 0 1.5707963 children DEF FREECAD_AXIS4 Transform { rotation 0 1 0 0 children Transform { rotation 1 0 0 -1.5707963 children Transform { translation 0 -35 -601 children [ # FOREARM Group { ... here comes the unmodified definition of FOREARM },      Transform { translation 0 35 770 #rotation 0 0 1 0 children DEF FREECAD_AXIS5 Transform { rotation 0 1 0 0 children Transform { #rotation 0 0 1 0 children Transform { translation 0 -35 -770 children [ # WRIST Group { ... here comes the unmodified definition of WRIST },      Transform { translation 0 35 835 rotation 1 0 0 1.5707963 children DEF FREECAD_AXIS6 Transform { rotation 0 1 0 0 children Transform { rotation 1 0 0 -1.5707963 children Transform { translation 0 -35 -835 children [ # TOOL FLANGE Group { ... here comes the unmodified definition of TOOL FRAME },      Group { ... here comes the unmodified definition of TX40_HB007 } # "]" was deleted from this line ]}}}},    ]}}}},     ]}}}},     ]}}}},     ]}}}},     ]}}}},     ] # this is the "]" deleted from the line above } }
 * 1) VRML V2.0 utf8

Here is a patch to obtain the vrml file suitable for robot simulation:

7a8 >        # HORIZONTAL BASE CABLE OUTLET 95968a95970,95981 >        Transform { >          translation 0 0 168 >          rotation 1 0 0 1.5707963 >          children >            DEF FREECAD_AXIS1 Transform { rotation 0 1 0 0 children >              Transform { >                rotation 1 0 0 -1.5707963 >                children >                  Transform { >                    translation 0 0 -168 >                    children [ >        # SHOULDER 128428a128442,128453 >        Transform { >          translation 0 107.8 320 >          #rotation 0 0 1 0 >          children >            DEF FREECAD_AXIS2 Transform { rotation 0 1 0 0 children >              Transform { >                #rotation 0 0 1 0 >                children >                  Transform { >                    translation 0 -107.8 -320 >                    children [ >        # ARM 206503a206529,206540 >        Transform { >          translation 0 104.15 545 >          #rotation 0 0 1 0 >          children >            DEF FREECAD_AXIS3 Transform { rotation 0 1 0 0 children >              Transform { >                #rotation 0 0 1 0 >                children >                  Transform { >                    translation 0 -104.15 -545 >                    children [ >        # ELBOW 267111a267149,267160 >        Transform { >          translation 0 35 601 >          rotation 1 0 0 1.5707963 >          children >            DEF FREECAD_AXIS4 Transform { rotation 0 1 0 0 children >              Transform { >                rotation 1 0 0 -1.5707963 >                children >                  Transform { >                    translation 0 -35 -601 >                    children [ >        # FOREARM 417854a417904,417915 >        Transform { >          translation 0 35 770 >          #rotation 0 0 1 0 >          children >            DEF FREECAD_AXIS5 Transform { rotation 0 1 0 0 children >              Transform { >                #rotation 0 0 1 0 >                children >                  Transform { >                    translation 0 -35 -770 >                    children [ >        # WRIST 422053a422115,422126 >        Transform { >          translation 0 35 835 >          rotation 1 0 0 1.5707963 >          children >            DEF FREECAD_AXIS6 Transform { rotation 0 1 0 0 children >              Transform { >                rotation 1 0 0 -1.5707963 >                children >                  Transform { >                    translation 0 -35 -835 >                    children [ >        # TOOL FLANGE 435627c435700,435707 <        } ] --- >         }  >       ]}}}}, >       ]}}}}, >       ]}}}}, >       ]}}}}, >       ]}}}}, >       ]}}}}, >       ]