[535f03]: / cmaes / optim_L2M2019Ctrl_2D.py

Download this file

86 lines (66 with data), 2.7 kB

 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from osim.env import L2M2019CtrlEnv
from osim.control.osim_loco_reflex_song2019 import OsimReflexCtrl
import sys
import numpy as np
trial_name = 'trial_190501_L2M2019CtrlEnv_2D_'
class CMATrain(object):
def __init__(self, ):
self.n_f_call = 0
self.best_total_reward = -np.inf
self.flag_model = '2D'
self.flag_ctrl_mode = '2D' # use 2D
self.seed = None
self.difficulty = 0
self.sim_dt = 0.01
self.sim_t = 20
self.timstep_limit = int(round(self.sim_t/self.sim_dt))
self.locoCtrl = OsimReflexCtrl(mode=self.flag_ctrl_mode, dt=self.sim_dt)
self.env = L2M2019CtrlEnv(locoCtrl=self.locoCtrl, seed=self.seed, difficulty=self.difficulty, visualize=False)
self.env.change_model(model=self.flag_model, difficulty=self.difficulty, seed=self.seed)
def f(self, params):
self.n_f_call += 1
try:
observation = self.env.reset(project=True, seed=self.seed)
except Exception as e_msg:
print("simulation error!!!")
print(e_msg)
#import pdb; pdb.set_trace()
return 0
self.env.spec.timestep_limit = self.timstep_limit+100
total_reward = 0
error_sim = 0;
t = 0
for i in range(self.timstep_limit+100):
t += self.sim_dt
observation, reward, done, info = self.env.step(params, project=True)
total_reward += reward
if done:
break
print(' sim #{}: score={} time={}sec #step={}'.format(self.n_f_call, total_reward, t, self.env.footstep['n']))
if self.best_total_reward < total_reward:
filename = "./data/cma/" + trial_name + "best.txt"
print("")
print("----")
print("update the best score!!!!")
print("\tprev = %.8f" % self.best_total_reward)
print("\tcurr = %.8f" % total_reward)
print("\tsave to [%s]" % filename)
print("----")
print("")
self.best_total_reward = total_reward
np.savetxt(filename, params)
return -total_reward # minimization
params = np.ones(37)
#params = np.loadtxt('./data/cma/trial_181029_walk_3D_noStand_8_best.txt')
if __name__ == '__main__':
prob = CMATrain()
from cmaes.solver_cma import CMASolver
solver = CMASolver(prob)
solver.options.set("popsize", 16) # 8 = 4 + floor(3*log(37))
solver.options.set("maxiter", 400)
solver.options.set("verb_filenameprefix", 'data/cma/' + trial_name)
solver.set_verbose(True)
x0 = params
sigma = .01
res = solver.solve(x0, sigma)
print(res)