viernes, 16 de julio de 2010

Videoconferencia con Renato y control del Pioneer 2.0

Bueno pues hoy Laura y yo tuvimos una video conferencia con Renato en donde nos resolvió algunas dudas y nos dejo tarea (Los links suministrados los pego abajo).

Las tareas consisten en lo siguiente:
-Ver los videos de introducción a la robótica de Stanford mas que nada para entender mas a fondo los coneptos generales de un robot.
-Intentar generar un mapa con el laser del robot.

Bueno, pues parte de la conversación fue acerca de que ya cambió el package de sscrovers-ros-pkg en cuanto que ya no tiene el nodo de visión que generaba tantos problemas para compilar, así que estoy procediendo a borrar el directorio de sscrovers-ros-pkg para volverlo a descargar y compilar.

Para hacer esto tienes que poner sudo su para accesar como ROOT ya que si no, no te permite hacer casi nada y posteriormente escribir rm -f -r y listo.

Adjunto un link que explica este comando:

http://en.wikipedia.org/wiki/Rm_%28Unix%29

mmm ok siguiendo las instrucciones del tutorial:

Build a Map in Stage: http://www.assembla.com/wiki/show/ssc-rovers/Starting_with_ROS

Descargué nuevamente el package y lo pude compilar sin mayor problema.

Ahora es momento de ver si ROSARIA funciona y puedo controlar al robot.

Lo primero es conectar el cable serial al robot, posteriormente (aun como root) me dirigí al siguiente directorio:

root@oscar-MAC:/opt/ros/boxturtle/ros/sscrovers-ros-pkg/sscrovers_odometry/ROSARIA/bin#

entonces ejecuté ROSARIA con el siguiente comando (con ls vez los ejecutables en verde):

./RosAria

inmediatamente empieza a surgir una respuesta en pantalla mas o menos así:

[ INFO] 1279298645.478370000: rcv: 1279298645.478318 0.000000 0.000000
[ INFO] 1279298645.687279000: rcv: 1279298645.687230 0.000000 0.000000
[ INFO] 1279298645.895816000: rcv: 1279298645.895764 0.000000 0.000000
[ INFO] 1279298646.107659000: rcv: 1279298646.107610 0.000000 0.000000
[ INFO] 1279298646.314695000: rcv: 1279298646.314645 0.000000 0.000000
[ INFO] 1279298646.530481000: rcv: 1279298646.530432 0.000000 0.000000
[ INFO] 1279298646.742306000: rcv: 1279298646.742257 0.000000 0.000000
[ INFO] 1279298646.950521000: rcv: 1279298646.950469 0.000000 0.000000
[ INFO] 1279298647.165970000: rcv: 1279298647.165921 0.000000 0.000000
[ INFO] 1279298647.377985000: rcv: 1279298647.377937 0.000000 0.000000
[ INFO] 1279298647.588941000: rcv: 1279298647.588892 0.000000 0.000000
[ INFO] 1279298647.795942000: rcv: 1279298647.795893 0.000000 0.000000
[ INFO] 1279298648.119641000: rcv: 1279298648.119591 0.000000 0.000000

Ahora para poder controlarlo como lo hice con el robot simulado utilizado el nodo de teleop_base_keyboard lo que tengo que hacer es encargarme de crear un nuevo nodo especial para el pioneer y hacer que publique en el mismo topico que el del robot y se puedan comunicar.

Antes que nada veo que nodos están operando y así darme cuenta cual utiliza el robot para su movimiento. Ejecuto el siguiente comando:

oscar@oscar-MAC:/opt/ros/boxturtle/ros$ rostopic list

y me aparece algo como lo siguiente:

/RosAria/cmd_vel
/RosAria/pose
/clock
/rosout
/rosout_agg
/tf
/time

Ahí me doy cuenta que el nodo mediante el cual se le indica como moverse es el de cmd_vel

Ahora lo que tengo que hacer es moverme al directorio de teleop_base

roscd teleop_base

De ahí accesar al src y ver que archivo .cpp hay del teleop_base_keyboard y accesar a el. Lo que quiero hacer es modificar el nombre del topico al cual se publica para poder tener comunicación con el robot, pero como tampoco quiero modificar el archivo base con el cual hago el movimiento del robot simulado, modifico el archivo y lo guardo como teleop_base_keyboardARIA.cpp

Para poder publicar al tópico busco en el código el objeto TBK_Node (anexo el codigo completo al final) y en el modifico:

"base_controller/command"

por el path del topico que vi anteriormente, oseare por:

"RosAria/cmd_vel"


Aquí se aprecia bien donde se encuentra base_controller/command

Una vez modificado y guardado subo nuevamente al directorio de teleop_base y modifico el archivo de CMakeLists.txt para dar de alta el nodo. Lo que hago es agregar el ejecutable como tal (teleop_base_keyboardARIA) de esta forma:

rosbuild_add_executable(teleop_base_keyboardARIA src/teleop_base_keyboardARIA.cpp)

Lo pego al final del texto.

Lo guardo y en el mismo directorio de teleop_base hago rosmake (pero lo tengo que hacer como root porque si no hay partes de la compilación que no me permite realizar).

Una vez que el package está compilado escribo ls para ver si el directorio fue creado.

Confirmo lo anterior y entonces ejecuto con el siguiente comando:

root@oscar-MAC:/opt/ros/boxturtle/ros/teleop_base# ./teleop_base_keyboardARIA

Entonces sale la ventana desde la cual puedo controlar el Pioneer con el teclado >.<:


Aquí se aprecia que el nodo teleop_base_keyboardARIA está dado de alta y es ejecutable, así mismo abajo se aprecian los comandos con los cuales se puede operar al robot.


Nuestro robot Pioneer XD.

*********

Listo Ahora para aprender a utilizar el Sick Laser tengo que estudiar el tutorial:
Using SICK Laser Scanners with the sicktoolbox_wrapper:
http://www.ros.org/wiki/sicktoolbox_wrapper/Tutorials/UsingTheSicklms

Hubo un correo de Renato en donde comenta que tuvo que hacer un delay del sick, se lo pediré a Laura y una vez terminado ese tutorial le pediré ayuda a Renato vía correo. Queda de tarea ver los videos de stanford, consguir hojas técnicas del laser sick y del robot, así como terminar de aprender HTML XML y JAVA, conseguir un tutorial de phyton y continuar con el de C++. No estaría demás buscar una suerte de foro o algo de donde sacar info relevante de robots.

Esto es todo por hoy. XD
----------------------------

Anexos:

Renato Samperio añadió a Oscar Rodrigo Hernandez Panczenko a este chat
09:12
Renato Samperio
09:12
http://subversion.assembla.com/svn/ssc-rovers/sscrovers-ros-pkg/sscrovers_2dnav/src/
09:12

svn up
09:13

svn co http://subversion.assembla.com/svn/ssc-rovers/sscrovers-ros-pkg/
09:14

svn commit -m "Agreguen el mensaje con descripcion"
09:15

http://subversion.assembla.com/svn/ssc-rovers/sscrovers-ros-pkg/sscrovers_2dnav/src/
09:15

svn add nombre.cpp
09:17

http://subversion.assembla.com/svn/ssc-rovers/sscrovers-ros-pkg/
09:20

http://www.ros.org/wiki/karto
09:27

http://subversion.assembla.com/svn/ssc-rovers/sscrovers-ros-pkg/sscrovers_tf_conf/src/
09:30

http://academicearth.org/courses/introduction-to-robotics
09:32

http://subversion.assembla.com/svn/ssc-rovers/sscrovers-ros-pkg/sscrovers_tf_conf/src/tf_listener.cpp
Laura Isabel Galindez Olascoaga
09:38
http://www.ros.org/wiki/slam_gmapping/Tutorials/MappingFromLoggedData
Renato Samperio
09:41
roscd sscrovers-ros-pkg/
09:41

roslaunch launch/create-map.launch
09:42

rosrecord -f sscrovers_2dnav/bags/sscrovers /base_scan /tf
09:46

rosplay sscrovers_2dnav/bags/
09:48

rosrun map_server map_saver map:=map

-------------------------------

teleop_base_keyboard.cpp:

/*
* teleop_base_keyboard
* Copyright (c) 2008, Willow Garage, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

#include
#include
#include
#include
#include
#include

#include
#include
#include

#define KEYCODE_I 0x69
#define KEYCODE_J 0x6a
#define KEYCODE_K 0x6b
#define KEYCODE_L 0x6c
#define KEYCODE_Q 0x71
#define KEYCODE_Z 0x7a
#define KEYCODE_W 0x77
#define KEYCODE_X 0x78
#define KEYCODE_E 0x65
#define KEYCODE_C 0x63
#define KEYCODE_U 0x75
#define KEYCODE_O 0x6F
#define KEYCODE_M 0x6d
#define KEYCODE_R 0x72
#define KEYCODE_V 0x76
#define KEYCODE_T 0x74
#define KEYCODE_B 0x62

#define KEYCODE_COMMA 0x2c
#define KEYCODE_PERIOD 0x2e

#define COMMAND_TIMEOUT_SEC 0.2

// at full joystick depression you'll go this fast
double max_speed = 0.500; // m/second
double max_turn = 60.0*M_PI/180.0; // rad/second
// should we continuously send commands?
bool always_command = false;


class TBK_Node
{
private:
geometry_msgs::Twist cmdvel;
ros::NodeHandle n_;
ros::Publisher pub_;

public:
TBK_Node()
{
pub_ = n_.advertise("base_controller/command",1);
}
~TBK_Node() { }
void keyboardLoop();
void stopRobot()
{
cmdvel.linear.x = cmdvel.angular.z = 0.0;
pub_.publish(cmdvel);
}
};

TBK_Node* tbk;
int kfd = 0;
struct termios cooked, raw;
bool done;

int
main(int argc, char** argv)
{
ros::init(argc,argv,"tbk", ros::init_options::AnonymousName | ros::init_options::NoSigintHandler);
TBK_Node tbk;

boost::thread t = boost::thread::thread(boost::bind(&TBK_Node::keyboardLoop, &tbk));

ros::spin();

t.interrupt();
t.join();
tbk.stopRobot();
tcsetattr(kfd, TCSANOW, &cooked);

return(0);
}

void
TBK_Node::keyboardLoop()
{
char c;
double max_tv = max_speed;
double max_rv = max_turn;
bool dirty=false;

int speed=0;
int turn=0;

// get the console in raw mode
tcgetattr(kfd, &cooked);
memcpy(&raw, &cooked, sizeof(struct termios));
raw.c_lflag &=~ (ICANON | ECHO);
raw.c_cc[VEOL] = 1;
raw.c_cc[VEOF] = 2;
tcsetattr(kfd, TCSANOW, &raw);

puts("Reading from keyboard");
puts("---------------------------");
puts("q/z : increase/decrease max angular and linear speeds by 10%");
puts("w/x : increase/decrease max linear speed by 10%");
puts("e/c : increase/decrease max angular speed by 10%");
puts("---------------------------");
puts("Moving around:");
puts(" u i o");
puts(" j k l");
puts(" m , .");
puts("anything else : stop");
puts("---------------------------");

struct pollfd ufd;
ufd.fd = kfd;
ufd.events = POLLIN;
for(;;)
{
boost::this_thread::interruption_point();

// get the next event from the keyboard
int num;
if((num = poll(&ufd, 1, 250)) < 0)
{
perror("poll():");
return;
}
else if(num > 0)
{
if(read(kfd, &c, 1) < 0)
{
perror("read():");
return;
}
}
else
continue;

switch(c)
{
case KEYCODE_I:
speed = 1;
turn = 0;
dirty = true;
break;
case KEYCODE_K:
speed = 0;
turn = 0;
dirty = true;
break;
case KEYCODE_O:
speed = 1;
turn = -1;
dirty = true;
break;
case KEYCODE_J:
speed = 0;
turn = 1;
dirty = true;
break;
case KEYCODE_L:
speed = 0;
turn = -1;
dirty = true;
break;
case KEYCODE_U:
turn = 1;
speed = 1;
dirty = true;
break;
case KEYCODE_COMMA:
turn = 0;
speed = -1;
dirty = true;
break;
case KEYCODE_PERIOD:
turn = 1;
speed = -1;
dirty = true;
break;
case KEYCODE_M:
turn = -1;
speed = -1;
dirty = true;
break;
case KEYCODE_Q:
max_tv += max_tv / 10.0;
max_rv += max_rv / 10.0;
if(always_command)
dirty = true;
break;
case KEYCODE_Z:
max_tv -= max_tv / 10.0;
max_rv -= max_rv / 10.0;
if(always_command)
dirty = true;
break;
case KEYCODE_W:
max_tv += max_tv / 10.0;
if(always_command)
dirty = true;
break;
case KEYCODE_X:
max_tv -= max_tv / 10.0;
if(always_command)
dirty = true;
break;
case KEYCODE_E:
max_rv += max_rv / 10.0;
if(always_command)
dirty = true;
break;
case KEYCODE_C:
max_rv -= max_rv / 10.0;
if(always_command)
dirty = true;
break;
default:
speed = 0;
turn = 0;
dirty = true;
}
if (dirty == true)
{
cmdvel.linear.x = speed * max_tv;
cmdvel.angular.z = turn * max_rv;

pub_.publish(cmdvel);
}
}
}

No hay comentarios:

Publicar un comentario