Mobile manipulation

From robotica.unileon.es
Revision as of 15:12, 21 September 2013 by Fernando (talk | contribs) (Creación de un package para nuestros programas)

Jump to: navigation, search
  • Project Name: Brazo Bioloid controlado por ROS con interfaz Arduino
  • Authors: Fernando Casado
  • Dates: September 2013
  • Degree: Ph.D.
  • Tags: MYRAbot, manipulation, arm, Bioloid
  • Technology: ROS, c++, Dynamixel, Arduino
  • State: WIP

Arduino IDE y rosserial

Para la comunicación e intercambio de información entre arduino y ROS es necesario instalar arduino IDE y rosserial (package de ROS que contiene el stack rosserial_arduino con las librerias para arduino). Comenzaremos instalando el arduino IDE, para lo que ejecutaremos los siguientes comandos en un terminal:

     sudo apt-get update
     sudo apt-get install arduino arduino-core
     sudo apt-get install arduino

Una vez realizada la instalación del software de arduino se procedera a la instalación del package de ROS ejecutando en un terminal el siguiente comando:

     sudo apt-get install ros-NUESTRA_VERSIÓN_ROS-rosserial

Instalados arduino IDE y el package rosserial debemos copiar las librerial de stack rosserial_arduino a el sketchbook de arduino, carpeta que se encuentra habitualmente en la carpeta personal, para lo que ejecutaremos en un terminal los siguientes comandos:

     roscd rosserial_arduino/libraries
     cp -r ros_lib home/”nombre_sesion”/sketchbook/libraries/ros_lib

Creación de un package para nuestros programas

Deberemos tener previamente creado un espacio de trabajo para nuestra versión de ROS. Para poder compilar y enviar nuestros programas a la placa arduino sin tener que pasar por arduino IDE vamos a crear un package llamado “arduino_fer” con las dependencias necesarias para nuestros programas, para ello ejecutaremos los siguientes comandos en un terminal:

     cd ~/ros_workspace
     roscreate-pkg arduino_fer rosserial_arduino std_msgs

Deberemos sustituir el contenido del fichero CmakeLists.txt, situado en la carpeta del package creado, por el siguiente:

      cmake_minimum_required(VERSION 2.4.6)
      include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake)

      rosbuild_find_ros_package(rosserial_arduino)
      include(${rosserial_arduino_PACKAGE_PATH}/cmake_scripts/rosserial.cmake)

Para finalizar la cración del package ejecutaremos los siguientes comandos:

     roscd arduino_fer
     cmake .

Primer programa (A toda potencia)

El primer programa que vamos a realizar crea un nodo llamado “potencia” que publica un topic llamado “cifra” y está subscrito a un topic llamado “resultado”. Cuando se publique un número en el topic “cifra” lo multiplicará por si mismo y publicará el resultado en el topic “resultado”. El código del programa es el siguiente:

#include <ros.h> 
#include <std_msgs/Int16.h> 

ros::NodeHandle nh; 
int pot; 

void potencia( const std_msgs::Int16& cifra){ 

::pot = cifra.data*cifra.data; 
} 

ros::Subscriber<std_msgs::Int16> sub("cifra", &potencia ); 
std_msgs::Int16 res; 

ros::Publisher pub("resultado", &res); 

void setup() 
{ 
  nh.initNode(); 
  nh.subscribe(sub);  
  nh.advertise(pub); 
} 

void loop() 
{ 
  res.data = ::pot; 
  pub.publish( &res ); 
  nh.spinOnce(); 
  delay(1000); 
}

Para su compilación y envio a la placa arduino es necesario añadir al archivo CmakeLists.txt las siguientes líneas:

    set(FIRMWARE_NAME potencia)

    set(${FIRMWARE_NAME}_BOARD mega2560)         # Modelo placa arduino
    set(${FIRMWARE_NAME}_SRCS src/potencia.cpp )
    set(${FIRMWARE_NAME}_PORT /dev/ttyACM0)            # Puerto serie de subida
    generate_ros_firmware(${FIRMWARE_NAME})

Donde se indica el nombre del programa, tipo de placa arduino, nombre y ubicación del archivo y puerto serie del PC empleado para la comunicación con la placa. Deberemos ejecutar los siguientes comandos en un terminal:

     roscd arduino_fer
     make potencia-upload

Para le ejecución del programa se debe lanzar en un terminal el núcleo de ROS ejecutando el siguiente el comando:

     roscore

En otro terminal se ejecutará el nodo que comunica a ROS con la placa arduino indicándole el puerto empleado para la comunicación:

     rosrun rosserial_python serial_node.py /dev/ttyACM0

Para la publicación de un número en el topic “cifra” se ejecutará en otro terminal el siguiente comando:

     rostopic pub cifra std_msgs/Int16 NUMERO_DESEADO --once

Para comprobar que realmente el programa calcula el cuadrado del número publicado en el topic “cifra” podemos ejecutar en otro terminal el siguiente comando para visualizar el topic “resultado”:

     rostopic echo resultado

Arduino y servomotores Dinamixel

En Savage Electronics se encuentran las adaptaciones hardware realizadas a la placa arduino mega2560 para la correcta comunicación con los servomotores AX-12A Dynamixel de ROBOTICS, así como las librerías empleadas para la programación DynamixelSerial.

Segundo programa (Muévete)

En este programa simplemente se realiza un prueba de la comunicación con un servomotor Dynamixel AX-12A. El programa publica el topic “angulo” con la posición del motor (entero entre 0 y 1023) y está suscrito al topic “giro” del que recibe la posición a la que debe moverse (entero entre 0 y 1023), con una velocidad constante de 128 (valores entre 0 y 1023). El código del programa es el siguiente:

#include <ros.h>
#include <std_msgs/Int16.h>
#include <DynamixelSerial1.h>

ros::NodeHandle nh;


void mover( const std_msgs::Int16& giro){

  Dynamixel.moveSpeed(1,giro.data,128);

}

ros::Subscriber<std_msgs::Int16> sub("giro", &mover );

std_msgs::Int16 ang;
ros::Publisher pub("angulo", &ang);

void setup()
{
  nh.initNode();
  nh.subscribe(sub);  
  nh.advertise(pub);
  Dynamixel.begin(1000000,2);
  delay(1000);
}

void loop()
{
  int posicion = Dynamixel.readPosition(1);
  ang.data = posicion;
  pub.publish( &ang );
  nh.spinOnce();
  delay(10);
}

Para poder compilar el programa y enviarlo a la placa arduino deberemos emplear el software arduino IDE, ya que empleamos una librería externa al systema ROS.