def run(agent: DDPG, steps: int, save_dir: str) -> float: sim_distance_file = DataCSVSaver(os.path.join(save_dir, "distance.txt"), ("step", "distance")) sim_somite_phase_diffs_file = DataCSVSaver(os.path.join(save_dir, "somite_phase_diffs.txt"), ["step"] + ["phi_{}".format(i) for i in range(config.oscillators)]) sim_gripper_phase_diffs_file = DataCSVSaver(os.path.join(save_dir, "gripper_phase_diffs.txt"), ["step"] + ["phi_{}".format(i) for i in range(config.grippers)]) sim_somite_phases_file = DataCSVSaver(os.path.join(save_dir, "somite_phases.txt"), ["step"] + ["phi_{}".format(i) for i in range(config.oscillators)]) sim_gripper_phases_file = DataCSVSaver(os.path.join(save_dir, "gripper_phases.txt"), ["step"] + ["phi_{}".format(i) for i in range(config.grippers)]) sim_somite_actions_file = DataCSVSaver(os.path.join(save_dir, "somite_actions.txt"), ["step"] + ["action_{}".format(i) for i in range(config.oscillators)]) sim_gripper_actions_file = DataCSVSaver(os.path.join(save_dir, "gripper_actions.txt"), ["step"] + ["action_{}".format(i) for i in range(config.grippers)]) sim_frictions_file = DataCSVSaver(os.path.join(save_dir, "frictions.txt"), ["step"] + ["friction_{}".format(i) for i in range(config.somites)]) sim_tension_file = DataCSVSaver(os.path.join(save_dir, "tensions.txt"), ["step"] + ["tension_{}".format(i) for i in range(config.somites - 2)]) caterpillar = Caterpillar(config.somites, config.oscillators_list, config.grippers_list, config.caterpillar_params) locomotion_distance = utils.locomotion_distance_logger(caterpillar) for step in range(steps): obs, somite_phases, gripper_phases = observe(caterpillar) actions = agent.act(obs) feedbacks_somite, feedbacks_gripper = actions[:config.oscillators], actions[config.oscillators:] caterpillar.step_with_feedbacks(config.params["time_delta"], tuple(feedbacks_somite), tuple(feedbacks_gripper)) frictions, tensions, _, _ = np.split( obs, [config.somites, config.somites * 2 - 2, config.somites * 2 - 2 + config.oscillators]) sim_distance_file.append_data(step, locomotion_distance(caterpillar)) sim_somite_phase_diffs_file.append_data(step, *utils.phase_diffs(np.array(somite_phases))) sim_gripper_phase_diffs_file.append_data(step, *utils.phase_diffs(np.array(gripper_phases))) sim_somite_phases_file.append_data(step, *utils.mod2pi(np.array(somite_phases))) sim_gripper_phases_file.append_data(step, *utils.mod2pi(np.array(gripper_phases))) sim_frictions_file.append_data(step, *frictions) sim_tension_file.append_data(step, *tensions) sim_somite_actions_file.append_data(step, *feedbacks_somite) sim_gripper_actions_file.append_data(step, *feedbacks_gripper) caterpillar.save_simulation("{}/render.json".format(save_dir)) return locomotion_distance(caterpillar)
def run_earthworm(actor, save_dir: str, steps: int, disable_list=None, broken_value=0): if disable_list is None: disable_list = [] earthworm = Earthworm(config.somites, config.oscillators_list, config.earthworm_params) # Record during sampling sim_distance_file = DataCSVSaver(os.path.join(save_dir, "distance.txt"), ("step", "distance")) sim_somite_phase_diffs_file = DataCSVSaver( os.path.join(save_dir, "somite_phase_diffs.txt"), ["step"] + ["phi_{}".format(i) for i in range(config.oscillators)]) sim_somite_phases_file = DataCSVSaver( os.path.join(save_dir, "somite_phases.txt"), ["step"] + ["phi_{}".format(i) for i in range(config.oscillators)]) sim_somite_actions_file = DataCSVSaver( os.path.join(save_dir, "somite_actions.txt"), ["step"] + ["action_{}".format(i) for i in range(config.oscillators)]) sim_frictions_file = DataCSVSaver( os.path.join(save_dir, "frictions.txt"), ["step"] + ["friction_{}".format(i) for i in range(config.somites)]) sim_tension_file = DataCSVSaver( os.path.join(save_dir, "tensions.txt"), ["step"] + ["tension_{}".format(i) for i in range(config.somites - 1)]) locomotion_distance = utils.locomotion_distance_logger( earthworm) # closure to keep locomotion distance for step in range(steps): obv, action = observe_and_act(actor, earthworm, disable_list=disable_list, broken_value=broken_value) # for (oscillator_id, target_angle) in config.fixed_angles.items(): # earthworm.set_target_angle(oscillator_id, target_angle) earthworm.step_with_feedbacks(config.params["time_delta"], tuple(action)) # Save data phases, frictions, tensions = obv sim_distance_file.append_data(step, locomotion_distance(earthworm)) sim_somite_phase_diffs_file.append_data( step, *utils.phase_diffs(phases[:config.oscillators])) sim_somite_phases_file.append_data( step, *utils.mod2pi(phases[:config.oscillators])) sim_frictions_file.append_data(step, *frictions) sim_tension_file.append_data(step, *tensions) sim_somite_actions_file.append_data(step, *action) earthworm.save_simulation("{}/render.json".format(save_dir)) return locomotion_distance(earthworm)
def test_current_params(actor: base_actor, log_dir: str, episode: int): steps = input("How many steps for this sample?: ") if steps == "": utils.notice("default steps {}".format( config.params["default_sample_steps"])) steps = config.params["default_sample_steps"] # Record during sampling sim_distance_file = DataCSVSaver( "{}/train_result_ep{}_distance.txt".format(log_dir, episode), ("step", "distance")) sim_somite_phase_diffs_file = DataCSVSaver( "{}/train_result_ep{}_somite_phase_diffs.txt".format(log_dir, episode), ["step"] + ["phi_{}".format(i) for i in range(config.oscillators)]) sim_somite_phases_file = DataCSVSaver( "{}/train_result_ep{}_somite_phases.txt".format(log_dir, episode), ["step"] + ["phi_{}".format(i) for i in range(config.oscillators)]) sim_somite_actions_file = DataCSVSaver( "{}/train_result_ep{}_somite_actions.txt".format(log_dir, episode), ["step"] + ["action_{}".format(i) for i in range(config.oscillators)]) sim_frictions_file = DataCSVSaver( "{}/train_result_ep{}_frictions.txt".format(log_dir, episode), ["step"] + ["friction_{}".format(i) for i in range(config.somites)]) earthworm = new_earthworm() locomotion_distance = utils.locomotion_distance_logger(earthworm) for step in range(int(steps)): try: (phases, frictions, _), action = earthworm_runner.observe_and_act( actor, earthworm, []) # for (oscillator_id, target_angle) in config.fixed_angles.items(): # earthworm.set_target_angle(oscillator_id, target_angle) earthworm.step_with_feedbacks(config.params["time_delta"], tuple(action)) except KeyboardInterrupt as e: print("exception occured during sample run,", e) continue else: # Save data sim_distance_file.append_data(step, locomotion_distance(earthworm)) sim_somite_phase_diffs_file.append_data( step, *utils.phase_diffs(phases[:config.oscillators])) sim_somite_phases_file.append_data( step, *utils.mod2pi(phases[:config.oscillators])) sim_somite_actions_file.append_data(step, *action) sim_frictions_file.append_data(step, *frictions) print("Moved distance:", locomotion_distance(earthworm)) earthworm.save_simulation("{}/train_result_ep{}.json".format( log_dir, episode))
def run_caterpillar(actor, save_dir: str, steps: int, disable_list=None, broken_value=0): if disable_list is None: disable_list = [] caterpillar = Caterpillar(config.somites, config.oscillators_list, config.grippers_list, config.caterpillar_params) # Record during sampling sim_distance_file = DataCSVSaver(os.path.join(save_dir, "distance.txt"), ("step", "distance")) sim_somite_phase_diffs_file = DataCSVSaver( os.path.join(save_dir, "somite_phase_diffs.txt"), ["step"] + ["phi_{}".format(i) for i in range(config.oscillators)]) sim_gripper_phase_diffs_file = DataCSVSaver( os.path.join(save_dir, "gripper_phase_diffs.txt"), ["step"] + ["phi_{}".format(i) for i in range(config.grippers)]) sim_somite_phases_file = DataCSVSaver( os.path.join(save_dir, "somite_phases.txt"), ["step"] + ["phi_{}".format(i) for i in range(config.oscillators)]) sim_gripper_phases_file = DataCSVSaver( os.path.join(save_dir, "gripper_phases.txt"), ["step"] + ["phi_{}".format(i) for i in range(config.grippers)]) sim_somite_actions_file = DataCSVSaver( os.path.join(save_dir, "somite_actions.txt"), ["step"] + ["action_{}".format(i) for i in range(config.oscillators)]) sim_gripper_actions_file = DataCSVSaver( os.path.join(save_dir, "gripper_actions.txt"), ["step"] + ["action_{}".format(i) for i in range(config.grippers)]) sim_frictions_file = DataCSVSaver( os.path.join(save_dir, "frictions.txt"), ["step"] + ["friction_{}".format(i) for i in range(config.somites)]) sim_tension_file = DataCSVSaver( os.path.join(save_dir, "tensions.txt"), ["step"] + ["tension_{}".format(i) for i in range(config.somites - 2)]) sim_grip_thresholds_file = DataCSVSaver( os.path.join(save_dir, "grip_thresholds.txt"), ["step"] + ["gripper_{}".format(i) for i in range(config.grippers)]) locomotion_distance = utils.locomotion_distance_logger( caterpillar) # closure to keep locomotion distance for step in range(steps): obv, action = observe_and_act(actor, caterpillar, disable_list=disable_list, broken_value=broken_value) feedbacks, gripping_phase_thresholds = action[0], action[1] for (oscillator_id, target_angle) in config.fixed_angles.items(): caterpillar.set_target_angle(oscillator_id, target_angle) caterpillar.set_gripping_phase_thresholds( tuple(gripping_phase_thresholds)) caterpillar.step_with_feedbacks(config.params["time_delta"], tuple(feedbacks[:config.oscillators]), tuple(feedbacks[config.oscillators:])) # Save data phases, frictions, tensions = obv sim_distance_file.append_data(step, locomotion_distance(caterpillar)) sim_somite_phase_diffs_file.append_data( step, *utils.phase_diffs(phases[:config.oscillators])) sim_gripper_phase_diffs_file.append_data( step, *utils.phase_diffs(phases[config.oscillators:])) sim_somite_phases_file.append_data( step, *utils.mod2pi(phases[:config.oscillators])) sim_gripper_phases_file.append_data( step, *utils.mod2pi(phases[config.oscillators:])) sim_frictions_file.append_data(step, *frictions) sim_tension_file.append_data(step, *tensions) sim_somite_actions_file.append_data(step, *feedbacks[:config.oscillators]) sim_gripper_actions_file.append_data(step, *feedbacks[config.oscillators:]) sim_grip_thresholds_file.append_data(step, *gripping_phase_thresholds) caterpillar.save_simulation("{}/render.json".format(save_dir)) return locomotion_distance(caterpillar)