VisualStorms Tools

14
Antonio Cisternino & Dieg o Colombo VisualStorms Tools Another Brick in the Robot . . . Università degli Studi di Pisa

description

Università degli Studi di Pisa. VisualStorms Tools. Another Brick in the Robot. Introduction. Lego MindStorms allow building small robots based on the popular Lego bricks A programmable brick allows controlling up to three devices (motors) and test up to three input sensors - PowerPoint PPT Presentation

Transcript of VisualStorms Tools

Antonio Cisternino & Diego Colombo

VisualStorms Tools

Another Brick in the Robot . . .

Università degliStudi di Pisa

Antonio Cisternino & Diego Colombo

Introduction

• Lego MindStorms allow building small robots based on the popular Lego bricks

• A programmable brick allows controlling up to three devices (motors) and test up to three input sensors

• Programs are expressed in a bytecode interpreted by an interpreter in the brick’s ROM

• The execution model is concurrent (up to ten threads) and there is a (very) small amount of memory representing the state of the execution

Antonio Cisternino & Diego Colombo

Programming the Brick• Lego provides a visual programming

system to program the brick• Other tools have been developed to

program MindStorms: a tiny JVM is being written (to replace the Lego VM), NQC is a C-Like language for programming the Brick

• We have written a library to program MindStorms with .NET and Visual Studio

• The library compiles Intermediate Language (IL) into Lego bytecode, in this way (almost) any .NET compiler can be used to program the Brick.

Antonio Cisternino & Diego Colombo

Compilation Scheme

VisualStorms

bcI File

Brick Downloader

C#

VB

SML

. . .

IL

Antonio Cisternino & Diego Colombo

Memory Organization

• The compilation process should map a stack based machine into a register based machine

• Class fields are mapped to global variables

• Stack of a method is mapped to local variables starting from index 47 towards 32

• Local variables are mapped starting from 32

• Thus maxstack + #locals < 32

Global variables (0-31)

Task 0 (M

ain) 32-47

Task 1 (32-47)

Task 9 (32-47)

. . .Stack

4746

sp

V1

V2

.. . .

Antonio Cisternino & Diego Colombo

Compilation: an Exampleusing System;namespace StormTestAdvanced { public class AracnoBrickTop : VisualStormsTypes.RCX2 {

public int x;public int y;[FunctionType(Function.Task, 0)]public void main() { int i = Sensor2(); while(Sensor1() == 0) if (i != 0)

SetMotorsPower(VisualStormsTypes.Motor.A, Sensor3()); else SetMotorsPower(VisualStormsTypes.Motor.C, Sensor3());}}}

Inheritance to indicate the type of Brick

Custom attribute to indicate tasks, subs

and functions

Inherited methods for I/O

Global variables are expressed as

fields

Antonio Cisternino & Diego Colombo

Compilation Example: ILIL_0000: ldarg.0IL_0001: call instance int32 VisualStormsTypes.LegoBrick::Sensor2()IL_0006: stloc.0IL_0007: br.s IL_0028IL_0009: ldloc.0IL_000a: brfalse.s IL_001bIL_000c: ldarg.0IL_000d: ldc.i4.1IL_000e: ldarg.0IL_000f: call instance int32 VisualStormsTypes.LegoBrick::Sensor3()IL_0014: call instance void LegoBrick::SetMotorsPower(Motor, int32)IL_0019: br.s IL_0028IL_001b: ldarg.0IL_001c: ldc.i4.4IL_001d: ldarg.0IL_001e: call instance int32 VisualStormsTypes.LegoBrick::Sensor3()IL_0023: call instance void LegoBrick::SetMotorsPower(Motor, int32)IL_0028: ldarg.0IL_0029: call instance int32 VisualStormsTypes.LegoBrick::Sensor1()IL_002e: brfalse.s IL_0009IL_0030: ret

SetVar : 20 32 9 1 0

LJump : 114 26 0 (26 f)SetVar : 20 47 0 32 0

LCheckDo : 149 192 2 47 0 0 9 0 (9 f)

SetPower : 19 1 9 2

LJump : 114 6 0 (6 f)

SetPower : 19 4 9 2

SetVar : 20 47 9 0 0

LCheckDo : 149 192 2 47 0 0 221 255 (35 b)

Antonio Cisternino & Diego Colombo

Compilation Example: Output

SetVar : 20 32 9 1 0LJump : 114 26 0 (26 f)SetVar : 20 47 0 32 0LCheckDo : 149 192 2 47 0 0 9 0 (9 f)SetPower : 19 1 9 2LJump : 114 6 0 (6 f)SetPower : 19 4 9 2SetVar : 20 47 9 0 0LCheckDo : 149 192 2 47 0 0 221 255 (35 b)

Antonio Cisternino & Diego Colombo

Compilation Example: NQCint x;int y;task main (){ int i = SENSOR_2; while(SENSOR_1 == 0) { if (i != 0) { SetPower (OUT_A,SENSOR_3); } else { SetPower (OUT_C,SENSOR_3); } }}

Antonio Cisternino & Diego Colombo

Compilation Example: NQC’s output

*** Var 0 = x*** Var 1 = y*** Var 47 = i*** Task 0 = main

pwr ABC, 7dir ABC, Fwdsetv var[47], Input(1)jmpl 33chkl 0 == var[47], 29pwr A, Input(2)jmpl 33pwr C, Input(2)chkl 0 == Input(0), 14

SetVar : 20 32 9 1 0LJump : 114 26 0 (26 f)SetVar : 20 47 0 32 0LCheckDo : 149 192 2 47 0 0 9 0 (9 f)SetPower : 19 1 9 2LJump : 114 6 0 (6 f)SetPower : 19 4 9 2SetVar : 20 47 9 0 0LCheckDo : 149 192 2 47 0 0 221 255 (35 b)

Antonio Cisternino & Diego Colombo

Structure of the System

VisualStorms AddIn

VisualStormsCompiler

SharpStormsLib CliFileReader

SharpSerial

Reflection

AssemblyLoader

VisualStudio User

Antonio Cisternino & Diego Colombo

Demo

Antonio Cisternino & Diego Colombo

Applications

• Teaching: the ability of programming simple robots with real world languages allow a gentle introduction to programming

• Use of Lego to prototype robots controlled by remote programs running on a full fledged PC and radio controlled

• Application of extensible reflection provided by .NET

• It is Possibile to implement emulators and debug programs in Visual Studio (or guidbg) for .NET

Antonio Cisternino & Diego Colombo

Conclusions and Future Work

• IL is a rich binary format that can be exploited for purposes different than execution

• The ability of compiling a subset of C# programs to the robot allows a neat environment for experimenting with easy-to-build robots

• In the future the compiler will recognize call to external methods generating RPC code and distributing a computation between the robot and the PC automatically