Nuova sezione libri disponibile!

Tutorial - Sviluppiamo un Bot Telegram in ROS

Ludovico Russo

lettura in 5 minuti

In questo tutorial vedremo come creare un semplice bot telegram in grado di controllare un robot in cloud.

Cosa serve?

Per sviluppare questo progetto, vi servirà essere iscritti alla nostra piattaforma ed avere a disposizione un robot reale o virtuale.

Questa volta, useremo un robot reale per dialogare con il robot! Ad ogni modo, potrete comunque richiedere il vostro robot virtuale per fare prove! Se volete utilizzare un robot virtuale scriveteci a info@hotblackrobotics.com!

Per prima cosa, è importate iscriversi alla piattaforma e collegarsi al robot, potete seguire le istruzioni all'inizio di questo tutorial.

Creazione di un Bot Telegram

Per prima cosa, è necessario configurare un bot telegram! Per farlo, telegram mette a disposizione un bot (chiamato BotFather) in grado di creare altri bot.

Assicuriamoci di aver installato telegram sul nostro dispositivo e accediamo al BotFather cliccando qui. Una volta aperta la chat con BotFather lui ci informerà (in inglese) sulle azioni che possiamo fare.

BotFather primo contatto

Per creare un nuovo bot, inviamo il comando /newbot, a cui il BotFather risponderà chiedendo che nome dare al proprio bot

Diamo un nome al bot

Una volta scelto il nome (BotFather ci informa se il nome è già stato preso), verrà creato il nostro bot e ci verranno fornite due informazioni essenziali:

  • l'URL del bot, grazia al quale potremmo aprire la chat
  • il Token del bot (da mantenere segreto) che servirà per sviluppare il codice.

Bot Creato

Una volta creato il bot, cliccando sull'URL, potremmo aprire la chat! Ovviamente adesso non succederà nulla perchè il bot non è ancora stato implementato.

Bot Chat

Creazione del nostro programma

Una volta connessi, creiamo un nuovo programma chiamato telebot, seguendo le istruzioni di seguito.

Dopo esserci loggati in piattaforma, apriamo il tab sketches. aprire sketches

Creiamo un nuovo sketch e apriamolo

nuovo sketch aprire sketch

Implementiamo un semplice Bot

A questo punto, siamo pronti ad implementare un semplicissimo bot che risponde alla nostra chat. Nel programma appena crato, implementiamo il seguente codice.

import dotbot_ros
import telepot

import sys

class Node(dotbot_ros.DotbotNode):
    node_name = 'bot'
    TOKEN = "INSERISCI QUI IL TUO TOKEN"

    def setup(self):
        self.bot = telepot.Bot(self.TOKEN)
        self.bot.message_loop(self.handle)

    def handle(self, msg):
        content_type, chat_type, chat_id = telepot.glance(msg)

        if content_type == 'text':
            cmd = msg['text'].split()
            if cmd[0] == '/start':
                self.bot.sendMessage(chat_id, "ciao, benvenuto nella mia chat!")
            elif cmd[0] == '/ciao':
                self.bot.sendMessage(chat_id, "ciao, come stai?")
            else:
                self.bot.sendMessage(chat_id, "scusa, non capisco, conosco solo il comando '/ciao'")
        print msg
        sys.stdout.flush()

IMPORTANTE: ricordate di modificare la linea TOKEN = "INSERISCI QUI IL TUO TOKEN" inserendo il token del vostro robot tra i doppi apici

codice bot implementato

Una volta implementato il programma, salviamo e lanciamo il codice! A questo punto, se tutto va bene, potremmo aprire la chat telegram col nostro bot e iniziare a dialogare con lui!

programma lanciato

bot dialogo

Analizziamo il codice

Come al solito, il nostro programma è composto da un nodo ROS, la funzione princiapale è la funzione setup, che si occupa di inizializzare il bot e creare una callback di gestione.

    def setup(self):
        self.bot = telepot.Bot(self.TOKEN)
        self.bot.message_loop(self.handle)

In particolare, la linea self.bot = telepot.Bot(self.TOKEN) crea il bot utilizzando il nostro token, mentre la seconda linea self.bot.message_loop(self.handle) dice che, ogni volta che un nuovo messaggio viene mandato al bot, bisogna chiamare la funzione self.handle.

La funzione handle, quindi, viene chiamata quando un nuovo messaggi è mandato alla nostra chat, ed.è implementata come segue:

    def handle(self, msg):
        content_type, chat_type, chat_id = telepot.glance(msg)

        if content_type == 'text':
            cmd = msg['text'].split()
            if cmd[0] == '/start':
                self.bot.sendMessage(chat_id, "ciao, benvenuto nella mia chat!")
            elif cmd[0] == '/ciao':
                self.bot.sendMessage(chat_id, "ciao, come stai?")
            else:
                self.bot.sendMessage(chat_id, "scusa, non capisco, conosco solo il comando '/ciao'")
        print msg
        sys.stdout.flush()

Alla funzione viene passato come parametro il messaggio mandato alla chat, contenuto nella variabile msg.

Per prima cosa, è necessario estrarre informaizoni utili dalla chat, in particolare il chat_id (che identifica univocamente la chat aperta, in modo che il bot possa gestire più chat contemporaneamente), e il content_type, cioè il tipo di dati contenuti nel messaggio. Questa operazione viene fatta dalla riga content_type, chat_type, chat_id = telepot.glance(msg).

A questo punto, dobbiamo verificare che il messaggio sia di tipo testuale (il bot al momento non sa gestire immagini, video o file). Facciamo quindi il check if content_type == 'text':.

Se il messaggio è di tipo testuale, possiamo andare ad analizzarlo. Il messaggio sarà contenuto in una stringa msg['text'] di testo. Possiamo dividere la stringa nelle parole contenute utilizzando il metodo plit(), come nella riga cmd = msg['text'].split(). In questo modo, se la stringa è "ciao come stai?", la variabile cmd sarà uguale a ['ciao', 'come', 'stai?'].

Ora possiamo analizzare la prima parola, rispondendo in modo diverso in base al valore di questa. Al momento, il robot risponde solamente a due parole: /ciao e /start (notare lo /). Questo viene fatto all'interno del costrutto if ... elif ... else.

Per rispondere alla chat, utilizziamo il la riga self.bot.sendMessage(chat_id, "ciao, come stai?") , dove il primo parametro è l'id della chat stessa, mentre il secondo parametro è la stringa da mandare.

Esercizio

Provate ad implemntare altri comandi!

Controlliamo il robot da chat telegram!

Una volta capito come mandare comandi al robot, possiamo tranquillamente implementare dei comandi per farlo muovere. Per farlo, bisogna modificare il nostro programma come segue.

  1. Importare dalla libreria gpiozero l'oggetto Robot
  2. Creare un oggetto Robot nella funzione di setup
  3. Implementare i comandi nel costrutto if ... elif ... else
  4. Nei nuovi comandi, controllare i motori tramite l'oggetto Robot.

Il nuovo codice implementato è il seguente

import dotbot_ros
import telepot

from gpiozero import Robot
import time
import sys

class Node(dotbot_ros.DotbotNode):
    node_name = 'bot'
    TOKEN = "INSERISCI QUI IL TUO TOKEN"

    def setup(self):
        self.bot = telepot.Bot(self.TOKEN)
        self.bot.message_loop(self.handle)
        self.robot = Robot(left=(9, 10), right=(7, 8))


    def handle(self, msg):
        content_type, chat_type, chat_id = telepot.glance(msg)

        if content_type == 'text':
            cmd = msg['text'].split()
            if cmd[0] == '/start':
                self.bot.sendMessage(chat_id, "ciao, benvenuto nella mia chat!")
            elif cmd[0] == '/ciao':
                self.bot.sendMessage(chat_id, "ciao, come stai?")
            elif cmd[0] == '/avanti':
                self.bot.sendMessage(chat_id, "ok, vado avanti")
                self.robot.forward()
                time.sleep(0.5)
                self.robot.stop()
            elif cmd[0] == '/dietro':
                self.bot.sendMessage(chat_id, "ok, vado dietro")
                self.robot.backward()
                time.sleep(0.5)
                self.robot.stop()
            elif cmd[0] == '/destra':
                self.bot.sendMessage(chat_id, "ok, giro a destra")
                self.robot.right()
                time.sleep(0.5)
                self.robot.stop()
            elif cmd[0] == '/sinistra':
                self.bot.sendMessage(chat_id, "ok, giro a sinistra")
                self.robot.left()
                time.sleep(0.5)
                self.robot.stop()
            else:
                self.bot.sendMessage(chat_id, "scusa, non capisco, conosco solo il comando '/ciao'")
        print msg
        sys.stdout.flush()

Provate quindi a rilanciare il programma e far muovere un robot. Ecco qui un video che mostra il risultato finale!

Ti è piaciuto questo post?

Registrati alla newsletter per rimanere sempre aggiornato!

Ci tengo alla tua privacy. Leggi di più sulla mia Privacy Policy.

Ti potrebbe anche interessare

HB Cloud Tutorial #1 - Uso dei Led
Iniziamo ad utilizzare la piattaforma di Cloud Robotics
HB Cloud Tutorial #2 - Uso dei Bottoni
Rieccomi con il secondo tutorial legato all'uso dei bottoni per il robot **DotBot-ROS**. In questo tutorial, vedremo come configurare ed utilizzare in Python un bottone attaccato ad un pin GPIO del Raspberry Pi 3.
HB Cloud Tutorial #3 - I Motori
I Motori sono una delle parti essenziali dei robot. In questo tutorial, vederemo come è possibile in modo semplice ed intuitivo implementare un programma in Python che controlla i motori in base a comandi inviati via Wifi al Robot.
Non avete un robot? C'è il robot in cloud accessibile da remoto tramite il vostro PC o da cellulare
Non avete un robot? C'è il robot in cloud accessibile da remoto tramite il vostro PC o cellulare
Avete problemi hardware? C'è il robot in cloud accessibile da remoto tramite il vostro PC o cellulare
Avete problemi hardware? C'è il robot in cloud accessibile da remoto tramite il vostro PC o cellulare
Utilizzare la RaspiCam in streaming con la piattaforma Cloud
Breve tutorial che spiega come abilitare la RaspiCam su ROS e la piattaforma di Cloud Robotics
Installiamo ROS su Raspberry Pi
Un breve tutorial su come utilizzare ROS sul Raspberry Pi
Video Corso ROS Rokers - Completati i video di Introduzione
Sono disponibili online i video tutorial del corso di ROS partito dalla community Rokers
NTBD: guida step by step
Cos'è e come utilizzare NTBD step by step, primo articolo della serie
Inviare Goals alla Navigation Stack - versione nodo ROS Python
Inviare un goal all ROS navigation stack utilizzando un nodo Python
Inviare una sequenza di Goals alla ROS NavStack usando Python
Inviare una sequenza di pose desiderate alla ROS Navigation Stack usando un nodo Python
Come creare messaggi custom in ROS
Creare nuovi tipi di messaggio ROS
Benvenuto a ROS 2.0
Primo contatto con ROS 2.0
Usare il braccio robotico Dobot con ROS
Come usare il braccio robotico con Robot Operating System
Un IDE web Arduino sviluppato in Python e Flask
Un mio progetto dell'estate del 2015 che permette di programmare Arduino da un'interfaccia Web esposta da un Raspberry Pi
Utilizziamo Atom come editor di testo remoto su Raspberry Pi
Come usare Atom come editor di testo remoto per Raspberry Pi
Canopy: una Pythonica alternativa a Matlab
Presento questo interessante tool python che può essere considerato una buona alternativa a Matlab per l'analisi dei dati!
Python + Arduino = Nanpy
Programmare Arduino in Python con Nanpy
Utilizzo di Nanpy con il sensore di temperatura/umidità della famiglia DHT
Come utilizzare Nanpy col sensore DHT di temperatura e Umidità
Accendere led con Arduino e Telegram
Un bot telegram in grado di controllare Arduino realizzato da 3 ragazzi del Liceo Stampacchia
Gestire le macchine virtuali senza sforzo con Vagrant
Introduzione ed esempio di utilizzo su Vagrant, il tool che semplifica la gestione delle macchine virtuali per lo sviluppo.
Implementiamo un bot Telegram con Python
Una semplice guida per iniziare a muovere i primi passi nello sviluppo di chatbot Telegram con Python
Implementiamo un bot Telegram con Python - I Comandi
Vediamo come gestire i comandi del nostro bot in Telegram
Un Video Corso di ROS
Il mio video corso su come utilizzare ROS è disponibile
Sviluppiamo un bot Telegram che legge i codici a barre degli alimenti
Implementiamo un bot Telegram in grado di leggere ed analizzare le immagini per la lettura ed interpretazione dei codici a barre
Sviluppiamo un Robot con tecnologie Open Source
Inizio una serie di videoguide, in cui voglio introdurvi al mondo della robotica di servizio in modo pratico, facendo vedere come è possibilile, sfruttando tecnologie completamente Open Source, quali Arduino, Raspberry Pi, ROS e Docker, costruire un piccolo robot di Servizio.
Robot Open Source - Introduzione a Docker
È disponibile il video "Introduzione a Docker".
I chatbot possono Parlare? Sviluppiamo un bot telegram che manda messaggi vocali
Usiamo le API di sintesi vocale di google per creare un bot in grado di mandare messaggi vocali
Buildare e usare container Docker per Raspberry Pi
In questa guida vediamo come buildare ed utilizzare Docker su Raspberry Pi (ed in generale sistemi Linux Embedded) per velocizzare la produzione di applicazioni Linux Embedded
Robot Open Source - Docker e Raspberry
È disponibile il video "Docker e Raspberry".
Un bot telegram che invia messaggi al verificarsi di eventi sui GPIO del Raspberry Pi
Mandare un messaggio tramite telegram quando il un GPIO del Raspberry cambia stato è possibile, ecco come!