Modelo para simulación brazo MYRAbot (urdf+gazebo)

From robotica.unileon.es
Revision as of 09:02, 6 November 2013 by Fernando (talk | contribs) (Modificaciones del URDF)

Jump to: navigation, search

< volver a principal

Creación del modelo URDF

El formato empleado para el modelo del brazo está denominado por el acrónimo inglés URDF (Unified Robot Description Format), que emplea el lenguaje xml. Consiste en un árbol de elementos geométricos (links) conectados entre sí mediante uniones (joints) que determinan el parentesco entre ellos. Estas uniones pueden ser fijas o móviles, las móviles pueden ser a su vez rotacionales o lineales.

Comenzaremos creando el package "brazo_fer_modelo" que va a contener el modelo de nuestro brazo, con las siguientes pependencias: urdf brazo_fer std_msgs sensor_msgs tf roscpp

El modelo planteado para nuestro brazo es el siguiente, que guardaremos en el directorio "urdf" del package creado en un archivo llamado "brazo.urdf.xacro":

<?xml version="1.0"?>

<robot name="MYRAbot_arm"
       xmlns:xi="http://www.w3.org/2001/XInclude"
       xmlns:gazebo="http://playerstage.sourceforge.net/gazebo/xmlschema/#gz"
       xmlns:model="http://playerstage.sourceforge.net/gazebo/xmlschema/#model"
       xmlns:sensor="http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor"
       xmlns:body="http://playerstage.sourceforge.net/gazebo/xmlschema/#body"
       xmlns:geom="http://playerstage.sourceforge.net/gazebo/xmlschema/#geom"
       xmlns:joint="http://playerstage.sourceforge.net/gazebo/xmlschema/#joint"
       xmlns:interface="http://playerstage.sourceforge.net/gazebo/xmlschema/#interface"
       xmlns:rendering="http://playerstage.sourceforge.net/gazebo/xmlschema/#rendering"
       xmlns:renderable="http://playerstage.sourceforge.net/gazebo/xmlschema/#renderable"
       xmlns:controller="http://playerstage.sourceforge.net/gazebo/xmlschema/#controller"
       xmlns:physics="http://playerstage.sourceforge.net/gazebo/xmlschema/#physics"
       xmlns:xacro="http://www.ros.org/wiki/xacro">

<xacro:macro name="default_inertia">
      <inertia ixx="0.001" ixy="0.0" ixz="0.0" iyy="0.001" iyz="0.0" izz="0.001"/>
</xacro:macro>

<xacro:macro name="default_inertia_servos">
      <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.01"/>
</xacro:macro>

<xacro:macro name="default_dynamics">
      <dynamics fricction="0" damping="0" />
</xacro:macro>

  <link name="world" />

  <joint name="fixed" type="fixed">
    <parent link="world"/>
    <child link="base_link"/>
    <origin xyz="0 0 0" rpy="0 0 0" />
    <axis xyz="0 0 1" />  
  </joint>
    
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.032 0.05 0.04"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 -0.0135 0.020"/>
      <material name="black">
        <color rgba="0 0 0 1"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 -0.0135 0.020"/>		
	  <geometry>
        <box size="0.032 0.05 0.04"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0 -0.0135 0.020"/>			
      <mass value="0.055"/>
	  <xacro:default_inertia_servos />
    </inertial>       
  </link>

  <joint name="base" type="revolute">
    <parent link="base_link"/>
    <child link="hombro_link"/>
    <origin xyz="0 0 0.04" rpy="0 0 0" />
    <axis xyz="0 0 1" />
    <limit effort="30.0" lower="-2.62" upper="2.62" velocity="2"/>
	<xacro:default_dynamics />          
  </joint>
  
  <link name="hombro_link">
    <visual>
      <geometry>
        <box size="0.04 0.032 0.05"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0 0.020"/>
      <material name="black" />
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.020"/>		
	  <geometry>
        <box size="0.04 0.032 0.05"/>
      </geometry>       
    </collision> 
    <inertial>
      <origin rpy="0 0 0" xyz="0 0 0.020"/>			
      <mass value="0.055"/>
	  <xacro:default_inertia_servos />
    </inertial>        
  </link>  

  <joint name="arti1" type="revolute">
    <parent link="hombro_link"/>
    <child link="brazo_link"/>  
    <origin xyz="0 0 0.0385" rpy="0 0 0" />
	<axis xyz="1 0 0" />
    <limit effort="30.0" lower="-2.62" upper="2.62" velocity="2"/> 
	<xacro:default_dynamics />        
  </joint>
  
  <!--brazo-->

<xacro:macro name="servo" params="nombre">  
  <link name="${nombre}_link">
    <visual>
      <geometry>
        <box size="0.04 0.032 0.05"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0 0.0905"/>
      <material name="black" />
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.0905"/>		
	  <geometry>
        <box size="0.04 0.032 0.05"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0 0 0.0905"/>		
      <mass value="0.055"/>
	  <xacro:default_inertia_servos />
    </inertial>             
  </link>
</xacro:macro>

<xacro:servo nombre="brazo" />
  
  <joint name="servo_arti1_B" type="fixed">
    <parent link="brazo_link"/>
    <child link="brazo_link_B"/>  
    <origin xyz="0 0 0" rpy="0 0 0" />
	<axis xyz="1 0 0" />    
  </joint>  

<xacro:macro name="base" params="nombre">    
  <link name="${nombre}_link_B">    
	<visual>
      <geometry>
        <box size="0.04 0.032 0.015"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0 0 0.058"/>
      <material name="white">
		<color rgba="1 1 1 1"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0 0 0.058"/>		
	  <geometry>
        <box size="0.04 0.032 0.015"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0 0 0.058"/>			
      <mass value="0.001"/>
	  <xacro:default_inertia />
    </inertial>           
  </link>
</xacro:macro> 

<xacro:base nombre="brazo" /> 
  
  <joint name="servo_arti1_D" type="fixed">
    <parent link="brazo_link"/>
    <child link="brazo_link_SI"/>  
    <origin xyz="0 0 0" rpy="0 0 0" />
	<axis xyz="1 0 0" />    
  </joint>  
  
<xacro:macro name="soporte" params="nombre simetrico lado">    
  <link name="${nombre}_link_S${lado}">    
	<visual>
      <geometry>
        <box size="0.002 0.032 0.067"/>
      </geometry>
      <origin rpy="0 0 0" xyz="${simetrico*0.021} 0 0.022"/>
      <material name="white">
		<color rgba="1 1 1 1"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="${simetrico*0.021} 0 0.022"/>		
	  <geometry>
        <box size="0.002 0.032 0.067"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="${simetrico*0.021} 0 0.022"/>			
      <mass value="0.001"/>
	  <xacro:default_inertia />
    </inertial>           
  </link>
</xacro:macro>

<xacro:soporte nombre="brazo" simetrico="1" lado="I" />  
  
  <joint name="servo_arti1_I" type="fixed">
    <parent link="brazo_link"/>
    <child link="brazo_link_SD"/>  
    <origin xyz="0 0 0" rpy="0 0 0" />
	<axis xyz="1 0 0" />    
  </joint>  
  
<xacro:soporte nombre="brazo" simetrico="-1" lado="D" />     
  
  <joint name="arti2" type="revolute">
    <parent link="brazo_link"/>
    <child link="antebrazo_link"/>
    <origin xyz="0 0 0.104" rpy="0 0 0" />
    <axis xyz="1 0 0" />
    <limit effort="30.0" lower="-2.62" upper="2.62" velocity="2"/> 
	<xacro:default_dynamics />            
  </joint>
  
  <!--antebrazo-->
  
<xacro:servo nombre="antebrazo" /> 
  
  <joint name="servo_arti2_B" type="fixed">
    <parent link="antebrazo_link"/>
    <child link="antebrazo_link_B"/>  
    <origin xyz="0 0 0" rpy="0 0 0" />
	<axis xyz="1 0 0" />    
  </joint>  
  
<xacro:base nombre="antebrazo" />
  
  <joint name="servo_arti2_D" type="fixed">
    <parent link="antebrazo_link"/>
    <child link="antebrazo_link_SI"/>  
    <origin xyz="0 0 0" rpy="0 0 0" />
	<axis xyz="1 0 0" />    
  </joint>  
  
<xacro:soporte nombre="antebrazo" simetrico="1" lado="I" />  
  
  <joint name="servo_arti2_I" type="fixed">
    <parent link="antebrazo_link"/>
    <child link="antebrazo_link_SD"/>  
    <origin xyz="0 0 0" rpy="0 0 0" />
	<axis xyz="1 0 0" />    
  </joint>  
  
<xacro:soporte nombre="antebrazo" simetrico="-1" lado="D" />     

  <joint name="arti3" type="revolute">
    <parent link="antebrazo_link"/>
    <child link="muneca_link"/>
    <origin xyz="0 0 0.104" rpy="0 0 0" />
    <axis xyz="1 0 0" />
    <limit effort="1000.0" lower="-2.62" upper="2.62" velocity="2"/> 
	<xacro:default_dynamics />             
  </joint>
  
  <!--muneca-->
  
  <link name="muneca_link">
    <visual>
      <geometry>
        <box size="0.05 0.04 0.032"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0.00625 0 0.06"/>
      <material name="black" />
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0.00625 0 0.06"/>		
	  <geometry>
        <box size="0.05 0.04 0.032"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0.00625 0 0.06"/>			
      <mass value="0.055"/>
	  <xacro:default_inertia_servos />
    </inertial>            
  </link>  
  
  <joint name="servo_arti3_B" type="fixed">
    <parent link="muneca_link"/>
    <child link="muneca_link_B"/>  
    <origin xyz="0 0 0" rpy="0 0 0" />
	<axis xyz="1 0 0" />    
  </joint>  
  
  <link name="muneca_link_B">    
	<visual>
      <geometry>
        <box size="0.05325 0.04 0.005"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0.004625 0 0.0415"/>
      <material name="white">
		<color rgba="1 1 1 1"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0.004625 0 0.0415"/>		
	  <geometry>
        <box size="0.05325 0.04 0.005"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0.004625 0 0.0415"/>		
      <mass value="0.0005"/>
	  <xacro:default_inertia />
    </inertial>              
  </link>
  
  <joint name="servo_arti3_D" type="fixed">
    <parent link="muneca_link"/>
    <child link="muneca_link_SI"/>  
    <origin xyz="0 0 0" rpy="0 0 0" />
	<axis xyz="1 0 0" />    
  </joint>  
  
  <link name="muneca_link_SI">    
	<visual>
      <geometry>
        <box size="0.002 0.032 0.0555"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0.021 0 0.01625"/>
      <material name="white">
		<color rgba="1 1 1 1"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0.021 0 0.01625"/>		
	  <geometry>
        <box size="0.002 0.032 0.0555"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0.021 0 0.01625"/>		
      <mass value="0.0005"/>
	  <xacro:default_inertia />
    </inertial>           
  </link>
  
  <joint name="servo_arti3_I" type="fixed">
    <parent link="muneca_link"/>
    <child link="muneca_link_SD"/>  
    <origin xyz="0 0 0" rpy="0 0 0" />
	<axis xyz="1 0 0" />    
  </joint>  
  
  <link name="muneca_link_SD">    
	<visual>
      <geometry>
        <box size="0.002 0.032 0.0555"/>
      </geometry>
      <origin rpy="0 0 0" xyz="-0.021 0 0.01625"/>
      <material name="white">
		<color rgba="1 1 1 1"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="-0.021 0 0.01625"/>		
	  <geometry>
        <box size="0.002 0.032 0.0555"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="-0.021 0 0.01625"/>			
      <mass value="0.0005"/>
	  <xacro:default_inertia />
    </inertial>            
  </link>
  
  <joint name="servo_arti3_P" type="fixed">
    <parent link="muneca_link"/>
    <child link="muneca_link_P"/>  
    <origin xyz="0 0 0" rpy="0 0 0" />
	<axis xyz="1 0 0" />    
  </joint>  
  
  <!--pinza izquierda fija-->
  
  <link name="muneca_link_P">    
	<visual>
      <geometry>
        <box size="0.002 0.04 0.092"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0.03425 0 0.090"/>
      <material name="white">
		<color rgba="1 1 1 1"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0.03425 0 0.090"/>		
	  <geometry>
        <box size="0.002 0.04 0.092"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0.03425 0 0.090"/>			
      <mass value="0.001"/>
	  <xacro:default_inertia />
    </inertial>           
  </link>
  
  <joint name="servo_arti3_PS" type="fixed">
    <parent link="muneca_link"/>
    <child link="muneca_link_PS"/>  
    <origin xyz="0 0 0" rpy="0 0 0" />
	<axis xyz="1 0 0" />    
  </joint>
  
  <link name="muneca_link_PS">    
	<visual>
      <geometry>
        <box size="0.002 0.04 0.037"/>
      </geometry>
      <origin rpy="0 0 0" xyz="0.03225 0 0.0575"/>
      <material name="white">
		<color rgba="1 1 1 1"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="0.03225 0 0.060"/>		
	  <geometry>
        <box size="0.002 0.04 0.032"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="0.03225 0 0.060"/>			
      <mass value="0.0005"/>
	  <xacro:default_inertia />
    </inertial>            
  </link>             
  
  <joint name="pinza" type="revolute">
    <parent link="muneca_link"/>
    <child link="pinza_link"/>
    <origin xyz="-0.00725 0 0.06" rpy="0 0 0" />
    <axis xyz="0 1 0" />
    <limit effort="30.0" lower="-2.62" upper="2.62" velocity="2"/>
	<xacro:default_dynamics />     
  </joint>
  
  <!--pinza-->
  
  <link name="pinza_link">    
	<visual>
      <geometry>
        <box size="0.002 0.04 0.092"/>
      </geometry>
      <origin rpy="0 0 0" xyz="-0.027 0 0.030"/>
      <material name="white">
		<color rgba="1 1 1 1"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="-0.027 0 0.030"/>		
	  <geometry>
        <box size="0.002 0.04 0.092"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="-0.027 0 0.030"/>		
      <mass value="0.001"/>
 	  <xacro:default_inertia />
    </inertial>           
  </link>  
  
  <joint name="servo_pinza_B" type="fixed">
    <parent link="pinza_link"/>
    <child link="pinza_link_B"/>  
    <origin xyz="0 0 0" rpy="0 0 0" />
	<axis xyz="1 0 0" />    
  </joint>  
  
  <link name="pinza_link_B">    
	<visual>
      <geometry>
        <box size="0.002 0.04 0.032"/>
      </geometry>
      <origin rpy="0 0 0" xyz="-0.025 0 0"/>
      <material name="white">
		<color rgba="1 1 1 1"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="-0.025 0 0"/>		
	  <geometry>
        <box size="0.002 0.04 0.032"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="-0.025 0 0"/>		
      <mass value="0.0005"/>
	  <xacro:default_inertia />
    </inertial>           
  </link>
  
  <joint name="servo_pinza_D" type="fixed">
    <parent link="pinza_link"/>
    <child link="pinza_link_SI"/>  
    <origin xyz="0 0 0" rpy="0 0 0" />
	<axis xyz="1 0 0" />    
  </joint>  
  
  <link name="pinza_link_SI">    
	<visual>
      <geometry>
        <box size="0.0375 0.002 0.032"/>
      </geometry>
      <origin rpy="0 0 0" xyz="-0.00725 0.021 0"/>
      <material name="white">
		<color rgba="1 1 1 1"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="-0.00725 0.021 0"/>		
	  <geometry>
        <box size="0.0375 0.002 0.032"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="-0.00725 0.021 0"/>			
      <mass value="0.0005"/>
	  <xacro:default_inertia />
    </inertial>        
  </link>
  
  <joint name="servo_pinza_I" type="fixed">
    <parent link="pinza_link"/>
    <child link="pinza_link_SD"/>  
    <origin xyz="0 0 0" rpy="0 0 0" />
	<axis xyz="1 0 0" />    
  </joint>  
  
  <link name="pinza_link_SD">    
	<visual>
      <geometry>
        <box size="0.0375 0.002 0.032"/>
      </geometry>
      <origin rpy="0 0 0" xyz="-0.00725 -0.021 0"/>
      <material name="white">
		<color rgba="1 1 1 1"/>
      </material>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="-0.00725 -0.021 0"/>		
	  <geometry>
        <box size="0.0375 0.002 0.032"/>
      </geometry>
    </collision>
    <inertial>
      <origin rpy="0 0 0" xyz="-0.00725 -0.021 0"/>			
      <mass value="0.0005"/>
	  <xacro:default_inertia />
    </inertial>            
  </link>

</robot>

Análisis del modelo

Como estamos empleando xacro para simplificar y hacer más editable el código necesitamos hacer la conversión a URDF para obtener el archivo procesado, ejecutando en un terminal la siguiente secuencia de comandos:

roscd brazo_fer_modelo
cd urdf
rosrun xacro xacro.py brazo.urdf.xacro > brazo.urdf

Ahora podemos comprobar si el modelo que hemos creado es correcto ejecutando el siguiente comando en el terminal:

rosrun urdf_parser check_urdf brazo.urdf

Si todo va bien deberiamos obtener lo siguiente:

robot name is: MYRAbot_arm
---------- Successfully Parsed XML ---------------
root Link: world has 1 child(ren)
    child(1):  base_link
        child(1):  hombro_link
            child(1):  brazo_link
                child(1):  antebrazo_link
                    child(1):  muneca_link
                        child(1):  pinza_link
                            child(1):  pinza_link_B
                            child(2):  pinza_link_SI
                            child(3):  pinza_link_SD
                        child(2):  muneca_link_B
                        child(3):  muneca_link_SI
                        child(4):  muneca_link_SD
                        child(5):  muneca_link_P
                        child(6):  muneca_link_PS
                    child(2):  antebrazo_link_B
                    child(3):  antebrazo_link_SI
                    child(4):  antebrazo_link_SD
                child(2):  brazo_link_B
                child(3):  brazo_link_SI
                child(4):  brazo_link_SD

Podemos ver el árbol de relaciones de forma gráfica generando un archivo pdf, para lo que ejecutaremos en el terminal el siguiente comando:

rosrun urdf_parser urdf_to_graphiz brazo.urdf

El resultado obtenido será el siguiente:

Árbol de relaciones modelo URBF para el brazo del MYRAbot

Prueba visual del modelo

Para poder visualizar el modelo y comprobar el correcto funcionamiento de las uniones joints vamos a crear un launcher para cargarlo en el robot_state_publisher y ejecutar el joint_state_publisher con el interfaz de publicación del estado de las uniones móviles, y el rviz para la visualización. Crearemos el archivo "brazo_rviz.launch" en el directorio "launch" del package que hemos creado, con el siguiente contenido:

<launch>

  <param name="robot_description" command="$(find xacro)/xacro.py '$(find brazo_fer_modelo)/urdf/brazo.urdf.xacro'" />

  <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

  <param name="use_gui" value="true"/>

  <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />

  <node name="rviz" pkg="rviz" type="rviz" />

</launch>

Para iniciar el launcher debemos ejecutar en un terminal el siguiente comando:

roslaunch brazo_fer_modelo brazo_rviz.launch

Si todo va bien, se ejecutará rviz y el interfaz del joint_state_publisher, sobre el cual al modificar los controles deslizables observaremos como se modifica la posición de las uniones móviles en el modelo 3D cargado en rviz. Para que se muestre correctamente nuestro modelo en rviz debemos seleccionar el elemento link que se va ha tomar como elemento fijo "fixed frame", en nuestro caso en "Global Options" el "Fixed Frame" será el link "/world". El resultado es el que se muestra a continuación:

Modelo cargado en rviz e interfaz joint_state_publisher

Control de uniones para simulación

Una vez creado el modelo URDF y probada la correcta representación y funcionamiento de las uniones móviles, debemos añadir una serie de controladores a cada unión para poder simular en gazebo los servomotores Dynamixel AX-12A.

Pasos previos

Debemos comenzar añadiendo los packages donde se encuentran los controladores que vamos a emplear. Se trata de los controladores del PR2 por lo que necesitamos instalar los stacks pr2_simulator, pr2_mechanism y pr2_controllers. Para ello tenemos que ejecutar la siguiente secuencia de comandos en un terminal:

sudo atp-get update
sudo apt-get install ros-VERSIÓN_ROS-pr2-simulator ros-VERSIÓN_ROS-pr2-mechanism ros-VERSIÓN_ROS-pr2-controllers

Añadir controladores a uniones móviles

En el URDF hemos definido la geometría y propiedades físicas de los elementos (link), así como las uniones (joint) entre estos y sus características. Para poder visualizar el color que le hemos dado a cada elemento en gazebo debemos asignar a cada elemento un material gazebo. También necesitamos establecer los coeficientes de rozamiento de cada elemento, establecer si pueden colisionar los elementos entre sí y la acción de la fuerza de gravedad. A continuación se muestra la descripción para cada elemento en gazebo, que añadiremos al final de nuestro URDF antes de la etiqueta </robot>:

<xacro:macro name="default_mu">
	<mu1>0.5</mu1>
	<mu2>0.5</mu2>
</xacro:macro>

 <gazebo reference="base_link">
    <material>Gazebo/Black</material>
	<xacro:default_mu />
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>
  
  <gazebo reference="hombro_link">
	<xacro:default_mu />  
    <material>Gazebo/Black</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>
  
  <gazebo reference="brazo_link">
	<xacro:default_mu />  
    <material>Gazebo/Black</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>
   
  <gazebo reference="antebrazo_link">
	<xacro:default_mu />
    <material>Gazebo/Black</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo> 
  
  <gazebo reference="muneca_link">
	<xacro:default_mu />  
    <material>Gazebo/Black</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>    
  
  <gazebo reference="brazo_link_B">
	<xacro:default_mu />  
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>
   
  <gazebo reference="brazo_link_SI">
	<xacro:default_mu />  
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>
  
  <gazebo reference="brazo_link_SD">
	<xacro:default_mu /> 
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>
  
  <gazebo reference="antebrazo_link_B">
	<xacro:default_mu />  
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo> 

  <gazebo reference="antebrazo_link_SI">
	<xacro:default_mu />  
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>
  
  <gazebo reference="antebrazo_link_SD">
	<xacro:default_mu />  
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>
  
  <gazebo reference="muneca_link_B">
	<xacro:default_mu />  
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>
  
  <gazebo reference="muneca_link_SI">
	<xacro:default_mu /> 
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>

  <gazebo reference="muneca_link_SD">
	<xacro:default_mu />  
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>
  
  <gazebo reference="muneca_link_P">
	<xacro:default_mu /> 
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>

  <gazebo reference="muneca_link_PS">
	<xacro:default_mu />  
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>    
  
  <gazebo reference="pinza_link">
	<xacro:default_mu />  
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>
  
  <gazebo reference="pinza_link_B">
	<xacro:default_mu />  
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>
   
  <gazebo reference="pinza_link_SI">
	<xacro:default_mu /> 
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>
  
  <gazebo reference="pinza_link_SD">
	<xacro:default_mu />  
    <material>Gazebo/White</material>
    <selfCollide>true</selfCollide>
    <turnGravityOff>false</turnGravityOff>  
  </gazebo>

Ahora nos queda añadir las características de las uniones móviles, el plugin del controlador que vamos a emplear para el control de estas y el modelado del mecanismo de transmisión. A continuación se muestra el código que debemos añadir al final de nuestro fichero URDF antes de la etiqueta </robot>:

 <gazebo reference="base">
    <erp>0.1</erp>
    <stopKd value="100000.0" />
    <stopKp value="100000.0" />
    <fudgeFactor value="0.5" />
 </gazebo>
 
 <gazebo reference="arti1">
    <erp>0.1</erp>
    <stopKd value="100000.0" />
    <stopKp value="100000.0" />
    <fudgeFactor value="0.5" />
 </gazebo>  
 
 <gazebo reference="arti2">
    <erp>0.1</erp>
    <stopKd value="100000.0" />
    <stopKp value="100000.0" />
    <fudgeFactor value="0.5" />
 </gazebo>   
 
 <gazebo reference="arti3">
    <erp>0.1</erp>
    <stopKd value="100000.0" />
    <stopKp value="100000.0" />
    <fudgeFactor value="0.5" />
 </gazebo>
 
 <gazebo reference="pinza">
    <erp>0.1</erp>
    <stopKd value="100000.0" />
    <stopKp value="100000.0" />
    <fudgeFactor value="0.5" />
 </gazebo>      
    
 
<gazebo>   
     <controller:gazebo_ros_controller_manager name="gazebo_ros_controller_manager" plugin="libgazebo_ros_controller_manager.so">
          <alwaysOn>true</alwaysOn>
          <updateRate>1000.0</updateRate>
     </controller:gazebo_ros_controller_manager>
</gazebo>


 <transmission type="pr2_mechanism_model/SimpleTransmission" name="base_trans">
    <actuator name="base_motor" />
    <joint name="base" />
    <mechanicalReduction>1.0</mechanicalReduction>
    <motorTorqueConstant>1.0</motorTorqueConstant>
 </transmission>

 <transmission type="pr2_mechanism_model/SimpleTransmission" name="arti1_trans">
    <actuator name="arti1_motor" />
    <joint name="arti1" />
    <mechanicalReduction>1.0</mechanicalReduction>
    <motorTorqueConstant>1.0</motorTorqueConstant>
 </transmission>              
 
 <transmission type="pr2_mechanism_model/SimpleTransmission" name="arti2_trans">
    <actuator name="arti2_motor" />
    <joint name="arti2" />
    <mechanicalReduction>1.0</mechanicalReduction>
    <motorTorqueConstant>1.0</motorTorqueConstant>
 </transmission>
 
 <transmission type="pr2_mechanism_model/SimpleTransmission" name="arti3_trans">
    <actuator name="arti3_motor" />
    <joint name="arti3" />
    <mechanicalReduction>1.0</mechanicalReduction>
    <motorTorqueConstant>1.0</motorTorqueConstant>
 </transmission>

 <transmission type="pr2_mechanism_model/SimpleTransmission" name="pinza_trans">
    <actuator name="pinza_motor" />
    <joint name="pinza" />
    <mechanicalReduction>1.0</mechanicalReduction>
    <motorTorqueConstant>1.0</motorTorqueConstant>
 </transmission>

Carga del modelo en gazebo

Para poder mostrar el modelo en gazebo vamos a crear un launcher que cargue el modelo en el servicio "robot_description" y cargue un mundo vacío. Crearemos el archivo "brazo_gazebo.launch" en el directorio "launch" de nuestro package, con el siguiente contenido:

<launch>

  <include file="$(find gazebo_worlds)/launch/empty_world.launch"/>

  <param name="robot_description" command="$(find xacro)/xacro.py '$(find brazo_fer_modelo)/brazo.urdf.xacro'" />

  <node name="spawn_brazo" pkg="gazebo" type="spawn_model" args="-urdf -param robot_description -model MYRAbot_arm" respawn="false" output="screen" />
  
</launch>

Si todo va bien podremos ver el modelo del brazo en posición vertical tal como se muestra en la siguiente imagen:

Modelo brazo MYRAbot en gazebo


< volver a principal