コード例 #1
0
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)
コード例 #2
0
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)
コード例 #3
0
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))
コード例 #4
0
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)