Workshop - R.O.S. O sistema operacional para robôs Lucas, Thiago e Rafael 3 de fevereiro de 2017 Agenda 1 O que é ROS? 2 História 3 Como funciona? Estrutura Publisher e Subscriber 4 Mãos a obra Sistema Operacional Criando e navegando em um package Criando publishers e subscribers O que é ROS? Robot Operating System • Framework que auxilia na escrita de softwares para robôs; • Coleção de ferramentas, bibliotecas e convenções com o objetivo de simplificar a criação de programas para tarefas complexas e robustas em robôs independente da plataforma. Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 1 / 32 História 03/2010 08/2010 03/2011 08/2011 04/2013 12/2012 09/2013 07/2014 Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 2 / 32 História 05/2015 Lucas, Thiago e Rafael 05/2016 ROS Aula 01 3 de fevereiro de 2017 3 / 32 História ROS - 5 years https://www.youtube.com/watch?v=PGaXiLZD2KQ Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 4 / 32 História ROS - 8 years https://vimeo.com/146183095 Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 5 / 32 Como funciona o ROS? - Estrutura • Organizado através de stacks e packages; • Um stack possui diversos packages; • Um package possui um, ou vários, node. Nodes são processos em execução no computador. Eles contem as ações e processamentos de entrada e saída no robô; • A comunicação entre os nodes é feita através de messages; • As messages são transportadas no ROS através de topics; • Os nodes podem emitir(publisher) ou receber(subscriber) messages; • Todo o sistema é controlado por um node chamado de master. Informações retiradas de http://wiki.ros.org/ROS/Tutorials. Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 6 / 32 Como funciona o ROS? - Publisher e Subscriber Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 7 / 32 Como funciona o ROS? - Publisher e Subscriber Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 8 / 32 Sistemas Operacionais Outros OS (Experimental): • OS X (Homebrew); • Arch Linux; • Android (NDK); • Debian Wheezy; • OpenEmbedded/Yocto. versão 14.04 LTS -> ROS Indigo Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 9 / 32 Configurando a máquina virtual • Para proceguir, vamos utilizar uma máquina virtual para conseguirmos trabalhar com o ROS no Linux. Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 10 / 32 Configurando a máquina virtual • Vamos abrir a máquina virtual! Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 11 / 32 Configurando a máquina virtual • Com a VirtualBox aberta, vamos clicar em Machine->Add..., selecionar o arquivo .vbox da pasta WS_CP_2017 e clicar em Open Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 12 / 32 Configurando a máquina virtual • Agora já teremos o Linux rodando na máquina virtual, já podemos proceguir! Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 13 / 32 Configurando a máquina virtual • Feito isso, a máquina virtual está criada! Agora vamos clicar em Start • Login: WS_CP_2017 Password: rosworkshop Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 14 / 32 Navegando pelo workspace Conferindo a configuração. $ echo $ROS_PACKAGE_PATH A saída deve ser: /home/youruser/catkin_ws/src:/opt/ros/kinetic/share:/opt/ ros/kinetic/stacks Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 15 / 32 Primeiro package $ cd ~/catkin_ws/src $ catkin_create_pkg ros_workshop std_msgs rospy roscpp Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 16 / 32 Compilando um package $ cd ~/catkin_ws $ catkin_make Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 17 / 32 Acessando seu package $ roscd ros_workshop $ ls Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 18 / 32 Criando um publisher em Python $ $ $ $ cd ~/catkin_ws/src/ros_workshop mkdir scripts cd scripts gedit talker.py Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 19 / 32 Criando um publisher em Python #!/usr/bin/env python import rospy from std_msgs.msg import String def talker(): pub = rospy.Publisher(’chatter’, String, queue_size=10) rospy.init_node(’talker’, anonymous=True) rate = rospy.Rate(10) # 10hz while not rospy.is_shutdown(): hello_str = "hello␣world␣%s" % rospy.get_time() rospy.loginfo(hello_str) pub.publish(hello_str) rate.sleep() if __name__ == ’__main__’: try: talker() except rospy.ROSInterruptException: pass Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 20 / 32 Executando talker.py $ chmod +x talker.py Em um terminal execute: $ roscore Em um segundo terminal execute: $ rosrun ros_workshop talker.py Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 21 / 32 Vamos agora ver o tópico criado • O comando rostopic list lista os tópicos que estão publicando informação de um Nó. Para podermos analisar o tópico que acabamos de criar, em outro terminal rode o comando a seguir: $ rostopic list Para ver a informação puplicada pelo Nó: $ rostopic echo /chatter Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 22 / 32 Criando um subscriber em Python $ cd ~/catkin_ws/src/ros_workshop $ cd scripts $ gedit listener.py Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 23 / 32 Criando um subscriber em Python #!/usr/bin/env python import rospy from std_msgs.msg import String def callback(data): rospy.loginfo(rospy.get_caller_id() + "I␣heard␣%s", data.data) def listener(): rospy.init_node(’listener’, anonymous=True) rospy.Subscriber("chatter", String, callback) rospy.spin() if __name__ == ’__main__’: listener() Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 24 / 32 Executando listener.py $ chmod +x listener.py Em um segundo terminal execute: $ rosrun ros_workshop listener.py Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 25 / 32 Atividade Vamos agora controlar um ”robô” em forma de tartaruga no simulador! • Vamos Fechar todas as janelas de terminal abertas... Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 26 / 32 Criando um publisher para controlar a tartaruga! $ $ $ $ cd ~/catkin_ws/src/ros_workshop cd scripts gedit turtle_circle.py chmod +x listener.py Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 27 / 32 Criando um publisher para controlar a tartaruga! #!/usr/bin/env python import rospy from geometry_msgs.msg import Twist def turtle_circle(): pub = rospy.Publisher(’/turtle1/cmd_vel’, Twist, queue_size=10) rospy.init_node(’turtle_circle’, anonymous=True) rate = rospy.Rate(10) # 10hz vel = Twist() while not rospy.is_shutdown(): vel.linear.x = 0.5 vel.angular.z = 0.2 pub.publish(vel) rate.sleep() if __name__ == ’__main__’: try: turtle_circle() except rospy.ROSInterruptException: pass Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 28 / 32 Atividade Em um terminal execute: $ roscore Em outro terminal execute: $ rosrun turtlesim turtlesim_node Em outro terminal execute: $ rosrun ros_workshop turtle_circle.py Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 29 / 32 Atividade Observe a tartaruga, ela deverá estar andando em circulo! • Com a versatilidade do ROS o mesmo código feito para a tartaruga, com algumas modificações, pode controlar um robô real, como os demonstrados nos vídeos, mudando apenas o nome do tópico! Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 30 / 32 Atividade Vamos agora observar como o ROS está lidando com os nós! Com a tartaruga ainda andando em círculos, em um terminal rode: $ rosrun rqt_graph rqt_graph Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 31 / 32 Referências Todas as informações e exemplos retirados do site oficial do ROS. http://wiki.ros.org/ROS/Tutorials Lucas, Thiago e Rafael ROS Aula 01 3 de fevereiro de 2017 32 / 32