Skip to content

Commit 7d7de94

Browse files
authored
fix: Pathfinder atlas direction patch (#605)
* Reorganize script * Updated pathfinder space
1 parent 706d65c commit 7d7de94

File tree

3 files changed

+88
-88
lines changed

3 files changed

+88
-88
lines changed

Assets/Scripts/Pinpoint/CoordinateSystems/PathfinderSpace.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ public class PathfinderSpace : CoordinateSpace
1616

1717
public override Vector3 Space2World(Vector3 coordSpace, bool useReference = true)
1818
{
19-
return new Vector3(coordSpace.x, -coordSpace.z, -coordSpace.y);
19+
return new Vector3(coordSpace.x, coordSpace.z, coordSpace.y);
2020
}
2121

2222
public override Vector3 World2Space(Vector3 coordWorld, bool useReference = true)
2323
{
24-
return new Vector3(coordWorld.x, -coordWorld.z, -coordWorld.y);
24+
return new Vector3(coordWorld.x, coordWorld.z, coordWorld.y);
2525
}
2626

2727
public override Vector3 Space2World_Vector(Vector3 vecSpace)

Assets/Scripts/Pinpoint/Probes/ManipulatorBehaviorController.cs

Lines changed: 84 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class ManipulatorBehaviorController : MonoBehaviour
3232

3333
public int NumAxes { get; set; }
3434

35-
public Vector3 Dimensions { get; set; }
35+
public Vector3 Dimensions { get; private set; }
3636

3737
/**
3838
* Getter and setter or the zero coordinate offset of the manipulator.
@@ -140,88 +140,6 @@ private void OnDisable()
140140

141141
#endregion
142142

143-
#region Private Methods
144-
145-
private void EchoPosition(Vector4 pos)
146-
{
147-
if (!enabled && _probeController == null) return;
148-
149-
// Check for special Pathfinder mode (directly set probe position, no calculations needed)
150-
if (NumAxes == -1)
151-
{
152-
CommunicationManager.Instance.GetAngles(ManipulatorID, angles =>
153-
{
154-
_probeController.SetProbeAngles(new Vector3(angles.x, 90 - angles.y, angles.z));
155-
156-
// Convert Pathfinder space coordinates into active atlas space
157-
_probeController.SetProbePosition(
158-
BrainAtlasManager.ActiveReferenceAtlas.World2Atlas_Vector(
159-
CoordinateSpace.Space2World_Vector(pos)));
160-
});
161-
}
162-
else
163-
{
164-
// Calculate last used direction for dropping to brain surface (between depth and DV)
165-
var dvDelta = Math.Abs(pos.z - _lastManipulatorPosition.z);
166-
var depthDelta = Math.Abs(pos.w - _lastManipulatorPosition.w);
167-
if (dvDelta > 0.0001 || depthDelta > 0.0001) IsSetToDropToSurfaceWithDepth = depthDelta > dvDelta;
168-
_lastManipulatorPosition = pos;
169-
170-
// Apply zero coordinate offset
171-
var zeroCoordinateAdjustedManipulatorPosition = pos - ZeroCoordinateOffset;
172-
173-
// Convert to coordinate space
174-
var manipulatorSpacePosition = CoordinateTransform.T2U(zeroCoordinateAdjustedManipulatorPosition);
175-
176-
// Brain surface adjustment
177-
var brainSurfaceAdjustment = float.IsNaN(BrainSurfaceOffset) ? 0 : BrainSurfaceOffset;
178-
if (IsSetToDropToSurfaceWithDepth)
179-
zeroCoordinateAdjustedManipulatorPosition.w += brainSurfaceAdjustment;
180-
else
181-
manipulatorSpacePosition.y -= brainSurfaceAdjustment;
182-
183-
// Convert to world space
184-
var zeroCoordinateAdjustedWorldPosition =
185-
CoordinateSpace.Space2World(manipulatorSpacePosition);
186-
187-
// Set probe position (change axes to match probe)
188-
var transformedApmldv =
189-
_probeController.Insertion.World2T_Vector(zeroCoordinateAdjustedWorldPosition);
190-
191-
// Split between 3 and 4 axis assignments
192-
if (CoordinateTransform.Prefix == "3lhm")
193-
_probeController.SetProbePosition(transformedApmldv);
194-
else
195-
_probeController.SetProbePosition(new Vector4(transformedApmldv.x, transformedApmldv.y,
196-
transformedApmldv.z, zeroCoordinateAdjustedManipulatorPosition.w));
197-
}
198-
199-
// Log every 5 hz
200-
if (Time.time - _lastLoggedTime >= 0.2)
201-
{
202-
_lastLoggedTime = Time.time;
203-
var tipPos = _probeController.ProbeTipT.position;
204-
205-
// ["ephys_link", Real time stamp, Manipulator ID, X, Y, Z, W, Phi, Theta, Spin, TipX, TipY, TipZ]
206-
string[] data =
207-
{
208-
"ephys_link", Time.realtimeSinceStartup.ToString(CultureInfo.InvariantCulture), ManipulatorID,
209-
pos.x.ToString(CultureInfo.InvariantCulture), pos.y.ToString(CultureInfo.InvariantCulture),
210-
pos.z.ToString(CultureInfo.InvariantCulture), pos.w.ToString(CultureInfo.InvariantCulture),
211-
_probeController.Insertion.Yaw.ToString(CultureInfo.InvariantCulture),
212-
_probeController.Insertion.Pitch.ToString(CultureInfo.InvariantCulture),
213-
_probeController.Insertion.Roll.ToString(CultureInfo.InvariantCulture),
214-
tipPos.x.ToString(CultureInfo.InvariantCulture), tipPos.y.ToString(CultureInfo.InvariantCulture),
215-
tipPos.z.ToString(CultureInfo.InvariantCulture)
216-
};
217-
OutputLog.Log(data);
218-
}
219-
220-
// Continue echoing position
221-
CommunicationManager.Instance.GetPos(ManipulatorID, EchoPosition);
222-
}
223-
224-
#endregion
225143

226144
#region Public Methods
227145

@@ -270,7 +188,7 @@ void StartEchoing()
270188
});
271189
}
272190

273-
public void UpdateSpaceAndTransform()
191+
private void UpdateSpaceAndTransform()
274192
{
275193
CoordinateSpace = NumAxes switch
276194
{
@@ -416,5 +334,87 @@ public void MoveBackToZeroCoordinate(Action<Vector4> onSuccessCallback, Action<s
416334
}
417335

418336
#endregion
337+
338+
#region Private Methods
339+
340+
private void EchoPosition(Vector4 pos)
341+
{
342+
if (!enabled && _probeController == null) return;
343+
344+
// Check for special Pathfinder mode (directly set probe position, no calculations needed)
345+
if (NumAxes == -1)
346+
{
347+
CommunicationManager.Instance.GetAngles(ManipulatorID, angles =>
348+
{
349+
_probeController.SetProbeAngles(new Vector3(angles.x, 90 - angles.y, angles.z));
350+
351+
// Convert Pathfinder space coordinates into active atlas space
352+
_probeController.SetProbePosition(
353+
_probeController.Insertion.World2T_Vector(CoordinateSpace.Space2World_Vector(pos)));
354+
});
355+
}
356+
else
357+
{
358+
// Calculate last used direction for dropping to brain surface (between depth and DV)
359+
var dvDelta = Math.Abs(pos.z - _lastManipulatorPosition.z);
360+
var depthDelta = Math.Abs(pos.w - _lastManipulatorPosition.w);
361+
if (dvDelta > 0.0001 || depthDelta > 0.0001) IsSetToDropToSurfaceWithDepth = depthDelta > dvDelta;
362+
_lastManipulatorPosition = pos;
363+
364+
// Apply zero coordinate offset
365+
var zeroCoordinateAdjustedManipulatorPosition = pos - ZeroCoordinateOffset;
366+
367+
// Convert to coordinate space
368+
var manipulatorSpacePosition = CoordinateTransform.T2U(zeroCoordinateAdjustedManipulatorPosition);
369+
370+
// Brain surface adjustment
371+
var brainSurfaceAdjustment = float.IsNaN(BrainSurfaceOffset) ? 0 : BrainSurfaceOffset;
372+
if (IsSetToDropToSurfaceWithDepth)
373+
zeroCoordinateAdjustedManipulatorPosition.w += brainSurfaceAdjustment;
374+
else
375+
manipulatorSpacePosition.y -= brainSurfaceAdjustment;
376+
377+
// Convert to world space
378+
var zeroCoordinateAdjustedWorldPosition =
379+
CoordinateSpace.Space2World(manipulatorSpacePosition);
380+
381+
// Set probe position (change axes to match probe)
382+
var transformedApmldv =
383+
_probeController.Insertion.World2T_Vector(zeroCoordinateAdjustedWorldPosition);
384+
385+
// Split between 3 and 4 axis assignments
386+
if (CoordinateTransform.Prefix == "3lhm")
387+
_probeController.SetProbePosition(transformedApmldv);
388+
else
389+
_probeController.SetProbePosition(new Vector4(transformedApmldv.x, transformedApmldv.y,
390+
transformedApmldv.z, zeroCoordinateAdjustedManipulatorPosition.w));
391+
}
392+
393+
// Log every 5 hz
394+
if (Time.time - _lastLoggedTime >= 0.2)
395+
{
396+
_lastLoggedTime = Time.time;
397+
var tipPos = _probeController.ProbeTipT.position;
398+
399+
// ["ephys_link", Real time stamp, Manipulator ID, X, Y, Z, W, Phi, Theta, Spin, TipX, TipY, TipZ]
400+
string[] data =
401+
{
402+
"ephys_link", Time.realtimeSinceStartup.ToString(CultureInfo.InvariantCulture), ManipulatorID,
403+
pos.x.ToString(CultureInfo.InvariantCulture), pos.y.ToString(CultureInfo.InvariantCulture),
404+
pos.z.ToString(CultureInfo.InvariantCulture), pos.w.ToString(CultureInfo.InvariantCulture),
405+
_probeController.Insertion.Yaw.ToString(CultureInfo.InvariantCulture),
406+
_probeController.Insertion.Pitch.ToString(CultureInfo.InvariantCulture),
407+
_probeController.Insertion.Roll.ToString(CultureInfo.InvariantCulture),
408+
tipPos.x.ToString(CultureInfo.InvariantCulture), tipPos.y.ToString(CultureInfo.InvariantCulture),
409+
tipPos.z.ToString(CultureInfo.InvariantCulture)
410+
};
411+
OutputLog.Log(data);
412+
}
413+
414+
// Continue echoing position
415+
CommunicationManager.Instance.GetPos(ManipulatorID, EchoPosition);
416+
}
417+
418+
#endregion
419419
}
420420
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
{
2-
"Date": "11/30/2023 3:46:50 PM",
2+
"Date": "12/11/2023 1:28:36 PM",
33
"UnityVersion": "2022.3.12f1",
44
"com.unity.scriptablebuildpipeline": "1.21.20",
55
"com.unity.addressables": "1.21.18",
66
"traceEvents": [
7-
{"name": "Building Use Existing Build (requires built groups)", "ph": "X", "dur": 4626.1, "tid": 1, "ts": 1758, "pid": 1}
7+
{"name": "Building Use Existing Build (requires built groups)", "ph": "X", "dur": 4203.7, "tid": 1, "ts": 1585, "pid": 1}
88
]
99
}

0 commit comments

Comments
 (0)