📏 Tries to rebuild kinematics in python
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
import numpy as np
|
||||
|
||||
|
||||
class Kinematic:
|
||||
def __init__(self) -> None:
|
||||
|
||||
self.l1 = 60.5
|
||||
self.l2 = 10
|
||||
self.l3 = 100.7
|
||||
self.l4 = 118.5
|
||||
|
||||
self.L = 207.5
|
||||
self.W = 78
|
||||
|
||||
def calculate_inverse_kinematics(self, omega, phi, psi, x, y, z, feet):
|
||||
Tlf, Trf, Tlb, Trb = self.bodyIK(omega, phi, psi, x, y, z)
|
||||
|
||||
Q = np.linalg.inv(Tlf).dot(feet[0])[:3]
|
||||
|
||||
IK = self.legIK(*Q)
|
||||
LF = (
|
||||
np.rad2deg(np.pi / 2 - IK[0]),
|
||||
np.rad2deg(np.pi / 3 - IK[1]),
|
||||
np.rad2deg(np.pi - IK[2]),
|
||||
)
|
||||
|
||||
Q = self.Ix.dot(np.linalg.inv(Trf)).dot(feet[1])[:3]
|
||||
|
||||
IK = self.legIK(*Q)
|
||||
RF = (
|
||||
np.rad2deg(np.pi / 2 + IK[0]),
|
||||
np.rad2deg(2 * np.pi / 3 + IK[1]),
|
||||
np.rad2deg(IK[2]),
|
||||
)
|
||||
|
||||
Q = np.linalg.inv(Tlb).dot(feet[2])[:3]
|
||||
|
||||
IK = self.legIK(*Q)
|
||||
LB = (
|
||||
np.rad2deg(np.pi / 2 + (IK[0])),
|
||||
np.rad2deg(np.pi / 3 - IK[1]),
|
||||
np.rad2deg(np.pi - IK[2]),
|
||||
)
|
||||
|
||||
Q = self.Ix.dot(np.linalg.inv(Trb)).dot(feet[3])[:3]
|
||||
|
||||
IK = self.legIK(*Q)
|
||||
RB = (
|
||||
np.rad2deg(np.pi / 2 - IK[0]),
|
||||
np.rad2deg(2 * np.pi / 3 + IK[1]),
|
||||
np.rad2deg(IK[2]),
|
||||
)
|
||||
return (LF, RF, LB, RB)
|
||||
|
||||
def bodyIK(self, omega, phi, psi, xm, ym, zm):
|
||||
sHp = np.sin(np.pi / 2)
|
||||
cHp = np.cos(np.pi / 2)
|
||||
Rx = np.array(
|
||||
[
|
||||
[1, 0, 0, 0],
|
||||
[0, np.cos(omega), -np.sin(omega), 0],
|
||||
[0, np.sin(omega), np.cos(omega), 0],
|
||||
[0, 0, 0, 1],
|
||||
]
|
||||
)
|
||||
Ry = np.array(
|
||||
[
|
||||
[np.cos(phi), 0, np.sin(phi), 0],
|
||||
[0, 1, 0, 0],
|
||||
[-np.sin(phi), 0, np.cos(phi), 0],
|
||||
[0, 0, 0, 1],
|
||||
]
|
||||
)
|
||||
Rz = np.array(
|
||||
[
|
||||
[np.cos(psi), -np.sin(psi), 0, 0],
|
||||
[np.sin(psi), np.cos(psi), 0, 0],
|
||||
[0, 0, 1, 0],
|
||||
[0, 0, 0, 1],
|
||||
]
|
||||
)
|
||||
Rxyz = Rx @ Ry @ Rz
|
||||
|
||||
T = np.array([[0, 0, 0, xm], [0, 0, 0, ym], [0, 0, 0, zm], [0, 0, 0, 0]])
|
||||
Tm = T + Rxyz
|
||||
|
||||
return [
|
||||
Tm
|
||||
@ np.array(
|
||||
[
|
||||
[cHp, 0, sHp, self.L / 2],
|
||||
[0, 1, 0, 0],
|
||||
[-sHp, 0, cHp, self.W / 2],
|
||||
[0, 0, 0, 1],
|
||||
]
|
||||
),
|
||||
Tm
|
||||
@ np.array(
|
||||
[
|
||||
[cHp, 0, sHp, self.L / 2],
|
||||
[0, 1, 0, 0],
|
||||
[-sHp, 0, cHp, -self.W / 2],
|
||||
[0, 0, 0, 1],
|
||||
]
|
||||
),
|
||||
Tm
|
||||
@ np.array(
|
||||
[
|
||||
[cHp, 0, sHp, -self.L / 2],
|
||||
[0, 1, 0, 0],
|
||||
[-sHp, 0, cHp, self.W / 2],
|
||||
[0, 0, 0, 1],
|
||||
]
|
||||
),
|
||||
Tm
|
||||
@ np.array(
|
||||
[
|
||||
[cHp, 0, sHp, -self.L / 2],
|
||||
[0, 1, 0, 0],
|
||||
[-sHp, 0, cHp, -self.W / 2],
|
||||
[0, 0, 0, 1],
|
||||
]
|
||||
),
|
||||
]
|
||||
|
||||
def legIK(self, x, y, z):
|
||||
"""
|
||||
x/y/z=Position of the Foot in Leg-Space
|
||||
|
||||
F=Length of shoulder-point to target-point on x/y only
|
||||
G=length we need to reach to the point on x/y
|
||||
H=3-Dimensional length we need to reach
|
||||
"""
|
||||
|
||||
F = np.sqrt(x**2 + y**2 - self.l1**2)
|
||||
G = F - self.l2
|
||||
H = np.sqrt(G**2 + z**2)
|
||||
|
||||
theta1 = -np.atan2(y, x) - np.atan2(F, -self.l1)
|
||||
|
||||
D = (H**2 - self.l3**2 - self.l4**2) / (2 * self.l3 * self.l4)
|
||||
theta3 = np.acos(D)
|
||||
|
||||
theta2 = np.atan2(z, G) - np.atan2(
|
||||
self.l4 * np.sin(theta3), self.l3 + self.l4 * np.cos(theta3)
|
||||
)
|
||||
|
||||
return (theta1, theta2, theta3)
|
||||
Reference in New Issue
Block a user