Skip to content

Commit

Permalink
Keras-rl and rllab compatible
Browse files Browse the repository at this point in the history
  • Loading branch information
kidzik committed Nov 20, 2016
1 parent 8eddc84 commit 9c33d87
Show file tree
Hide file tree
Showing 9 changed files with 149 additions and 129 deletions.
6 changes: 4 additions & 2 deletions __init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
import os, sys
sys.path.append(os.path.join(os.path.dirname(__file__), "lib"))
import sys
import os

sys.path.append(os.path.dirname(os.path.realpath(__file__)))
5 changes: 5 additions & 0 deletions osim/env/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from __future__ import absolute_import
from .arm import *
from .human import *
from .osim import *
from .helpers import *
25 changes: 14 additions & 11 deletions osim/env/arm.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import numpy as np
import os
import random
from env.osim import OsimEnv
from .osim import OsimEnv

class ArmEnv(OsimEnv):
ninput = 14
Expand All @@ -14,8 +14,11 @@ def __init__(self, visualize = True):
self.shoulder = 0.0
self.elbow = 0.0
super(ArmEnv, self).__init__(visualize = visualize)
self.joints.append(osim.CustomJoint.safeDownCast(self.jointSet.get(0)))
self.joints.append(osim.CustomJoint.safeDownCast(self.jointSet.get(1)))

def configure(self):
super(ArmEnv, self).configure()
self.osim_model.joints.append(osim.CustomJoint.safeDownCast(self.osim_model.jointSet.get(0)))
self.osim_model.joints.append(osim.CustomJoint.safeDownCast(self.osim_model.jointSet.get(1)))

def new_target(self):
self.shoulder = random.uniform(-1.2,0.3)
Expand All @@ -33,17 +36,17 @@ def get_observation(self):
invars[0] = self.shoulder
invars[1] = self.elbow

invars[2] = self.joints[0].getCoordinate(0).getValue(self.state)
invars[3] = self.joints[1].getCoordinate(0).getValue(self.state)
invars[2] = self.osim_model.joints[0].getCoordinate(0).getValue(self.osim_model.state)
invars[3] = self.osim_model.joints[1].getCoordinate(0).getValue(self.osim_model.state)

invars[4] = self.joints[0].getCoordinate(0).getSpeedValue(self.state)
invars[5] = self.joints[1].getCoordinate(0).getSpeedValue(self.state)
invars[4] = self.osim_model.joints[0].getCoordinate(0).getSpeedValue(self.osim_model.state)
invars[5] = self.osim_model.joints[1].getCoordinate(0).getSpeedValue(self.osim_model.state)

invars[6] = self.sanitify(self.joints[0].getCoordinate(0).getAccelerationValue(self.state))
invars[7] = self.sanitify(self.joints[1].getCoordinate(0).getAccelerationValue(self.state))
invars[6] = self.sanitify(self.osim_model.joints[0].getCoordinate(0).getAccelerationValue(self.osim_model.state))
invars[7] = self.sanitify(self.osim_model.joints[1].getCoordinate(0).getAccelerationValue(self.osim_model.state))

pos = self.model.calcMassCenterPosition(self.state)
vel = self.model.calcMassCenterVelocity(self.state)
pos = self.osim_model.model.calcMassCenterPosition(self.osim_model.state)
vel = self.osim_model.model.calcMassCenterVelocity(self.osim_model.state)

invars[8] = pos[0]
invars[9] = pos[1]
Expand Down
16 changes: 14 additions & 2 deletions osim/env/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,27 @@
import numpy as np

def convert_to_gym(space):
spaces.Box(np.array(space[0]), np.array(space[1]) )
return spaces.Box(np.array(space[0]), np.array(space[1]) )

class Specification:
timestep_limit = None
def __init__(self, timestep_limit):
self.timestep_limit = timestep_limit

def gymify_env(env):
env.action_space = convert_to_gym(env.action_space)
env.observation_space = convert_to_gym(env.observation_space)

env.spec = Specification(env.timestep_limit)
env.spec.action_space = env.action_space
env.spec.observation_space = env.observation_space

return env

def rllabify_env(env):
env = gymify_env(env)
print(env.action_space)
env.action_space = convert_gym_space(env.action_space)
env.observation_space = convert_gym_space(env.action_space)
env.observation_space = convert_gym_space(env.observation_space)
env.horizon = env.timestep_limit
return env
83 changes: 41 additions & 42 deletions osim/env/human.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import math
import numpy as np
import os
from env.osim import OsimEnv
from .osim import OsimEnv

class GaitEnv(OsimEnv):
ninput = 25
Expand All @@ -22,51 +22,50 @@ def is_done(self):
def __init__(self, visualize = True, noutput = None):
super(GaitEnv, self).__init__(visualize = visualize, noutput = noutput)

self.head = self.bodySet.get(12)
def configure(self):
super(GaitEnv, self).configure()

self.joints.append(osim.PlanarJoint.safeDownCast(self.jointSet.get(0))) # PELVIS
self.head = self.osim_model.bodySet.get(12)
self.osim_model.joints.append(osim.PlanarJoint.safeDownCast(self.osim_model.jointSet.get(0))) # PELVIS

self.joints.append(osim.PinJoint.safeDownCast(self.jointSet.get(1)))
self.joints.append(osim.CustomJoint.safeDownCast(self.jointSet.get(2))) # 4
self.joints.append(osim.PinJoint.safeDownCast(self.jointSet.get(3))) # 7
# self.joints.append(osim.WeldJoint.safeDownCast(self.jointSet.get(4)))
# self.joints.append(osim.WeldJoint.safeDownCast(self.jointSet.get(5)))
self.osim_model.joints.append(osim.PinJoint.safeDownCast(self.osim_model.jointSet.get(1)))
self.osim_model.joints.append(osim.CustomJoint.safeDownCast(self.osim_model.jointSet.get(2))) # 4
self.osim_model.joints.append(osim.PinJoint.safeDownCast(self.osim_model.jointSet.get(3))) # 7
# self.osim_model.joints.append(osim.WeldJoint.safeDownCast(self.osim_model.jointSet.get(4)))
# self.osim_model.joints.append(osim.WeldJoint.safeDownCast(self.osim_model.jointSet.get(5)))

self.joints.append(osim.PinJoint.safeDownCast(self.jointSet.get(6))) # 2
self.joints.append(osim.CustomJoint.safeDownCast(self.jointSet.get(7))) # 5
self.joints.append(osim.PinJoint.safeDownCast(self.jointSet.get(8)))
# self.joints.append(osim.WeldJoint.safeDownCast(self.jointSet.get(9)))
# self.joints.append(osim.WeldJoint.safeDownCast(self.jointSet.get(10)))
self.osim_model.joints.append(osim.PinJoint.safeDownCast(self.osim_model.jointSet.get(6))) # 2
self.osim_model.joints.append(osim.CustomJoint.safeDownCast(self.osim_model.jointSet.get(7))) # 5
self.osim_model.joints.append(osim.PinJoint.safeDownCast(self.osim_model.jointSet.get(8)))
# self.osim_model.joints.append(osim.WeldJoint.safeDownCast(self.osim_model.jointSet.get(9)))
# self.osim_model.joints.append(osim.WeldJoint.safeDownCast(self.osim_model.jointSet.get(10)))

# self.joints.append(osim.PinJoint.safeDownCast(self.jointSet.get(11)))
# self.joints.append(osim.WeldJoint.safeDownCast(self.jointSet.get(12)))
# self.osim_model.joints.append(osim.PinJoint.safeDownCast(self.osim_model.jointSet.get(11)))
# self.osim_model.joints.append(osim.WeldJoint.safeDownCast(self.osim_model.jointSet.get(12)))

for i in range(18):
print(self.muscleSet.get(i).getName())


self.reset()
print(self.osim_model.muscleSet.get(i).getName())

def get_observation(self):
invars = np.array([0] * self.ninput, dtype='f')

invars[0] = 0.0

invars[1] = self.joints[0].getCoordinate(0).getValue(self.state)
invars[2] = self.joints[0].getCoordinate(1).getValue(self.state)
invars[3] = self.joints[0].getCoordinate(2).getValue(self.state)
invars[1] = self.osim_model.joints[0].getCoordinate(0).getValue(self.osim_model.state)
invars[2] = self.osim_model.joints[0].getCoordinate(1).getValue(self.osim_model.state)
invars[3] = self.osim_model.joints[0].getCoordinate(2).getValue(self.osim_model.state)

invars[4] = self.joints[0].getCoordinate(0).getSpeedValue(self.state)
invars[5] = self.joints[0].getCoordinate(1).getSpeedValue(self.state)
invars[6] = self.joints[0].getCoordinate(2).getSpeedValue(self.state)
invars[4] = self.osim_model.joints[0].getCoordinate(0).getSpeedValue(self.osim_model.state)
invars[5] = self.osim_model.joints[0].getCoordinate(1).getSpeedValue(self.osim_model.state)
invars[6] = self.osim_model.joints[0].getCoordinate(2).getSpeedValue(self.osim_model.state)

for i in range(6):
invars[7+i] = self.joints[1+i].getCoordinate(0).getValue(self.state)
invars[7+i] = self.osim_model.joints[1+i].getCoordinate(0).getValue(self.osim_model.state)
for i in range(6):
invars[13+i] = self.joints[1+i].getCoordinate(0).getSpeedValue(self.state)
invars[13+i] = self.osim_model.joints[1+i].getCoordinate(0).getSpeedValue(self.osim_model.state)

pos = self.model.calcMassCenterPosition(self.state)
vel = self.model.calcMassCenterVelocity(self.state)
pos = self.osim_model.model.calcMassCenterPosition(self.osim_model.state)
vel = self.osim_model.model.calcMassCenterVelocity(self.osim_model.state)

invars[19] = pos[0]
invars[20] = pos[1]
Expand All @@ -83,12 +82,12 @@ def get_observation(self):

class StandEnv(GaitEnv):
def compute_reward(self):
y = self.joints[0].getCoordinate(2).getValue(self.state)
x = self.joints[0].getCoordinate(1).getValue(self.state)
y = self.osim_model.joints[0].getCoordinate(2).getValue(self.osim_model.state)
x = self.osim_model.joints[0].getCoordinate(1).getValue(self.osim_model.state)

pos = self.model.calcMassCenterPosition(self.state)
vel = self.model.calcMassCenterVelocity(self.state)
acc = self.model.calcMassCenterAcceleration(self.state)
pos = self.osim_model.model.calcMassCenterPosition(self.osim_model.state)
vel = self.osim_model.model.calcMassCenterVelocity(self.osim_model.state)
acc = self.osim_model.model.calcMassCenterAcceleration(self.osim_model.state)

a = abs(acc[0])**2 + abs(acc[1])**2 + abs(acc[2])**2
v = abs(vel[0])**2 + abs(vel[1])**2 + abs(vel[2])**2
Expand All @@ -102,25 +101,25 @@ def __init__(self, visualize = True):
super(HopEnv, self).__init__(visualize = visualize, noutput = 9)

def compute_reward(self):
y = self.joints[0].getCoordinate(2).getValue(self.state)
y = self.osim_model.joints[0].getCoordinate(2).getValue(self.osim_model.state)
return (y) ** 3

def is_head_too_low(self):
y = self.joints[0].getCoordinate(2).getValue(self.state)
y = self.osim_model.joints[0].getCoordinate(2).getValue(self.osim_model.state)
return (y < 0.4)

def activate_muscles(self, action):
for j in range(9):
muscle = self.muscleSet.get(j)
muscle.setActivation(self.state, action[j])
muscle = self.muscleSet.get(j + 9)
muscle.setActivation(self.state, action[j])
muscle = self.osim_model.muscleSet.get(j)
muscle.setActivation(self.osim_model.state, action[j])
muscle = self.osim_model.muscleSet.get(j + 9)
muscle.setActivation(self.osim_model.state, action[j])

class CrouchEnv(HopEnv):
def compute_reward(self):
y = self.joints[0].getCoordinate(2).getValue(self.state)
y = self.osim_model.joints[0].getCoordinate(2).getValue(self.osim_model.state)
return 1.0 - (y-0.5) ** 3

def is_head_too_low(self):
y = self.joints[0].getCoordinate(2).getValue(self.state)
y = self.osim_model.joints[0].getCoordinate(2).getValue(self.osim_model.state)
return (y < 0.25)
Loading

0 comments on commit 9c33d87

Please sign in to comment.