“Is it an animal? Is it an insect?” in Android


walker“Is it an animal? Is it an insect?”. The answer is neither. In fact it is my version of a ‘robot walker’ in android using Box2D & AndEngine. I got interested in this simulation after I saw the Theo Jansen walker in JBox2D (look under Joints) . I did take a look at the code for this but I found it difficult to follow so I made my own version of a robot walker.

With the above the robot walker is able to walk awkwardly as seen in the video clip on Youtube – Robot Walker in Android
The entire project can be cloned at GitHub at RobotWalker

In this connection I would like to point yot to an excellent and a fascinating TED talk by the creator Theo Jansen himself on “My creations, a new form of life”. His creations are really jaw- dropping.

Anyway getting back to my post I thought about what would make the insect walk? After some thought I realized that I had to create a swinging motion of the upper part of the leg combined with the lower leg motion which does not bend that much.

So I created a robot body which is a flat rectangular shape

//Create the robot body

robot = new Sprite(100, 360, this.mRobotTextureRegion, this.getVertexBufferObjectManager());

robotBody = PhysicsFactory.createBoxBody(this.mPhysicsWorld, robot, BodyType.DynamicBody, BODY_FIXTURE_DEF);

this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(robot, robotBody, true, true));

this.mScene.attachChild(robot);

Creating legs

Then I create 6 different legs spaced apart

createLeg(100,360,1);

createLeg(120,360,1);

createLeg(140,360,1);

createLeg(160,360,1);

createLeg(180,360,1);

createLeg(200,360,1);

createLeg(220,360,1);

createLeg(240,360,1);

The createLeg() creates an upper and lower part of the leg. The upper part of the leg is connected to the body of the robot through a revoluteJoint as follows

Upper Leg

// Create upper leg

upperLeg = new Sprite(x, y, this.mLegTextureRegion, this.getVertexBufferObjectManager());

upperLegBody = PhysicsFactory.createBoxBody(this.mPhysicsWorld, upperLeg, BodyType.DynamicBody, LEG_FIXTURE_DEF);

this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(upperLeg, upperLegBody, true, true));

this.mScene.attachChild(upperLeg);

//Create an anchor/pivot at the body of the robot

Vector2 anchor1 = new Vector2(x/PIXEL_TO_METER_RATIO_DEFAULT,y/PIXEL_TO_METER_RATIO_DEFAULT);

//Attach upper leg to the body using a revolute joint with a motor

final RevoluteJointDef rJointDef = new RevoluteJointDef();

rJointDef.initialize(upperLegBody, robotBody, anchor1);

rJointDef.enableMotor = true;

rJointDef.enableLimit = true;

rJoint = (RevoluteJoint) this.mPhysicsWorld.createJoint(rJointDef);

Lower Leg

The lower leg is connected to upper leg through a distance joint

// Create lower leg

lowerLeg= new Sprite(x, (y+50), this.mLegTextureRegion, this.getVertexBufferObjectManager());

lowerLegBody = PhysicsFactory.createBoxBody(this.mPhysicsWorld, lowerLeg, BodyType.DynamicBody, LEG_FIXTURE_DEF);

this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(lowerLeg, lowerLegBody, true, true));

this.mScene.attachChild(lowerLeg);

// Connect the lower and upper leg with distance joint

Vector2 anchor2 = new Vector2(x/PIXEL_TO_METER_RATIO_DEFAULT, (y+50)/PIXEL_TO_METER_RATIO_DEFAULT);

//Create a distanceJoint between upper & lower leg

DistanceJointDef distanceJoint1 = new DistanceJointDef();

distanceJoint1.initialize(upperLegBody,lowerLegBody, anchor2,anchor2);

distanceJoint1.collideConnected = true;

distanceJoint1.dampingRatio = 0.5f;

distanceJoint1.frequencyHz = 10.0f;

this.mPhysicsWorld.createJoint(distanceJoint1);

 mqdefault

Creating a walking movement

To create a walking movement I create a timer task which triggers after a delay of 1 second periodically and makes the upper legs’s revoluteJoint swing between angles within an upper and lower limit.

new IntervalTimer(secs,rJoint);

The timer itself reverses the motor every time it fires

class RemindTask extends TimerTask {

RevoluteJoint rj1;;

RemindTask(RevoluteJoint rj){

rj1 = rj;

}

@Override

publicvoid run() {

reverseMotor();

}

publicvoid reverseMotor(){

rj1.setMotorSpeed(-(rj1.getMotorSpeed()));

rj1.setMaxMotorTorque(10);

}

}

With the above the robot walker is able to walk awkwardly as seen in the video Robot Walker in Android

The entire project can be cloned at GitHub at RobotWalker

I will probably be refining this sometime in the future. One good idea is to create a delay between the swings of different legs. Any thoughts suggestions on making the movement more fluid are more than welcome.

Take a look at some cool simulations using AndEngine & Box2D
1. Simulating the domino effect using Box2D and AndEngine
2. Bull in a china shop – Behind the scenes in android
3. Creating a blob in Android using  Box2D physics Engine & AndEngine
4. Blob with an attitude(stiffness) in Android
and a few more
Find me on Google+

Advertisements

4 thoughts on ““Is it an animal? Is it an insect?” in Android

  1. Pingback: A closer look at “Robot Horse on a Canter” in Android | Giga thoughts ...

  2. Pingback: Simulating the domino effect in Android using Box2D and AndEngine | Giga thoughts …

  3. Pingback: Modeling a Car in Android | Giga thoughts …

  4. Pingback: Cricket analytics with cricketr in paperback and Kindle versions | Giga thoughts …

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s