16.10.24 robots jus intro ros s4-5
TRANSCRIPT
RoboticaEuropa.org
Primeros pasos con ROS
JUS Tu Robot Inteligente
24 Octubre 2016
SOFTWARE
Introducción a ROS
3
Arquitectura en red
Abstracción del hardware
Modular
Multi-PLATAFORMA y Multi-LENGUAJE
4
Algunos ejemplos Robot móviles
Entornos de Inteligencia Artificial
Asistentes personales
Sistemas de vigilancia
5
PRELIMINARESEl cerebro distribuido
6
memoria sensorial
Visual Auditiva Háptica
Estímulo
Salida
Memoria aCORTO plazo
Memoria aLARGO plazo
Los sistemas de memoria
7
¿Qué es ROS?
Un framework para desarrollo de software para robots, bajo el concepto de META Sistema Operativo
Su objetivo primario es la reutilización de código en I+D en Robótica
Fue desarrollado en 2007 por el Stanford Artificial Intelligence Laboratory y continuó su desarrollo la empresa Willow Garage
Gestionado y mantenido por la Open Source Robotics Foundation
8
Arquitectura distribuida
9
Nodo MasterPermite que cada nodo vea a los demás para que puedan comunicarse
roscoreContiene la BBDD de parámetros del robot
10
Mensajería peer-to-peer
11
Conceptos claveMaster
(roscore)Nodos
Paquetes(nodos)
12
Abstracción del hardware
Control bajo-niveldispositivos
13
Multi-lenguaje
14
Componentes clave
15
Herramientas de desarrollo
16
Comandosbash
SOFTWARE
Primeros pasos con ROS
18
El grafo de ROS
Arquitecturahttp://www.andrewng.org/portfolio/stair-stanford-artificial-intelligence-robot/
http://ai.stanford.edu/~asaxena/stairmanipulation/
Visión y agarre
Navegación
Reconoc. voz y respuesta
20
Sistema de compilación de ROS
1. Incluye macros de Cmake y scripts de Python
2. Ficheros clave workspace_folder/src/
• CMakeLists.txt ' Toplevel' CMake provided by catkin
• package_1/CMakeLists.txt CMakeLists. txt file for package_1
package_1/Package.xml Package manifest
catkin
Conceptos clave
21
• Inicializar espacio de trabajo
Workspaces
Conceptos clave
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
$ cd ~/catkin_ws
$ catkin_make
• Compilar espacio de trabajo
src/build/src/devel/
$ source ~/catkin_ws/devel/setup.bash ~/.bashrc
22
Paquetes de ROS
Conceptos clave
$ cd ~/catkin_ws/src
$ catkin_create_pkg basics rospy
dependenciasnombre
23
Los paquetes son simplemente localizaciones en el sistema de archivos
• Paquete rospy_tutorials
• Nodo talker ejecutable en /opt/ros/kinetic/share/rospy_tutorials
rosrun
Conceptos clave
$ rosrun PACKAGE EXECUTABLE [ARGS]
$ rosrun rospy_tutorials talker
24
Conceptos claverosrun
$ rosrun rospy_tutorials listener
$ rqt_graph
25
Namespaces
Robot con 2 cámaras
• left/image
• right/image
Nombres de dominio y re-mapeado
Conceptos clave
26
Remapping
Los nombres puede ser remapeados en tiempo real
• Streaming de video: nodo image_view , topic image
Nombres de dominio y re-mapeado
Conceptos clave
$ ./image_view image:= right/image
27
Incluir un nodo (push a node) en un Namespace
En el directorio donde está el programa camera
• Lanza el nodo camera con el nombre right
Nombres de dominio y re-mapeado
Conceptos clave
$ ./camera.py __ns:= right
Si lanzamos 2 veces el mismo nodo (no remapeamos),la instancia más antigua es eliminada
28
Herramienta de línea de comandos para automatizar el lanzamiento
de conjuntos de nodos de ROS
roslaunch
Conceptos clave
$ roslaunch PACKAGE LAUNCH_FILE
<launch><node name="talker"
pkg="rospy_tutorials"
type="talker.py"
output="screen" />
<node name="listener"
pkg="rospy_tutorials"
type="listener.py"
output="screen" />
</launch>
Notación XML
29
Autocompleta líneas de comando
Tecla TAB
Conceptos clave
30
6D Pose = Position (x, y, z) + Orientation (roll, pitch, yaw)
tf
Trasformación de coordenadas
31
Vamos con los ejemplos
$ git clone https://github.com/roboticaeuropa/ros-basics
32
Publicación
Topics
#!/usr/bin/env python
import rospy
from std_msgs.msg import Int32
rospy. init_node('topic_publisher' )
pub = rospy. Publisher('counter' , Int32)
rate = rospy. Rate(2)
count = 0
while not rospy. is_shutdown():
pub. publish(count)
count += 1
rate. sleep()
$ nano/home/pi/catkin_ws/src/basics/src/topic_publisher.py
33
Publicación
Topics$ roscore
$ rosrun basics topic_publisher.py
$ rostopic list # Use rostopic –h for help
$ rostopic echo counter –n 5
$ rostopic hz counter
$ rqt_graph
$ nano ~/.bashrc
export EDITOR='nano -w‘ # por defecto es vim
$ echo $EDITOR
$ rosed basics topic_publisher.py
$ roscd basics
Cambia: rate = rospy.Rate(1)
Y tendrás un segundero
Tu turno
34
Suscripción
Topics$ nano/home/pi/catkin_ws/scr/basics/src/topic_subscriber.py
$ rosed … ¿? # Tu turno
#!/usr/bin/env Python
import rospy
from std_msgs.msg import Int32
def callback(msg):
print msg. Data
rospy. init_node('topic_subscriber' )
sub = rospy. Subscriber('counter' , Int32, callback)
rospy. spin()
35
Suscripción
Topics
$ roscore
$ rosrun basics topic_subscriber.py
#Publicar desde la línea de comandos
$ rostopic pub counter std_msgs/Int32 1000000
$ rostopic info counter
Refresca rqt_graph
36
If a topic is marked as latched when it is
advertised, subscribers automatically get
the last message sent when they subscribe
to the topic
Latched topics
Topics
pub = rospy. Publisher('map' , nav_msgs/OccupancyGrid, latched=True)
publish once
37
Cuidado al usar C++ y Python
• Uint8
• C++: 8 bits sin signo
• Python: con signo
Tipos de mensajes
Topics
Con estos tipos primitivos se
construyen los MENSAJES:
• std_msgs package
• common_msgs package
38
• Usar tipos primitivos y combinarlos
• Directorio scr/basics/msg
• Tras la definición -> catkin_make
Definición de un mensaje (1)
Topics
EJEMPLO: publicar números complejos aleatorios
• Complex.msg
float32 real
float32 imaginary
39
1. Package.xml (manifest.xml). Añadir:
• <build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
2. CMakeLists.txt …
Definición de un mensaje (2)
Topics
40
2. CMakeLists.txt
Definición de un mensaje (3)
Topics
find_package(catkin REQUIRED
COMPONENTS
roscpp
rospy
std_msgs
# Add message_generation here,
after the other packages
message_generation
)
catkin_package(
…
CATKIN_DEPENDS message_runtime
)
add_message_files(
FILES
Complex.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
$ cd ~/catkin_ws
$ catkin_make
$ rosmsg show Complex
41
message_publisher.py
Topics#!/usr/bin/env Python
import rospy
from basics.msg import Complex
from random import random
rospy. init_node('message_publisher' )
pub = rospy. Publisher('complex' , Complex)
rate = rospy. Rate(2)
while not rospy. is_shutdown():
msg = Complex()
msg. real = random()
msg. imaginary = random()
pub. publish(msg)
rate. sleep()
42
message_subscriber.py
Topics#!/usr/bin/env python
import rospy
from basics.msg import Complex
def callback(msg):
print 'Real:' , msg. real
print 'Imaginary:' , msg. imaginary
rospy. init_node('message_subscriber' )
sub = rospy. Subscriber('complex' , Complex, callback)
rospy. spin()
43
Listando los mensajes
Topics
$ rosmsg show Complex
# Lista los tipos de mensaje del paquete
$ rosmsg package basics
# Mensajes compuestos
$ rosmsg show PointStamped
44
Corriendo el código
Topics
$ roscore
$ rosrun basics message_publisher.py
$ rosrun basics message_subscriber.py
$ rqt_graph
$ rostopic info complex
45
Publicamos ‘doubled’
sólo cuando se reciben
nuevos datos ‘number’
Combinando publicadores y suscriptoresdoubler.py
Topics #!/usr/bin/env Python
import rospy
from std_msgs.msg import Int32
rospy. init_node('doubler' )
def callback(msg):
doubled = Int32()
doubled. data = msg. data * 2
pub. publish(doubled)
sub = rospy. Subscriber('number' , Int32, callback)
pub = rospy. Publisher('doubled' , Int32)
rospy. spin()