Table of Contents

Object Manipulation Robot Simulator

Compact Models Objects Control (CMOC)

Integrantes:

Sebastián Bolaños (B21031).

Juan Sánchez Brenes (B16068).

Antes de comenzar es necesario que realizen este proyecto para continuar con esta página: Object Manipulation Robot Simulator

Descripción

Una vez ya instalado la primera parte de este proyecto podemos proceder a realizar otras simulaciones muy utiles y dinámicas. En esta segunda parte del proyecto se simula el robot entero realizando movimientos para mover objetos comunes de concina hacia un eje de coordenadas justo al frente del robot. Además, vamos a implementar un algoritmo que determina si el al aplicar una fuerza sobre el objeto este va a deslizarse.

Objetivos del proyecto

Ejecución de las simulaciones

Primeramente va ser necesario ingresar al usuario del chroot el cual fue instalado en la primera parte.

Antes de ejecutar cualquiera de estos programas es necesario tener yarpserver3 abierto.

Modelo de deslice y control

Modelo de deslice y control sin el robot
cd ~/local/src
pyrovito -r lwr -a robot_descriptions/tum-rosie/kinematics/lwr/ -d robot_descriptions/tum-rosie/kinematics/sahand/
planar_sliding_simple
xfinger_feeder

Ahora tenes a disposicón un dedo que se puede utilizar para mover la caja. SI intentas controlar el dedo con las flechas del teclado vas a ver que es muy difícil, por eso es más sencillo dejar que el robot se encargue de eso. Cancele planar_slider_simple y xfinger_feeder. Ahora ejecute en dos consolas diferentes:

planar_sliding_simple

slider_control_simple
Modelo de deslice visualizando el robot

Cancele todos los programas ejecutados. Ahora ejecute los siguientes:

vfclik -i lwr -i right -d robot_descriptions/tum-rosie/kinematics/lwr/ -s
vfclik -i lwr -i left -d robot_descriptions/tum-rosie/kinematics/lwr/ -s
sahand_yarp_sim -s -d -n -f robot_descriptions/tum-rosie/kinematics/sahand/hands_kin.py

Espere a que se completen los anteriores y ejecute:

pyrovito -r lwr --arm_right --arm_left --hand_right --hand_left -a robot_descriptions/tum-rosie/kinematics/lwr/ -d robot_descriptions/tum-rosie/kinematics/sahand/

Espere a que se completen los anteriores y ejecute:

torque_sim -s -a robot_descriptions/tum-rosie/kinematics/lwr/ -c robot_descriptions/tum-rosie/kinematics/sahand/calibration_data/finger_calibration_data.py -f robot_descriptions/tum-rosie/kinematics/sahand/hands_kin.py

Espere a que se completen los anteriores y ejecute:

planar_sliding -o cmoc/objects/sliding/objects/ice_tea_params.py

Espere a que se completen los anteriores y ejecute:

slider_control  -s -f robot_descriptions/tum-rosie/kinematics/sahand/hands_kin.py -o cmoc/objects/sliding/objects/ice_tea_params.py

Planar_Sliding

Contiene la clase control loop que se encarga de verificar las posiciones de los objetos (dedo, caja y mesa) respecto al punto de referencia (base del robot) en cada ciclo de control . El ciclo de control posee una frecuancia predeterminada de 15 Hz.

La función set_params inicializa los puertos de Yarp para torque_sim, planar_control, ffinger, además de recibir y definir parámetros de peso, posición y dimensiones de la caja. También contiene la función process ejecuta la simulación.

En la siguiente parte, s muy colocar el codigo que llama la función box_forward_3d del archivo box3dmodel.py adentro del if touch donde touch es un booleano que determina si el dedo esta tocando la caja.

Slider control

Este programa, una vez que se haya inicializado el planar sliding, se encarga de mover el dedo junto con la caja hasta las coordenadas objetivo. Realiza movimientos y cambios costantes en la apliación de la fuerza sobre el objeto.

Sin incluír el box3dmodel en planar_sliding, este programa lleva la caja hasta las coordenadas de origen.

Algoritmo de Box 3D model

Este algoritmo esta encargado de recibir parametros desde el planar_sliding y los va utilizar para determinar si el objeto se va caer o deslizar en el momento que el robot comienza a empujar dicho objeto. Los parametros necesarios y sus tipos son los siguientes:

No fue posible integrar completamente el codigo de box3Dmodel pero si se pudo lograr un pequeño avance en su funcionamiento. Primero se tiene que colocar el archivo que contiene el codigo del box3Dmodel en la carpeta src y además al inicio del archivo de planar sliding colocar lo siguiente:

from box3dmodel import box_forward_3d

Seguidamente, colocamos en la línea 271 de planar_sliding las siguientes variables que se encuentran presentes en planar_sliding:

box_forward_3d(fc_local ,self.finger_pos_local, self.obj_par.friction_coef_object_table_static, self.obj_par.friction_coef_object_table, self.obj_par.weight_force, self.obj_par.box_vertices, table_object_normal,self.obj_par.box_planes[self.table_object_face][1])

Donde podemos ver que cada variable fc_local, self.finger_pos_local, self.obj_par.friction_coef_object_table_static y los demas, son variables que son propias del objeto que vamos a usar que se importa escogiendo el archivo que se quiere al ejecutar los comandos de planar sliding y slider control.

Dificultades

Aunque no fue posible hacer un buen funcionamiento del modelo 3D, se implemetaron algunas modificaciones al codigo del modelo para que se pudiera avanzar más en su ejecución.

Primera

En la función vertices2plane_distances esta el siguiente codigo:

return([vertex2plane_distance(vertex,plane_normal,plane_point) for vertex in vertices])

Donde al realizar el for vertex in vertices vertixes es un entero que se le va a mandar a la función vertex2plane_distance. Vertex2plane_distance tiene una parte en donde realiza una resta entre vertex y plane_point, el cual es el punto que represanta el plano. Python da un error al realizar una operación de resta entre un entero y un arreglo. Se puede ver que las dos variables en su nombre probablemente sean arreglos entonces se intento de proponer una solución que entregue a vertex2plane_distance una variable vertex tipo arreglo. Se implemento el siguiente codigo en la función vertices2plane_distances:

for x in xrange(6):
      for y in xrange(3):
               return([vertex2plane_distance(vertices[x][y],plane_normal,plane_point)]) 

Este codigo entrega a vertex2plane_distance en su primer parametro un arreglo que se supone es la intención de vertexes. Es importante notar que vertices son los vertices de la caja que se le entrega en parametro a las funciones mencionadas, pero por alguna razón el for en el vertices2plane_distances hace que vertex sea un enterro, que por su nombre se puede suponer no es así.

Segunda

El segundo error despues de arreglar el código de arriba es el siguiente:

if ((vertex!=pivot).any()):
AttributeError: 'bool' object has no attribute 'any'

Que ocurre en la línea 204. Se puede ver en el codigo fuente de box3Dmodel que en líneas superiores a la 204 a esta se aplica un for a in b que por alguna razón hace que el valor a sea un entero, en este error las variables vertex y pivot son el a. Este error ocurre por que los tipos de variable cuando se evalua el if de vertex y pivot son enteros, pero se sabe por su nombre que son arreglos.

se cambio el codigo:

pivots=[]
  for pivot in vertices:
      print "Pivot:", pivot
      pivot_torques=[]
      for vertex in vertices:
          if ((vertex!=pivot).any()):
              pivot_torques.append(cross((vertex-pivot),table_normal))
      print "Table torques:", pivot_torques
      

Por:

  pivots=[]
  for x in xrange(6):
      for y in xrange(3):               
              pivot_torques=[]
              for h in xrange(6):
                      for j in xrange(3):
                                 if ((vertices[h][j]!=vertices[x][y])).any():
                                      pivot_torques.append(cross((vertex-pivot),table_normal))
              print "Table torques:", pivot_torques
              

Hay que asegurar que las indentaciones de las lineas por debajo a este codigo esten al mismo nivel que el for h.

Tercera

Por último, al realizar el cambio de arriba nos sale el error en donde no pudimos avanzar más:

if ((vertices[h][j]!=vertices[x][y])).any():
TypeError: 'int' object has no attribute '__getitem__'

Conclusiones

Logramos el objetivo de poner a correr la simulación de slider_control que simula el movimiento de empuje del dedo, logramos cambiar la altura de la mesa y además logramos incorporar el box3dmodel.py de manera que planar_sliding corra sin problemas hasta que se hace el primer contacto con el objeto.