예제 #1
0
def lcm_mode():
    import_lcm_python()
    lc = LCM()
    subscription = lc.subscribe('VALVE', valve_handler)
    print 'Subscribed to the VAVLE channel, waiting for command...'
    while True:
        lc.handle()
예제 #2
0
class JsonManipulatorTrajRunner:
    def __init__(self, filename):
        with open(filename) as fp:
            self.plan = json.load(fp)

        self._lcm = LCM()
        self._lcm.subscribe("EXECUTION_STATUS",
                            self._kuka_plan_runner_status_handler)

        self.wsg_utime = 0
        self.torque_mode = 0
        self.cur_node_id = 0
        self.plan_started = False
        self.node_completed = False

    def run_plan(self):
        if len(self.plan):
            print("Node", self.cur_node_id)
            self._publish_node_traj(self.plan[self.cur_node_id])

            while True:
                self._lcm.handle()
                if self.node_completed:
                    self.node_completed = False
                    self.cur_node_id += 1
                    if self.cur_node_id >= len(self.plan):
                        print("Plan Completed")
                        break
                    print("Node", self.cur_node_id)
                    self._publish_node_traj(self.plan[self.cur_node_id])

    def _publish_node_traj(self, node):
        msg = dict_to_lcmt_manipulator_traj(node)

        if USE_TORQUE:
            msg.dim_torques = 7
        else:
            msg.dim_torques = 0

        if msg.n_time_steps:
            self._lcm.publish("COMMITTED_ROBOT_PLAN", msg.encode())
            print("Trajectory Published!")

    def _kuka_plan_runner_status_handler(self, channel, msg):
        print("Kuka Traj Completed")
        self.node_completed = True

    def run_plan_lcm_wrapper(self):
        self._lcm.subscribe("START_PLAN", self._start_plan_handler)
        while (not self.plan_started):
            self._lcm.handle()

    def _start_plan_handler(self, channel, msg):
        self.plan_started = True
        print("Starting plan")
        self.run_plan()
예제 #3
0
def run(joint_index, save_file_base):
    lcm = LCM(robot_lcm_url)
    status_sub = LcmMessagePoll(lcm, status_channel, lcmt_panda_status)
    events = []
    print(f"joint_index: {joint_index}")

    print("Waiting for first message...")
    lcm.handle()

    count = 0
    dt_des = 0.005

    print("Received! Starting")
    t_abs_start = time.time()
    t = 0.0
    t_transient_start = 3.0
    t_transient_end = 0.25

    t_sweep = 10.0
    T_sec_min = 1.0
    T_sec_max = 5.0

    v = None

    try:
        while True:
            lcm_handle_all(lcm)
            status = status_sub.get()
            if status is None:
                continue

            t_prev = t
            t = time.time() - t_abs_start
            s = min(t / t_transient_start, 1.0)
            dt = t - t_prev

            v = np.array(status.joint_velocity)
            assert v.shape == (ndof,), v.shape

            # T_sec = np.array([4.0, 3.5, 3.0, 2.5, 2.0, 1.5, 1.0]) / 4
            s_chirp = min(t / t_sweep, 1.0)
            if s_chirp >= 1.0:
                raise KeyboardInterrupt
            T_sec = T_sec_min + (1 - s_chirp) * (T_sec_max - T_sec_min)
            print(T_sec)
            w = 2 * np.pi / T_sec
            v_max = np.zeros(ndof)
            v_max[joint_index] = 1.0
            # v_max = np.array([0.5, 1.5, 0.5, 1.0, 1.0, 1.5, 1.5])

            vd = np.zeros(ndof)
            vd[:] = s * v_max * np.sin(w * t)

            cmd = make_command(vd)
            lcm.publish(cmd_channel, cmd.encode())
            events.append((status, cmd))

            count += 1

            t_next = t + dt_des
            while time.time() - t_abs_start < t_next:
                time.sleep(dt_des / 100)

    except KeyboardInterrupt:
        # Wind down.
        assert v is not None
        v0 = v
        vd = np.zeros(ndof)

        t_abs_start = time.time()
        t = 0.0
        while t < t_transient_end:
            lcm_handle_all(lcm)
            status = status_sub.get()
            if status is None:
                continue

            t = time.time() - t_abs_start
            s = min(t / t_transient_end, 1.0)
            vd = v0 * (1 - s)
            cmd = make_command(vd)
            lcm.publish(cmd_channel, cmd.encode())
            events.append((status, cmd))

            t_next = t + dt_des
            while time.time() - t_abs_start < t_next:
                time.sleep(dt_des / 100)

    finally:
        # Save data.
        file = expanduser(f"~/data/panda/tracking/{save_file_base}.pkl")
        with open(file, "wb") as f:
            pickle.dump(events, f)
        print(f"Wrote: {file}")
예제 #4
0
class MotionQueryHandler:
    def __init__(self, query_file, ddp_traj_file):
        with open(query_file) as fp:
            data = json.load(fp)

        self._queries = []
        for d in data:
            try:
                self._queries.append(dict_to_lcmt_multi_wp_manip_query(d))
            except:
                self._queries.append(None)

        with open(ddp_traj_file) as fp:
            self._ddp_traj = json.load(fp)

        self._lcm = LCM()
        self._lcm.subscribe("TREE_SEARCH_QUERY_RESULTS",
                            self._query_results_handler)

        self._cur_query = None
        self._completed = False
        self.trajs = []
        self.q_idx = 0

    def _query_results_handler(self, channel, msg):
        print("message received.")
        data = lcmt_manipulator_traj.decode(msg)
        print("Cost:", data.cost)

        if not data.n_time_steps:
            print("IK Infeasible")
        elif data.cost == float('inf') or math.isnan(
                data.cost) or data.cost <= 1:
            if self._cur_query.time_step / 2 >= MIN_TIME_STEP:
                self._cur_query.time_step /= 2
                self._lcm.publish("TREE_SEARCH_QUERY",
                                  self._cur_query.encode())
                print("Decreasing time step to", self._cur_query.time_step)
                return
            else:
                print("Minimum time step reached. Trajectory cannot be found.")
                self.trajs.append(self._ddp_traj[self.q_idx])
                self._completed = True
                return

        self.trajs.append(lcmt_manipulator_traj_to_dict(data))
        self._completed = True

    def Run(self):
        self.q_idx = 0
        total_time = 0
        for self.q_idx in range(len(self._queries)):
            self._cur_query = self._queries[self.q_idx]

            if self._cur_query is None:
                print(
                    "No move query in this action. Keeping original trajectory"
                )
                self.trajs.append(self._ddp_traj[self.q_idx])
                continue

            if self._cur_query.time_step > MAX_TIME_STEP:
                self._cur_query.time_step = MAX_TIME_STEP

            print("Computing ADMM " + str(self.q_idx + 1) + "/" +
                  str(len(self._queries)))
            print("Action: " + self._cur_query.name)

            self._completed = False
            start_time = time.time()
            self._lcm.publish("TREE_SEARCH_QUERY", self._cur_query.encode())
            print("LCM Query Published...")

            while not self._completed:
                self._lcm.handle()

            end_time = time.time()
            total_time += end_time - start_time
            print("Computation time:", end_time - start_time)

        print("Total computation time:", total_time)
        self._save_trajs()

    def run_single_traj(self, q_idx):
        self._cur_query = self._queries[q_idx]
        print("Action: " + self._cur_query.name)
        if self._cur_query.time_step > MAX_TIME_STEP:
            self._cur_query.time_step = MAX_TIME_STEP

        if self._cur_query is None:
            print("No move query in this action. Keeping original trajectory")
            self.trajs.append(self._ddp_traj[q_idx])

        else:
            print("Computing ADMM " + str(q_idx + 1) + "/" +
                  str(len(self._queries)))

            self._completed = False
            start_time = time.time()
            self._lcm.publish("TREE_SEARCH_QUERY", self._cur_query.encode())
            print("LCM Query Published...")

            while not self._completed:
                self._lcm.handle()

        self._save_trajs()

    def run_action_names(self, action_name):
        self.q_idx = 0
        total_time = 0
        for self.q_idx in range(len(self._queries)):
            if self._queries[self.q_idx] is not None and self._queries[
                    self.q_idx].name.startswith(action_name):
                self._cur_query = self._queries[self.q_idx]
            else:
                self._cur_query = None

            if self._cur_query is None:
                print(
                    "No move query in this action. Keeping original trajectory"
                )
                self.trajs.append(self._ddp_traj[self.q_idx])
                continue

            if self._cur_query.time_step > MAX_TIME_STEP:
                self._cur_query.time_step = MAX_TIME_STEP

            print("Computing ADMM " + str(self.q_idx + 1) + "/" +
                  str(len(self._queries)))
            print("Action: " + self._cur_query.name)

            self._completed = False
            start_time = time.time()
            self._lcm.publish("TREE_SEARCH_QUERY", self._cur_query.encode())
            print("LCM Query Published...")

            while not self._completed:
                self._lcm.handle()

            end_time = time.time()
            total_time += end_time - start_time
            print("Computation time:", end_time - start_time)

        print("Total computation time:", total_time)
        self._save_trajs()

    def _save_trajs(self):
        print("ADMM completed, saving results")

        filename = "/home/zhigen/code/drake/manipulation_tamp/results/admm_traj" + datetime.now(
        ).strftime("%Y%m%dT%H%M%S") + ".json"

        with open(filename, 'w') as out:
            json.dump(self.trajs, out)
class BasicManipMotionPlanRunner(object):
    """ Runs Motion Plan for conveyor belt domain
    """
    def __init__(self, geo_setup_file, traj_setup_file):
        self._lcm = LCM()
        self._lcm.subscribe("TREE_SEARCH_QUERY_RESULTS", self._results_handler)
        self._query = ConveyorBeltManipQuery(geo_setup_file)
        self._node = None
        self._traj_perturbed = False

        with open(traj_setup_file) as fp:
            self._traj_setup = json.load(fp)

    def _results_handler(self, channel, msg):
        print("message received.")
        data = lcmt_manipulator_traj.decode(msg)
        print("Cost:", data.cost)

        if not data.n_time_steps:
            print("IK Infeasible")
        elif data.cost == float('inf') or math.isnan(
                data.cost) or data.cost == 0:
            if self._node.move_query.time_step / 2 >= self._traj_setup[
                    "min_time_step"]:
                self._node.move_query.time_step /= 2
                self._lcm.publish("TREE_SEARCH_QUERY",
                                  self._node.move_query.encode())
                print("Decreasing time step to",
                      self._node.move_query.time_step)
                return
                # ans = input("Trajectory not found. Try Again? [yes/no]")
                # while not (ans == "yes" or ans == "no"):
                #     ans = input("Please input yes or no...")

                # if ans =="yes":
                #     self._lcm.publish("TREE_SEARCH_QUERY", self._node.move_query.encode())
                #     print("Decreasing time step to",
                #         self._node.move_query.time_step)
                #     return
                # elif ans == "no":
                #     print("Traj Op terminated by user. Trajectory cannot be found.")

            elif not self._traj_perturbed:
                self._node.move_query.time_step = self._traj_setup[
                    "admm_time_step"]
                self._perturb_desired_ee(self._node, sigma=0.005)
                self._lcm.publish("TREE_SEARCH_QUERY",
                                  self._node.move_query.encode())
                print("Perturbed desired ee, reset time step")
                return

            else:
                print("Minimum time step reached. Trajectory cannot be found.")

        self.results = lcmt_manipulator_traj_to_dict(data)
        self.completed = True

    def run(self, node):
        """ returns results of query for conveyor belt manipulation domain

        Args:
            node: (PddlTampNode)
        Returns:
            results: (Dict) containing trajectory info
        """
        self._node = node
        op_name = node.action.name[1:-1].split(" ")[0]
        obj_name = node.action.name[1:-1].split(" ")[2]

        if node.parent is not None:
            node.processed_object = node.parent.processed_object.copy()
            node.discrete_cost = node.parent.discrete_cost

        if obj_name not in node.processed_object:
            node.processed_object.append(obj_name)

            if "base_object_cost" in self._traj_setup:
                obj_name = node.action.name[1:-1].split(" ")[2]
                alpha = self._traj_setup["base_object_cost"]["alpha"]
                base_obj_cost = self._traj_setup["base_object_cost"][obj_name]
                discrete_obj_cost = base_obj_cost * (alpha**len(
                    node.processed_object))
                node.discrete_cost += discrete_obj_cost

                print("Adding New discrete cost", obj_name, discrete_obj_cost)
                print("Total discrete cost", node.discrete_cost)

        self.completed = False

        if self._traj_setup[op_name]["traj_op"]:
            if node.move_query is None:
                node.move_query = self._generate_move_query(node, op_name)
            self._lcm.publish("TREE_SEARCH_QUERY", node.move_query.encode())
            print("LCM Query Published...")
        else:
            if isinstance(self._traj_setup[op_name]["time_horizon"], list):
                node.time = node.parent.time + sum(
                    self._traj_setup[op_name]["time_horizon"])
            else:
                node.time = node.parent.time + self._traj_setup[op_name][
                    "time_horizon"]
            self.results = self._generate_traj(node, op_name)
            self.completed = True

        timeout = 5000
        while (True):
            if self.completed:
                return self.results

            rfds, wfds, efds = select.select([self._lcm.fileno()], [], [],
                                             timeout)
            if rfds:
                self._lcm.handle()

    def _perturb_desired_ee(self, node, sigma=0.01):
        if node.move_query is None:
            print("Warning: no move query available")
            return

        if isinstance(node.move_query.desired_ee, list):
            for ee in node.move_query.desired_ee:
                for element in ee:
                    element += random.gauss(0, sigma)

        else:
            for element in node.move_query.desired_ee:
                element += random.gauss(0, sigma)

        self._traj_perturbed = True

    def _generate_move_query(self, node, op_name):
        if node.parent_traj:
            q_prev = node.parent_traj["states"][-1]
            gripper_width_prev = node.parent_traj["gripper_width"][-1]
        else:
            q_prev = self._traj_setup["init_iiwa_pos"]
            gripper_width_prev = self._traj_setup["gripper_open_width"]

        if node.parent is None:
            print("q_prev:", q_prev)
            input("")

        ee_desired = self._query.get_desired_ee_pos(node)
        print("Prev q:", q_prev)
        print("DESIRED EE:", ee_desired)

        msg = lcmt_motion_plan_query()
        msg.name = node.action.name[1:-1].split(" ")[0]
        msg.dim_q = 7

        if node.option == "ddp":
            msg.level = 1
            msg.time_step = self._traj_setup["ddp_time_step"]
        elif node.option == "admm":
            msg.level = 2
            msg.time_step = self._traj_setup["admm_time_step"]

        msg.wait_time = self._traj_setup[op_name]["wait_time"]
        msg.time_horizon = self._traj_setup[op_name]["time_horizon"]
        msg.prev_gripper_width = gripper_width_prev

        msg.desired_ee = ee_desired
        msg.prev_q = q_prev
        msg.gripper_force = self._traj_setup["gripper_force"]
        node.final_ee = ee_desired

        return msg

    def _generate_traj(self, node, op_name):
        if isinstance(self._traj_setup[op_name]["time_horizon"], list):
            time_horizon = sum(self._traj_setup[op_name]["time_horizon"])
        else:
            time_horizon = self._traj_setup[op_name]["time_horizon"]

        node.final_ee = node.parent.final_ee

        time_step = self._traj_setup["manual_time_step"]

        if self._traj_setup[op_name]["gripper_open"] < 0:
            gripper_width = self._traj_setup["gripper_close_width"]
        elif self._traj_setup[op_name]["gripper_open"] > 0:
            gripper_width = self._traj_setup["gripper_open_width"]
        else:
            if node.parent_traj:
                gripper_width = node.parent_traj["gripper_width"][-1]
            else:
                gripper_width = self._traj_setup["init_gripper_width"]

        msg = dict()
        msg["n_time_steps"] = int(time_horizon / time_step)
        msg["dim_torques"] = 0
        msg["dim_states"] = self._traj_setup["n_joints"]

        msg["cost"] = self._traj_setup[op_name]["cost"]
        cur_time = 0

        msg["times_sec"] = []
        msg["states"] = []
        msg["torques"] = []
        msg["gripper_width"] = []
        msg["gripper_force"] = []

        if node.parent_traj:
            q = node.parent_traj["states"][-1]
        else:
            q = self._traj_setup["init_iiwa_pos"]

        for _ in range(msg["n_time_steps"]):
            msg["states"].append(q)
            msg["torques"].append([])
            msg["gripper_width"].append(gripper_width)
            msg["gripper_force"].append(self._traj_setup["gripper_force"])

            msg["times_sec"].append(cur_time)
            cur_time += time_step

        return msg
예제 #6
0
def handle_lcm():
    lc = LCM()
    subscription = lc.subscribe('ARM', arm_handler)
    print 'Subscribed to the ARM channel, waiting for command...'
    while True:
        lc.handle()