add calibration.py
This commit is contained in:
parent
31ab662227
commit
e535863eee
95
python/calibration.py
Normal file
95
python/calibration.py
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Created on Thu Oct 12 16:11:58 2023
|
||||||
|
|
||||||
|
@author: Pierre Lecomte
|
||||||
|
"""
|
||||||
|
from interbotix_xs_modules.xs_robot.arm import InterbotixManipulatorXS
|
||||||
|
import numpy as np
|
||||||
|
import nidaq
|
||||||
|
|
||||||
|
#%%########################################################################################################
|
||||||
|
# ROBOTIC ARM PARAMETERS
|
||||||
|
bot = InterbotixManipulatorXS(
|
||||||
|
robot_model='wx250s_custom',
|
||||||
|
group_name='arm',
|
||||||
|
gripper_name = None
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# The arm is going to the initial pose
|
||||||
|
bot.arm.go_to_home_pose()
|
||||||
|
bot.arm.set_ee_pose_components(x=0,y=0,z=0.5)
|
||||||
|
|
||||||
|
# HP coordinates in EE frame are set here. One should align the directions with a laser
|
||||||
|
hp = np.array([1, 0, 0]) # in EE frame
|
||||||
|
|
||||||
|
|
||||||
|
# EE frame to SMA frame rotation
|
||||||
|
thetaA, phiA, psiA = 91.5*np.pi/180, -45*np.pi/180, 0
|
||||||
|
|
||||||
|
rotEA = np.array([
|
||||||
|
[-np.cos(phiA) * np.sin(thetaA), np.cos(psiA) * np.sin(phiA) - np.cos(thetaA) * np.sin(psiA), -np.cos(thetaA) * np.cos(phiA) * np.cos(psiA) - np.sin(phiA) * np.sin(psiA)],
|
||||||
|
[-np.sin(thetaA) * np.sin(phiA), -np.cos(phiA) * np.cos(psiA) - np.cos(thetaA) * np.sin(phiA) * np.sin(psiA), - np.cos(thetaA) * np.cos(psiA) * np.sin(phiA) + np.cos(phiA) * np.sin(psiA)],
|
||||||
|
[-np.cos(thetaA), np.sin(thetaA) * np.sin(psiA), np.cos(psiA) * np.sin(thetaA)]
|
||||||
|
])
|
||||||
|
|
||||||
|
#%% xyzA: DOA to be measured in Cartesian Coordinates in SMA frame
|
||||||
|
xyzA = np.array([[0, 0, 1], [1, 0, 0], [0, 1, 0], [-1*1, 0, 0], [0, -1*1, 0], [0,
|
||||||
|
0, -1*1]])#, [1/np.sqrt(3), 1/np.sqrt(3), 1/np.sqrt(3)], [-1*(1/np.sqrt(3)), 1/np.sqrt(3),
|
||||||
|
# 1/np.sqrt(3)], [-1*(1/np.sqrt(3)), -1*(1/np.sqrt(3)), 1/np.sqrt(3)], [1/np.sqrt(
|
||||||
|
# 3), -1*(1/np.sqrt(3)), 1/np.sqrt(3)], [1/np.sqrt(3), 1/np.sqrt(
|
||||||
|
# 3), -1*(1/np.sqrt(3))], [-1*(1/np.sqrt(3)), 1/np.sqrt(
|
||||||
|
# 3), -1*(1/np.sqrt(3))], [-1*(1/np.sqrt(3)), -1*(1/np.sqrt(3)), -1*(1/np.sqrt(3))], [1/
|
||||||
|
# np.sqrt(3), -1*(1/np.sqrt(3)), -1*(1/np.sqrt(3))], [1/np.sqrt(2), 0, 1/np.sqrt(2)], [0,
|
||||||
|
# 1/np.sqrt(2), 1/np.sqrt(2)], [-1*(1/np.sqrt(2)), 0, 1/np.sqrt(
|
||||||
|
# 2)], [0, -1*(1/np.sqrt(2)), 1/np.sqrt(2)], [1/np.sqrt(2), 1/np.sqrt(2),
|
||||||
|
# 0], [-1*(1/np.sqrt(2)), 1/np.sqrt(2), 0], [-1*(1/np.sqrt(2)), -1*(1/np.sqrt(2)),
|
||||||
|
# 0], [1/np.sqrt(2), -1*(1/np.sqrt(2)), 0], [1/np.sqrt(2), 0, -1*(1/np.sqrt(2))], [0,
|
||||||
|
# 1/np.sqrt(2), -1*(1/np.sqrt(2))], [-1*(1/np.sqrt(2)),
|
||||||
|
# 0, -1*(1/np.sqrt(2))], [0, -1*(1/np.sqrt(2)), -1*(1/np.sqrt(2))], [1/np.sqrt(11), 1/
|
||||||
|
# np.sqrt(11), 3/np.sqrt(11)], [-1*(1/np.sqrt(11)), 1/np.sqrt(11), 3/np.sqrt(
|
||||||
|
# 11)], [-1*(1/np.sqrt(11)), -1*(1/np.sqrt(11)), 3/np.sqrt(11)], [1/np.sqrt(
|
||||||
|
# 11), -1*(1/np.sqrt(11)), 3/np.sqrt(11)], [3/np.sqrt(11), 1/np.sqrt(11), 1/np.sqrt(
|
||||||
|
# 11)], [1/np.sqrt(11), 3/np.sqrt(11), 1/np.sqrt(11)], [-1*(1/np.sqrt(11)), 3/np.sqrt(
|
||||||
|
# 11), 1/np.sqrt(11)], [-1*(3/np.sqrt(11)), 1/np.sqrt(11), 1/np.sqrt(
|
||||||
|
# 11)], [-1*(3/np.sqrt(11)), -1*(1/np.sqrt(11)), 1/np.sqrt(
|
||||||
|
# 11)], [-1*(1/np.sqrt(11)), -1*(3/np.sqrt(11)), 1/np.sqrt(11)], [1/np.sqrt(
|
||||||
|
# 11), -1*(3/np.sqrt(11)), 1/np.sqrt(11)], [3/np.sqrt(11), -1*(1/np.sqrt(11)), 1/np.sqrt(
|
||||||
|
# 11)], [3/np.sqrt(11), 1/np.sqrt(11), -1*(1/np.sqrt(11))], [1/np.sqrt(11), 3/np.sqrt(
|
||||||
|
# 11), -1*(1/np.sqrt(11))], [-1*(1/np.sqrt(11)), 3/np.sqrt(
|
||||||
|
# 11), -1*(1/np.sqrt(11))], [-1*(3/np.sqrt(11)), 1/np.sqrt(
|
||||||
|
# 11), -1*(1/np.sqrt(11))], [-1*(3/np.sqrt(11)), -1*(1/np.sqrt(11)), -1*(1/np.sqrt(
|
||||||
|
# 11))], [-1*(1/np.sqrt(11)), -1*(3/np.sqrt(11)), -1*(1/np.sqrt(11))], [1/np.sqrt(
|
||||||
|
# 11), -1*(3/np.sqrt(11)), -1*(1/np.sqrt(11))], [3/np.sqrt(
|
||||||
|
# 11), -1*(1/np.sqrt(11)), -1*(1/np.sqrt(11))], [1/np.sqrt(11), 1/np.sqrt(
|
||||||
|
# 11), -1*(3/np.sqrt(11))], [-1*(1/np.sqrt(11)), 1/np.sqrt(
|
||||||
|
# 11), -1*(3/np.sqrt(11))], [-1*(1/np.sqrt(11)), -1*(1/np.sqrt(11)), -1*(3/np.sqrt(
|
||||||
|
# 11))], [1/np.sqrt(11), -1*(1/np.sqrt(11)), -1*(3/np.sqrt(11))]])
|
||||||
|
|
||||||
|
#%% xyzE: DOA to be measured in Cartesian Coordinates in EE frame
|
||||||
|
xyzE = np.linalg.inv(rotEA) @ np.transpose(xyzA)
|
||||||
|
|
||||||
|
|
||||||
|
sr = 44100
|
||||||
|
duration = 8
|
||||||
|
t = np.linspace(0, duration, sr*duration, endpoint=False)
|
||||||
|
sig = nidaq.sine_sweep(sr,duration)
|
||||||
|
|
||||||
|
for i in range(xyzE.shape[1]):
|
||||||
|
xyzEi = xyzE[:,i]
|
||||||
|
print(["DOA: " + str(xyzA[i,:])])
|
||||||
|
gamma = np.arctan2(xyzEi[2], xyzEi[1])
|
||||||
|
k =np.array([
|
||||||
|
[1, 0, 0],
|
||||||
|
[0, np.cos(gamma), np.sin(gamma)],
|
||||||
|
[0, -np.sin(gamma), np.cos(gamma)]
|
||||||
|
]) @ xyzEi
|
||||||
|
alpha = np.arccos(np.dot(k, hp/np.linalg.norm(hp)))
|
||||||
|
bot.arm.set_single_joint_position(joint_name='wrist_rotate', position=-gamma)
|
||||||
|
bot.arm.set_single_joint_position(joint_name='waist', position=-alpha)
|
||||||
|
out = np.array(nidaq.playrec(sig, sr))
|
||||||
|
np.save(str(i) + '.npy', out)
|
||||||
|
|
||||||
|
print("Done")
|
Loading…
Reference in New Issue
Block a user