89 lines
2.8 KiB
Python
89 lines
2.8 KiB
Python
|
import argparse
|
||
|
import time
|
||
|
import warnings
|
||
|
|
||
|
import numpy as np
|
||
|
import placo
|
||
|
from placo_utils.visualization import robot_viz
|
||
|
from placo_utils.tf import tf
|
||
|
import time
|
||
|
import pickle
|
||
|
import FramesViewer.utils as fv_utils
|
||
|
|
||
|
warnings.filterwarnings("ignore")
|
||
|
model_filename = "../../mini_bdx/robots/bdx/robot.urdf"
|
||
|
robot = placo.RobotWrapper(model_filename)
|
||
|
robot.set_joint_limits("left_knee", -2, -0.01)
|
||
|
robot.set_joint_limits("right_knee", -2, -0.01)
|
||
|
solver = placo.KinematicsSolver(robot)
|
||
|
# solver.mask_fbase(True)
|
||
|
|
||
|
left_foot_task = solver.add_frame_task("left_foot_frame", np.eye(4))
|
||
|
left_foot_task.configure("left_foot_frame", "soft", 1.0)
|
||
|
right_foot_task = solver.add_frame_task("right_foot_frame", np.eye(4))
|
||
|
right_foot_task.configure("right_foot_frame", "soft", 1.0)
|
||
|
|
||
|
T_world_trunk = np.eye(4)
|
||
|
T_world_trunk = fv_utils.rotateInSelf(T_world_trunk, [0, -2, 0])
|
||
|
trunk_task = solver.add_frame_task("trunk", T_world_trunk)
|
||
|
trunk_task.configure("trunk", "hard")
|
||
|
|
||
|
T_world_head = np.eye(4)
|
||
|
T_world_head[:3, 3][2] = 0.1
|
||
|
head_task = solver.add_frame_task(
|
||
|
"head",
|
||
|
T_world_head,
|
||
|
)
|
||
|
head_task.configure("head", "soft")
|
||
|
|
||
|
robot.update_kinematics()
|
||
|
|
||
|
move = []
|
||
|
viz = robot_viz(robot)
|
||
|
while True: # some main loop
|
||
|
# Update tasks data here
|
||
|
|
||
|
# left_foot_task.T_world_frame = tf.translation_matrix(
|
||
|
# [0, -0.12 / 2, np.sin(time.time())]
|
||
|
# )
|
||
|
z_offset = 0.015 * np.sin(2 * time.time())
|
||
|
left_foot_task.T_world_frame = tf.translation_matrix(
|
||
|
[-0.005, 0.12 / 2, -0.17 + z_offset]
|
||
|
)
|
||
|
right_foot_task.T_world_frame = tf.translation_matrix(
|
||
|
[-0.005, -0.12 / 2, -0.17 + z_offset]
|
||
|
)
|
||
|
|
||
|
head_task.T_world_frame = tf.translation_matrix(
|
||
|
[0.05 * np.sin(2 * np.pi * 2 * time.time()), 0, 0.1]
|
||
|
)
|
||
|
# Solve the IK
|
||
|
solver.solve(True)
|
||
|
|
||
|
# Update frames and jacobians
|
||
|
robot.update_kinematics()
|
||
|
|
||
|
angles = {
|
||
|
"right_hip_yaw": robot.get_joint("right_hip_yaw"),
|
||
|
"right_hip_roll": robot.get_joint("right_hip_roll"),
|
||
|
"right_hip_pitch": robot.get_joint("right_hip_pitch"),
|
||
|
"right_knee": robot.get_joint("right_knee"),
|
||
|
"right_ankle": robot.get_joint("right_ankle"),
|
||
|
"left_hip_yaw": robot.get_joint("left_hip_yaw"),
|
||
|
"left_hip_roll": robot.get_joint("left_hip_roll"),
|
||
|
"left_hip_pitch": robot.get_joint("left_hip_pitch"),
|
||
|
"left_knee": robot.get_joint("left_knee"),
|
||
|
"left_ankle": robot.get_joint("left_ankle"),
|
||
|
"neck_pitch": robot.get_joint("neck_pitch"),
|
||
|
"head_pitch": robot.get_joint("head_pitch"),
|
||
|
"head_yaw": robot.get_joint("head_yaw"),
|
||
|
"left_antenna": robot.get_joint("left_antenna"),
|
||
|
"right_antenna": robot.get_joint("right_antenna"),
|
||
|
}
|
||
|
move.append(angles)
|
||
|
time.sleep(1 / 60)
|
||
|
pickle.dump(move, open("move.pkl", "wb"))
|
||
|
# Optionally: dump the solver status
|
||
|
solver.dump_status()
|
||
|
viz.display(robot.state.q)
|