ROS Kinetic: Publisher și Subscriber în Python

Prima oară când am început să citesc despre ROS a fost anul trecut. Tot atunci am luat decizia de a învăța cât mai multe despre ROS și a face cât mai multe proiecte bazate pe el. După primele tutoriale citite, am fost sigur că o să fie dureros până să ajung să fac primul robot bazat pe ROS. Și am avut dreptate.

Primul pas în ROS începe cu acest tutorial. Sau mai bine zis, totul începe cu două noduri, așa zisele elemente de bază. Un nod care să publice date, și un nod care să citească și să afișeze datele primite. Fiind un constructor de roboți autodidact, știu cât de greu este să învaț lucruri care nu sunt explicate în detaliu. În acest tutorial am pus destul de multă atenție pe resurse și pașii necesari pentru a scrie și rula două noduri: un nod de tip Publisher si un nod Subscriber.

Notă: Am scris cu litere mari Publisher și Subscriber pentru a evidenția cele două concepte ROS.

Ce găsiți în acest tutorial

  1. De ce avem nevoie pentru acest tutorial
  2. O scurtă descriere a nodurilor Publisher și Subscriber
  3. O schemă a nodurilor
  4. Crearea spaţiului de lucru şi a pachetului care va conţine nodurile
  5. Publisher
  6. Subscriber
  7. Rulare noduri cu un fişier de lansare automat
  8. Comenzi ajutătoare
  9. Statistici
  10. Concluzie

1. De ce avem nevoie pentru acest tutorial

Pentru a scrie cele două noduri ROS avem nevoie de resurse hardware și software. Mai jos am făcut o listă cu resursele obligatorii, la care am adăugat și o resursă opțională care poate fi de folos la dezvoltarea proiectelor complexe.

  1. O placă Raspberry Pi 3 conectată la un monitor, tastatură și un mouse. Puteți folosi și optiune de control de la distanță și interfață grafică. Una dintre aplicațiile care permite controlul plăcii Pi de la un alt computer este Remote Desktop Connection. Aici este un tutorial unde puteți afla setările pentru a controla Pi de la distanță.
  2. Ubuntu MATE instalat pe Raspberry Pi 3. Există o versiune de Ubuntu MATE special creată pentru Raspberry Pi.
  3. ROS Kinetic instalat pe Raspberry Pi 3. Am explicat pașii necesari pentru a instala varianta completă a ROS Kinetic în acest tutorial.
  4. Opțional, puteți instala un IDE pentru Python. Eu folosesc IDLE.

2. O scurtă descriere a nodurilor Publisher și Subscriber

Ideea este de a simula transferul de date între un senzor (de exemplu poate fi un senzor ultrasonic) și un program care să calculeze direcția de mers a robotului. Un senzor ultrasonic precum HC-SR04 returnează informație sub forma unui șir numeric. Șirul de numere returnate de senzor vor fi citite de nodul Subscriber pentru calcularea și luarea deciziilor care tin de navigarea robotului.

Pentru a simula un astfel de scenariu simplu de trimitere și citire de date, am creat două noduri. Nodul Publisher va genera un număr aleator, în timp ce nodul Subscriber va afișa numarul aleator primit de la nodul Publisher.

Mai jos am făcut o schemă a nodurilor, cum vor circula datele, tipului de date folosit la trimiterea infomației de la un nod la altul, și rata de trimitere a datelor.

3. O schemă a nodurilor

O schemă a nodurilor care conține numele celor două noduri, tipul de date trimis/primit și rata de trimitere a datelor.

O schemă a nodurilor care conține numele celor două noduri, tipul de date trimis/primit și rata de trimitere a datelor.

4. Crearea spațiului de lucru și a pachetului care va conține nodurile

Acest pas este valabil doar dacă nu aveți deja creat un spațiu de lucru. Dacă spațiul de lucru este creat, atunci puteți sări peste acest pas direct la următoarele comenzi – secțiunea 4.2 – pentru crearea pachetului.

4.1 Comenzi pentru crearea spațiului de lucru
mkdir -p ~/your_workspace_name_here/src 
cd ~/ your_workspace_name_here/src
catkin_init_workspace
catkin_make
source devel/setup.bash

Comenzile de mai sus creează un set de directoare care vor găzdui toate nodurile ROS.
Dacă primele două comenzi ar trebui să va fie familiare, următoarele două comanzi sunt specifice ROS. Ambele comenzi au rolul de a crea fișiere cu meta date pentru ROS. Comanda „catkin_init_workspace” creează fișierul CmakeLists.txt. Comanda „catkin_make” generează o serie de directoare care au rolul de a găzdui fișiere, librării sau programe executabile.

4.2 Comenzi pentru crearea pachetului ROS

Este necesar ca pachetul ROS care va conține cele două noduri să fie inclus în directorul spațiului de lucru. În plus, fiecare pachet va conține două fișiere: CmakeLists.txt și package.xml.
Comenzile pentru crearea pachetului sunt:

cd ~/your_workspace_name_here/src
catkin_create_pkg your_package_name rospy

catkin_create_pkg‘ este comanda pentru crearea pachetului nou.
rospy‘ este dependența pachetului nou creat de pachetul rospy.

5. Publisher

Mai jos este codul pentru nodul Publisher. Acest nod va genera la fiecare 2 secunde un număr aleatoriu cuprins între 0 și 5000. Fișierul trebuie să fie executabil.

#!/usr/bin/env python
import rospy

from std_msgs.msg import Int32
from random import randint

//define the random_number Publisher
def random_number_publisher():
	rospy.init_node('random_number')
	pub=rospy.Publisher('rand_no', Int32, queue_size=10)
	rate= rospy.Rate(2)
//generate a random number at every 2 seconds
	while not rospy.is_shutdown():
		random_msg=randint(0,5000)
		rospy.loginfo(random_msg)
		pub.publish(random_msg)
		rate.sleep()

if __name__=='__main__':
	try:
		random_number_publisher()
	except rospy.ROSInterruptException:
		pass


Pentru a face un fișier executabil, rulați comanda:

chmod u+x the_file.py

6. Subscriber

Nodul Subscriber va afișa toate numerele aleatorii trimise de nodul Subscribe. Rata de afișare este aceeși cu rata de transmitere a nodului Publisher. Fișierul trebuie să fie executabil.

#!/usr/bin/env python

import rospy

from std_msgs.msg import Int32
//define the display text
def callback(data):
	rospy.loginfo("I receive %s", data.data)

//define the subscriber
def random_subscriber():
	rospy.init_node('random_subscriber')
	rospy.Subscriber('rand_no',Int32, callback)
	rospy.spin()

if __name__=='__main__':
	random_subscriber()

7. Rulare noduri cu un fisier de lansare automat

Pentru a rula cele două fișiere, trebuie să rulaţi trei comenzi în ferestre diferite. Prima fereastră aparține comenzii roscore. A doua comandă aparține nodului Publisher, iar cea de-a treia este comanda pentru Subscriber. Pentru a nu deschide câte o fereastră și a rula comenzile manual una câte una, ROS ne oferă un instrument care rulează automat toate aceste comenzi. Este vorba de roslaunch.

Pentru a lansa toate fișierele automat, avem nevoie de un fișier cu extensia ‘.launch’. Fișierul nostru conține liniile din imaginea alăturată și va fi salvat în pachetul cu nodurile Publisher și Subscriber. Fișierul trebuie să fie executabil, la fel ca și celelalte fișiere Publisher și Subscriber.

Conținutul fișierului cu extensia .launch

Conținutul fișierului cu extensia .launch

Rulare 'roslaunch'

Rulare ‘roslaunch’

8. Comenzi ajutatoare

rostopic info rand_no – afișează informații despre topic
rostopic hz rand_no – afișează rata de publicare a mesajelor
rostopic type rand_no – afișează tipul topicului
rqt_graph – afișează o fereastră cu nodurile și legăturile dintre ele

9. Statistici

Placa Raspberry Pi 3 are resurse limitate de memorie și procesare. De aceea este necesar să cunoaștem în orice moment resursele consumate de nodurile ROS. Mai jos am monitorizat încărcarea plăcii Raspberry Pi în timp ce rulează cele două noduri. În funcție de aplicațiile pornite, datele de mai jos pot diferi. Captura de mai jos este făcută în timp ce rulam pe RPi doar cele două noduri ROS.

Statistici Raspberry Pi 3

Statistici Raspberry Pi 3

10. Concluzie

Acest tutorial este pentru începători, pentru aceia care își doresc să învețe să lucreze cu ROS. Cele două noduri de mai sus sunt un fel de “Hello World” din programare. Dacă ați parcurs tutorialul și l-ați pus în practică, tocmai ați făcut primul pas în ROS. Este primul pas în robotica avansată.

Leave a Reply

Câmpurile obligatorii sunt marcate cu *.