exoskeleton/code/test/test_sew_mapper2.py

137 lines
4.5 KiB
Python
Raw Permalink Normal View History

import numpy as np
import pinocchio as pin
from core.sew_mapper2 import SEWMapper, BallJointConfig
# -------------------------- quick test --------------------- ----- #
def test_once(mapper: SEWMapper) -> None:
q_m7 = np.array([0.534, 0.314, -0.1, 2.14, 0.38, 0.38, -0.72], dtype=float)
q_s, dbg = mapper.retarget(q_m7)
# evaluate
mapper._fk_master(_build_q7(mapper.m_model, mapper.m_qidx7, q_m7))
mapper._fk_slave(q_s)
Rm = mapper._rot(mapper.m_data, mapper.fid_mEE)
Rs = mapper._rot(mapper.s_data, mapper.fid_sEE)
ang_err = float(np.linalg.norm(pin.log3(Rs.T @ Rm)))
pW = mapper._pos(mapper.s_data, mapper.fid_sW)
pos_err = float(np.linalg.norm(pW - dbg["pW_s_ref"]))
print("q_s(7):", np.array([q_s[i] for i in mapper.s_qidx7]))
print("angle_err(rad):", ang_err)
print("wrist_pos_err(m):", pos_err)
def _build_q7(model: pin.Model, qidx7, q7):
q = pin.neutral(model)
for i, idx in enumerate(qidx7):
q[idx] = float(q7[i])
return q
def test_fake():
master_urdf = "../config/master_7dof.urdf"
slave_urdf = "../config/slave_7dof.urdf"
m_model = pin.buildModelFromUrdf(master_urdf)
s_model = pin.buildModelFromUrdf(slave_urdf)
# frames
mS, mE, mW, mEE = "master_shoulder", "master_forearm", "master_wrist", "master_ee"
sS, sE, sW, sEE = "slave_shoulder", "slave_forearm", "slave_wrist", "slave_ee"
# joint order: [S1,S2,S3, EL, W1,W2,W3]
master_joint_names = (
"master_shoulder_pitch_joint", "master_shoulder_yaw_joint", "master_shoulder_roll_joint",
"master_elbow_flex_joint",
"master_wrist_roll_joint", "master_wrist_yaw_joint", "master_wrist_pitch_joint",
)
slave_joint_names = (
"slave_shoulder_pitch_joint", "slave_shoulder_yaw_joint", "slave_shoulder_roll_joint",
"slave_elbow_flex_joint",
"slave_wrist_roll_joint", "slave_wrist_yaw_joint", "slave_wrist_pitch_joint",
)
# configs (your confirmed settings)
s_sh_cfg = BallJointConfig(
axis_order="yxy",
joint_names=("slave_shoulder_pitch_joint", "slave_shoulder_yaw_joint", "slave_shoulder_roll_joint"),
signs=(-1.0, 1.0, -1.0),
)
s_wr_cfg = BallJointConfig(
axis_order="yzx",
joint_names=("slave_wrist_roll_joint", "slave_wrist_yaw_joint", "slave_wrist_pitch_joint"),
signs=(-1.0, 1.0, 1.0),
)
mapper = SEWMapper(
master_model=m_model,
slave_model=s_model,
m_shoulder=mS, m_elbow=mE, m_wrist=mW, m_ee=mEE,
s_shoulder=sS, s_elbow=sE, s_wrist=sW, s_ee=sEE,
master_joint_names=master_joint_names,
slave_joint_names=slave_joint_names,
slave_shoulder_cfg=s_sh_cfg,
slave_wrist_cfg=s_wr_cfg,
slave_elbow_axis_local=np.array([1.0, 0.0, 0.0]),
debug=False,
)
test_once(mapper)
def test_real():
master_urdf = "../config/master_7dof.urdf"
slave_urdf = "../config/real_slave_7dof.urdf"
m_model = pin.buildModelFromUrdf(master_urdf)
s_model = pin.buildModelFromUrdf(slave_urdf)
# frames
mS, mE, mW, mEE = "master_shoulder", "master_forearm", "master_wrist", "master_ee"
sS, sE, sW, sEE = "R_SHOULDER_R_S", "R_ELBOW_R_S", "R_WRIST_R_S", "R_WRIST_R_S"
# joint order: [S1,S2,S3, EL, W1,W2,W3]
master_joint_names = (
"master_shoulder_pitch_joint", "master_shoulder_yaw_joint", "master_shoulder_roll_joint",
"master_elbow_flex_joint",
"master_wrist_roll_joint", "master_wrist_yaw_joint", "master_wrist_pitch_joint",
)
slave_joint_names = (
"R_SHOULDER_P", "R_SHOULDER_R", "R_SHOULDER_Y",
"R_ELBOW_R",
"R_WRIST_P", "R_WRIST_Y", "R_WRIST_R",
)
# configs (your confirmed settings)
s_sh_cfg = BallJointConfig(
axis_order="yxy",
joint_names=("R_SHOULDER_P", "R_SHOULDER_R", "R_SHOULDER_Y"),
signs=(-1.0, 1.0, -1.0),
)
s_wr_cfg = BallJointConfig(
axis_order="yzx",
joint_names=("R_WRIST_P", "R_WRIST_Y", "R_WRIST_R"),
signs=(-1.0, 1.0, 1.0),
)
mapper = SEWMapper(
master_model=m_model,
slave_model=s_model,
m_shoulder=mS, m_elbow=mE, m_wrist=mW, m_ee=mEE,
s_shoulder=sS, s_elbow=sE, s_wrist=sW, s_ee=sEE,
master_joint_names=master_joint_names,
slave_joint_names=slave_joint_names,
slave_shoulder_cfg=s_sh_cfg,
slave_wrist_cfg=s_wr_cfg,
slave_elbow_axis_local=np.array([1.0, 0.0, 0.0]),
debug=False,
)
test_once(mapper)
if __name__ == "__main__":
test_real()