T1807663-v1 - SR Matrix Calc

2018-02-15, Mark Barton

Data

X and Y are the standard interferometer global coordinates.
The HR surface faces -Y for SR2 and +Y for SR3 and SRM, and defines L (longitudinal).
T (transverse) is 90° anticlockwise from L (so as to make right handed LTV with vertical up).
For convenience, so that standard rotation matrices can be used, the calculation is done first in x/y coordinates where y=L and x=-T.
Leg #0 is in the +x direction and angles are measured anticlockwise from it.
Geophone #0 and LVDT/FR #0 are offset by 15° and 30° from Leg #0. (Note: in the BS, the FR was at -30°, but in the SR, the FR and LVDT are colocated at 30°.)
Legs #1 and #2 are at 120° and 240°.

PI Data

Payload Data

Data Summary

vals = {
(* IP stuff *)
R->715./1000, (* PI radius *)
Fradius -> 1268.8/1000/2, (* from center to FR stepper; 3D CAD *)
Gradius -> 1183./1000/2, (* from center to geophone;3D CAD *)
Lradius -> 1188./1000/2, (* from center to LVDT;3D CAD; CHECK ME! *)
Eradius->650./1000, (* from center to EQ stop hole; guesstimate *)
Iradius->650./1000, (* from center to leg; guesstimate *)
Eradius2->80./1000/2, (* radius of EQ stop hole; guesstimate *)
Iradius2->80./1000/2, (* radius of leg; guesstimate *)
l->200./1000, (* arrow length, for diagram *)
origin -> 0°, (* 3 o'clock *)
(* IM stuff *)
IMV1L ->0.096,
IMV2L->0.096*Sin[Pi/6],
IMV3L->0.096*Sin[Pi/6],
IMV1T->0,
IMV2T-> 0.096*Cos[Pi/6],
IMV3T-> 0.096*Cos[Pi/6],
IMH1L ->0,
IMH2L->0.085,
IMH3L->0.085,
(* TM stuff *)
TMH1V->0.16546/2,
TMH2V->0.16546/2,
TMH3V->0.16546/2,
TMH4V->0.16546/2,
TMH1T->0.16546/2,
TMH2T->0.16546/2,
TMH3T->0.16546/2,
TMH4T->0.16546/2
};

TM Geometry

Updated for SR. Relative to BS, lots of signs are reversed, because the OSEMs are on the back side of the optic (was front for the BS), but the numbering is as viewed from the back in both cases.

The test matrix, which gives the change at each sensor for excursions in L, P and Y.

(TMtest =  Transpose[{
{1,1,1,1},
{TMH1V,-TMH2V,TMH3V,-TMH4V},
{-TMH1T,-TMH2T,TMH3T,TMH4T}
}]/.vals
)//TableForm

The diagonalization matrix, which attempts to undo the test matrix. This matrix should be typed as-is into the OSEM2EUL screen and transposed into the EUL2OSEM screen.

(TM ={
0.25*{1,1,1,1},
0.25*{1/TMH1V,-1/TMH2V,1/TMH3V,-1/TMH4V},
0.25*{-1/TMH1T,-1/TMH2T,1/TMH3T,1/TMH4T}
}/.vals
)//TableForm

Multiplying the diagonalization matrix and the test matrix should give the identity matrix.

TM.TMtest//TableForm

IM Geometry

Updated for SR. Relative to the BS there are no changes to the symbolic version, only different numeric values.

The test matrix, which gives the change at each sensor for excursions in L, T, V, R, P and Y.

(IMtest = Transpose[{
{0,0,0,-1,0,0}, (* L *)
{0,0,0,0,-1,1}, (* T *)
{-1,-1,-1,0,0,0}, (* V *)
{0,-IMV2T,IMV3T,0,0,0}, (* R *)
{IMV1L,-IMV2L,-IMV3L,0,0,0}, (* P *)
{0,0,0,0,-IMH2L,-IMH3L} (* Y *)
}]/.vals//N
)//Transpose//TableForm

The diagonalization matrix, which attempts to undo the test matrix.  This matrix should be typed as-is into the OSEM2EUL screen and transposed into the EUL2OSEM screen.

(IM = {
{0,0,0,-1,0,0}, (* L *)
{0,0,0,0,-1,1}/2, (* T *)
{-1,-1,-1,0,0,0}/3, (* V *)
{0,-1/IMV2T,1/IMV3T,0,0,0}/2, (* R *)
{4/IMV1L,-1/IMV2L,-1/IMV3L,0,0,0}/6, (* P *)
{0,0,0,0,-1/IMH2L,-1/IMH3L}/2 (* Y *)
}/.vals//N
)//TableForm

Multiplying the diagonalization matrix and the test matrix should give the identity matrix.

IM.IMtest//TableForm

PI Geometry

Mostly updated for SR. The only big change from the BS was that the FR is colocated with the LVDT at +30 relative to the leg in the Nikhef IPs instead of -30° in the old Promec IP. The radius values are still as for BS - this is probably right for geophones and LVDTs but possibly not for the new colocated FRs -> CHECK.

Calculation

90° Rotation matrix for x/y -> L/T.

Ninety = RotationMatrix[90°]

Angular locations of the various items

IP legs

Iangles = {0°,120°,240°};

Geophones

Gangles =15°+Iangles

LVDTs

Langles = 30°+Iangles

Fishing rod steppers

Fangles = 30°+Iangles (* was -30° for BS *)

EQ stop positions

Eangles = -60°+Iangles

Positions of the various items as vectors

These are calculated by rotating the x axis {1,0} by the corresponding angles.

Ipositions =Iradius* Table[RotationMatrix[Iangles[[i]]].{1,0},{i,1,3}]

Fpositions =Fradius* Table[RotationMatrix[Fangles[[i]]].{1,0},{i,1,3}]

{{(((Sqrt[3]) Fradius)/2),-(Fradius/2)},{0,Fradius},{-(((Sqrt[3]) Fradius)/2),-(Fradius/2)}}

Gpositions =  Gradius*Table[RotationMatrix[Gangles[[i]]].{1,0},{i,1,3}]

Lpositions =  Lradius*Table[RotationMatrix[Langles[[i]]].{1,0},{i,1,3}]

Epositions =  Eradius*Table[RotationMatrix[Eangles[[i]]].{1,0},{i,1,3}]

Orientations of the various items as unit vectors

These are calculated by rotating a unit y vector {0,1} (i.e., the tangent vector at {1,0}) by the same set of angles.

Fvectors = Table[RotationMatrix[Fangles[[i]]].{0,1},{i,1,3}]

Gvectors =Table[RotationMatrix[Gangles[[i]]].{0,1},{i,1,3}]

Lvectors =Table[RotationMatrix[Langles[[i]]].{0,1},{i,1,3}]

Diagram

Graphics[{
Circle[{0,0},R],
Sequence[Table[Disk[Ipositions[[i]],Iradius2],
{i,1,3}
]],
Sequence[Table[Text[i-1,Ipositions[[i]],Background->White],{i,1,3}]],Sequence[Table[Circle[Epositions[[i]],Eradius2],
{i,1,3}
]],
Sequence[Table[Text[i-1,Epositions[[i]],Background->White],{i,1,3}]],
Red,
Sequence[Table[Arrow[{Fpositions[[i]]-Fvectors[[i]]*l/2,Fpositions[[i]]+Fvectors[[i]]*l/2}],{i,1,3}
]],
Black,Sequence[Table[Text[i-1,Fpositions[[i]],Background->White],{i,1,3}]],
Green,
Sequence[Table[Arrow[{Gpositions[[i]]-Gvectors[[i]]*l/2,Gpositions[[i]]+Gvectors[[i]]*l/2}],{i,1,3}
]],
Black,Sequence[Table[Text[i-1,Gpositions[[i]],Background->White],{i,1,3}]],
Blue,
Sequence[Table[Arrow[{Lpositions[[i]]-Lvectors[[i]]*l/2,Lpositions[[i]]+Lvectors[[i]]*l/2}],{i,1,3}
]],
Black,Sequence[Table[Text[i-1,Lpositions[[i]],Background->White],{i,1,3}]],
Arrow[{{0,0},{R/2,0}}],Text["x=-T",{R/5,0},Background->White],
Arrow[{{0,0},{0,R/2}}],Text["y=L",{0,R/5},Background->White],
Gray,
Arrow[{{0,0},{-R/2,0}}],Text["T=-x",{-R/5,0},Background->White]
}]/.vals

Matrices between L/T/Y and LVDTs

Usage: {L0, L1, L2}= LVDTfromLTY.{L, T, Y}

(LVDTfromLTY = {
Table[Lvectors[[i]].Ninety.{1,0},{i,1,3}],
Table[Lvectors[[i]].Ninety.{0,1},{i,1,3}],
Table[Lradius,{i,1,3}]
})//TableForm

Usage: type these numbers into EUL2COIL

Transpose[LVDTfromLTY]/.vals//N//TableForm

Usage: {L, T, Y}= LTYfromLVDT.{L0, L1, L2}

(LTYfromLVDT = Inverse[LVDTfromLTY])//TableForm

Usage: type these numbers into LVDT2EUL

Transpose[LTYfromLVDT]/.vals//N//TableForm

Matrices between L/T/Y and Geophones

Usage: {G0, G1, G2}= GfromLTY.{L, T, Y} (assuming the geophones had actuation)

(GfromLTY = {
Table[Gvectors[[i]].Ninety.{1,0},{i,1,3}],
Table[Gvectors[[i]].Ninety.{0,1},{i,1,3}],
Table[Gradius,{i,1,3}]
})//TableForm

Usage: you would type these numbers into EUL2ACC if it existed, which it doesn’t because geophones don’t have actuation.

Transpose[GfromLTY]/.vals//N//TableForm

Usage: {L, T, Y}= LTYfromG.{G0, G1, G2}

(LTYfromG = Inverse[GfromLTY]//Simplify)//TableForm

Usage: type these numbers into ACC2EUL

Transpose[LTYfromG]/.vals//N//TableForm

Matrices between L/T/Y and FRs

Usage: {F0, F1, F2}= FfromLTY.{L, T, Y}

(FfromLTY = {
Table[Fvectors[[i]].Ninety.{1,0},{i,1,3}],
Table[Fvectors[[i]].Ninety.{0,1},{i,1,3}],
Table[Fradius,{i,1,3}]
})//TableForm

({{((Sqrt[3])/2), 0, -((Sqrt[3])/2)}, {-(1/2), 1, -(1/2)}, {Fradius, Fradius, Fradius}})

Usage: write a Python script to take DC force/torque requests in LTY coordinates, multiply by this matrix and output stepper motor movements in steps.

FfromLTY/.vals//N//TableForm

Usage: {L, T, Y}= LTYfromF.{F0, F1, F2}

(LTYfromF = Inverse[FfromLTY]//Simplify)//TableForm

({{(1/(Sqrt[3])), -(1/3), (1/(3 Fradius))}, {0, (2/3), (1/(3 Fradius))}, {-(1/(Sqrt[3])), -(1/3), (1/(3 Fradius))}})

Usage: you would type these numbers into FR2EUL, if it existed, which it doesn’t because FRs don’t have sensing.

Transpose[LTYfromF]/.vals//N//TableForm