no way to compare when less than two revisions
Diferenzas
Isto amosa as diferenzas entre a revisión seleccionada e a versión actual da páxina.
— | inv:por-clasificar:ros [2013/03/27 10:55] (actual) – creado - edición externa 127.0.0.1 | ||
---|---|---|---|
Liña 1: | Liña 1: | ||
+ | ====== Instalación y configuración de ROS (26 dic) ====== | ||
+ | Cada versión de ROS soporta un máximo de tres versiones de ubuntu, por lo que conviene tener claro qué versión vamos a instalar. | ||
+ | Para Ubuntu 12.10 debemos instalar ROS groovy. | ||
+ | ==== Ubuntu 12.10 ==== | ||
+ | == Instalación de ROS Groovy == | ||
+ | Añadir los repositorios de ros-groovy para ubuntu 12.10 (a 12 dic 2012) | ||
+ | < | ||
+ | sudo sh -c 'echo "deb http:// | ||
+ | wget http:// | ||
+ | sudo apt-get update | ||
+ | sudo apt-get upgrade | ||
+ | </ | ||
+ | |||
+ | Instalar con apt-get (todas las dependencias se instalan automáticamente). | ||
+ | < | ||
+ | sudo apt-get install ros-groovy-desktop-full | ||
+ | </ | ||
+ | |||
+ | Instalar también otras herramientas que facilitan el trabajo con ROS. | ||
+ | < | ||
+ | sudo apt-get install python-rosinstall python-rosdep | ||
+ | </ | ||
+ | |||
+ | == Configuración de ROS Groovy == | ||
+ | Configuración inicial: | ||
+ | < | ||
+ | sudo rosdep init | ||
+ | rosdep update | ||
+ | source / | ||
+ | </ | ||
+ | |||
+ | Creamos nuestro espacio de trabajo (se recomienda para no ensuciar la instalación base) | ||
+ | < | ||
+ | cd /opt/ros | ||
+ | mkdir rosws | ||
+ | sudo chmod -R 775 / | ||
+ | sudo chown user:user / | ||
+ | rosws init / | ||
+ | </ | ||
+ | |||
+ | Añadimos el script de configuración al bashrc | ||
+ | < | ||
+ | echo " | ||
+ | . ~/.bashrc | ||
+ | </ | ||
+ | |||
+ | |||
+ | == Instalación de stacks desde repositorios == | ||
+ | Para instalar cualquier stack desde repositorios: | ||
+ | < | ||
+ | roscd | ||
+ | roslocate info STACKNAME | rosws merge - | ||
+ | source setup.sh | ||
+ | rosws update STACKNAME | ||
+ | rosmake STACKNAME | ||
+ | </ | ||
+ | |||
+ | Un ejemplo de instalación del stack ROSARIA. | ||
+ | Este stack es un wrapper de [[http:// | ||
+ | < | ||
+ | roscd | ||
+ | roslocate info ROSARIA | rosws merge - | ||
+ | source setup.sh | ||
+ | rosws update ROSARIA | ||
+ | rosmake ROSARIA | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ====== Tutoriales de ROS ====== | ||
+ | [[http:// | ||
+ | |||
+ | |||
+ | ====== Crear un paquete ROS ====== | ||
+ | |||
+ | En este tutorial mostraremos cómo crear un paquete de software para ROS. A modo de ejemplo, crearemos un paquete ficticio con un único nodo ROS, que se encargará de las siguientes tareas: | ||
+ | |||
+ | - Abrir un sensor ficticio. | ||
+ | - Leer los datos que proporciona el sensor de forma periódica. | ||
+ | - Publicar los datos a través del sistema de intercambio de mensajes ROS. El programa que se encargue de esto recibirá el nombre de // | ||
+ | |||
+ | Nuestro sensor ficticio proporcionará la posición 3D de un objeto y la marca temporal asociada a cada dato: | ||
+ | |||
+ | < | ||
+ | timestamp x y z | ||
+ | </ | ||
+ | |||
+ | Antes de comenzar el tutorial, debemos descargarnos los fuentes que utilizaremos en el paquete {{: | ||
+ | * SensorFake.cpp y SensorFake.h: | ||
+ | * SensorFake_Publisher.cpp: | ||
+ | |||
+ | |||
+ | ==== Diseño del paquete ROS ==== | ||
+ | |||
+ | Al tratarse de un paquete sencillo, proponemos un diseño que no complique en exceso ni la implementación ni el mantenimiento del mismo. Nuestro paquete constará de los siguientes archivos: | ||
+ | |||
+ | - Librería para el manejo del sensor. Proporcionará las funciones típicas: conexión, lectura, desconexión, | ||
+ | - Nodo ROS encargado de comunicarse con el sensor (a través de su librería) y transmitir los datos a través del sistema de mensajes ROS. | ||
+ | |||
+ | Para paquetes más complejos, se recomienda encarecidamente utilizar un [[http:// | ||
+ | |||
+ | |||
+ | ==== Creación del paquete ==== | ||
+ | |||
+ | Nos situamos en la carpeta donde queramos crear nuestro paquete. Por ejemplo: | ||
+ | < | ||
+ | ${HOME}/ros | ||
+ | </ | ||
+ | |||
+ | Creamos el paquete. El nombre del paquete será // | ||
+ | < | ||
+ | roscreate-pkg sensor_fake roscpp | ||
+ | </ | ||
+ | |||
+ | La salida del comando debería ser algo como: | ||
+ | |||
+ | < | ||
+ | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
+ | WARNING: current working directory is not on ROS_PACKAGE_PATH! | ||
+ | Please update your ROS_PACKAGE_PATH environment variable. | ||
+ | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
+ | Created package directory / | ||
+ | Created include directory / | ||
+ | Created cpp source directory / | ||
+ | Created package file / | ||
+ | Created package file / | ||
+ | Created package file / | ||
+ | Created package file / | ||
+ | |||
+ | Please edit sensor_fake/ | ||
+ | </ | ||
+ | |||
+ | Esto nos indica: | ||
+ | |||
+ | Si nos desplazamos a la carpeta correspondiente (// | ||
+ | |||
+ | * include: directorio para ficheros " | ||
+ | * * sensor_fake: | ||
+ | * src: directorio para ficheros " | ||
+ | * mainpage.dox: | ||
+ | * CMakeLists.txt: | ||
+ | * manifest.xml: | ||
+ | |||
+ | ==== Añadiendo el paquete al workspace ==== | ||
+ | |||
+ | **Desde ${HOME}/ | ||
+ | < | ||
+ | rosws set sensor_fake | ||
+ | </ | ||
+ | |||
+ | Alternativamente, | ||
+ | < | ||
+ | rosstack profile && rospack profile | ||
+ | </ | ||
+ | |||
+ | |||
+ | Cerramos el terminal y lo abrimos de nuevo, para que se recarguen las variables de entorno correspondientes. A continuación, | ||
+ | < | ||
+ | rospack profile | ||
+ | </ | ||
+ | En este punto, ROS debería ser capaz de encontrar nuestro paquete. Lo comprobamos mediante: | ||
+ | < | ||
+ | rospack find sensor_fake | ||
+ | </ | ||
+ | |||
+ | Comprobamos que todo funciona correctamente ejecutando una compilación de prueba: | ||
+ | |||
+ | < | ||
+ | rosmake sensor_fake | ||
+ | </ | ||
+ | |||
+ | Cuya salida debería ser algo como: | ||
+ | |||
+ | < | ||
+ | [ rosmake ] rosmake starting... | ||
+ | [ rosmake ] Packages requested are: [' | ||
+ | [ rosmake ] Logging to directory / | ||
+ | [ rosmake ] Expanded args [' | ||
+ | [' | ||
+ | [rosmake-0] Starting >>> | ||
+ | [rosmake-0] Finished <<< | ||
+ | [rosmake-0] Starting >>> | ||
+ | [rosmake-0] Finished <<< | ||
+ | [rosmake-0] Starting >>> | ||
+ | [rosmake-0] Finished <<< | ||
+ | [ rosmake ] Results: | ||
+ | [ rosmake ] Built 3 packages with 0 failures. | ||
+ | [ rosmake ] Summary output to directory | ||
+ | [ rosmake ] / | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Importación a Eclipse ==== | ||
+ | |||
+ | Si queremos importar este paquete a un proyecto Eclipse, podemos seguir las instrucciones que se encuentran en: [[http:// | ||
+ | |||
+ | ==== Compilación de la librería para interacción con sensor_fake ==== | ||
+ | |||
+ | En primer lugar, copiamos el archivo // | ||
+ | |||
+ | < | ||
+ | #common commands for building c++ executables and libraries | ||
+ | rosbuild_add_library(${PROJECT_NAME} src/ | ||
+ | #Esto indica que queremos compilar SensorFake.cpp como una librería dinámica. Esta librería tendrá el mismo nombre que el proyecto | ||
+ | # (sensor_fake) | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Compilamos: | ||
+ | |||
+ | < | ||
+ | rosmake sensor_fake | ||
+ | </ | ||
+ | |||
+ | **Nota importante**: | ||
+ | |||
+ | < | ||
+ | #include " | ||
+ | </ | ||
+ | |||
+ | De no se así (por ejemplo, si le hemos dado otro nombre al paquete), debemos modificar este // | ||
+ | |||
+ | Si la compilación es satisfactoria, | ||
+ | |||
+ | ==== Definición de los mensajes ROS ==== | ||
+ | |||
+ | Ahora debemos definir los mensajes que nuestro paquete va a utilizar para comunicarse con ROS. Para ello, creamos la carpeta // | ||
+ | < | ||
+ | #uncomment if you have defined messages | ||
+ | rosbuild_genmsg() | ||
+ | </ | ||
+ | |||
+ | Compilamos: | ||
+ | |||
+ | < | ||
+ | rosmake sensor_fake | ||
+ | </ | ||
+ | |||
+ | Si la compilación es correcta, //rosmake// habrá creado dos nuevas carpetas: 1) // | ||
+ | |||
+ | ==== Compilación del // | ||
+ | |||
+ | Ahora estamos en disposición de escribir un programa que lea los datos de nuestro // | ||
+ | el tipo de mensaje generado en el apartado anterior). En primer lugar, copiamos el archivo // | ||
+ | |||
+ | < | ||
+ | #common commands for building c++ executables and libraries | ||
+ | rosbuild_add_library(${PROJECT_NAME} src/ | ||
+ | rosbuild_add_executable(SensorFake_Publisher src/ | ||
+ | target_link_libraries(SensorFake_Publisher ${PROJECT_NAME}) | ||
+ | </ | ||
+ | |||
+ | |||
+ | Si la compilación es satisfactoria, | ||
+ | |||
+ | ==== Ejecución del nodo ROS ==== | ||
+ | Finalmente, probamos nuestro paquete. Para ello, abrimos un terminal y ejecutamos el servidor ROS: | ||
+ | |||
+ | < | ||
+ | roscore | ||
+ | </ | ||
+ | |||
+ | En otro terminal, ejecutamos nuestro // | ||
+ | |||
+ | < | ||
+ | rosrun sensor_fake SensorFake_Publisher | ||
+ | </ | ||
+ | |||
+ | La salida debería ser algo como: | ||
+ | |||
+ | < | ||
+ | Hello, I am the SensorFake_Publisher | ||
+ | Time 1353001026.799379: | ||
+ | Time 1353001026.899426: | ||
+ | Time 1353001026.999419: | ||
+ | </ | ||
+ | |||
+ | En otro terminal, ejecutamos un // | ||
+ | |||
+ | < | ||
+ | rostopic echo / | ||
+ | </ | ||
+ | |||
+ | |||
+ | La salida debería ser algo como: | ||
+ | < | ||
+ | header: | ||
+ | seq: 31 | ||
+ | stamp: | ||
+ | secs: 1353001134 | ||
+ | nsecs: 532552707 | ||
+ | frame_id: '' | ||
+ | timestamp: | ||
+ | secs: 1353001134 | ||
+ | nsecs: 532516000 | ||
+ | x: 1 | ||
+ | y: 6 | ||
+ | z: 11 | ||
+ | --- | ||
+ | header: | ||
+ | seq: 32 | ||
+ | stamp: | ||
+ | secs: 1353001134 | ||
+ | nsecs: 632531208 | ||
+ | frame_id: '' | ||
+ | timestamp: | ||
+ | secs: 1353001134 | ||
+ | nsecs: 632489000 | ||
+ | x: 2 | ||
+ | y: 7 | ||
+ | z: 12 | ||
+ | --- | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Compartir el paquete ==== | ||
+ | |||
+ | Si queremos compartir el paquete (por ejemplo, enviarlo por email), debemos borrar la carpeta // | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ====== Stage + AMCL + RVIZ ====== | ||
+ | |||
+ | En este tutorial veremos: | ||
+ | - Cómo simular un robot con Stage. | ||
+ | - Cómo ejecutar el algoritmo de localización AMCL. Este algoritmo estimará la posición del robot sobre un mapa en base a la información del simulador. | ||
+ | - Cómo visualizar todos los datos con el //rviz//. | ||
+ | |||
+ | Para ello, necesitamos instalar: | ||
+ | - Stack Stage: //sudo apt-get install ros-groovy-stage// | ||
+ | - Nodos AMCL y map_server(stack Navigation): | ||
+ | - Nodo rviz: //sudo apt-get install ros-groovy-rviz// | ||
+ | |||
+ | |||
+ | ==== Archivos de configuración ==== | ||
+ | |||
+ | En primer lugar, debemos descargar | ||
+ | |||
+ | - // | ||
+ | - // | ||
+ | - // | ||
+ | |||
+ | A continuación, | ||
+ | |||
+ | < | ||
+ | | ||
+ | Este archivo contiene los parámetros que se le pasarán al AMCL. Podemos modificar los parámetros editando el archivo. | ||
+ | |||
+ | Finalmente, descargamos el archivo {{: | ||
+ | |||
+ | |||
+ | ==== Ejecución de los nodos (uno por terminal) ==== | ||
+ | |||
+ | Arrancamos el // | ||
+ | |||
+ | < | ||
+ | |||
+ | Ejecutamos el simulador Stage con un archivo " | ||
+ | |||
+ | < | ||
+ | rosrun stage stageros ${WORLD_PATH}/ | ||
+ | </ | ||
+ | |||
+ | Ejecutamos el map_server: | ||
+ | |||
+ | < | ||
+ | rosrun map_server map_server ${WORLD_PATH}/ | ||
+ | </ | ||
+ | |||
+ | Ejecutamos el AMCL con el archivo de configuración descargado: | ||
+ | |||
+ | < | ||
+ | roslaunch amcl amcl_diff_stage.launch | ||
+ | </ | ||
+ | |||
+ | AMCL expone un servicio (global_localization) mediante el cual se puede activar el proceso de localización global del robot. | ||
+ | En otro terminal, hacemos: | ||
+ | |||
+ | < | ||
+ | rosservice call / | ||
+ | </ | ||
+ | |||
+ | Comprobamos con la herramienta //rxgraph// que todos los nodos están: 1) levantados, 2) comunicándose correctamente. A continuación, | ||
+ | |||
+ | < | ||
+ | rosrun rviz rviz ${RVIZ_CONFIG}/ | ||
+ | </ | ||
+ | |||
+ | Deberíamos ver algo como: {{ : | ||
+ | |||
+ | Ahora podemos mover el robot (pestaña teleop) por el entorno para que se localice. | ||
+ | |||
+ | |||
+ | ====== Rosbag ====== | ||
+ | |||
+ | Rosbag es una herramienta para grabar, reproducir y modificar logs con los mensajes que recibe el nodo roscore (pose, medidas del láser, transformaciones geométricas, | ||
+ | |||
+ | ==== Rosbag record ==== | ||
+ | |||
+ | ==== Rosbag play ==== | ||
+ | |||
+ | ==== Rosbag filter ==== | ||
+ | |||
+ | Rosbag nos permite generar nuevos archivos bag a partir de un bag ya existente. Presentamos aquí algunos ejemplos: | ||
+ | |||
+ | Generar un bag que sólo contenga mensajes "/ | ||
+ | < | ||
+ | rosbag filter original.bag filtrado.bag | ||
+ | </ | ||
+ | |||
+ | Generar un bag que sólo contenga mensajes "/ | ||
+ | < | ||
+ | rosbag filter original.bag filtrado.bag | ||
+ | </ | ||
+ | |||
+ | Generar un bag que contenga todos los mensajes excepto el "/ | ||
+ | < | ||
+ | rosbag filter original.bag filtrado.bag | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Creación de un controlador básico ==== | ||
+ | |||
+ | |||
+ | Descargar el siguiente paquete: {{: | ||
+ | |||
+ | Para probar el código con el Stage necesitamos hacer un re-mapping de los topics como si fuera el robot real: | ||
+ | |||
+ | < | ||
+ | < | ||
+ | <node pkg=" | ||
+ | <remap from="/ | ||
+ | <remap from="/ | ||
+ | <remap from="/ | ||
+ | </ | ||
+ | <arg name=" | ||
+ | <node name=" | ||
+ | </ | ||
+ | </ |