• Welcome to LusoRobótica - Robótica em Português.
 

Simulador RobotBasic

Started by Tayeb, 13 de December de 2009, 21:21

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Tayeb

Olá membros e visitantes,

Hoje quero introduzir-vos ao simulador gratuito de robótica RobotBasic. Entusiasmei-me tanto com este simulador que mandei vir da Amazon livros sobre o mesmo.

O que é afinal RobotBasic?

RobotBasic é uma linguagem de programação poderosa cheia de comandos e funções. Uma boa quantidade desses comandos e funções são específicos para simular o funcionamento de um robô móvel. Existe também a possibilidade de controlar um robô físico com o mesmo programa da simulação.

A linguagem segue a sintaxe da saudosa linguagem BASIC pelo que a curva de aprendizagem é extremamente curta. Com um simulador deste tipo podemos testar ideias e novos algoritmos de uma forma fácil.

O seguinte código implementa a simulação de um robô que segue a parede esquerda da arena do concurso Robô Bombeiro. A maior parte do código é para construir a arena




Código: Seleccionar Todos
//Variaveis globais

Ox = 150 //X do canto superior esquerdo da arena
Oy = 50 //Y do canto superior esquerdo da arena



//Cores dos diferentes elementos da arena
colorWall = Green
colorLine = White
colorStart = White
colorFloor = Black
colorCandleArea = White
colorCandle = Red
colorPen = Blue

//===========================================================
MainProgram:
   gosub DisplayInstructions
   gosub Arena
   gosub InitializeRobot
   gosub RobotControl
End
//===========================================================

InitializeRobot:

   rLocate Ox + 200, Oy + 45, 90 //Posição do robô
   rInvisible colorFloor, colorLine, colorStart, colorPen, colorCandleArea //Lista de cores invisiveis
   rPen Down, colorPen
   LineWidth 3
   rSlip 10
Return

//=============================================================

DisplayInstructions:
  data IM;"RB_Base.Bas"
  data IM;"Simulação do Robô Bombeiro."
  n = MsgBox(IM)
Return

//=============================================================

Arena:
  ClearScr Gray

  //Desenha o chão
  Rectangle Ox, Oy, Ox + 496, Oy + 496, colorFloor, colorFloor

  //Desenha as paredes exteriores
  Line Ox, Oy, Ox, Oy + 496, 3, colorWall //Left
  Line Ox, Oy, Ox + 496, Oy, 3, colorWall //Top
  Line Ox + 496, Oy, Ox + 496, Oy + 496, 3, colorWall //Right
  Line Ox, Oy + 496, Ox + 496, Oy + 496, 3, colorWall //Botom

  //Desenha 1º quarto
  Line Ox + 154, Oy, Ox + 154, Oy + 182, 3, colorWall
  Line Ox + 96, Oy + 182, Ox + 154, Oy + 182, 3, colorWall
  Line Ox + 3, Oy + 182, Ox + 93, Oy + 182, 3, colorLine //*** line ***

  //Desenha 2º quarto
  Line Ox, Oy + 274, Ox + 154, Oy + 274, 3, colorWall
  Line Ox + 154, Oy + 274, Ox + 154, Oy + 396, 3, colorWall
  Line Ox + 154, Oy + 399, Ox + 154, Oy + 493, 3, colorLine //*** line ***
 
  //Desenha 3º quarto
  Line Ox + 246, Oy + 314, Ox + 496, Oy + 314, 3, colorWall
  Line Ox + 246, Oy + 406, Ox + 246, Oy + 496, 3, colorWall
  Line Ox + 246, Oy + 317, Ox + 246, Oy + 403, 3, colorLine //*** line ***
   
  //Desenha 4º quarto
  Line Ox + 246, Oy + 92, Ox + 246, Oy + 214, 3, colorWall
  Line Ox + 246, Oy + 92, Ox + 398, Oy + 92, 3, colorWall
  Line Ox + 398, Oy + 92, Ox + 398, Oy + 214, 3, colorWall
  Line Ox + 398, Oy + 214, Ox + 342, Oy + 214, 3, colorWall
  Line Ox + 249, Oy + 214, Ox + 339, Oy + 214, 3, colorLine //*** line ***

  //Desenha círculo da posição de partida standard
  Circle Ox + 170, Oy + 16, Ox + 170 + 60, Oy + 16 + 60, colorStart, colorStart

  //Escolha aleatória da posição da vela
  candleBasePos = Random(9) + 1
 
  if (candleBasePos = 1)
    candleBaseOX = Ox + 3
    candleBaseOY = Oy + 3
    candleBaseDI = 270
    candleBaseDF = 90
    candleX = 1
    candleY = 1

  elseif (candleBasePos = 2)
    candleBaseOX = Ox + 154 - 2
    candleBaseOY = Oy + 3
    candleBaseDI = 180
    candleBaseDF = 90
    candleX = -1
    candleY = 1

  elseif (candleBasePos = 3)
    candleBaseOX = Ox + 246 + 3
    candleBaseOY = Oy + 92 + 3
    candleBaseDI = 270
    candleBaseDF = 90
    candleX = 1
    candleY = 1

  elseif (candleBasePos = 4)
    candleBaseOX = Ox + 398 - 1
    candleBaseOY = Oy + 92 + 3
    candleBaseDI = 180
    candleBaseDF = 90
    candleX = -1
    candleY = 1

  elseif (candleBasePos = 5)
    candleBaseOX = Ox + 496 - 2
    candleBaseOY = Oy + 314 + 3
    candleBaseDI = 180
    candleBaseDF = 90
    candleX = -1
    candleY = 1

  elseif (candleBasePos = 6)
    candleBaseOX = Ox + 496 - 1
    candleBaseOY = Oy + 496 - 1
    candleBaseDI = 90
    candleBaseDF = 90
    candleX = -1
    candleY = -1

  elseif (candleBasePos = 7)
    candleBaseOX = Ox + 3
    candleBaseOY = Oy + 496 - 1
    candleBaseDI = 0
    candleBaseDF = 90
    candleX = 1
    candleY = -1

  elseif (candleBasePos = 8)
    candleBaseOX = Ox + 3
    candleBaseOY = Oy + 274 + 3
    candleBaseDI = 270
    candleBaseDF = 90
    candleX = 1
    candleY = 1

  elseif (candleBasePos = 9)
    candleBaseOX = Ox + 154 - 1
    candleBaseOY = Oy + 274 + 3
    candleBaseDI = 180
    candleBaseDF = 90
    candleX = -1
    candleY = 1
  endif
     
  candleBaseR = 80;  //Raio do semicírculo que forma a zona da vela
  candleR = 5 //Raio da base da vela (corresponde à própria vela)
  candleX = candleX * 30 //Posição X da vela dentro do semicírculo
  candleY = candleY * 30 //Posição X da vela dentro do semicírculo
           
  //Desenha o semicírculo           
  Pie candleBaseOX - candleBaseR, candleBaseOY - candleBaseR, candleBaseOX + candleBaseR, candleBaseOY + candleBaseR, DtoR(candleBaseDI), DtoR(candleBaseDF), colorCandleArea, colorCandleArea
 
  //Desenha a vela (substituir por um beacon)
  Circle candleBaseOX + candleX - candleR, candleBaseOY + candleY - candleR, candleBaseOX + candleX + candleR, candleBaseOY + candleY + candleR, colorCandle, colorCandle
Return

//===========================================================

RobotControl:
  //Subrotina para controlar o robô

  gosub SeguirParedeEsquerda

Return

//===========================================================


SeguirParedeEsquerda:
  dist1 = 40
  dist2 = 50

  rForward 50
  Linhas = 0

  while true
    if(rRange(0) <= 30)
      rTurn 90
    elseif (rRange(-90) >= dist1) and (rRange(-90) <= dist2)
      rForward 1
    elseif (rRange(-90) <= dist1)
        rTurn 1       
        rForward 1
    elseif rRange(-90) >= dist2
        rTurn -1 
        rForward 1     
    endif 

    if(rSense(white) & 2)
      Linhas = Linhas + 1
      rForward 5
      XYstring 10, 10, "Linhas: " + Linhas
    endif   
  wend
return



Experimentem! O programa é gratuito e pode ser puxado do site http://www.robotbasic.org/

Eis um vídeo de uma simulação mais sofisticada em que é simulado um robô bombeiro que detecta e apaga a vela.

Simulação RB 01

-----------------------------

Texto cortesia de:

Simulador RobotBasic
por Carreto em Segunda Ago 31, 2009 10:45 pm
fonte do texto: http://robobombeiro.ipg.pt/forum/viewtopic.php?f=10&t=87
--------------------

Tayeb




Fifas

Muito bom post Tayeb ;)

Vou testar isso :)

Tayeb

Acredite Fifas que vai achar o programa muito interessante e com grandes potencialidades.

microbyte

Parece-me muito interessante. ;)
Pergunto-me quando está para vir um RobotArduino.  :D

Tayeb

Quote from: microbyte on 13 de December de 2009, 22:59
Parece-me muito interessante. ;)
Pergunto-me quando está para vir um RobotArduino.  :D

Acho que microbyte está a querer dizer quando haverá um simulador para Arduino?

Efectivamente RobotBasic pode comunicar com qualquer microcontrolador.

O comando  SerialOut pode ser usado para enviar qualquer sequência de bytes a qualquer báudio (vêr SetCommPort)  e permitir assim o controlo de qualquer microcontrolador. Existem ainda os comandos SerIn e SerOut.

Veja os seguintes dois documentos de RobotBASIC para BasicStamp,:

http://www.robotbasic.org/resources/RobotBASIC_Serial_IO.pdf

e

http://www.robotbasic.org/resources/RobotBASIC_To_BS2_Comms.pdf

Os comandos podem ser facilmente adaptados ao Arduino.

Tayeb


microbyte

Hmm... Pensei que não tivesse comm serial.
Pensei que fosse mesmo só simulador.

Isso parece fixe.
Nas férias tenho de testar.  ;)

Tayeb

#6
O nooso moderador Fifas, o Ricardo e o nosso Admin Tiago vão adorar o que encontrei:

Trata-se de uma aplicação de um sistema de controlo PID, implementado em RobotBASIC, e utilizado para controlar um modelo de Estação Espacial, assim como a respectiva simulação do processo no écrã do PC:

RobotBASIC Control Application

Tal como se diz em inglês: awsome!

Tayeb

Tayeb

#7
E mais um vídeo de aplicação de Visão Robótica com RobotBASIC, simplesmente de novo "awesome!":

Robot Vision with RobotBASIC

microbyte

Gostei muito do projecto da estação espacial ;)
Estou a começar a achar piada ao RobotBasic.

Agora vou ter mesmo de testar.

Tayeb

Quote from: microbyte on 14 de December de 2009, 13:08
Gostei muito do projecto da estação espacial ;)
Estou a começar a achar piada ao RobotBasic.

Agora vou ter mesmo de testar.

Talvez se se tornar um perito, nos juntemos para dar uma formação aos membros deste espaço. Estou a imaginar muitas coisas com RobotBASIC!

guibot

Procuro uma coisa semelhante desde que me iniciei na robótica! Isto é absolutamente fantástico!!

Tayeb

#11
Quote from: guibot on 14 de December de 2009, 15:16
Procuro uma coisa semelhante desde que me iniciei na robótica! Isto é absolutamente fantástico!!

Acredite Guilherme que para mim tem sido uma revelação e a também admiro a generosidade dos autores que oferecem gratuitamente o software e que mostram muita dedicação no seu desenvolvimento.

Vale o esforço aprender a usar esta poderosa ferramenta. Quando receber os livros que encomendei, mostrá-los-ei a sí.

microbyte

Era bom uma versão para Mac ;)

Tayeb

Talvez se consiga emular para o Mac?

microbyte

Sim, no site diz que dá por Virtual Machine.
Mas isso é batota...  :P