-
Notifications
You must be signed in to change notification settings - Fork 2
/
bipedal.py
71 lines (59 loc) · 2.85 KB
/
bipedal.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
"""
bipedal.py constructs bipedal creatures based on Box2D module
it gets width and height from the sim.py
and returns the bipedal objects.
"""
import Box2D
import random
from math import cos, sin, pi
from Box2D.b2 import (world, circleShape, staticBody, dynamicBody, polygonShape)
"""define variables"""
MAX_TORQUE = 1e4
WHEEL_FRICTION = 5.0
#CHANGED SPEED TO NEGATIVE TO MOVE FORWARD
SPEED = 5
class Bipedal:
""" designate the physical variable with the genes """
def __init__(self, name, gene):
self.genome = {'width': gene[0],'height': gene[1],'right_leg': gene[2],'left_leg': gene[2]}
self.name = name
def build(self, world, x0, y0):
width = self.genome['width']
height = self.genome['height']
length1 = self.genome['right_leg']
length2 = self.genome['left_leg']
""" construct body, head, and neck """
body = world.CreateDynamicBody(position=(x0, y0))
body.fixedRotation = True
body.CreatePolygonFixture(box=(width, height), density=1, friction=0.3)
head = world.CreateDynamicBody(position=(x0, y0+4))
head.fixedRotation = True
head.CreateCircleFixture(radius = 1.8, density=1, friction=0.3)
neck = world.CreateDynamicBody(position=(x0, y0+2.5))
neck.fixedRotation = True
neck.CreatePolygonFixture(box = (0.5, 1), density=1, friction=WHEEL_FRICTION)
""" Connect the body with the joints, but rotation is not allowed. """
world.CreateRevoluteJoint(bodyA=head, bodyB=neck, anchor = head.worldCenter, enableMotor = False)
world.CreateRevoluteJoint(bodyA=neck, bodyB=body, anchor = body.worldCenter, enableMotor = False)
""" Construct the leg and connect it with the body """
right_leg = world.CreateDynamicBody(position=(x0+1, y0-2))
right_leg.CreatePolygonFixture(box = (0.5,3), density=1, friction=WHEEL_FRICTION)
world.CreateRevoluteJoint(bodyA=body, bodyB=right_leg,
anchor = body.worldCenter + (1,-2),
lowerAngle = -0.3 * pi, upperAngle = 0.3 * pi,
enableLimit = True,
maxMotorTorque = MAX_TORQUE, motorSpeed = cos(SPEED),
enableMotor = True)
left_leg = world.CreateDynamicBody(position=(x0-1, y0-2))
left_leg.CreatePolygonFixture(box = (0.5,3), density=1, friction=WHEEL_FRICTION)
world.CreateRevoluteJoint(bodyA=body, bodyB=left_leg,
anchor = body.worldCenter + (-1, -2),
lowerAngle = -0.3 * pi, upperAngle = 0.3 * pi,
enableLimit = True,
maxMotorTorque = MAX_TORQUE, motorSpeed = sin(SPEED),
enableMotor = True)
print(width, height)
self.bodies = [body, head, neck, right_leg, left_leg]
self.tracker = body.worldCenter
# return the body object for tracking position
return body