Sunday, 24 January 2016

Raspberry Pi gesture controlled Minecraft X-Wing (revisited)

figure 1
This post builds on two earlier posts and tries to address some of the very useful comments from people who have tried this. I hope this helps.

Overall the project builds on an earlier project to get a simple X-Wing into Minecraft on a Raspberry Pi.  The goal was get Python to build and move the X-Wing. Details of this project can be found here.

Main revision: In this project and the earlier one is based around Python 3 running the Raspbian 'Jessie' November version OS. Also additional libraries may need to be add to get the minecraftstuff (such as ShapeBlock() and MinecraftShape()). Details on how to obtain and install these can be found at  http://www.stuffaboutcode.com/2013/11/coding-shapes-in-minecraft.html .

In this post the additional of Pirmoroni's Skywriter is included to allow movements of a hand or a finger to enable the X-Wing to take-off, land, move forward or backward.

It builds on ideas from the book Adventures in Minecraft on using Python and Minecraft using a Raspberry Pi.


figure 2
The Skywriter  is a Raspberry Pi HAT (see figure 2) that allows positional information of the hand just above the board. In this project it is detecting flicks of the hand up, down, or across the board to determine the direction of motion.

Before you start, to use the Skywriter, in the terminal you need to add curl -sSL get.pimoroni.com/skywriter | bash

To start with we just placed the X-Wing above the player by placing blocks in the shape (roughly) of the X-Wing based around the method MinecraftShape (see Chapter 8 of Adventures in Minecraft ).



figure 3

  • Find the position of the player;
  • To avoid building on top the player the starting position of the X-Wing is set by:
    • add 5 to the x position of the player;
    • add 10 to the y position of the player(The bit I have to keep reminding myself is the y-axis is vertical.);
    • add 5 to the z position of the player;
  • Using these values build using, Wool blocks, the X-Wing - 0 for white, and 14 for red blocks;
  • If a flick starts at the top of the board (or "north") this moves the X-Wing down towards the ground;
  • If a flick starts at the bottom of the board (or "south") this moves the X-Wing vertically up;
  • If a flick starts on the right of the board (or "east") the X-Wing moves backwards horizontally;
  • if a flick starts on the left of the board (or "west") the X-Wing moves forward.
    from mcpi.minecraft import Minecraft
    from mcpi import block
    import mcpi.minecraftstuff as minecraftstuff
    import time
    import skywriter
    import signal

    mc=Minecraft.create()
    xPos=mc.player.getTilePos()
    xPos.x=xPos.x+5
    xPos.y=xPos.y+5
    xPos.z=xPos.z+5

    xWingBlocks=[
    minecraftstuff.ShapeBlock(0,0,0,block.WOOL.id,0),
    minecraftstuff.ShapeBlock(-1,0,0,block.WOOL.id,0),
    minecraftstuff.ShapeBlock(-2,0,0,block.WOOL.id,14),
    minecraftstuff.ShapeBlock(-3,0,0,block.WOOL.id,0),
    minecraftstuff.ShapeBlock(1,0,0,block.WOOL.id,0),
    minecraftstuff.ShapeBlock(0,1,0,block.WOOL.id,0),
    minecraftstuff.ShapeBlock(1,1,0,block.WOOL.id,0),
    minecraftstuff.ShapeBlock(2,0,0,block.WOOL.id,0),
    minecraftstuff.ShapeBlock(2,1,0,block.WOOL.id,0),
    minecraftstuff.ShapeBlock(1,2,-1,block.WOOL.id,14),
    minecraftstuff.ShapeBlock(1,2,1,block.WOOL.id,14),
    minecraftstuff.ShapeBlock(1,-1,-1,block.WOOL.id,14),
    minecraftstuff.ShapeBlock(1,-1,1,block.WOOL.id,14),
    minecraftstuff.ShapeBlock(1,3,-2,block.WOOL.id,0),
    minecraftstuff.ShapeBlock(1,3,2,block.WOOL.id,0),
    minecraftstuff.ShapeBlock(1,-2,-2,block.WOOL.id,0),
    minecraftstuff.ShapeBlock(1,-2,2,block.WOOL.id,0)]

    xWingShape=minecraftstuff.MinecraftShape(mc,xPos,xWingBlocks)

    @skywriter.flick()
    def flick(start,finish):
      if start=="south":
        for count in range(1,10):
          time.sleep(0.1)
          xWingShape.moveBy(0,1,0)
      if start=="west":
        for count in range(1,10):
          time.sleep(0.1)
          xWingShape.moveBy(-1,0,0)
      if start=="east":
        for count in range(1,10):
          time.sleep(0.1)
          xWingShape.moveBy(1,0,0)
      if start=="north":
        for count in range(1,10):
          time.sleep(0.1)
          xWingShape.moveBy(0,-1,0)

    signal.pause()




    For more details on Minecraft and Python I would suggest going to http://www.stuffaboutcode.com/2013/11/coding-shapes-in-minecraft.html especially on how to download the software to implement MinecraftShape. 


    If you do use or modify this please leave a comment, I would love to see what others do with it.







    All opinions in this blog are the Author's and should not in any way be seen as reflecting the views of any organisation the Author has any association with.

    Sunday, 17 January 2016

    Raspberry Pi - Python Junkbot



    Junkbots (http://junkbots.blogspot.co.uk/) are based around using  materials such as drink's cans, broken propellors and motors to produce something that moves by vibration. Previous designs be found at:



    The latest tweak to the Raspberry Pi based Junkbot design is to use the combination of Python and Pimoroni's Explorer HAT PRO to control it. Explorer HAT Pro is a good choice, it can control two motors with a library provided to simplify the programming. For this the Junkbot was the one shown above: a drinks can, pen, LEGO bits, motor and broken propellor.

    Before the Explorer HAT can be used the library needs to be installed via the Terminal and the instructions below

    curl get.pimoroni.com/explorerhat | bash

    Python code to control the junkbot is shown below.


    import explorerhat
    from time import sleep

    def spin1(duration):
        explorerhat.motor.one.forward(100)
        sleep(duration)
        explorerhat.motor.one.stop()

    def spin2(duration):
        explorerhat.motor.one.backward(100)
        sleep(duration)
        explorerhat.motor.one.stop()

    spin1(1)
    spin2(1)

    Essentially the code spins the junkbot one way and then the other.





    All opinions in this blog are the Author's and should not in any way be seen as reflecting the views of any organisation the Author has any association with.

    Thursday, 7 January 2016

    Robots behaving...

    Reblogged from: http://scott-ltattempts.blogspot.co.uk/2011/05/robot-behaviours.html


    Behaviour based robots was used in the teaching as way of getting the students to think out AI a little deeper and in particular Do we need Human Level intelligence? or rather Do we always need to aim for Human Level Intelligence?

    Lego Mindstorms robot are a good vehicle for students to start trying out idea around behaviour-based robotics. They are inexpensive, programmable and with the LeJOS software installed on them; have behaviours built into the programming which is done in Java.

    A good example to use comes from Bagnall's book (B Bagnall (2002) Core Lego Mindstorms: 

    Programming the RCX in Java , ISBN: 978-0130093646)


    code 1: HitWall

    //Taken from Bagnall (2002)
    import josx.robotics.*;
    import josx.platform.rcx.*;
    public class HitWall implements Behavior
    {
    public boolean takeControl()
    {
    return Sensor.S2.readBooleanValue();
    }
    public void suppress()
    {
    Motor.A.stop();
    Motor.C.stop();
    }
    public void action()
    {
    Motor.A.backward();
    Motor.C.backward();
    try{Thread.sleep(1000);}catch(Exception e){}
    Motor.A.stop();
    try{Thread.sleep(300);}catch(Exception e){}
    Motor.C.stop();
    }
    }

    Code 2: DriveForward

    //Taken from Bagnall (2002)

    import josx.robotics.*;
    import josx.platform.rcx.*;
    public class DriveForward implements Behavior
    {
    public boolean takeControl()
    {
    return true;
    }
    public void suppress()
    {
    Motor.A.stop();
    Motor.C.stop();
    }
    public void action()
    {
    Motor.A.forward();
    Motor.C.forward();
    }
    }



    Code 3: Bumper Car

    import josx.robotics.*;
    public class BumperCar
    {
    public static void main(String [] args)
    {
    Behavior b1=new DriveForward();
    Behavior b2=new HitWall();
    Behavior [] bArray ={b1,b2};
    Arbitrator arby=new Arbitrator(bArray);
    arby.start();
    }
    }

    All opinions in this blog are the Author's and should not in any way be seen as reflecting the views of any organisation the Author has any association with.

    Sunday, 3 January 2016

    Raspberry Pi gesture controlled Minecraft X-Wing

    figure 1
    This post builds on an earlier project to get a simple X-Wing into Minecraft on a Raspberry Pi.  The goal was get Python to build and move the X-Wing. Details of this project can be found here.

    In this post the additional of Pirmoroni's Skywriter HAT included to allow movements of a hand to enable the X-Wing to take-off, land, move forward or backward.

    It builds on ideas from the book Adventures in Minecraft on using Python and Minecraft using a Raspberry Pi.


    figure 2
    The Skywriter is a Raspberry Pi HAT (see figure 2) that allows positional information of the hand just above the board. In this project it is detecting flicks of the hand up, down, or across the board to determine the direction of motion.

    Before you start, to use the Skywriter, in the terminal you need to add curl -sSL get.pimoroni.com/skywriter | bash

    To start with we just placed the X-Wing above the player by placing blocks in the shape (roughly) of the X-Wing based around the method MinecraftShape (see Chapter 8 of Adventures in Minecraft ).



    figure 3
    • Find the position of the player;
    • To avoid building on top the player the starting position of the X-Wing is set by:
      • add 5 to the x position of the player;
      • add 10 to the y position of the player(The bit I have to keep reminding myself is the y-axis is vertical.);
      • add 5 to the z position of the player;
    • Using these values build using, Wool blocks, the X-Wing - 0 for white, and 14 for red blocks;
    • If a flick starts at the top of the board (or "north") this moves the X-Wing down towards the ground;
    • If a flick starts at the bottom of the board (or "south") this moves the X-Wing vertically up;
    • If a flick starts on the right of the board (or "east") the X-Wing moves backwards horizontally;
    • if a flick starts on the left of the board (or "west") the X-Wing moves forward.
      from mcpi.minecraft import Minecraft
      from mcpi import block
      import mcpi.minecraftstuff as minecraftstuff
      import time
      import skywriter
      import signal

      mc=Minecraft.create()
      xPos=mc.player.getTilePos()
      xPos.x=xPos.x+5
      xPos.y=xPos.y+5
      xPos.z=xPos.z+5

      xWingBlocks=[
      minecraftstuff.ShapeBlock(0,0,0,block.WOOL.id,0),
      minecraftstuff.ShapeBlock(-1,0,0,block.WOOL.id,0),
      minecraftstuff.ShapeBlock(-2,0,0,block.WOOL.id,14),
      minecraftstuff.ShapeBlock(-3,0,0,block.WOOL.id,0),
      minecraftstuff.ShapeBlock(1,0,0,block.WOOL.id,0),
      minecraftstuff.ShapeBlock(0,1,0,block.WOOL.id,0),
      minecraftstuff.ShapeBlock(1,1,0,block.WOOL.id,0),
      minecraftstuff.ShapeBlock(2,0,0,block.WOOL.id,0),
      minecraftstuff.ShapeBlock(2,1,0,block.WOOL.id,0),
      minecraftstuff.ShapeBlock(1,2,-1,block.WOOL.id,14),
      minecraftstuff.ShapeBlock(1,2,1,block.WOOL.id,14),
      minecraftstuff.ShapeBlock(1,-1,-1,block.WOOL.id,14),
      minecraftstuff.ShapeBlock(1,-1,1,block.WOOL.id,14),
      minecraftstuff.ShapeBlock(1,3,-2,block.WOOL.id,0),
      minecraftstuff.ShapeBlock(1,3,2,block.WOOL.id,0),
      minecraftstuff.ShapeBlock(1,-2,-2,block.WOOL.id,0),
      minecraftstuff.ShapeBlock(1,-2,2,block.WOOL.id,0)]

      xWingShape=minecraftstuff.MinecraftShape(mc,xPos,xWingBlocks)

      @skywriter.flick()
      def flick(start,finish):
        if start=="south":
          for count in range(1,10):
            time.sleep(0.1)
            xWingShape.moveBy(0,1,0)
        if start=="west":
          for count in range(1,10):
            time.sleep(0.1)
            xWingShape.moveBy(-1,0,0)
        if start=="east":
          for count in range(1,10):
            time.sleep(0.1)
            xWingShape.moveBy(1,0,0)
        if start=="north":
          for count in range(1,10):
            time.sleep(0.1)
            xWingShape.moveBy(0,-1,0)
      signal.pause()




      For more details on Minecraft and Python I would suggest going to http://www.stuffaboutcode.com/2013/11/coding-shapes-in-minecraft.html especially on how to download the software to implement MinecraftShape. 
      If you do use or modify please leave a comment, I would love to see what others do with it.






      All views are those of the author and should not be seen as the views of any organisation the author is associated with.


      Gesture controlled python robot unicorn (or is it a rhino)

      In the previous two post I built and played with a robot unicorn from  Do it Kits https://doitkits.com/product/robot-unicorn/ . In the first...