|
|
(129 intermediate revisions by 2 users not shown) |
Line 1: |
Line 1: |
| * '''Project Name:''' Brazo Bioloid controlado por ROS con interfaz Arduino | | * '''Project Name:''' Brazo Bioloid controlado por ROS con interfaz Arduino |
| + | * '''Author:''' [http://www.fernando.casadogarcia.es Fernando Casado García] |
| + | * '''Dates:''' September 2013 - |
| + | * '''Degree:''' PhD |
| + | * '''Tags:''' MYRAbot, manipulation, arm, Bioloid, webcam, recognition, simulation |
| + | * '''Technologies:''' ROS, c++, Dynamixel, Arduino, find_object_2d, gazebo, URDF, moveIt!, actionlib, maxon, epos2, EposManager (wpi-rover) |
| + | * '''State:''' Ongoing |
| | | |
− | * '''Authors:''' Fernando Casado
| |
| | | |
− | * '''Web of Authors:''' http://www.fernando.casadogarcia.es
| + | ---- |
| + | ---- |
| + | [[File:myrabot_portada.png|100px|thumb|right|MYRABot]] |
| | | |
− | * '''Dates:''' September 2013
| |
| | | |
− | * '''Degree:''' Ph.D.
| + | <center style="font-size: 30px;">MYRABot</center> |
| | | |
− | * '''Tags:''' MYRAbot, manipulation, arm, Bioloid
| |
| | | |
− | * '''Technology:''' ROS, c++, Dynamixel, Arduino
| + | {| style="border: solid 0px white; width: 100%" |
| + | ! Español |
| + | ! English |
| + | |- |
| + | | valign="top" width="50%" |Contenido |
| + | ---- |
| | | |
− | * '''State:''' WIP
| + | #[[Control brazo MYRAbot (bioloid+arduino)]] |
| + | #[[Detección y cálculo de posición de objetos (cámara web)]] |
| + | #[[Modelo para simulación brazo MYRAbot (urdf+gazebo)]] |
| + | #[[Modelo para simulación MYRAbot (urdf+gazebo)]] |
| + | #[[Integración de MYRAbot en moveIt! (gazebo+moveIt!)]] |
| + | #[[Órdenes y confirmación mediante voz (sphinx+festival)]] |
| + | #[[Teleoperación de MYRAbot con controlador inalámbrico xbox360 (controlador xbox360+joy)]] |
| | | |
− | ==Arduino IDE y rosserial== | + | | valign="top" |Content |
| + | ---- |
| | | |
− | Para la comunicación e intercambio de información entre [http://www.arduino.cc arduino] y [http://www.ros.org ROS] es necesario instalar [http://www.arduino.cc arduino] IDE y rosserial (''package'' de [http://www.ros.org ROS] que contiene el ''stack'' rosserial_arduino con las librerias para [http://www.arduino.cc arduino]). Comenzaremos instalando el [http://www.arduino.cc arduino] IDE, para lo que ejecutaremos los siguientes comandos en un terminal:
| + | #[[MYRAbot's arm control (bioloid+arduino)]] |
− | sudo apt-get update
| + | #[[Objects recognition and position calculation (webcam)]] |
− | sudo apt-get install arduino arduino-core
| + | #[[MYRAbot's arm model for simulation (urdf+gazebo)]] |
− | sudo apt-get install arduino
| + | #[[MYRAbot model for simulation (urdf+gazebo)]] |
| + | #[[Integration of MYRAbot in moveIt! (gazebo+moveIt!)]] |
| + | #[[Voice control (sphinx+festival)]] |
| + | #[[MYRAbot's Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]] |
| + | |} |
| | | |
− | Una vez realizada la instalación del software de [http://www.arduino.cc arduino] se procedera a la instalación del ''package'' de [http://www.ros.org ROS] ejecutando en un terminal el siguiente comando:
| + | MYRABot ROS packages: |
− | sudo apt-get install ros-electric-rosserial
| |
− | Instalados [http://www.arduino.cc arduino] IDE y el ''package'' rosserial debemos copiar las librerial de ''stack'' rosserial_arduino a el sketchbook de [http://www.arduino.cc 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===
| + | [https://github.com/Robotica-ule/MYRABot MYRABot's GitHub] |
| | | |
− | Deberemos tener previamente creado un [[Fernando-TFM-ROS02#Creando un espacio de trabajo|espacio de trabajo]] para nuestra versión de [http://www.ros.org ROS]. Para poder compilar y enviar nuestros programas a la placa [http://www.arduino.cc arduino] sin tener que pasar por [http://www.arduino.cc 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)
| + | ---- |
| + | [[File:cervantes_portada.png|100px|thumb|right|CeRVaNTeS]] |
| | | |
− | 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:
| + | <center style="font-size: 30px;">CeRVaNTeS</center> |
− | 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:
| + | {| style="border: solid 0px white; width: 100%" |
− | <syntaxhighlight lang=c>
| + | ! Español |
− | #include <ros.h>
| + | ! English |
− | #include <std_msgs/Int16.h>
| + | |- |
| + | | valign="top" width="50%" |Contenido |
| + | ---- |
| | | |
− | ros::NodeHandle nh;
| + | #[[Control brazo y base CeRVaNTeS (maxon+epos2)]] |
− | int pot;
| + | #[[Modelo para simulación brazo CeRVaNTeS (urdf+gazebo)]] |
| + | #[[Modelo para simulación CeRVaNTeS (urdf+gazebo)]] |
| + | #[[Integración de CeRVaNTeS en moveIt! (gazebo+moveIt!)]] |
| + | #[[Teleoperación de CeRVaNTeS con controlador inalámbrico xbox360 (controlador xbox360+joy)]] |
| | | |
− | void potencia( const std_msgs::Int16& cifra){
| + | | valign="top" |Content |
| + | ---- |
| | | |
− | ::pot = cifra.data*cifra.data;
| + | #[[CeRVaNTeS' arm and base control (maxon+epos2)]] |
− | } | + | #[[CeRVaNTeS' arm model for simulation (urdf+gazebo)]] |
| + | #[[CeRVaNTeS model for simulation (urdf+gazebo)]] |
| + | #[[Integration of CeRVaNTeS in moveIt! (gazebo+moveIt!)]] |
| + | #[[CeRVaNTeS' Teleoperation with xbox360 wireless controller (xbox360 controller+joy)]] |
| + | |} |
| | | |
− | ros::Subscriber<std_msgs::Int16> sub("cifra", &potencia );
| |
− | std_msgs::Int16 res;
| |
| | | |
− | ros::Publisher pub("resultado", &res);
| + | ---- |
| + | ---- |
| + | [[File:rb1_portada.png|100px|thumb|right|OrBiOne]] |
| | | |
− | void setup()
| |
− | {
| |
− | nh.initNode();
| |
− | nh.subscribe(sub);
| |
− | nh.advertise(pub);
| |
− | }
| |
| | | |
− | void loop()
| + | <center style="font-size: 30px;">OrBiOne</center> |
− | {
| |
− | res.data = ::pot;
| |
− | pub.publish( &res );
| |
− | nh.spinOnce();
| |
− | delay(1000);
| |
− | }
| |
− | </syntaxhighlight>
| |
− | Para su compilación y envio a la placa [http://www.arduino.cc arduino] es necesario añadir al archivo CmakeLists.txt las siguientes líneas:
| |
− | | |
− | <nowiki>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})</nowiki>
| |
− | Donde se indica el nombre del programa, tipo de placa [http://www.arduino.cc 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 [http://www.ros.org ROS] ejecutando el siguiente el comando:
| |
− | roscore
| |
− | En otro terminal se ejecutará el nodo que comunica a [http://www.ros.org ROS] con la placa [http://www.arduino.cc 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 [http://savageelectronics.blogspot.com.es/2011/01/arduino-y-dynamixel-ax-12.html Savage Electronics] se encuentran las adaptaciones hardware realizadas a la placa [http://www.arduino.cc arduino] mega2560 para la correcta comunicación con los servomotores AX-12A [http://www.robotis.com/xe/dynamixel_en Dynamixel] de [http://www.robotis.com/xe/ ROBOTICS], así como las librerías empleadas para la programación [http://savageelectronics.blogspot.com.es/2011/08/actualizacion-biblioteca-dynamixel.html DynamixelSerial].
| |
− | | |
− | ===Segundo programa (Muévete)===
| |
− | | |
− | En este programa simplemente se realiza un prueba de la comunicación con un servomotor [http://www.robotis.com/xe/dynamixel_en 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:
| |
− | <syntaxhighlight lang=c>
| |
− | #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);
| |
− | }
| |
− | </syntaxhighlight> | |
− | Para poder compilar el programa y enviarlo a la placa [http://www.arduino.cc arduino] deberemos emplear el software [http://www.arduino.cc arduino] IDE, ya que empleamos una librería externa al systema [http://www.ros.org ROS].
| |