Friday, October 25, 2013

“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.

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


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.

Find me on Google+

No comments:

Post a Comment