Hi Guys,
I thought I should update this thread with some of my later findings.
I recently set-up a machine for local LLM, and wanted to learn opencode a bit, so I figured a good way would be to see if I could get parallel alignment working the way I envision it, without having to write any code myself, being horrible at Java. I primarily used Qwen 122B A10B Q5 for this work.
I'm still testing, have not run any panels yet. But it feels solid.
Anyway, since before, I had the dual bottom cameras, as described earlier in this thread, which let med settle the head only once, which is the biggest benefit, now I wanted to first capture the images in parallel and then do the alignment in parallel as well. While doing this, I decided to scrap some of my old concept, to make the implementation cleaner.
So, the result is at couple of hundred CPH better - currently at about 3750 average with 4mm feed on 0402. Unfortunately, I did not reach 4000CPH, so the hunt has to continue :-) (well I could easily pass 4k if I pull 8mm, but that is kind of cheating)

Typical camera session (mainly the settle time differs between shots, but also the alignment time);
026-04-26 18:48:53.932 ReferencePnpJobProcessor$ParallelAlign DEBUG: Head moved to alignment position for nozzle N2, camera CAM1830e742fb154786
2026-04-26 18:48:53.932 ReferencePnpJobProcessor$ParallelAlign TRACE: Async capture started for camera Upp1, part C0402-22p/50V
2026-04-26 18:48:53.934 TravelCost TRACE: Travel cost estimation for headmountable Down Locking not avaiable on Z axis
2026-04-26 18:48:53.934 TravelCost TRACE: Travel cost estimation for headmountable Down Locking not avaiable on Z axis
2026-04-26 18:48:53.934 TravelCost TRACE: Travel cost estimation for headmountable Down Locking not avaiable on rotational axis
2026-04-26 18:48:53.934 TravelCost TRACE: Travel cost estimation for headmountable Down Locking not avaiable on rotational axis
2026-04-26 18:48:53.934 TravellingSalesman TRACE: Using estimated travel cost as metric
2026-04-26 18:48:53.934 TravellingSalesman TRACE: Using estimated travel cost as metric
2026-04-26 18:48:53.934 ReferenceBottomVision DEBUG: captureImageOnly: isFirstNozzleTip=false, cameraOffset=(0.238690, 0.114669, 0.000000, 0.000000 mm), runoutCompensation=(-0.019026, 0.000999, 0.000000, 0.000000 mm), displacementDelta=(0.219664, 0.115668, 0.000000, 0.000000 mm)
2026-04-26 18:48:53.934 ReferenceBottomVision DEBUG: captureImageOnlyWithSettle: isFirstNozzleTip=true, cameraOffset=(-0.114905, 0.045446, 0.000000, 0.000000 mm), runoutCompensation=(-0.109379, -0.025817, 0.000000, 0.000000 mm), displacementDelta=(0.000000, 0.000000, 0.000000, 0.000000 mm)
2026-04-26 18:48:53.935 Scripting TRACE: Scripting.on Camera.BeforeCapture
2026-04-26 18:48:53.935 Scripting TRACE: Scripting.on Camera.BeforeSettle
2026-04-26 18:48:53.935 Scripting TRACE: Scripting.on Camera.BeforeCapture
2026-04-26 18:48:53.943 Scripting TRACE: Scripting.on Camera.AfterCapture
2026-04-26 18:48:53.944 Scripting TRACE: Scripting.on Camera.AfterCapture
2026-04-26 18:48:53.945 AbstractCamera TRACE: Camera 'Upp1' actuateLightAfterCapture called
2026-04-26 18:48:53.945 ReferenceCameraBatchOperation DEBUG: Camera 'Upp1' registered with batch 'parallel-align-precapture' (level 2)
2026-04-26 18:48:53.945 AbstractCamera DEBUG: Camera 'Upp1' registered with batch operation - deferring light off
2026-04-26 18:48:53.945 ReferencePnpJobProcessor$ParallelAlign TRACE: Async capture completed for camera Upp1, part C0402-22p/50V
2026-04-26 18:48:53.945 Scripting TRACE: Scripting.on Camera.BeforeCapture
2026-04-26 18:48:53.953 Scripting TRACE: Scripting.on Camera.AfterCapture
2026-04-26 18:48:53.956 AbstractSettlingCamera TRACE: autoSettleAndCapture t=21 auto settle score: 1.284 compute time: 2
2026-04-26 18:48:53.956 Scripting TRACE: Scripting.on Camera.BeforeCapture
2026-04-26 18:48:53.966 Scripting TRACE: Scripting.on Camera.AfterCapture
2026-04-26 18:48:53.968 AbstractSettlingCamera TRACE: autoSettleAndCapture t=34 auto settle score: 0.323 compute time: 2
2026-04-26 18:48:53.968 Scripting TRACE: Scripting.on Camera.BeforeCapture
2026-04-26 18:48:53.981 Scripting TRACE: Scripting.on Camera.AfterCapture
2026-04-26 18:48:53.984 AbstractSettlingCamera TRACE: autoSettleAndCapture t=49 auto settle score: 0.248 compute time: 2
2026-04-26 18:48:53.984 AbstractSettlingCamera DEBUG: autoSettleAndCapture in 49 ms
2026-04-26 18:48:53.984 Scripting TRACE: Scripting.on Camera.AfterSettle
2026-04-26 18:48:53.984 AbstractCamera TRACE: Camera 'Upp2' actuateLightAfterCapture called
2026-04-26 18:48:53.984 ReferenceCameraBatchOperation DEBUG: Camera 'Upp2' registered with batch 'parallel-align-precapture' (level 2)
2026-04-26 18:48:53.984 AbstractCamera DEBUG: Camera 'Upp2' registered with batch operation - deferring light off
2026-04-26 18:48:53.984 ReferencePnpJobProcessor$ParallelAlign TRACE: Waiting for 1 async camera captures to complete
2026-04-26 18:48:53.984 ReferencePnpJobProcessor$ParallelAlign TRACE: Async capture 1 added to buffer (camera: CAM1830e7329b17e54f, nozzle: N1)
2026-04-26 18:48:53.984 ReferencePnpJobProcessor$ParallelAlign TRACE: All async captures complete, 1 shots added
2026-04-26 18:48:53.984 ReferenceCameraBatchOperation TRACE: Batch END level 2 'parallel-align-precapture' - expected: parallel-align-precapture
2026-04-26 18:48:53.985 ReferencePnpJobProcessor$ParallelAlign DEBUG: Camera batch operation ended for parallel alignment pre-capture
2026-04-26 18:48:53.985 Scripting TRACE: Scripting.on Vision.PartAlignment.Before
2026-04-26 18:48:53.985 Scripting TRACE: Scripting.on Vision.PartAlignment.Before
2026-04-26 18:48:53.988 TravelCost TRACE: Travel cost estimation for headmountable Down Locking not avaiable on Z axis
2026-04-26 18:48:53.988 TravelCost TRACE: Travel cost estimation for headmountable Down Locking not avaiable on Z axis
2026-04-26 18:48:53.988 TravelCost TRACE: Travel cost estimation for headmountable Down Locking not avaiable on rotational axis
2026-04-26 18:48:53.988 TravelCost TRACE: Travel cost estimation for headmountable Down Locking not avaiable on rotational axis
2026-04-26 18:48:53.988 TravellingSalesman TRACE: Using estimated travel cost as metric
2026-04-26 18:48:53.988 TravellingSalesman TRACE: Using estimated travel cost as metric
2026-04-26 18:48:54.005 MaskHsv TRACE: Fraction actually masked = 0.006509479241660676
2026-04-26 18:48:54.007 MaskHsv TRACE: Fraction actually masked = 0.0
2026-04-26 18:48:54.011 MaskHsv TRACE: Fraction actually masked = 0.9993760499160067
2026-04-26 18:48:54.013 MaskHsv TRACE: Fraction actually masked = 0.9993897338142322
2026-04-26 18:48:54.030 ReferenceBottomVision DEBUG: Alignment result: C0402-22p/50V
2026-04-26 18:48:54.030 ReferenceBottomVision DEBUG: Upp2 displacement (parallel), using displacement delta (0.000000, 0.000000, 0.000000, 0.000000 mm)
2026-04-26 18:48:54.030 ReferenceBottomVision DEBUG: Bottom vision part C0402-22p/50V result rect { {536.0, 459.0} 36x20 * 0.0 }
2026-04-26 18:48:54.030 ReferenceBottomVision DEBUG: Offsets accepted (-0.105166, 0.105579, 0.000000, 0.112518 mm)
2026-04-26 18:48:54.031 ReferenceBottomVision DEBUG: Alignment result: C0402-22p/50V | X:-0.105 Y:0.106 C:0.113 Δ:0.149
2026-04-26 18:48:54.031 ReferenceBottomVision DEBUG: Part C0402-22p/50V size ok. Width 0.948, Length 0.527
2026-04-26 18:48:54.032 AbstractNozzle TRACE: Nozzle N2: set rotation mode offset: -22.443740797070962°.
2026-04-26 18:48:54.032 Scripting TRACE: Scripting.on Vision.PartAlignment.After
2026-04-26 18:48:54.032 ReferenceBottomVision DEBUG: Alignment result: C0402-22p/50V
2026-04-26 18:48:54.032 ReferenceBottomVision DEBUG: Upp1 displacement (parallel), using displacement delta (0.219664, 0.115668, 0.000000, 0.000000 mm)
2026-04-26 18:48:54.032 ReferenceBottomVision DEBUG: Bottom vision part C0402-22p/50V result rect { {536.2377319335938, 474.1147766113281} 37x20 * -5.194427490234375 }
2026-04-26 18:48:54.032 ReferenceBottomVision DEBUG: Offsets accepted (-0.074987, -0.009527, 0.000000, 5.306946 mm)
2026-04-26 18:48:54.033 ReferenceBottomVision DEBUG: Alignment result: C0402-22p/50V | X:0.145 Y:0.106 C:5.307 Δ:0.179
2026-04-26 18:48:54.033 ReferenceBottomVision DEBUG: Part C0402-22p/50V size ok. Width 1.004, Length 0.549
2026-04-26 18:48:54.034 AbstractNozzle TRACE: Nozzle N1: set rotation mode offset: -17.249313306836587°.
2026-04-26 18:48:54.034 Scripting TRACE: Scripting.on Vision.PartAlignment.After
Of course there's a short
video clip of this.
- Micael