6. Meu script move um robô de verdade

O mesmo script, no chão

English version

O problema. O seu script da etapa 4 dirige um robô simulado no seu notebook. O simulador prometeu que o mesmo código roda sem mudanças no controlador de verdade: aqui você confere essa promessa, num dos seus dois robôs.

Esta etapa roda de novo os scripts da etapa 4, na mesma ordem: acender, andar, voltar, girar, e o quadrado se houver tempo. Só mudam duas linhas, as duas que você viu na etapa 5: o endereço do controlador e a etiqueta do seu robô.

Trabalhe em ~/dotbot-academy, com o ambiente ativo, ao lado do academy.py. O seu simulador pode continuar rodando: nada aqui fala com ele.

Antes de rodar qualquer coisa

  • Escolha um dos seus dois robôs, e tenha à mão a etiqueta dele, da etapa 5.
  • O robô está virado para o alto do campo. Confira que o chão está livre cerca de 300 mm à frente dele e à esquerda.
  • Deixe uma pequena marca ao lado dele, uma moeda ou um papel, fora do caminho: você vai querer saber de onde ele saiu.

Olá: acenda

Salve o real.py (abaixo) ao lado do academy.py. É o primeiro hello.py da etapa 4, com as duas linhas que mudam no topo: coloque em BASE_URL o controlador do instrutor, como no connect.py, e em LABEL a etiqueta do seu robô. Depois rode:

real.py
"""Step 6: my script moves a real robot.

Step 4's hello.py, with the two lines that change on the floor at the top:
the instructor's controller and the label on your robot.
You should see: your robot on the floor turns red, then green, then blue,
one second apart, and so does its dot on the instructor's map.
"""

import time

import academy

BASE_URL = "http://192.168.1.10:8000"  # TODO: the instructor's controller
LABEL = "A1B2C3"  # TODO: the label on one of your two robots

academy.connect(BASE_URL)
robot = academy.bot(LABEL)
robot.led(255, 0, 0)  # red: red, green, blue, each 0 to 255
time.sleep(1)
robot.led(0, 255, 0)  # green
time.sleep(1)
robot.led(0, 0, 255)  # blue
python real.py

Você deve ver: o seu robô fica vermelho, depois verde, depois azul, com um segundo entre cada cor, no chão e como um ponto no mapa do instrutor.

Essencial: ande, e volte

Acrescente ao fim do real.py as mesmas linhas da etapa 4, Core: drive it: para a frente a 50 mm/s durante 2 segundos, depois de volta do mesmo jeito. Rode de novo.

Você deve ver: o robô anda cerca de 100 mm para o alto do campo, depois dá ré e para perto da sua marca. Perto, não exatamente em cima: no simulador ele voltava a poucos milímetros.

Essencial: gire

Acrescente o giro da etapa 4, Core: turn it: para a esquerda, a 50 mm/s, durante 5 segundos. Rode de novo.

Você deve ver: depois de ir e voltar, o robô gira para a esquerda no lugar, mais ou menos uma volta inteira. Ele termina virado para o mesmo lado que o seu robô simulado?

real.py
"""Step 6: my script moves a real robot.

Step 4's hello.py, drive, back and spin, with the two lines that change on
the floor at the top: the instructor's controller and the label on your robot.
You should see: your robot changes color, drives about 100 mm up the floor,
backs up close to where it started, then turns left on the spot, about one
full turn.
"""

import time

import academy

BASE_URL = "http://192.168.1.10:8000"  # TODO: the instructor's controller
LABEL = "A1B2C3"  # TODO: the label on one of your two robots

academy.connect(BASE_URL)
robot = academy.bot(LABEL)
robot.led(255, 0, 0)  # red: red, green, blue, each 0 to 255
time.sleep(1)
robot.led(0, 255, 0)  # green
time.sleep(1)
robot.led(0, 0, 255)  # blue
robot.drive(speed=50, seconds=2)  # 50 mm/s for 2 s: about 100 mm
robot.drive(speed=-50, seconds=2)  # back the same 100 mm, to the start
robot.spin(speed=-50, seconds=5)  # left, on the spot: about a full turn

Desafio: um quadrado

NotaUm desafio, se houver tempo

O instrutor pode pular este. A etapa 7 não precisa de nada dele.

Pegue o seu square.py da etapa 4, o desafio, e mude BASE_URL e LABEL como no real.py, e nada mais. Confira que o chão também está livre cerca de 300 mm à esquerda do robô, depois rode python square.py.

Você deve ver: o robô percorre quatro lados de cerca de 200 mm, uma cor nova em cada um, virando à esquerda em cada canto. Ele não termina onde começou, e talvez não fique virado para o mesmo lado.

O valor que fazia um quadrado no simulador não é o deste robô neste chão. Observe o primeiro canto: aberto demais, diminua um pouco o QUARTER_TURN; fechado demais, aumente um pouco. Depois rode de novo.

O que muda em relação ao simulador

O código é o mesmo; o robô, não. Algumas coisas que você pode ter notado:

  • Ele deriva. drive() e spin() giram as rodas por um tempo e nunca conferem onde o robô foi parar. Cada pequeno erro se soma, então o quadrado não fecha e a volta termina perto do início, não em cima dele.
  • O QUARTER_TURN precisa de novo ajuste. Um giro por tempo dá um ângulo diferente em cada robô e em cada chão.
  • As rodas patinam. Num chão liso ou empoeirado, na partida e na parada, uma roda gira sem que o robô avance tudo aquilo. As rodas do simulador nunca patinam.
  • A carga acaba. Um DotBot funciona com supercapacitores, não com bateria. Um robô com pouca carga anda devagar, ou para de responder: avise o instrutor, ele vai para o carregador.
  • O ponto no mapa é medido. No simulador ele é calculado; aqui o lighthouse mede a posição, então o ponto treme um pouco mesmo com o robô parado.

A etapa 7 responde à deriva: ela manda o robô para uma posição, e o robô confere onde está até chegar lá.

  • LookupError: 0 robots match: a etiqueta tem um erro de digitação, ou o robô está desligado. Confira na vista List do console.
  • ConnectionError: o BASE_URL está errado, ou o seu notebook não está no Wi-Fi do workshop.
  • O robô acende mas não anda, ou para no meio: pode estar com pouca carga. Chame o instrutor.