Koh Young Technology

AOI Inspection · Resource-Aware Computation Time Optimization

4th Koh Young AI Contest — ICCAS 2026
RegistrationJul. 1 โ€“ Aug. 28, 2026
CompetitionSep. 7 โ€“ Oct. 9, 2026
AwardOct. 29, 2026
๐Ÿ“‹ Registration & Details at ICCAS 2026 Official Page โ†—
Problem Description CT + Calculation Time Scoring Full Code Open Source
1 Problem Overview
AOI (Automatic Optical Inspection) is equipment that automatically inspects electronic components on a PCB. A camera head moves across the PCB, capturing images and performing 3D reconstruction and inspection.

📷 AOI Camera Structure

Imaging Head Top Side Side LED Lighting PCB Top FOV Side FOV (ยฝ) Top Imaging Side Imaging Top Camera โ€” Component surface inspection Side Camera โ€” Solder side inspection

The AOI equipment has a single imaging head with a Top camera (top-down view) and multiple Side cameras (angled views) mounted together.

Top Camera

Captures the top surface of components vertically. Inspects presence, position error, orientation, etc. All components require Top imaging, and side=1 components additionally require Side imaging.

Side Camera

Captures the side solder fillet at an angle. Only applies to components with side=1. In this contest, the Side FOV is assumed to be half the size of the Top FOV.

💡 Both cameras are mounted on the same head, move together, and capture simultaneously at each position. There is no need to create separate FOVs for Side imaging only.
FOVs containing side=1 components have increased capture time of max(capture_time, side_capture_time).

🔍 What are Components and FOVs?

Components are electronic parts (resistors, ICs, etc.) mounted on a PCB, and FOV (Field of View) is the rectangular area captured in a single camera shot.

The camera moves from FOV to FOV, capturing multiple components in each shot. FOV size is fixed; participants determine the position and number of FOVs.

💡 The more components packed into each FOV, the fewer total FOVs needed, reducing both movement count and CT.
PCB Board FOV 1 (2 comps) FOV 2 (2 comps) FOV 3 (2 comps) Comp. FOV FOV Center Path (1→2→3)

🧩 Three Problems to Solve

For the camera to efficiently traverse the PCB, three decisions must be made. Because each decision affects the others, combinatorial explosion (NP-hard) occurs, and these three decisions determine the Cycle Time (CT).

STEP 1
FOV Placement
Determine FOV positions and count
to cover all components
STEP 2
Component Assignment
Decide which components
belong to each FOV
STEP 3
Inspection Order
Optimize FOV visit order
(Fiducial → Barcode → Normal)
RESULT
CT Calculation
Auto-calculated by
Checker from Steps 1~3
💡 Components accidentally left unassigned to any FOV are automatically assigned by the Checker using a greedy approach.
Even with just 3 FOVs, there are 6 possible orderings. When FOV placement variations are included, the search space grows exponentially. The core count is a fixed input constraint, so focus on minimizing FOV count and optimizing visit order for the lowest Cycle Time.

STEP 4 — How CT Is Calculated

The AOI machine doesn’t inspect the entire PCB at once. It repeats Capture → 3D Recon → Inspect per FOV, with different Cores working simultaneously to save time. Click through the 8 steps to see the pipeline in action!

C0 Capโ‘ 
Core 0 captures FOV โ‘  with the camera.
⏱ Capture time = capture_time (input parameter, fixed)
C0 Move+C1 Recโ‘ 
As soon as capture finishes, Core 0 immediately moves to the next FOV! Meanwhile, Core 1 starts 3D Reconstruction of FOV โ‘  in parallel.
✨ This is the pipeline’s key insight — Move and Recon happen simultaneously!
⏱ Move time = max(Tx, Ty) / Recon time = Σ(component time)
C0 Capโ‘ก
Core 0 captures FOV โ‘ก. Meanwhile, Core 1 is still finishing Recon for FOV โ‘ .
⏱ Capture time = capture_time
C0 Move+C2 Recโ‘ก+C3 Insโ‘ +C4 Insโ‘ 
Maximum parallelism! 4 Cores working simultaneously:
C0: Moving to FOV โ‘ข
C2: 3D Recon of FOV โ‘ก
C3: Inspect FOV โ‘  comp a   C4: Inspect FOV โ‘  comp b
Components vary in size, so inspection times differ → balanced assignment matters!
⏱ Inspect time = max(C3 assignment, C4 assignment) — 2 components across 2 Cores
C0 Capโ‘ข
Core 0 captures the last FOV โ‘ข.
⏱ Capture time = capture_time
C1 Recโ‘ข+C3 Insโ‘ก+C4 Insโ‘ก
Core 0 has finished all captures. Remaining Cores continue processing:
C1: Recon FOV โ‘ข
C3: Inspect FOV โ‘ก comp a   C4: Inspect FOV โ‘ก comp b
⏱ When C0 finishes fast, the other Cores determine the CT
C3 Insโ‘ข+C4 Insโ‘ข
Final inspection! Core 3 and Core 4 each inspect one component from FOV โ‘ข.
Larger components take longer, so which Core gets which component affects CT.
⏱ Inspect time = max(C3 assignment, C4 assignment)
All Done
All FOVs have been captured, reconstructed, and inspected!
CT = when the last Core finishes (the slowest Core determines CT)
▼ Core Pipeline Timeline
Core 4Inspect
Core 3Inspect
Core 23D Recon
Core 13D Recon
Core 0Cap+Move
①a
②a
③a
①b
②b
③b

📊 CT Difference Based on FOV Layout and Inspection Order

Even with the same component layout, the total Cycle Time varies significantly depending on how FOVs are grouped and the inspection order.

Case A — ①→②→③ Sequential Case B — ①→③→② Zigzag FOV ① FOV ② FOV ③ 1 2 3 → Short total travel distance FOV ① FOV ② FOV ③ 1 2 3 ↗ Long move! ↙ Backtracking! → Long total travel distance ▼ Pipeline Timeline ▼ Pipeline Timeline Core 3+ (Inspect) Core 1 (Recon) Core 0 (Capture) โ‘  Inspect โ‘ก Inspect โ‘ข Inspect โ‘  โ‘ก โ‘ข โ‘  โ†’ โ‘ก โ†’ โ‘ข CT = 7.8s 0 2 4 6 8 Core 3+ (Inspect) Core 1 (Recon) Core 0 (Capture) โ‘  Inspect โ‘ข Inspect โ‘ก Inspect โ‘  Wait โ‘ข Wait โ‘ก โ‘  Move โ‘ข Move โ‘ก CT = 9.8s 0 2 4 6 8 10 ✔ Sequential → CT 7.8s ✘ Zigzag → CT 9.8s (+26%) Even with the same FOV layout, Cycle Time varies significantly depending on inspection order 3 FOV order permutations = 6 combinations · Including FOV placement choices, the search space grows exponentially

🧩 PCB Component Types

Fiducial (type=2)

The origin (starting point) of the PCB coordinate system. Since slight positional errors occur when the PCB is placed on the machine, Fiducial coordinates are measured first to calibrate the entire coordinate system.

Key: Must be placed in the first FOV exclusively / No other components allowed in Fiducial FOV

Barcode (type=1)

PCB model identifier. Barcodes identify which PCB model is being inspected, allowing model-specific inspection programs to be applied. Inspected after Fiducials.

Key: Inspected after Fiducials / Multiple allowed in the same FOV / 0~4 per PCB

Normal Component (type=0)

The actual inspection targets โ€” SMD components (resistors, capacitors, ICs, etc.). Their position, orientation, and solder quality are inspected in 3D.

Key: Inspected after Fiducial/Barcode / Order can be freely optimized

🔧 Side Camera & FOV Two-Layer Structure

Some components (side=1) require a Side camera (side solder inspection) in addition to the Top camera. The Side FOV is half the size of the Top FOV, sharing the same center point.

  • side=0Top camera only (most components) — OK if within Top FOV
  • side=1 → Top + Side camera required — must be fully within the smaller Side FOV
OK vs NG — side=1 Component Placement
OK Top FOV Side FOV (1/2) side=0 side=1 side=1 inside Side FOV → Pass side=0 only needs Top FOV NG Top FOV Side FOV (1/2) side=1 Inside Top FOV but outside Side FOV → Violation! side=1 must be within Side FOV
2 Contest Format and Scoring
You only need to implement solver.py. The max_core is given as a fixed input parameter (random 4–16 per dataset).

🏆 Scoring

📅 The scoring method will be announced when the competition begins (Sep. 7, 2026).
The 96 datasets in simulation_data/ are for development and testing. Final official scoring uses a separate hidden test set.
3 Constraint Details
These are mandatory conditions to ensure valid inspection results. All conditions must be satisfied without violations for a solution to be accepted.

3-1. FOV Size — Physical size of the area captured in a single camera shot

#ConstraintDetails
1.1Top FOV Size The Top camera's field of view. Defined by the fov_size value in input_size.csv.
FOV size is defined separately for the x and y axes.
Example (input_size.csv)
fov_size x=50mm, y=50mm โ†’ Top FOV is a 50mm × 50mm rectangle
1.2Side FOV Size In this contest, the Side camera's field of view is assumed to be half of the Top FOV (per axis).
side_fov_w = fov_width / 2.0, side_fov_h = fov_height / 2.0
The Side FOV and Top FOV share the same center point.
Example
If Top FOV is 50×50mm โ†’ Side FOV is 25×25mm, same center point
1.3Top + Side Combined Capture The AOI equipment has a Top Camera (shoots downward from above) and Side Cameras (shoot at oblique angles for side views). The Top camera inspects the component surface, while the Side cameras inspect solder fillet geometry on the component sides. Both cameras are mounted on the same capture head and move together simultaneously.

Components with side=1 require additional Side camera capture on top of the Top capture. Since both cameras capture simultaneously at the same position, the imaging time is the longer of the two.
The Top FOV and Side FOV share the same center point โ€” a single FOV position captures both Top and Side simultaneously. No need for separate Side-only FOVs.
However, if an FOV contains even one side=1 component, its capture time becomes max(capture_time, side_capture_time).
💡 Optimization Tip: When side=1 and side=0 components are in the same FOV, the Side capture cost (side_capture_time) is incurred only once while normal components are also inspected โ€” saving FOVs. If Side components fit within the Side FOV and normal components within the Top FOV, one FOV covers everything.
PCB Top FOV Side FOV (1/2) Shared Center Normal Comp Side Comp Top FOV (blue) Side FOV (blue, 1/2 size) Center point (Top=Side)
💡 Key Point: FOV size is fixed as input. What participants decide is the position (x, y) and number of FOVs.
Side FOV Warning: side=1 components must be fully contained within the blue Side FOV area. Even if inside the Top FOV, being outside the Side FOV is a constraint violation.
💡 Optimization Tip: Side components benefit from being clustered near the FOV center. Since the Side FOV is half the Top, Side components far from center may require separate FOVs, increasing FOV count.

3-2. Component Placement — Rules for placing components within FOVs

#ConstraintDetails
2.1Full Component Coverage All components must be included in at least one FOV. Missing components constitute a constraint violation.
Verification (checker.py)
Check that comp_mask[idx] is 1 for each component. If any is 0, it fails.
2.2Fully Contained Within FOV All 4 corners (tl, tr, bl, br) of a component must be inside the FOV area.
Any part of a component extending outside the FOV is a constraint violation.
Criteria
fov_tl_x ≤ comp_tl_x AND fov_tl_y ≤ comp_tl_y AND fov_br_x ≥ comp_br_x AND fov_br_y ≥ comp_br_y
2.3Fiducial FOV Restriction Fiducial components (type=2) must be placed in the first FOV exclusively. No other components allowed in the Fiducial FOV.
Fiducials define the origin (starting point) of the PCB coordinate system for precise position calibration.
2.4Barcode FOV Rules Barcodes (type=1), unlike Fiducials, can have multiple in the same FOV.
Barcodes are PCB model identifiers used to determine which PCB model is being inspected. Must be inspected after Fiducials.

A Barcode FOV can also contain Normal components (type=0). The FOV's type is determined by the highest type among its components: fov.type = max(component types in FOV). So a FOV containing both Barcode(1) and Normal(0) components becomes a Barcode FOV (type=1).
Fiducial vs Barcode
Fiducial (type=2): First FOV, exclusive โ€” no other components allowed
Barcode (type=1): Multiple per FOV, can include Normal(0) components too โ†’ Group nearby Barcodes and Normals for efficient placement
💡 Optimization Point: Grouping Barcodes with nearby Normal components into one FOV reduces total FOV count. The FOV is automatically classified as type=1 (Barcode) and placed in the correct inspection order.
2.5Large Component Split Inspection When a component is larger than its effective FOV, it is inspected by splitting across multiple FOVs.
The union of split FOVs must fully cover the entire component area without gaps.
Effective FOV per component type
side=0: effective FOV = Top FOV (fov_width × fov_height)
side=1: effective FOV = Side FOV (fov_width/2 × fov_height/2)
A side component exceeding the Side FOV (but smaller than the Top FOV) is still a “large component” and must be split.
Verification
The is_target_fully_covered() function verifies that the union of effective FOV areas fully covers the component. For side=1 large components, the coverage check uses the Side FOV area of each assigned FOV. Grid-based partitioning checks for any uncovered cells.
2.6Side Component Placement Components with side=1 must have all 4 corners fully contained within the Side FOV (1/2 of Top) area.
Since the Side FOV is smaller than the Top FOV, a component may fit in the Top FOV but not the Side FOV.
Criteria (checker.py code)
side_tl_x = fov.x - fov_width/4, side_br_x = fov.x + fov_width/4
side_tl_y = fov.y - fov_height/4, side_br_y = fov.y + fov_height/4
All 4 corners of the Side component must be within this area to pass.
2.7Step Mixing Prohibited All components within a single FOV must have the same step (height) value.
Mixing step=0 and step=1 components in the same FOV is a constraint violation.
Verification (checker.py code)
steps = set(component.iloc[idx]['step'] for idx in comp_idx)
if len(steps) > 1: ERROR — Collect step values of components in the FOV into a set; if more than 1, violation.
Violation: 3 components with step=0 + 1 component with step=1 in one FOV โ†’ Disqualified
Valid: 4 components all with step=0 in one FOV โ†’ Pass
① Normal Component FOV All 4 corners inside FOV Side FOV (1/2) ② Side Component FOV Side comps in blue area BC BC ③ Barcode FOV Multiple per FOV allowed Fiducial ④ Fiducial FOV First FOV, exclusive step=0 No mixing ✗ step=1 ⑤ Step Separation Same step only
💡 Optimization Tip: The basic strategy is to pack as many components as possible into each FOV to minimize total FOV count. Fewer FOVs mean fewer moves and less 3D Reconstruction/Capture overhead. However, components at different step heights cannot share the same FOV, so they must be grouped by step.

Before / After — FOV Placement Optimization

❌ Before — Inefficient placement (9 FOVs)
PCB (320 ร— 240 mm) 9 FOVs โ†’ 8 moves, high CT
✅ After — Optimized placement (4 FOVs)
PCB (320 ร— 240 mm) FOV 1 (7 comps) FOV 2 (6 comps) FOV 3 (4 comps) FOV 4 (3 comps) 4 FOVs โ†’ 3 moves, CT greatly reduced
Comparison
Before: 9 FOVs, 8 moves โ†’ 9 Captures + 9 3D Reconstructions + high travel overhead
After : 4 FOVs, 3 moves โ†’ 4 Captures + 4 3D Reconstructions + minimal travel overhead

56% fewer FOVs โ†’ significant CT improvement (reduced Travel time + Capture/3D Reconstruction fixed costs)

3-3. FOV Inspection Order — Rules requiring certain component-type FOVs to be inspected first

#ConstraintDetails
3.1FOV Type-based order The FOV type is determined by the maximum type value among its components. The inspection order is:
Fiducial FOV (type=2) โ†’ Barcode FOV (type=1) โ†’ Normal FOV (type=0)

In other words, type values must be in descending order (higher types first).
Verification (checker.py)
all(fov.type[i] ≥ fov.type[i+1] for i in range(len-1))
In the row order of output_fov.csv, each FOV's type must be greater than or equal to the next.
3.2Fiducial FOV Ordering When there are multiple Fiducial FOVs, the FOV containing the lower-indexed Fiducial in input_component.csv must be inspected first.
Example
If Fiducial components are at index=0 and index=5, then the FOV containing index=0 must come before the FOV containing index=5.
Order 1
Fiducial FOV
type=2 (PCB reference point)
Order 2
Barcode FOV
type=1 (PCB model identifier)
Multiple per FOV allowed
Order 3
Normal FOV
type=0 (order freely optimizable)
💡 Optimization Point: Fiducial/Barcode FOV order is fixed, but Normal FOV (type=0) ordering is freely optimizable. This is the TSP (path optimization) problem.
💡 Optimization Tip: Applying local search methods like 2-opt or Or-opt can significantly reduce travel distance compared to simple Nearest Neighbor. However, since switching between FOVs at different step heights incurs a +5s penalty, visiting same-step FOVs consecutively before switching steps takes priority over distance optimization.

3-4. Inspection Resources & CT Calculation — How the Core pipeline determines Cycle Time

#ConstraintDetails
4.1Core Roles Core 0: Camera X/Y movement + FOV Capture (always sequential)
Core 1~2: Dedicated 3D Reconstruction (assigned to idle core after Capture)
Core 3+: Component Inspection (assigned to least-busy core after 3D Reconstruction)
Core 0 sequence (per FOV)
[Move from prev FOV โ†’ next FOV] โ†’ [Capture] โ†’ [Move to next FOV] โ†’ ...
Core 0 continuously cycles: Moveโ†’Captureโ†’Moveโ†’Capture without pause.
4.2Core Count (Fixed Input) max_core is a fixed input constraint per dataset (random 4–16). The Checker uses this value directly — participants cannot change or optimize this value.
Cores 0 through (max_core-1) are used.
Example
max_core=8 โ†’ Core 0 (Move+Capture), Core 1~2 (3D Reconstruction), Core 3~7 (5 Inspection cores)
max_core=16 โ†’ Core 3~15 all used for Inspection โ†’ more parallel Inspection โ†’ lower CT
4.3Capture Time Time required to capture (acquire image) each FOV. Uses the capture_time value from input_parameter.csv.
4.43D Reconstruction Time Time to generate 3D data from the captured image. Uses the recon_time value.
4.5Component Inspection Time Each component's inspection time is defined individually in the time field of input_component.csv.
Components within an FOV are sequentially assigned to the least-busy Inspection Core.
4.6Side Capture Time If an FOV contains even one side=1 component, both Top and Side cameras capture simultaneously, so the capture time is the longer of the two.
FOV with Side comps: imaging_time = max(capture_time, side_capture_time)
FOV without Side comps: imaging_time = capture_time
4.7Z-axis Step Transition Delay When two consecutive FOVs have different step (height) values, the camera must adjust its Z-axis height, incurring an additional 5.0-second delay.
The Z-axis movement itself is fast, but settling time is needed for camera vibration to stabilize after the move. Capture quality requires waiting until vibration has fully dampened.
This delay is added on Core 0 after movement, before Capture.
Same step: Core 0 = [Move] โ†’ [Capture]
Different step: Core 0 = [Move] โ†’ [+5.0s Z transition] โ†’ [Capture]
🔥 5 seconds is a very large penalty. Compared to typical travel time of 0.1~0.5s, it is 10~50x larger. The key strategy is to place same-step FOVs consecutively to minimize the number of transitions.

Core Pipeline Timeline (Example: max_core=5, 5 FOVs)

Camera Movement
FOV Capture
3D Reconstruction
Component Inspection
Z-axis Step Transition (+5s)
Core 4 (insp) Core 3 (insp) Core 2 (3D) Core 1 (3D) Core 0 (cam) Capture1 3D Reconstruction1 Inspection1 Move Capture2 3D Reconstruction2 Inspection2 Z Trans 5s Capture3 3D Reconstruction3 Inspection3 Capture4 3D Reconstruction4 Inspection4 Capture5 3D Reconstruction5 Inspection5 t(s)
💡 CT = max(completion time of last task across all Cores). Since this is a pipeline, multiple FOVs are processed concurrently. FOV2's Capture and FOV1's 3D Reconstruction run in parallel.
💡 Optimization Tip: If components with large inspection times (time) are concentrated in one FOV, it creates a bottleneck on specific Cores. Distributing high-time components across multiple FOVs improves load balance across Cores and reduces CT. Also, since fewer cores (8) means fewer Inspection Cores, it is important to find placements that perform well across all core counts.

3-5. Camera Movement — X/Y-axis Trapezoidal Velocity Profile

#ConstraintDetails
5.1Independent X, Y Control X and Y axes move independently and simultaneously. Each axis follows a Trapezoidal velocity profile.
Parameters (input_parameter.csv)
v_x, v_y: 200โ€“1000 mm/s (max velocity, random per dataset)
a_x, a_y: 4900โ€“9800 mm/s² (acceleration, random per dataset)
5.2Travel Time Calculation Calculate X and Y travel times separately; the longer one is the actual travel time.
travel_time = max(T_x, T_y)
Numerical Example (v=1000, a=9800)
Moving from FOV center (100, 50) โ†’ (200, 80):
X distance=100mm, Y distance=30mm
Threshold th = v²/a = 1000²/9800 ≈ 102mm
X (100mm < 102mm): T_x = 2√(100/9800) ≈ 0.202s
Y (30mm < 102mm): T_y = 2√(30/9800) ≈ 0.111s
travel_time = max(0.202, 0.111) = 0.202s

Camera Movement Diagram

PCB Board FOV A (100, 90) FOV B (280, 240) d_x = 180mm d_y = 150mm Simultaneous Travel Time Calculation X-axis d_x = |280 - 100| = 180mm th = v²/a (e.g. 1000²/9800 ≈ 102mm) 180 ≥ 102 โ†’ long distance formula: T_x = 2v/a + (d-th)/v = 0.282s Y-axis d_y = |240 - 90| = 150mm 150 ≥ 102 โ†’ long distance formula: T_y = 2v/a + (d-th)/v = 0.252s Travel time = max(T_x, T_y) = max(0.282, 0.252) = 0.282s

Trapezoidal Velocity Profile Formulas

Variables
  d = distance along one axis (|Δx| or |Δy|)
  v = max velocity for that axis (v_x or v_y)
  a = acceleration for that axis (a_x or a_y)

Threshold distance th = v² / a

Long distance (d ≥ th):
  T = 2v/a + (d − th) / v
  โ†’ Accel โ†’ Constant velocity โ†’ Decel (trapezoid)

Short distance (d < th):
  T = 2√(d/a)
  โ†’ Accel โ†’ Decel (no constant velocity, triangle)

Final Travel time = max(Tx, Ty)
  X, Y axes move simultaneously; the slower axis determines travel time
Trapezoidal Velocity Profile Long dist (d ≥ v²/a) v Accel Const Decel Short dist (d < v²/a) Accel Decel Max vel not reached Velocity Time T = 2v/a + (d-th)/v T = 2√(d/a)
💡 Optimization Tip: Since travel time is max(T_x, T_y), having a long distance on one axis and short on the other incurs little penalty. For example, moving 200mm on X and 10mm on Y means Y movement is essentially free. When ordering FOVs, a sweep pattern along one axis then stepping to the next row is fundamentally efficient.
4 Step (Height) Region Details
The PCB is a stepped board with regions at different Z-axis heights. This section explains step-related constraints in detail.

📍 What is a Step Region?

Specific rectangular regions on the PCB have different heights. Defined in input_step_region.csv.

  • If a component is inside a step region โ†’ step=1
  • If outside the step region โ†’ step=0
  • 1~2 step regions exist

🚫 Step Constraint Summary

Step Mixing ProhibitedCannot place step=0 and step=1 components in the same FOV
Step Transition DelayIf consecutive FOVs have different steps: +5.0s extra (camera vibration settling time after Z-axis move)
Optimization StrategyVisit all step=0 FOVs first โ†’ then all step=1 FOVs (only 1 transition)

Stepped Board Structure โ€” Real PCB Example

Below is a simplified diagram of a real stepped board. Areas where large modules (BGA, etc.) are mounted have higher elevation and become step regions (step=1).

PCB Stepped Board Step Region (step=1) FID QR QR QR QR FOV โ‘  step=0 FOV โ‘ก step=0 FOV โ‘ข step=1 0.3s +5.0s transition! Legend step=0 region (low comps) step=1 region (tall modules) Same-step move Step transition (+5s) Optimization Strategy Visit same-step FOVs consecutively โ†’ minimize transitions โ‘  โ†’ โ‘ก โ†’ โ‘ข = 1 transition (5s) โ‘  โ†’ โ‘ข โ†’ โ‘ก = 2 transitions (10s) Group-by-step routing is better
5 Dataset Structure
Format and meaning of each field in the input/output files.

📥 Input Data

input_component.csv

FieldDescription
tl_x, tl_y, br_x, br_yComponent top-left / bottom-right coordinates (mm)
type0: Normal / 1: Barcode / 2: Fiducial
sideSide camera capture required (0 or 1)
stepStep (height) level (0 or 1)
timePer-component inspection time (seconds)

input_size.csv

FieldDescription
pcb_sizePCB size (mm)
fov_sizeFOV size (mm)

input_parameter.csv

FieldDescription
capture_timeCapture time (seconds)
recon_time3D Reconstruction time (seconds)
side_capture_timeSide capture time (seconds)
max_coreMax core count (4–16, random per dataset)
v_x, v_y, a_x, a_yx/y axis velocity (mm/s), Acceleration (mm/s²)

input_step_region.csv

FieldDescription
tl_x, tl_y, br_x, br_yStep region top-left / bottom-right coordinates (mm)

📤 Output Data

output_fov.csv

FieldDescription
x, yFOV center coordinates (mm)
comp_idxComponent indices in this FOV (JSON array)
Important: The row order in output_fov.csv determines the FOV visit sequence. The first row is the first FOV to be inspected.

Output Example

# output_fov.csv ,x,y,comp_idx 0,52.30,48.10,"[0]" # Fiducial FOV (type=2, inspected first) 1,145.20,22.50,"[1,2]" # Barcode FOV (type=1, multiple allowed) 2,98.70,75.30,"[3,4,5]" # Normal FOV (step=0) 3,200.10,120.40,"[6,7]" # Normal FOV (step=1)
Complete Constraint Summary Table
All constraints at a glance.
#CategoryConstraintSummary
1.1FOV SizeTop FOV SizeFixed by fov_size in input_size.csv
1.2Side FOV SizeTop FOV / 2 (per axis), shared center
1.3Top+Side Combined CaptureSimultaneous capture at same position
2.1Component PlacementFull Component CoverageAll components in at least 1 FOV
2.2Fully Contained Within FOVAll 4 corners inside FOV area
2.3Fiducial FOV RestrictionFirst FOV, exclusive โ€” no other components allowed
2.4Barcode FOV RulesMultiple Barcodes per FOV OK. Normal components can be included. fov.type = max(comp types). Inspect after Fiducial, before Normal
2.5Large Component SplitComponents exceeding effective FOV (Side FOV for side=1) covered by multiple FOVs
2.6Side Component Placementside=1 comps: all 4 corners in Side FOV (1/2)
2.7Step Mixing ProhibitedComponents in same FOV must have same step value
3.1Inspection OrderFOV Type-based orderFiducial(2) โ†’ Barcode(1) โ†’ Normal(0)
3.2Fiducial FOV OrderingLower-indexed Fiducial first
4.1Inspection Resources
& CT
Core Role AssignmentCore 0=Move/Capture, Core 1~2=3D Recon, Core 3+=Inspection
4.2Core Count (Fixed Input)max_core is a fixed input constraint per dataset (random 4–16)
4.3Capture Timecapture_time (fixed value)
4.43D Reconstruction Timerecon_time (fixed value)
4.5Component Inspection TimePer-component time field (individual values)
4.6Side Capture TimeFOV with side comps: max(capture_time, side_capture_time)
4.7Z-axis Step Transition Delay+5.0s on step change
5.1Camera MovementIndependent X, Y ControlTrapezoidal velocity profile
5.2Travel Time Calculationmax(T_x, T_y)
📜 License

CC BY-NC-SA 4.0

All materials provided by this competition — datasets, evaluation tools (checker), simulation tools, and documentation — are licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0).

Term Meaning
BYAttribution — Credit the competition name and organizer
NCNonCommercial — No commercial use
SAShareAlike — Derivatives must use the same license
Allowed: Academic papers, educational use, personal research, portfolios, benchmark comparisons — anyone may use freely, regardless of competition participation
🚫 Prohibited: Commercial use of competition-provided materials (embedding in commercial products/services, paid distribution, etc.)
📜 Submitted Code License: By submitting code, participants agree to grant Koh Young Technology a non-exclusive, perpetual, royalty-free license to use, modify, and integrate the submitted code for internal research and product development purposes.

📝 Recommended Acknowledgement for Publications

“This work used the AOI inspection optimization dataset and evaluation tools provided by Koh Young Technology for the AI Contest held in conjunction with ICCAS 2026. The materials are available under CC BY-NC-SA 4.0.”

AOI ๊ฒ€์‚ฌยท์ž์› ๊ณ ๋ ค ๊ณ„์‚ฐ ์‹œ๊ฐ„ ์ตœ์ ํ™”

์ œ4ํšŒ ๊ณ ์˜ AI ๊ฒฝ์ง„๋Œ€ํšŒ — ICCAS 2026
์ ‘์ˆ˜2026. 7. 1 โ€“ 8. 28
๊ฒฝ์ง„2026. 9. 7 โ€“ 10. 9
์‹œ์ƒ2026. 10. 29
๐Ÿ“‹ ์ฐธ๊ฐ€ ๋“ฑ๋ก ๋ฐ ์•ˆ๋‚ด โ€” ICCAS 2026 ๊ณต์‹ ํŽ˜์ด์ง€ โ†—
๋ฌธ์ œ ์„ค๋ช… CT + ๊ณ„์‚ฐ ์‹œ๊ฐ„ ํ‰๊ฐ€ ์ „์ฒด ์ฝ”๋“œ ๊ณต๊ฐœ
1 ๋ฌธ์ œ ๊ฐœ์š”
AOI(Automatic Optical Inspection)๋Š” PCB ์œ„์˜ ์ „์ž ๋ถ€ํ’ˆ์„ ์ž๋™ ๊ฒ€์‚ฌํ•˜๋Š” ์žฅ๋น„์ž…๋‹ˆ๋‹ค. ์นด๋ฉ”๋ผ ํ—ค๋“œ๊ฐ€ PCB ์œ„๋ฅผ ์ด๋™ํ•˜๋ฉฐ ๋ถ€ํ’ˆ์„ ์ดฌ์˜ํ•˜๊ณ , 3D ๋ณต์› ๋ฐ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

📷 AOI ์นด๋ฉ”๋ผ ๊ตฌ์กฐ

์ดฌ์ƒ ํ—ค๋“œ Top Side Side LED ์กฐ๋ช… PCB Top FOV Side FOV (ยฝ) ์ƒ๋ฉด ์ดฌ์˜ ์ธก๋ฉด ์ดฌ์˜ Top ์นด๋ฉ”๋ผ โ€” ๋ถ€ํ’ˆ ์ƒ๋ฉด ๊ฒ€์‚ฌ Side ์นด๋ฉ”๋ผ โ€” ๋‚ฉ๋•œ ์ธก๋ฉด ๊ฒ€์‚ฌ

AOI ์žฅ๋น„์—๋Š” ํ•˜๋‚˜์˜ ์ดฌ์ƒ ํ—ค๋“œ์— Top ์นด๋ฉ”๋ผ(์œ„โ†’์•„๋ž˜)์™€ ์—ฌ๋Ÿฌ ๋Œ€์˜ Side ์นด๋ฉ”๋ผ(๋น„์Šค๋“ฌํ•œ ๊ฐ๋„)๊ฐ€ ํ•จ๊ป˜ ํƒ‘์žฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Top ์นด๋ฉ”๋ผ

๋ถ€ํ’ˆ์˜ ์ƒ๋ฉด์„ ์ˆ˜์ง์œผ๋กœ ์ดฌ์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€ํ’ˆ ์œ ๋ฌด, ์œ„์น˜ ์˜ค์ฐจ, ๋ฐฉํ–ฅ ๋“ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ถ€ํ’ˆ์ด Top ์ดฌ์˜ ๋Œ€์ƒ์ด๋ฉฐ, Side ๋ถ€ํ’ˆ (side=1)์€ Side ์ดฌ์˜๋„ ์ถ”๊ฐ€๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Side ์นด๋ฉ”๋ผ

๋ถ€ํ’ˆ์˜ ์ธก๋ฉด ๋‚ฉ๋•œ ํ•„๋ ›์„ ๋น„์Šค๋“ฌํžˆ ์ดฌ์˜ํ•ฉ๋‹ˆ๋‹ค. Side ๋ถ€ํ’ˆ (side=1)๋งŒ ํ•ด๋‹น๋˜๋ฉฐ, ๋ณธ ๋Œ€ํšŒ์—์„œ๋Š” ์ดฌ์ƒ ์˜์—ญ(Side FOV)์„ Top์˜ ์ ˆ๋ฐ˜ ํฌ๊ธฐ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

💡 ๋‘ ์นด๋ฉ”๋ผ๋Š” ๊ฐ™์€ ํ—ค๋“œ์— ํƒ‘์žฌ๋˜์–ด ๋™์‹œ์— ์ด๋™ํ•˜๊ณ , ํ•œ ์œ„์น˜์—์„œ ๋™์‹œ ์ดฌ์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„๋กœ Side๋งŒ์„ ์œ„ํ•œ FOV๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
Side ๋ถ€ํ’ˆ (side=1)์ด ํฌํ•จ๋œ FOV๋Š” ์ดฌ์ƒ ์‹œ๊ฐ„์ด max(capture_time, side_capture_time)์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

🔍 ๋ถ€ํ’ˆ๊ณผ FOV๋ž€?

๋ถ€ํ’ˆ(Component)์€ PCB ์œ„์— ์‹ค์žฅ๋œ ์ „์ž ๋ถ€ํ’ˆ(์ €ํ•ญ, IC ๋“ฑ)์ด๋ฉฐ, FOV(Field of View)๋Š” ์นด๋ฉ”๋ผ๊ฐ€ ํ•œ ๋ฒˆ์— ์ดฌ์˜ํ•˜๋Š” ์ง์‚ฌ๊ฐํ˜• ์˜์—ญ์ž…๋‹ˆ๋‹ค.

์นด๋ฉ”๋ผ๋Š” FOV ๋‹จ์œ„๋กœ ์ด๋™ํ•˜๋ฉฐ, ํ•œ FOV ์•ˆ์— ์—ฌ๋Ÿฌ ๋ถ€ํ’ˆ์„ ๋‹ด์•„ ํ•œ ๋ฒˆ์— ์ดฌ์˜ํ•ฉ๋‹ˆ๋‹ค. FOV ํฌ๊ธฐ๋Š” ๊ณ ์ •์ด๊ณ , ์ฐธ๊ฐ€์ž๋Š” FOV์˜ ์œ„์น˜์™€ ๊ฐœ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

💡 FOV ํ•˜๋‚˜์— ๋ถ€ํ’ˆ์„ ๋งŽ์ด ๋‹ด์„์ˆ˜๋ก ์ „์ฒด FOV ์ˆ˜๊ฐ€ ์ค„๊ณ , ์ด๋™ ํšŸ์ˆ˜๋„ ์ค„์–ด CT๊ฐ€ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.
PCB ๊ธฐํŒ FOV 1 (2๊ฐœ) FOV 2 (2๊ฐœ) FOV 3 (2๊ฐœ) ๋ถ€ํ’ˆ FOV FOV ์ค‘์‹ฌ ์ด๋™ ๊ฒฝ๋กœ (1→2→3)

🧩 ํ’€์–ด์•ผ ํ•˜๋Š” 3๊ฐ€์ง€ ๋ฌธ์ œ

์ด ์นด๋ฉ”๋ผ๊ฐ€ PCB ์œ„๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ์ดฌ์˜ํ•˜๋ ค๋ฉด 3๊ฐ€์ง€ ๊ฒฐ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ฒฐ์ •์ด ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์กฐํ•ฉ ํญ๋ฐœ(NP-hard)์ด ๋ฐœ์ƒํ•˜๋ฉฐ, ์ด ์„ธ ๊ฐ€์ง€ ๊ฒฐ์ •์ด Cycle Time(CT)์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

STEP 1
FOV ๋ฐฐ์น˜
๋ชจ๋“  ๋ถ€ํ’ˆ์„ ์ปค๋ฒ„ํ•˜๋„๋ก
FOV ์œ„์น˜์™€ ๊ฐœ์ˆ˜ ๊ฒฐ์ •
STEP 2
๋ถ€ํ’ˆ ํ• ๋‹น
๊ฐ FOV์— ์–ด๋–ค ๋ถ€ํ’ˆ์„
ํฌํ•จํ• ์ง€ ๊ฒฐ์ •
STEP 3
๊ฒ€์‚ฌ ์ˆœ์„œ ๊ฒฐ์ •
FOV ๋ฐฉ๋ฌธ ์ˆœ์„œ ์ตœ์ ํ™”
(Fiducial → Barcode → ์ผ๋ฐ˜)
RESULT
CT ์‚ฐ์ถœ
Step 1~3์˜ ๊ฒฐ๊ณผ๋กœ
Checker๊ฐ€ ์ž๋™ ๊ณ„์‚ฐ
💡 ์ฐธ๊ฐ€์ž๊ฐ€ ์‹ค์ˆ˜๋กœ FOV์— ํฌํ•จ์‹œํ‚ค์ง€ ๋ชปํ•œ ๋ถ€ํ’ˆ์€ Checker๊ฐ€ greedyํ•˜๊ฒŒ FOV์— ๋ฐฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
FOV 3๊ฐœ์˜ ์ˆœ์„œ ์กฐํ•ฉ๋งŒ ํ•ด๋„ 6๊ฐ€์ง€์ด๋ฉฐ, FOV ๋ฐฐ์น˜ ๋ฐฉ๋ฒ•๊นŒ์ง€ ๊ณ ๋ คํ•˜๋ฉด ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Core ์ˆ˜๋Š” ๊ณ ์ •๋œ ์ž…๋ ฅ ์กฐ๊ฑด์ด๋ฏ€๋กœ, FOV ์ˆ˜๋ฅผ ์ค„์ด๊ณ  ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ์ตœ์†Œ Cycle Time์„ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

STEP 4 — CT๋Š” ์ด๋ ‡๊ฒŒ ์‚ฐ์ถœ๋ฉ๋‹ˆ๋‹ค

AOI ์žฅ๋น„๋Š” PCB๋ฅผ ํ•œ ๋ฒˆ์— ๋‹ค ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. FOV ๋‹จ์œ„๋กœ ์ดฌ์ƒ → 3D ๋ณต์› → ๋ถ€ํ’ˆ ๊ฒ€์‚ฌ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ, ์„œ๋กœ ๋‹ค๋ฅธ Core๊ฐ€ ๋™์‹œ์— ์ž‘์—…ํ•˜์—ฌ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ 8๋‹จ๊ณ„๋ฅผ ํด๋ฆญํ•˜๋ฉฐ ํŒŒ์ดํ”„๋ผ์ธ์ด ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€ ๋”ฐ๋ผ๊ฐ€ ๋ณด์„ธ์š”!

C0 ์ดฌ์ƒโ‘ 
Core 0์ด FOV โ‘  ์˜์—ญ์„ ์นด๋ฉ”๋ผ๋กœ ์ดฌ์ƒํ•ฉ๋‹ˆ๋‹ค.
⏱ ์ดฌ์ƒ ์‹œ๊ฐ„ = capture_time (์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ, ๊ณ ์ •๊ฐ’)
C0 ์ด๋™+C1 ๋ณต์›โ‘ 
Core 0์€ ์ดฌ์ƒ์ด ๋๋‚˜์ž๋งˆ์ž ๋ฐ”๋กœ ๋‹ค์Œ FOV๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค! ๋™์‹œ์— Core 1์ด ๋ฐฉ๊ธˆ ์ดฌ์ƒํ•œ FOV โ‘ ์˜ 3D ๋ณต์›์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
✨ ์ด๊ฒƒ์ด ํŒŒ์ดํ”„๋ผ์ธ์˜ ํ•ต์‹ฌ — ์ด๋™๊ณผ ๋ณต์›์ด ๋™์‹œ์—!
⏱ ์ด๋™ ์‹œ๊ฐ„ = max(Tx, Ty) / ๋ณต์› ์‹œ๊ฐ„ = Σ(๋ถ€ํ’ˆ time)
C0 ์ดฌ์ƒโ‘ก
Core 0์ด FOV โ‘ก๋ฅผ ์ดฌ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ•œํŽธ Core 1์€ FOV โ‘  ๋ณต์›์„ ๋งˆ๋ฌด๋ฆฌํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.
⏱ ์ดฌ์ƒ ์‹œ๊ฐ„ = capture_time
C0 ์ด๋™+C2 ๋ณต์›โ‘ก+C3 ๊ฒ€์‚ฌโ‘ +C4 ๊ฒ€์‚ฌโ‘ 
์ตœ๋Œ€ ๋ณ‘๋ ฌ! 4๊ฐœ Core๊ฐ€ ๋™์‹œ์— ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค:
C0: FOV โ‘ข์œผ๋กœ ์ด๋™
C2: FOV โ‘ก 3D ๋ณต์› ์‹œ์ž‘
C3: FOV โ‘  ๋ถ€ํ’ˆ a ๊ฒ€์‚ฌ   C4: FOV โ‘  ๋ถ€ํ’ˆ b ๊ฒ€์‚ฌ
๋ถ€ํ’ˆ๋งˆ๋‹ค ํฌ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ ๊ฒ€์‚ฌ ์‹œ๊ฐ„๋„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค → ๊ท ๋“ฑ ๋ฐฐ๋ถ„์ด ์ค‘์š”!
⏱ ๊ฒ€์‚ฌ ์‹œ๊ฐ„ = max(C3 ํ• ๋‹น, C4 ํ• ๋‹น) — ๋ถ€ํ’ˆ 2๊ฐœ๋ฅผ Core 2๊ฐœ์— ๋ถ„๋ฐฐ
C0 ์ดฌ์ƒโ‘ข
Core 0์ด ๋งˆ์ง€๋ง‰ FOV โ‘ข์„ ์ดฌ์ƒํ•ฉ๋‹ˆ๋‹ค.
⏱ ์ดฌ์ƒ ์‹œ๊ฐ„ = capture_time
C1 ๋ณต์›โ‘ข+C3 ๊ฒ€์‚ฌโ‘ก+C4 ๊ฒ€์‚ฌโ‘ก
Core 0์€ ๋ชจ๋“  ์ดฌ์ƒ์„ ๋งˆ์ณค์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‚˜๋จธ์ง€ Core๋“ค์ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค:
C1: FOV โ‘ข ๋ณต์›
C3: FOV โ‘ก ๋ถ€ํ’ˆ a ๊ฒ€์‚ฌ   C4: FOV โ‘ก ๋ถ€ํ’ˆ b ๊ฒ€์‚ฌ
⏱ C0์ด ๋น ๋ฅด๊ฒŒ ๋๋‚ ์ˆ˜๋ก ๋‚˜๋จธ์ง€ Core์˜ ์ž‘์—…์ด CT๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค
C3 ๊ฒ€์‚ฌโ‘ข+C4 ๊ฒ€์‚ฌโ‘ข
๋งˆ์ง€๋ง‰ ๊ฒ€์‚ฌ! Core 3๊ณผ Core 4๊ฐ€ FOV โ‘ข ๋ถ€ํ’ˆ์„ ํ•˜๋‚˜์”ฉ ๋‚˜๋ˆ  ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
ํฐ ๋ถ€ํ’ˆ์€ ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฌ๋ฏ€๋กœ, ์–ด๋А Core์— ๋ฐฐ์ •ํ•˜๋А๋ƒ๊ฐ€ CT์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.
⏱ ๊ฒ€์‚ฌ ์‹œ๊ฐ„ = max(C3 ํ• ๋‹น, C4 ํ• ๋‹น)
์ „์ฒด ์™„๋ฃŒ
๋ชจ๋“  FOV์˜ ์ดฌ์ƒ → ๋ณต์› → ๊ฒ€์‚ฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!
CT = ๋งˆ์ง€๋ง‰ Core๊ฐ€ ์ž‘์—…์„ ๋๋‚ด๋Š” ์‹œ์  (๊ฐ€์žฅ ๋Šฆ๊ฒŒ ๋๋‚˜๋Š” Core๊ฐ€ CT๋ฅผ ๊ฒฐ์ •)
▼ Core ํŒŒ์ดํ”„๋ผ์ธ ํƒ€์ž„๋ผ์ธ
Core 4๊ฒ€์‚ฌ
Core 3๊ฒ€์‚ฌ
Core 23D ๋ณต์›
Core 13D ๋ณต์›
Core 0์ดฌ์ƒ+์ด๋™
①a
②a
③a
①b
②b
③b

📊 FOV ๊ตฌ์„ฑ๊ณผ ๊ฒ€์‚ฌ ์ˆœ์„œ์— ๋”ฐ๋ฅธ CT ์ฐจ์ด

๋™์ผํ•œ ๋ถ€ํ’ˆ ๋ฐฐ์น˜์—์„œ๋„ FOV๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฌถ๊ณ , ์–ด๋–ค ์ˆœ์„œ๋กœ ๊ฒ€์‚ฌํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ์ „์ฒด Cycle Time์ด ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

Case A — ①→②→③ ์ˆœ์ฐจ ์ด๋™ Case B — ①→③→② ์ง€๊ทธ์žฌ๊ทธ ์ด๋™ FOV ① FOV ② FOV ③ 1 2 3 → ์ด ์ด๋™ ๊ฑฐ๋ฆฌ ์งง์Œ FOV ① FOV ② FOV ③ 1 2 3 ↗ ๋ฉ€๋ฆฌ ์ด๋™! ↙ ๋˜๋Œ์•„๊ฐ! → ์ด ์ด๋™ ๊ฑฐ๋ฆฌ ๊ธธ๋‹ค ▼ ํŒŒ์ดํ”„๋ผ์ธ ํƒ€์ž„๋ผ์ธ ▼ ํŒŒ์ดํ”„๋ผ์ธ ํƒ€์ž„๋ผ์ธ Core 3+ (๊ฒ€์‚ฌ) Core 1 (๋ณต์›) Core 0 (์ดฌ์ƒ) โ‘  ๊ฒ€์‚ฌ โ‘ก ๊ฒ€์‚ฌ โ‘ข ๊ฒ€์‚ฌ โ‘  โ‘ก โ‘ข โ‘  โ†’ โ‘ก โ†’ โ‘ข CT = 7.8s 0 2 4 6 8 Core 3+ (๊ฒ€์‚ฌ) Core 1 (๋ณต์›) Core 0 (์ดฌ์ƒ) โ‘  ๊ฒ€์‚ฌ โ‘ข ๊ฒ€์‚ฌ โ‘ก ๊ฒ€์‚ฌ โ‘  ๋Œ€๊ธฐ โ‘ข ๋Œ€๊ธฐ โ‘ก โ‘  ์ด๋™ โ‘ข ์ด๋™ โ‘ก CT = 9.8s 0 2 4 6 8 10 ✔ ์ˆœ์ฐจ ์ด๋™ → CT 7.8s ✘ ์ง€๊ทธ์žฌ๊ทธ → CT 9.8s (+26%) ๋™์ผํ•œ FOV ๊ตฌ์„ฑ์ด๋ผ๋„ ๊ฒ€์‚ฌ ์ˆœ์„œ์— ๋”ฐ๋ผ Cycle Time์ด ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง„๋‹ค FOV 3๊ฐœ์˜ ์ˆœ์„œ ์กฐํ•ฉ = 6๊ฐ€์ง€ · FOV ๋ฐฐ์น˜ ๋ฐฉ๋ฒ•๊นŒ์ง€ ๊ณ ๋ คํ•˜๋ฉด ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ธฐํ•˜๊ธ‰์ˆ˜์ 

🧩 PCB ๋ถ€ํ’ˆ ์œ ํ˜• (type)

Fiducial (type=2)

PCB ์ขŒํ‘œ๊ณ„์˜ ์‹œ์ž‘์ (์›์ )์„ ์ •์˜ํ•˜๋Š” ๊ธฐ์ค€์ ์ž…๋‹ˆ๋‹ค. PCB๊ฐ€ ์žฅ๋น„์— ๋†“์ผ ๋•Œ ๋ฏธ์„ธํ•œ ์œ„์น˜ ์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, Fiducial ์ขŒํ‘œ๋ฅผ ๋จผ์ € ์ธก์ •ํ•˜์—ฌ ์ „์ฒด ์ขŒํ‘œ๊ณ„๋ฅผ ๋ณด์ •ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ง•: ๋ฐ˜๋“œ์‹œ ์ฒซ ๋ฒˆ์งธ FOV์— ๋‹จ๋… ๋ฐฐ์น˜ / Fiducial FOV์—๋Š” ๋‹ค๋ฅธ ๋ถ€ํ’ˆ ํฌํ•จ ๋ถˆ๊ฐ€

Barcode (type=1)

PCB ๋ชจ๋ธ ๊ตฌ๋ถ„์ž์ž…๋‹ˆ๋‹ค. ๋ฐ”์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์–ด๋–ค PCB ๋ชจ๋ธ์ธ์ง€ ์‹๋ณ„ํ•˜๋ฉฐ, ๋ชจ๋ธ๋ณ„ ๊ฒ€์‚ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด Fiducial ๋‹ค์Œ์œผ๋กœ ๋จผ์ € ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ง•: Fiducial ๋‹ค์Œ์œผ๋กœ ๊ฒ€์‚ฌ / ๋™์ผ FOV์— ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€๋Šฅ / PCB๋‹น 0~4๊ฐœ

์ผ๋ฐ˜ ๋ถ€ํ’ˆ (type=0)

์‹ค์ œ ๊ฒ€์‚ฌ ๋Œ€์ƒ์ธ SMD ๋ถ€ํ’ˆ(์ €ํ•ญ, ์ฝ˜๋ด์„œ, IC ๋“ฑ)์ž…๋‹ˆ๋‹ค. ๋ถ€ํ’ˆ์˜ ์œ„์น˜ยท๋ฐฉํ–ฅยท๋‚ฉ๋•œ ์ƒํƒœ ๋“ฑ์„ 3D๋กœ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ง•: Fiducial/Barcode ์ดํ›„ ๊ฒ€์‚ฌ / ์ˆœ์„œ ์ž์œ  ์ตœ์ ํ™” ๊ฐ€๋Šฅ

🔧 Side ์นด๋ฉ”๋ผ์™€ FOV ๋‘ ๊ฒน ๊ตฌ์กฐ

์ผ๋ถ€ Side ๋ถ€ํ’ˆ (side=1)์€ Top ์นด๋ฉ”๋ผ ์™ธ์— Side ์นด๋ฉ”๋ผ(์ธก๋ฉด ๋‚ฉ๋•œ ๊ฒ€์‚ฌ)๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Side FOV๋Š” Top FOV์˜ ์ ˆ๋ฐ˜ ํฌ๊ธฐ์ด๋ฉฐ, ๊ฐ™์€ ์ค‘์‹ฌ์ ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

  • side=0Top ์นด๋ฉ”๋ผ๋กœ๋งŒ ๊ฒ€์‚ฌ (๋Œ€๋ถ€๋ถ„์˜ ๋ถ€ํ’ˆ) — Top FOV ์•ˆ์ด๋ฉด OK
  • side=1 → Top + Side ์นด๋ฉ”๋ผ ๋ชจ๋‘ ํ•„์š” — ๋” ์ž‘์€ Side FOV ์•ˆ์— ์™„์ „ํžˆ ํฌํ•จ๋˜์–ด์•ผ ํ•จ
OK vs NG — side=1 ๋ถ€ํ’ˆ ๋ฐฐ์น˜
OK Top FOV Side FOV (1/2) side=0 side=1 side=1 ๋ถ€ํ’ˆ์ด Side FOV ์•ˆ → ํ†ต๊ณผ side=0์€ Top FOV ์•ˆ์ด๋ฉด OK NG Top FOV Side FOV (1/2) side=1 Top FOV ์•ˆ์ด์ง€๋งŒ Side FOV ๋ฐ– → ์œ„๋ฐ˜! side=1์€ ๋ฐ˜๋“œ์‹œ Side FOV ์•ˆ์—
2 ๋Œ€ํšŒ ํ˜•์‹ ๋ฐ ์ฑ„์ 
solver.py ํ•˜๋‚˜๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. max_core๋Š” ๋ฐ์ดํ„ฐ์…‹๋ณ„ ๊ณ ์ • ์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ(๋žœ๋ค 4–16)์ด๋ฉฐ, Cycle Time + Computation Time์œผ๋กœ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

🏆 ์ฑ„์ 

📅 ์ฑ„์  ๋ฐฉ์‹์€ ๊ฒฝ์ง„๋Œ€ํšŒ ์‹œ์ž‘ ์‹œ(2026. 9. 7) ๊ณต๊ฐœ๋ฉ๋‹ˆ๋‹ค.
simulation_data/์˜ 96๊ฐœ ๋ฐ์ดํ„ฐ์…‹์€ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ์šฉ์ž…๋‹ˆ๋‹ค. ์ตœ์ข… ๊ณต์‹ ์ฑ„์ ์€ ๋ณ„๋„์˜ ๋น„๊ณต๊ฐœ ํ…Œ์ŠคํŠธ์…‹์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
3 ์ œ์•ฝ ์กฐ๊ฑด ์ƒ์„ธ
๊ฒ€์‚ฌ ๊ฒฐ๊ณผ์˜ ์œ ํšจ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์กฐ๊ฑด์„ ์œ„๋ฐ˜ ์—†์ด ๋งŒ์กฑํ•ด์•ผ ์œ ํšจํ•œ ์†”๋ฃจ์…˜์œผ๋กœ ์ธ์ •๋ฉ๋‹ˆ๋‹ค.

3-1. FOV ํฌ๊ธฐ — ์นด๋ฉ”๋ผ๊ฐ€ ํ•œ ๋ฒˆ์— ์ดฌ์˜ํ•˜๋Š” ์˜์—ญ์˜ ๋ฌผ๋ฆฌ์  ํฌ๊ธฐ

#์ œ์•ฝ ์กฐ๊ฑด์ƒ์„ธ ์„ค๋ช…
1.1Top FOV ํฌ๊ธฐ Top ์นด๋ฉ”๋ผ์˜ ์ดฌ์ƒ ์˜์—ญ. input_size.csv์˜ fov_size ๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
x์ถ•๊ณผ y์ถ• ๊ฐ๊ฐ์˜ FOV ํฌ๊ธฐ๊ฐ€ ๋ณ„๋„๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.
์˜ˆ์‹œ (input_size.csv)
fov_size x=50mm, y=50mm โ†’ Top FOV๋Š” ๊ฐ€๋กœ 50mm × ์„ธ๋กœ 50mm ์ง์‚ฌ๊ฐํ˜•
1.2Side FOV ํฌ๊ธฐ ๋ณธ ๋Œ€ํšŒ์—์„œ๋Š” Side ์นด๋ฉ”๋ผ์˜ ์ดฌ์ƒ ์˜์—ญ์„ Top FOV์˜ ์ ˆ๋ฐ˜์œผ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค (๊ฐ ์ถ• ๊ธฐ์ค€).
side_fov_w = fov_width / 2.0, side_fov_h = fov_height / 2.0
Side FOV์™€ Top FOV๋Š” ์ค‘์‹ฌ์ ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ์‹œ
Top FOV๊ฐ€ 50×50mm์ด๋ฉด โ†’ Side FOV๋Š” 25×25mm, ์ค‘์‹ฌ์  ๋™์ผ
1.3Top + Side ํ†ตํ•ฉ ์ดฌ์ƒ AOI ์žฅ๋น„์—๋Š” Top ์นด๋ฉ”๋ผ(์œ„์—์„œ ์•„๋ž˜๋กœ ์ดฌ์˜)์™€ Side ์นด๋ฉ”๋ผ(๋น„์Šค๋“ฌํ•œ ๊ฐ๋„์—์„œ ์ธก๋ฉด์„ ์ดฌ์˜)๊ฐ€ ์žฅ์ฐฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Top ์นด๋ฉ”๋ผ๋Š” ๋ถ€ํ’ˆ์˜ ์ƒ๋ฉด์„ ๊ฒ€์‚ฌํ•˜๊ณ , Side ์นด๋ฉ”๋ผ๋Š” ๋ถ€ํ’ˆ ์˜†๋ฉด์˜ ๋‚ฉ๋•œ ํ•„๋ ›(solder fillet) ํ˜•์ƒ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์นด๋ฉ”๋ผ๋Š” ๊ฐ™์€ ์ดฌ์ƒ ํ—ค๋“œ์— ํ•จ๊ป˜ ํƒ‘์žฌ๋˜์–ด ๋™์‹œ์— ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

Side ๋ถ€ํ’ˆ (side=1)์€ Top ์ดฌ์ƒ์— ๋”ํ•ด Side ์นด๋ฉ”๋ผ ์ดฌ์ƒ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์นด๋ฉ”๋ผ๊ฐ€ ๊ฐ™์€ ์œ„์น˜์—์„œ ๋™์‹œ์— ์ดฌ์˜ํ•˜๋ฏ€๋กœ, ์ดฌ์ƒ ์‹œ๊ฐ„์€ ๋‘˜ ์ค‘ ๊ธด ์ชฝ์ด ๋ฉ๋‹ˆ๋‹ค.
Top FOV์™€ Side FOV๋Š” ๊ฐ™์€ ์ค‘์‹ฌ์ ์„ ๊ณต์œ ํ•˜๋ฉฐ, ํ•œ ๋ฒˆ์˜ FOV ์œ„์น˜ ์ด๋™์œผ๋กœ Top๊ณผ Side๋ฅผ ๋™์‹œ์— ์ดฌ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„๋กœ Side๋งŒ์„ ์œ„ํ•œ FOV๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋‹จ, FOV์— Side ๋ถ€ํ’ˆ (side=1)์ด 1๊ฐœ๋ผ๋„ ํฌํ•จ๋˜๋ฉด ํ•ด๋‹น FOV์˜ ์ดฌ์ƒ ์‹œ๊ฐ„์€ max(capture_time, side_capture_time)์ด ๋ฉ๋‹ˆ๋‹ค.
💡 ์ตœ์ ํ™” ํŒ: Side ๋ถ€ํ’ˆ (side=1)๊ณผ ์ผ๋ฐ˜ (side=0) ๋ถ€ํ’ˆ์ด ๊ฐ™์€ FOV์— ํ•จ๊ป˜ ๋“ค์–ด์˜ค๋ฉด, Side ์ดฌ์ƒ ๋น„์šฉ(side_capture_time)์€ ์–ด์ฐจํ”ผ 1ํšŒ๋งŒ ๋ฐœ์ƒํ•˜๋ฉด์„œ ์ผ๋ฐ˜ ๋ถ€ํ’ˆ๋„ ํ•จ๊ป˜ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์–ด FOV ์ˆ˜ ์ ˆ์•ฝ์ด ๋ฉ๋‹ˆ๋‹ค. Side ๋ถ€ํ’ˆ์ด Side FOV ์•ˆ์— ์žˆ๊ณ , ์ผ๋ฐ˜ ๋ถ€ํ’ˆ์ด Top FOV ์•ˆ์— ์žˆ์œผ๋ฉด ํ•˜๋‚˜์˜ FOV๋กœ ๋ชจ๋‘ ์ปค๋ฒ„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
PCB Top FOV Side FOV (1/2) ์ค‘์‹ฌ์  ๊ณต์œ  ์ผ๋ฐ˜ ๋ถ€ํ’ˆ Side ๋ถ€ํ’ˆ Top FOV (ํŒŒ๋ž‘) Side FOV (ํŒŒ๋ž‘, 1/2 ํฌ๊ธฐ) ์ค‘์‹ฌ์  (Top=Side)
💡 ํ•ต์‹ฌ: FOV ํฌ๊ธฐ๋Š” ์ž…๋ ฅ์œผ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ฐ€์ž๊ฐ€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ FOV์˜ ์œ„์น˜(x,y)์™€ ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค.
Side FOV ์ฃผ์˜: Side ๋ถ€ํ’ˆ (side=1)์€ ํŒŒ๋ž€์ƒ‰ Side FOV ์˜์—ญ ์•ˆ์— ์™„์ „ํžˆ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Top FOV ์•ˆ์— ์žˆ๋”๋ผ๋„ Side FOV ๋ฐ–์ด๋ฉด ์ œ์•ฝ ์œ„๋ฐ˜์ž…๋‹ˆ๋‹ค.
💡 ์ตœ์ ํ™” ํŒ: Side ๋ถ€ํ’ˆ์€ FOV ์ค‘์‹ฌ ๊ทผ์ฒ˜์— ๋ชจ์—ฌ ์žˆ์„์ˆ˜๋ก ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Side FOV๊ฐ€ Top์˜ ์ ˆ๋ฐ˜์ด๋ฏ€๋กœ, FOV ์ค‘์‹ฌ์—์„œ ๋จผ Side ๋ถ€ํ’ˆ์€ ๋ณ„๋„ FOV๊ฐ€ ํ•„์š”ํ•ด์ ธ FOV ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

3-2. ๋ถ€ํ’ˆ ๋ฐฐ์น˜ — FOV ์•ˆ์— ๋ถ€ํ’ˆ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ทœ์น™

#์ œ์•ฝ ์กฐ๊ฑด์ƒ์„ธ ์„ค๋ช…
2.1์ „์ฒด ๋ถ€ํ’ˆ ์ปค๋ฒ„ ๋ชจ๋“  ๋ถ€ํ’ˆ์€ ์ตœ์†Œ 1๊ฐœ์˜ FOV์— ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ฝ๋œ ๋ถ€ํ’ˆ์ด ์žˆ์œผ๋ฉด ์ œ์•ฝ ์œ„๋ฐ˜์ž…๋‹ˆ๋‹ค.
๊ฒ€์ฆ ๋ฐฉ๋ฒ• (checker.py)
๊ฐ ๋ถ€ํ’ˆ์— ๋Œ€ํ•ด comp_mask[idx]๊ฐ€ 1์ธ์ง€ ํ™•์ธ. ํ•˜๋‚˜๋ผ๋„ 0์ด๋ฉด ์‹คํŒจ.
2.2FOV ์˜์—ญ ๋‚ด ์™„์ „ ํฌํ•จ ๋ถ€ํ’ˆ์˜ 4๊ฐœ ๊ผญ์ง“์ (tl, tr, bl, br)์ด ๋ชจ๋‘ FOV ์˜์—ญ ์•ˆ์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ถ€ํ’ˆ์˜ ์ผ๋ถ€๋ผ๋„ FOV ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€๋ฉด ์ œ์•ฝ ์œ„๋ฐ˜์ž…๋‹ˆ๋‹ค.
ํŒ์ • ์กฐ๊ฑด
fov_tl_x ≤ comp_tl_x AND fov_tl_y ≤ comp_tl_y AND fov_br_x ≥ comp_br_x AND fov_br_y ≥ comp_br_y
2.3Fiducial FOV ์ œํ•œ Fiducial ๋ถ€ํ’ˆ(type=2)์€ ๋ฐ˜๋“œ์‹œ ์ฒซ ๋ฒˆ์งธ FOV์— ๋‹จ๋… ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. Fiducial FOV์—๋Š” ๋‹ค๋ฅธ ๋ถ€ํ’ˆ ํฌํ•จ ๋ถˆ๊ฐ€.
Fiducial์€ PCB ์ขŒํ‘œ๊ณ„์˜ ์‹œ์ž‘์ (์›์ )์œผ๋กœ, ์ •๋ฐ€ํ•œ ์œ„์น˜ ๋ณด์ •์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
2.4Barcode FOV ๊ทœ์น™ Barcode(type=1)๋Š” Fiducial๊ณผ ๋‹ฌ๋ฆฌ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋™์ผํ•œ FOV์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Barcode๋Š” PCB ๋ชจ๋ธ ๊ตฌ๋ถ„์ž๋กœ, ์–ด๋–ค PCB ๋ชจ๋ธ์ธ์ง€ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด Fiducial ๋‹ค์Œ์œผ๋กœ ๋จผ์ € ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Barcode FOV์—๋Š” ์ผ๋ฐ˜ ๋ถ€ํ’ˆ(type=0)๋„ ํ•จ๊ป˜ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. FOV์˜ ํƒ€์ž…์€ ํฌํ•จ๋œ ๋ถ€ํ’ˆ ์ค‘ ๊ฐ€์žฅ ๋†’์€ type์œผ๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค: fov.type = max(FOV ๋‚ด ๋ถ€ํ’ˆ type). ๋”ฐ๋ผ์„œ Barcode(1)์™€ ์ผ๋ฐ˜(0) ๋ถ€ํ’ˆ์ด ๊ฐ™์€ FOV์— ์žˆ์œผ๋ฉด ํ•ด๋‹น FOV๋Š” Barcode FOV(type=1)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
Fiducial vs Barcode
Fiducial(type=2): ์ฒซ ๋ฒˆ์งธ FOV์— ๋‹จ๋… ๋ฐฐ์น˜, ๋‹ค๋ฅธ ๋ถ€ํ’ˆ ๋ถˆ๊ฐ€
Barcode(type=1): ๋™์ผ FOV์— ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€๋Šฅ, ์ผ๋ฐ˜ ๋ถ€ํ’ˆ(type=0)๋„ ํ•จ๊ป˜ ํฌํ•จ ๊ฐ€๋Šฅ โ†’ ๊ฐ€๊นŒ์šด Barcode์™€ ์ผ๋ฐ˜ ๋ถ€ํ’ˆ์„ ๋ฌถ์–ด์„œ ํšจ์œจ์  ๋ฐฐ์น˜
💡 ์ตœ์ ํ™” ํฌ์ธํŠธ: Barcode ๊ทผ์ฒ˜์˜ ์ผ๋ฐ˜ ๋ถ€ํ’ˆ์„ ๊ฐ™์€ FOV์— ๋ฌถ์œผ๋ฉด ์ด FOV ์ˆ˜๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. FOV๋Š” ์ž๋™์œผ๋กœ type=1(Barcode)๋กœ ๋ถ„๋ฅ˜๋˜์–ด ์˜ฌ๋ฐ”๋ฅธ ๊ฒ€์‚ฌ ์ˆœ์„œ์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.
2.5ํฐ ๋ถ€ํ’ˆ ๋ถ„ํ•  ๊ฒ€์‚ฌ ๋ถ€ํ’ˆ ํฌ๊ธฐ๊ฐ€ ํ•ด๋‹น ๋ถ€ํ’ˆ์˜ ์œ ํšจ FOV๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ FOV๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๋ถ„ํ• ๋œ FOV๋“ค์˜ ํ•ฉ์ง‘ํ•ฉ์ด ๋ถ€ํ’ˆ ์ „์ฒด ์˜์—ญ์„ ๋นˆ ํ‹ˆ ์—†์ด ์ปค๋ฒ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋ถ€ํ’ˆ ์œ ํ˜•๋ณ„ ์œ ํšจ FOV
side=0: ์œ ํšจ FOV = Top FOV (fov_width × fov_height)
side=1: ์œ ํšจ FOV = Side FOV (fov_width/2 × fov_height/2)
Side ๋ถ€ํ’ˆ์ด Side FOV๋ณด๋‹ค ํฌ์ง€๋งŒ Top FOV๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ์—๋„ “ํฐ ๋ถ€ํ’ˆ”์œผ๋กœ ๋ถ„๋ฅ˜๋˜์–ด ๋ถ„ํ•  ๊ฒ€์‚ฌ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค.
๊ฒ€์ฆ ๋ฐฉ๋ฒ•
is_target_fully_covered() ํ•จ์ˆ˜๋กœ ์œ ํšจ FOV ์˜์—ญ๋“ค์˜ ํ•ฉ์ง‘ํ•ฉ์ด ๋ถ€ํ’ˆ์„ ์™„์ „ ์ปค๋ฒ„ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. side=1 ํฐ ๋ถ€ํ’ˆ์€ ๊ฐ FOV์˜ Side FOV ์˜์—ญ์„ ๊ธฐ์ค€์œผ๋กœ ์ปค๋ฒ„ ์—ฌ๋ถ€๋ฅผ ํŒ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฉ์ž ๋ถ„ํ•  ๋ฐฉ์‹์œผ๋กœ ๋นˆ ์…€์ด ์—†๋Š”์ง€ ๊ฒ€์ฆ.
2.6Side ๋ถ€ํ’ˆ ๋ฐฐ์น˜ Side ๋ถ€ํ’ˆ (side=1)์€ Side FOV(Top์˜ 1/2) ์˜์—ญ ์•ˆ์— 4๊ฐœ ๊ผญ์ง“์ ์ด ๋ชจ๋‘ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Side FOV๋Š” Top FOV๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ, Top FOV์—๋Š” ๋“ค์–ด๊ฐ€์ง€๋งŒ Side FOV์—๋Š” ์•ˆ ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŒ์ • ์กฐ๊ฑด (checker.py ์ฝ”๋“œ)
side_tl_x = fov.x - fov_width/4, side_br_x = fov.x + fov_width/4
side_tl_y = fov.y - fov_height/4, side_br_y = fov.y + fov_height/4
์ด ์˜์—ญ ์•ˆ์— Side ๋ถ€ํ’ˆ์˜ 4 ๊ผญ์ง“์ ์ด ๋ชจ๋‘ ์žˆ์–ด์•ผ ํ†ต๊ณผ.
2.7๋‹จ์ฐจ ํ˜ผํ•ฉ ๊ธˆ์ง€ ํ•˜๋‚˜์˜ FOV ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ๋ถ€ํ’ˆ์€ ๊ฐ™์€ ๋‹จ์ฐจ(๋†’์ด) ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋†’์ด=0์ธ ๋ถ€ํ’ˆ๊ณผ ๋†’์ด=1์ธ ๋ถ€ํ’ˆ์„ ๊ฐ™์€ FOV์— ์„ž์œผ๋ฉด ์ œ์•ฝ ์œ„๋ฐ˜์ž…๋‹ˆ๋‹ค.
๊ฒ€์ฆ ๋ฐฉ๋ฒ• (checker.py ์ฝ”๋“œ)
steps = set(component.iloc[idx]['step'] for idx in comp_idx)
if len(steps) > 1: ERROR — FOV ๋‚ด ๋ถ€ํ’ˆ๋“ค์˜ ๋‹จ์ฐจ ๊ฐ’์„ set์œผ๋กœ ๋ชจ์€ ๋’ค, 2๊ฐœ ์ด์ƒ์ด๋ฉด ์œ„๋ฐ˜.
์œ„๋ฐ˜ ์˜ˆ: FOV ์•ˆ์— ๋†’์ด=0 ๋ถ€ํ’ˆ 3๊ฐœ + ๋†’์ด=1 ๋ถ€ํ’ˆ 1๊ฐœ โ†’ ์‹ค๊ฒฉ
์ •์ƒ ์˜ˆ: FOV ์•ˆ์— ๋†’์ด=0 ๋ถ€ํ’ˆ๋งŒ 4๊ฐœ โ†’ ํ†ต๊ณผ
① ์ผ๋ฐ˜ ๋ถ€ํ’ˆ FOV 4๊ผญ์ง“์  ๋ชจ๋‘ FOV ๋‚ด Side FOV (1/2) ② Side ๋ถ€ํ’ˆ FOV Side ๋ถ€ํ’ˆ์€ ํŒŒ๋ž€ ์˜์—ญ ๋‚ด BC BC ③ Barcode FOV ์—ฌ๋Ÿฌ ๊ฐœ ๋™์ผ FOV ๊ฐ€๋Šฅ Fiducial ④ Fiducial FOV ์ฒซ ๋ฒˆ์งธ FOV, ๋‹จ๋… ๋ฐฐ์น˜ ๋†’์ด=0 ํ˜ผํ•ฉ ๋ถˆ๊ฐ€ ✗ ๋†’์ด=1 ⑤ ๋‹จ์ฐจ ๋ถ„๋ฆฌ ๊ฐ™์€ ๋‹จ์ฐจ๋งŒ ํ—ˆ์šฉ
💡 ์ตœ์ ํ™” ํŒ: FOV ํ•˜๋‚˜์— ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋ถ€ํ’ˆ์„ ๋„ฃ์–ด ์ „์ฒด FOV ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ ์ „๋žต์ž…๋‹ˆ๋‹ค. FOV ์ˆ˜๊ฐ€ ์ค„๋ฉด ์ด๋™ ํšŸ์ˆ˜๋„ ์ค„๊ณ , ๋ณต์›/์ดฌ์ƒ ์˜ค๋ฒ„ํ—ค๋“œ๋„ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ๋‹จ์ฐจ๊ฐ€ ๋‹ค๋ฅธ ๋ถ€ํ’ˆ์€ ๊ฐ™์€ FOV์— ๋„ฃ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹จ์ฐจ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ทธ๋ฃนํ•‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Before / After — FOV ๋ฐฐ์น˜ ์ตœ์ ํ™” ๋น„๊ต

❌ Before — ๋น„ํšจ์œจ ๋ฐฐ์น˜ (FOV 9๊ฐœ)
PCB (320 ร— 240 mm) FOV 9๊ฐœ โ†’ ์ด๋™ 8ํšŒ, CT ๋†’์Œ
✅ After — ์ตœ์  ๋ฐฐ์น˜ (FOV 4๊ฐœ)
PCB (320 ร— 240 mm) FOV 1 (7๊ฐœ) FOV 2 (6๊ฐœ) FOV 3 (4๊ฐœ) FOV 4 (3๊ฐœ) FOV 4๊ฐœ โ†’ ์ด๋™ 3ํšŒ, CT ๋Œ€ํญ ๊ฐ์†Œ
ํšจ๊ณผ ๋น„๊ต
Before: FOV 9๊ฐœ, ์ด๋™ 8ํšŒ โ†’ ์ดฌ์ƒ 9ํšŒ + ๋ณต์› 9ํšŒ + ์ด๋™ ์˜ค๋ฒ„ํ—ค๋“œ ๋†’์Œ
After : FOV 4๊ฐœ, ์ด๋™ 3ํšŒ โ†’ ์ดฌ์ƒ 4ํšŒ + ๋ณต์› 4ํšŒ + ์ด๋™ ์˜ค๋ฒ„ํ—ค๋“œ ์ตœ์†Œ

FOV ์ˆ˜ 56% ๊ฐ์†Œ โ†’ CT ํฌ๊ฒŒ ๊ฐœ์„  (์ด๋™ ์‹œ๊ฐ„ + ์ดฌ์ƒ/๋ณต์› ๊ณ ์ •๋น„ ์ ˆ๊ฐ)

3-3. FOV ๊ฒ€์‚ฌ ์ˆœ์„œ — ํŠน์ • ๋ถ€ํ’ˆ์ด ํฌํ•จ๋œ FOV๋ฅผ ๋จผ์ € ๊ฒ€์‚ฌํ•ด์•ผ ํ•˜๋Š” ๊ทœ์น™

#์ œ์•ฝ ์กฐ๊ฑด์ƒ์„ธ ์„ค๋ช…
3.1FOV ํƒ€์ž…๋ณ„ ์ˆœ์„œ FOV์— ํฌํ•จ๋œ ๋ถ€ํ’ˆ์˜ ์ตœ๋Œ€ type ๊ฐ’์œผ๋กœ FOV type์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ๊ฒ€์‚ฌ ์ˆœ์„œ๋Š”:
Fiducial FOV (type=2) โ†’ Barcode FOV (type=1) โ†’ ์ผ๋ฐ˜ FOV (type=0)

์ฆ‰, type ๊ฐ’์ด ๋‚ด๋ฆผ์ฐจ์ˆœ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (๋†’์€ type์ด ๋จผ์ €).
๊ฒ€์ฆ (checker.py)
all(fov.type[i] ≥ fov.type[i+1] for i in range(len-1))
output_fov.csv์˜ ํ–‰ ์ˆœ์„œ์—์„œ, ์•ž์ชฝ FOV์˜ type์ด ๋’ค์ชฝ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
3.2Fiducial FOV ๊ฐ„ ์ˆœ์„œ Fiducial FOV๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ, input_component.csv์—์„œ ์ธ๋ฑ์Šค๊ฐ€ ์ž‘์€ Fiducial์ด ์†ํ•œ FOV๋ฅผ ๋จผ์ € ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ์‹œ
Fiducial ๋ถ€ํ’ˆ์ด index=0๊ณผ index=5์— ์žˆ๋‹ค๋ฉด โ†’ index=0์˜ FOV๊ฐ€ ๋ฐ˜๋“œ์‹œ index=5์˜ FOV๋ณด๋‹ค ์•ž์— ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ˆœ์„œ 1
Fiducial FOV
type=2 (PCB ๊ธฐ์ค€์ )
์ˆœ์„œ 2
Barcode FOV
type=1 (PCB ๋ชจ๋ธ ๊ตฌ๋ถ„์ž)
๋™์ผ FOV์— ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€๋Šฅ
์ˆœ์„œ 3
์ผ๋ฐ˜ FOV
type=0 (์ž์œ  ์ˆœ์„œ ์ตœ์ ํ™” ๊ฐ€๋Šฅ)
💡 ์ตœ์ ํ™” ํฌ์ธํŠธ: Fiducial/Barcode FOV์˜ ์ˆœ์„œ๋Š” ๊ณ ์ •๋˜์ง€๋งŒ, ์ผ๋ฐ˜ FOV(type=0) ๊ฐ„์˜ ์ˆœ์„œ๋Š” ์ž์œ ๋กญ๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์ด TSP(๊ฒฝ๋กœ ์ตœ์ ํ™”) ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
💡 ์ตœ์ ํ™” ํŒ: ๋‹จ์ˆœ ์ตœ๊ทผ์ ‘ ์ด์›ƒ(Nearest Neighbor)๋ณด๋‹ค 2-opt, Or-opt ๋“ฑ ๊ตญ์†Œ ํƒ์ƒ‰์„ ์ ์šฉํ•˜๋ฉด ์ด๋™ ๊ฑฐ๋ฆฌ๋ฅผ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ๋‹จ์ฐจ๊ฐ€ ๋‹ค๋ฅธ FOV ๊ฐ„ ์ „ํ™˜ ์‹œ +5์ดˆ ํŽ˜๋„ํ‹ฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, ๊ฐ™์€ ๋‹จ์ฐจ FOV๋ฅผ ์—ฐ์† ๋ฐฉ๋ฌธํ•œ ๋’ค ๋‹จ์ฐจ๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฑฐ๋ฆฌ ์ตœ์ ํ™”๋ณด๋‹ค ์šฐ์„ ์ž…๋‹ˆ๋‹ค.

3-4. ๊ฒ€์‚ฌ ๋ฆฌ์†Œ์Šค & CT ๊ณ„์‚ฐ — Core ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ Cycle Time์ด ๊ฒฐ์ •๋˜๋Š” ๋ฐฉ์‹

#์ œ์•ฝ ์กฐ๊ฑด์ƒ์„ธ ์„ค๋ช…
4.1Core ์—ญํ•  Core 0: ์นด๋ฉ”๋ผ X/Y ์ด๋™ + FOV ์ดฌ์ƒ (ํ•ญ์ƒ ์ˆœ์ฐจ ์‹คํ–‰)
Core 1~2: 3D ๋ณต์› ์ „๋‹ด (์ดฌ์ƒ ์™„๋ฃŒ ํ›„, ๋‘˜ ์ค‘ ๋นˆ Core์— ํ• ๋‹น)
Core 3 ์ด์ƒ: ๋ถ€ํ’ˆ๋ณ„ ๊ฒ€์‚ฌ (๋ณต์› ์™„๋ฃŒ ํ›„, ๊ฐ€์žฅ ๋นˆ Core์— ํ• ๋‹น)
Core 0์˜ ์ˆœ์„œ (๋งค FOV๋งˆ๋‹ค)
[์ด์ „ FOV ์œ„์น˜ โ†’ ๋‹ค์Œ FOV ์œ„์น˜ ์ด๋™] โ†’ [์ดฌ์ƒ] โ†’ [๋‹ค์Œ FOV ์ด๋™] โ†’ ...
์ฆ‰, Core 0์€ ์‰ฌ์ง€ ์•Š๊ณ  ์ด๋™โ†’์ดฌ์ƒโ†’์ด๋™โ†’์ดฌ์ƒ์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
4.2Core ์ˆ˜ (๊ณ ์ • ์ž…๋ ฅ) max_core๋Š” ๋ฐ์ดํ„ฐ์…‹๋ณ„ ๊ณ ์ • ์ž…๋ ฅ (๋žœ๋ค 4–16). Checker๊ฐ€ ์ด ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ. ์ฐธ๊ฐ€์ž๊ฐ€ ๋ณ€๊ฒฝ/์ตœ์ ํ™” ๋ถˆ๊ฐ€.
Core 0 ~ Core (max_core-1)๊นŒ์ง€ ์‚ฌ์šฉ.
์˜ˆ์‹œ
max_core=8์ด๋ฉด โ†’ Core 0(์ด๋™+์ดฌ์ƒ), Core 1~2(๋ณต์›), Core 3~7(๊ฒ€์‚ฌ 5๊ฐœ)
max_core=16์ด๋ฉด โ†’ Core 3~15๊ฐ€ ๋ชจ๋‘ ๊ฒ€์‚ฌ์— ํ™œ์šฉ โ†’ ๋ณ‘๋ ฌ ๊ฒ€์‚ฌ ์ฆ๊ฐ€ โ†’ CT ๊ฐ์†Œ
4.3์ดฌ์ƒ ์‹œ๊ฐ„ ๊ฐ FOV์˜ ์ดฌ์ƒ(์ด๋ฏธ์ง€ ํš๋“)์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„. input_parameter.csv์˜ capture_time ๊ฐ’.
4.43D ๋ณต์› ์‹œ๊ฐ„ ์ดฌ์ƒ๋œ ์ด๋ฏธ์ง€๋กœ๋ถ€ํ„ฐ 3D ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹œ๊ฐ„. recon_time ๊ฐ’.
4.5๋ถ€ํ’ˆ ๊ฒ€์‚ฌ ์‹œ๊ฐ„ ๊ฐ ๋ถ€ํ’ˆ๋ณ„ ๊ฒ€์‚ฌ ์‹œ๊ฐ„์€ input_component.csv์˜ time ํ•„๋“œ์— ๊ฐœ๋ณ„ ์ •์˜๋ฉ๋‹ˆ๋‹ค.
FOV ์•ˆ์˜ ๋ถ€ํ’ˆ๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ ๊ฐ€์žฅ ๋นˆ ๊ฒ€์‚ฌ Core์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
4.6Side ์ดฌ์ƒ ์‹œ๊ฐ„ FOV์— Side ๋ถ€ํ’ˆ (side=1)์ด 1๊ฐœ๋ผ๋„ ํฌํ•จ๋˜๋ฉด, Top๊ณผ Side ์นด๋ฉ”๋ผ๊ฐ€ ๋™์‹œ ์ดฌ์˜ํ•˜๋ฏ€๋กœ ์ดฌ์ƒ ์‹œ๊ฐ„์€ ๋‘˜ ์ค‘ ๊ธด ์ชฝ์ด ๋ฉ๋‹ˆ๋‹ค.
Side ๋ถ€ํ’ˆ ํฌํ•จ FOV: imaging_time = max(capture_time, side_capture_time)
Side ๋ถ€ํ’ˆ ๋ฏธํฌํ•จ FOV: imaging_time = capture_time
4.7Z์ถ• ๋‹จ์ฐจ ์ „ํ™˜ ์ง€์—ฐ ์—ฐ์†๋œ ๋‘ FOV์˜ ๋‹จ์ฐจ(๋†’์ด) ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด ์นด๋ฉ”๋ผ์˜ Z์ถ• ๋†’์ด๋ฅผ ์ „ํ™˜ํ•ด์•ผ ํ•˜๋ฉฐ, 5.0์ดˆ์˜ ์ถ”๊ฐ€ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
Z์ถ• ์ด๋™ ์ž์ฒด๋Š” ๋น ๋ฅด์ง€๋งŒ, ์ด๋™ ํ›„ ์นด๋ฉ”๋ผ ์ง„๋™(ํ”๋“ค๋ฆผ)์ด ์•ˆ์ •๋  ๋•Œ๊นŒ์ง€์˜ settling time์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ดฌ์ƒ ํ’ˆ์งˆ์„ ๋ณด์žฅํ•˜๋ ค๋ฉด ์ง„๋™์ด ์™„์ „ํžˆ ์†Œ๋ฉธ๋œ ๋’ค ์ดฌ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด ์ง€์—ฐ์€ Core 0์—์„œ ์ด๋™ ํ›„, ์ดฌ์ƒ ์ „์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
๊ฐ™์€ ๋‹จ์ฐจ: Core 0 = [์ด๋™] โ†’ [์ดฌ์ƒ]
๋‹ค๋ฅธ ๋‹จ์ฐจ: Core 0 = [์ด๋™] โ†’ [+5.0์ดˆ Z์ „ํ™˜] โ†’ [์ดฌ์ƒ]
🔥 5์ดˆ๋Š” ๋งค์šฐ ํฐ ํŽ˜๋„ํ‹ฐ์ž…๋‹ˆ๋‹ค. ์ด๋™ ์‹œ๊ฐ„์ด ๋ณดํ†ต 0.1~0.5์ดˆ์ธ ๊ฒƒ์— ๋น„ํ•ด 10~50๋ฐฐ ํฝ๋‹ˆ๋‹ค. ๊ฐ™์€ ๋‹จ์ฐจ์˜ FOV๋ฅผ ์—ฐ์† ๋ฐฐ์น˜ํ•˜์—ฌ ์ „ํ™˜ ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ์ „๋žต์ž…๋‹ˆ๋‹ค.

Core ํŒŒ์ดํ”„๋ผ์ธ ํƒ€์ž„๋ผ์ธ (์˜ˆ์‹œ: max_core=5, FOV 5๊ฐœ)

์นด๋ฉ”๋ผ ์ด๋™
FOV ์ดฌ์ƒ
3D ๋ณต์›
๋ถ€ํ’ˆ ๊ฒ€์‚ฌ
Z์ถ• ๋‹จ์ฐจ ์ „ํ™˜ (+5s)
Core 4 (insp) Core 3 (insp) Core 2 (3D) Core 1 (3D) Core 0 (cam) ์ดฌ์ƒ1 ๋ณต์›1 ๊ฒ€์‚ฌ1 ์ด๋™ ์ดฌ์ƒ2 ๋ณต์›2 ๊ฒ€์‚ฌ2 Z์ „ํ™˜ 5s ์ดฌ์ƒ3 ๋ณต์›3 ๊ฒ€์‚ฌ3 ์ดฌ์ƒ4 ๋ณต์›4 ๊ฒ€์‚ฌ4 ์ดฌ์ƒ5 ๋ณต์›5 ๊ฒ€์‚ฌ5 t(s)
💡 CT = max(๋ชจ๋“  Core์˜ ๋งˆ์ง€๋ง‰ ์ž‘์—… ์™„๋ฃŒ ์‹œ๊ฐ„). ํŒŒ์ดํ”„๋ผ์ธ์ด๋ฏ€๋กœ ์—ฌ๋Ÿฌ FOV๊ฐ€ ๋™์‹œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. FOV2์˜ ์ดฌ์ƒ๊ณผ FOV1์˜ ๋ณต์›์ด ๋™์‹œ์— ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
💡 ์ตœ์ ํ™” ํŒ: ๊ฒ€์‚ฌ ์‹œ๊ฐ„(time)์ด ํฐ ๋ถ€ํ’ˆ๋“ค์ด ํ•œ FOV์— ๋ชฐ๋ฆฌ๋ฉด ํŠน์ • Core์— ๋ณ‘๋ชฉ์ด ์ƒ๊น๋‹ˆ๋‹ค. ๊ฒ€์‚ฌ ์‹œ๊ฐ„์ด ํฐ ๋ถ€ํ’ˆ์„ ์—ฌ๋Ÿฌ FOV์— ๊ณ ๋ฅด๊ฒŒ ๋ถ„์‚ฐํ•˜๋ฉด Core ๊ฐ„ ๋ถ€ํ•˜ ๊ท ํ˜•์ด ์ข‹์•„์ ธ CT๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๋˜ํ•œ Core ์ˆ˜๊ฐ€ ์ ์„์ˆ˜๋ก(8) ๊ฒ€์‚ฌ Core๊ฐ€ ๋ถ€์กฑํ•˜๋ฏ€๋กœ, ๋ชจ๋“  Core ์ˆ˜์—์„œ ๊ณ ๋ฅด๊ฒŒ ์ข‹์€ ๋ฐฐ์น˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

3-5. ์นด๋ฉ”๋ผ ์ด๋™ — X/Y์ถ• ์‚ฌ๋‹ค๋ฆฌ๊ผด ์†๋„ ํ”„๋กœํŒŒ์ผ

#์ œ์•ฝ ์กฐ๊ฑด์ƒ์„ธ ์„ค๋ช…
5.1X, Y์ถ• ๋…๋ฆฝ ์ œ์–ด X์ถ•๊ณผ Y์ถ•์€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์‹œ์— ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ถ•์€ ์‚ฌ๋‹ค๋ฆฌ๊ผด(Trapezoidal) ์†๋„ ํ”„๋กœํŒŒ์ผ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
ํŒŒ๋ผ๋ฏธํ„ฐ (input_parameter.csv)
v_x, v_y: 200~1000 mm/s (์ตœ๋Œ€ ์†๋„, ๋ฐ์ดํ„ฐ์…‹๋ณ„ ๋žœ๋ค)
a_x, a_y: 4900~9800 mm/s² (๊ฐ€์†๋„, ๋ฐ์ดํ„ฐ์…‹๋ณ„ ๋žœ๋ค)
5.2์ด๋™ ์‹œ๊ฐ„ ์‚ฐ์ • X์ถ•, Y์ถ• ์ด๋™ ์‹œ๊ฐ„์„ ๊ฐ๊ฐ ๊ณ„์‚ฐํ•œ ํ›„, ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ชฝ์ด ์‹ค์ œ ์ด๋™ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.
์ด๋™์‹œ๊ฐ„ = max(T_x, T_y)
์ˆ˜์น˜ ์˜ˆ์‹œ (v=1000, a=9800 ๊ธฐ์ค€)
FOV ์ค‘์‹ฌ (100, 50) โ†’ (200, 80)์œผ๋กœ ์ด๋™ ์‹œ:
X์ถ• ๊ฑฐ๋ฆฌ=100mm, Y์ถ• ๊ฑฐ๋ฆฌ=30mm
์ž„๊ณ„๊ฑฐ๋ฆฌ th = v²/a = 1000²/9800 ≈ 102mm
X์ถ•(100mm < 102mm): T_x = 2√(100/9800) ≈ 0.202์ดˆ
Y์ถ•(30mm < 102mm): T_y = 2√(30/9800) ≈ 0.111์ดˆ
์ด๋™์‹œ๊ฐ„ = max(0.202, 0.111) = 0.202์ดˆ

์นด๋ฉ”๋ผ ์ด๋™ ๊ฐœ๋…๋„

PCB Board FOV A (100, 90) FOV B (280, 240) d_x = 180mm d_y = 150mm ๋™์‹œ ์ด๋™ ์ด๋™ ์‹œ๊ฐ„ ๊ณ„์‚ฐ X์ถ• d_x = |280 - 100| = 180mm th = v²/a (e.g. 1000²/9800 ≈ 102mm) 180 ≥ 102 โ†’ ๊ธด ๊ฑฐ๋ฆฌ ๊ณต์‹ ์ ์šฉ: T_x = 2v/a + (d-th)/v = 0.282s Y์ถ• d_y = |240 - 90| = 150mm 150 ≥ 102 โ†’ ๊ธด ๊ฑฐ๋ฆฌ ๊ณต์‹ ์ ์šฉ: T_y = 2v/a + (d-th)/v = 0.252s ์ด๋™ ์‹œ๊ฐ„ = max(T_x, T_y) = max(0.282, 0.252) = 0.282s

์‚ฌ๋‹ค๋ฆฌ๊ผด ์†๋„ ํ”„๋กœํŒŒ์ผ ๊ณต์‹

๋ณ€์ˆ˜ ์ •์˜
  d = ํ•œ ์ถ•์˜ ์ด๋™ ๊ฑฐ๋ฆฌ (|Δx| ๋˜๋Š” |Δy|)
  v = ํ•ด๋‹น ์ถ•์˜ ์ตœ๋Œ€ ์†๋„ (v_x ๋˜๋Š” v_y)
  a = ํ•ด๋‹น ์ถ•์˜ ๊ฐ€์†๋„ (a_x ๋˜๋Š” a_y)

์ž„๊ณ„๊ฑฐ๋ฆฌ th = v² / a

๊ธด ๊ฑฐ๋ฆฌ (d ≥ th):
  T = 2v/a + (d − th) / v
  โ†’ ๊ฐ€์† โ†’ ๋“ฑ์† โ†’ ๊ฐ์† (์‚ฌ๋‹ค๋ฆฌ๊ผด)

์งง์€ ๊ฑฐ๋ฆฌ (d < th):
  T = 2√(d/a)
  โ†’ ๊ฐ€์† โ†’ ๊ฐ์† (๋“ฑ์† ๊ตฌ๊ฐ„ ์—†์Œ, ์‚ผ๊ฐํ˜•)

์ตœ์ข… ์ด๋™ ์‹œ๊ฐ„ = max(Tx, Ty)
  X, Y์ถ•์€ ๋™์‹œ์— ์ด๋™ํ•˜๋ฉฐ, ๋” ๋А๋ฆฐ ์ถ•์ด ์ด๋™ ์‹œ๊ฐ„์„ ๊ฒฐ์ •
์‚ฌ๋‹ค๋ฆฌ๊ผด ์†๋„ ํ”„๋กœํŒŒ์ผ ๊ธด ๊ฑฐ๋ฆฌ (d ≥ v²/a) v ๊ฐ€์† ๋“ฑ์† ๊ฐ์† ์งง์€ ๊ฑฐ๋ฆฌ (d < v²/a) ๊ฐ€์† ๊ฐ์† ์ตœ๋Œ€์†๋„ ๋ฏธ๋„๋‹ฌ ์†๋„ ์‹œ๊ฐ„ T = 2v/a + (d-th)/v T = 2√(d/a)
💡 ์ตœ์ ํ™” ํŒ: ์ด๋™ ์‹œ๊ฐ„์€ max(T_x, T_y)์ด๋ฏ€๋กœ, ํ•œ ์ถ•์˜ ์ด๋™ ๊ฑฐ๋ฆฌ๋งŒ ๊ธธ๊ณ  ๋‹ค๋ฅธ ์ถ•์€ ์งง์€ ๊ฒฝ์šฐ ์†ํ•ด๊ฐ€ ์ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด X์ถ•์œผ๋กœ 200mm ์ด๋™ํ•˜๋ฉด์„œ Y์ถ•์œผ๋กœ 10mm ์ด๋™ํ•˜๋ฉด, Y์ถ•์€ ์‚ฌ์‹ค์ƒ ๊ณต์งœ์ž…๋‹ˆ๋‹ค. FOV ์ˆœ์„œ๋ฅผ ์ •ํ•  ๋•Œ ํ•œ ์ถ• ๋ฐฉํ–ฅ์œผ๋กœ ์ญ‰ ํ›‘๋‹ค๊ฐ€(sweep) ๋‹ค์Œ ์ค„๋กœ ๋„˜์–ด๊ฐ€๋Š” ํŒจํ„ด์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
4 ๋‹จ์ฐจ(๋†’์ด) ์˜์—ญ ์ƒ์„ธ
PCB๋Š” ๋‹จ์ฐจ ๋ณด๋“œ๋กœ, Z์ถ• ๋†’์ด๊ฐ€ ๋‹ค๋ฅธ ์˜์—ญ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์„น์…˜์—์„œ ๋‹จ์ฐจ ๊ด€๋ จ ์ œ์•ฝ์„ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

📍 ๋‹จ์ฐจ ์˜์—ญ์ด๋ž€?

PCB ์œ„์˜ ํŠน์ • ์ง์‚ฌ๊ฐํ˜• ์˜์—ญ์ด ๋‹ค๋ฅธ ๋†’์ด๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. input_step_region.csv์— ์ •์˜๋ฉ๋‹ˆ๋‹ค.

  • ๋ถ€ํ’ˆ์ด ๋‹จ์ฐจ ์˜์—ญ ์•ˆ์— ์žˆ์œผ๋ฉด โ†’ ๋†’์ด=1
  • ๋‹จ์ฐจ ์˜์—ญ ๋ฐ–์— ์žˆ์œผ๋ฉด โ†’ ๋†’์ด=0
  • ๋‹จ์ฐจ ์˜์—ญ์€ 1~2๊ฐœ ์กด์žฌ

🚫 ๋‹จ์ฐจ ๊ด€๋ จ ์ œ์•ฝ ์š”์•ฝ

๋‹จ์ฐจ ํ˜ผํ•ฉ ๊ธˆ์ง€ํ•˜๋‚˜์˜ FOV ์•ˆ์— ๋†’์ด=0๊ณผ ๋†’์ด=1 ๋ถ€ํ’ˆ ๋™์‹œ ๋ฐฐ์น˜ ๋ถˆ๊ฐ€
๋‹จ์ฐจ ์ „ํ™˜ ์ง€์—ฐ์—ฐ์† FOV์˜ ๋‹จ์ฐจ๊ฐ€ ๋‹ค๋ฅด๋ฉด +5.0์ดˆ ์ถ”๊ฐ€ (Z์ถ• ์ด๋™ ํ›„ ์นด๋ฉ”๋ผ ์ง„๋™ settling time)
์ตœ์ ํ™” ์ „๋žต๋†’์ด=0 FOV๋“ค์„ ๋จผ์ € ๋ชจ๋‘ ์ˆœํšŒ โ†’ ๋†’์ด=1 FOV๋“ค ์ˆœํšŒ (์ „ํ™˜ 1ํšŒ)

๋‹จ์ฐจ ๋ณด๋“œ ๊ตฌ์กฐ โ€” ์‹ค์ œ PCB ์˜ˆ์‹œ

์•„๋ž˜๋Š” ์‹ค์ œ ๋‹จ์ฐจ ๋ณด๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. ํฐ ๋ชจ๋“ˆ(BGA ๋“ฑ)์ด ์‹ค์žฅ๋œ ์˜์—ญ์€ ๋†’์ด๊ฐ€ ๋†’์•„ ๋‹จ์ฐจ ์˜์—ญ(step=1)์ด ๋ฉ๋‹ˆ๋‹ค.

PCB ๋‹จ์ฐจ ๋ณด๋“œ ๋‹จ์ฐจ ์˜์—ญ (step=1) FID QR QR QR QR FOV โ‘  step=0 FOV โ‘ก step=0 FOV โ‘ข step=1 0.3s +5.0s ์ „ํ™˜! ๋ฒ”๋ก€ step=0 ์˜์—ญ (๋‚ฎ์€ ๋ถ€ํ’ˆ) step=1 ์˜์—ญ (๋†’์€ ๋ชจ๋“ˆ) ๊ฐ™์€ ๋‹จ์ฐจ ์ด๋™ ๋‹จ์ฐจ ์ „ํ™˜ (+5s) ์ตœ์ ํ™” ์ „๋žต ๊ฐ™์€ ๋‹จ์ฐจ FOV๋ฅผ ์—ฐ์† ๋ฐฉ๋ฌธ โ†’ ์ „ํ™˜ ํšŸ์ˆ˜ ์ตœ์†Œํ™” โ‘  โ†’ โ‘ก โ†’ โ‘ข = ์ „ํ™˜ 1ํšŒ (5s) โ‘  โ†’ โ‘ข โ†’ โ‘ก = ์ „ํ™˜ 2ํšŒ (10s) ๋‹จ์ฐจ๋ณ„ ๊ทธ๋ฃน ๊ฒฝ๋กœ๊ฐ€ ์œ ๋ฆฌ
5 ๋ฐ์ดํ„ฐ์…‹ ๊ตฌ์กฐ
์ž…๋ ฅ/์ถœ๋ ฅ ํŒŒ์ผ์˜ ํ˜•์‹๊ณผ ๊ฐ ํ•„๋“œ์˜ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

📥 Input ๋ฐ์ดํ„ฐ

input_component.csv

ํ•„๋“œ์„ค๋ช…
tl_x, tl_y, br_x, br_y๋ถ€ํ’ˆ ์ขŒ์ƒ๋‹จ/์šฐํ•˜๋‹จ ์ขŒํ‘œ (mm)
type0: ์ผ๋ฐ˜ ๋ถ€ํ’ˆ / 1: Barcode / 2: Fiducial
sideSide ์นด๋ฉ”๋ผ ์ดฌ์ƒ ์—ฌ๋ถ€ (0 or 1)
step๋†’์ด(๋‹จ์ฐจ) ๋ ˆ๋ฒจ (0 ๋˜๋Š” 1)
time๋ถ€ํ’ˆ๋ณ„ ๊ฒ€์‚ฌ ์‹œ๊ฐ„ (์ดˆ)

input_size.csv

ํ•„๋“œ์„ค๋ช…
pcb_sizePCB ํฌ๊ธฐ (mm)
fov_sizeFOV ํฌ๊ธฐ (mm)

input_parameter.csv

ํ•„๋“œ์„ค๋ช…
capture_time์ดฌ์ƒ ์‹œ๊ฐ„ (์ดˆ)
recon_time3D ๋ณต์› ์‹œ๊ฐ„ (์ดˆ)
side_capture_timeSide ์ดฌ์ƒ ์‹œ๊ฐ„ (์ดˆ)
max_core์ตœ๋Œ€ Core ์ˆ˜ (4~16, ๋ฐ์ดํ„ฐ์…‹๋ณ„ ๋žœ๋ค)
v_x, v_y, a_x, a_yx/y์ถ• ์†๋„(mm/s), ๊ฐ€์†๋„(mm/s²)

input_step_region.csv

ํ•„๋“œ์„ค๋ช…
tl_x, tl_y, br_x, br_y๋‹จ์ฐจ ์˜์—ญ์˜ ์ขŒ์ƒ๋‹จ/์šฐํ•˜๋‹จ ์ขŒํ‘œ (mm)

📤 Output ๋ฐ์ดํ„ฐ

output_fov.csv

ํ•„๋“œ์„ค๋ช…
x, yFOV ์ค‘์‹ฌ ์ขŒํ‘œ (mm)
comp_idxFOV์— ํฌํ•จ๋œ ๋ถ€ํ’ˆ ์ธ๋ฑ์Šค (JSON ๋ฐฐ์—ด)
์ค‘์š”: output_fov.csv์˜ ํ–‰ ์ˆœ์„œ๊ฐ€ FOV ๋ฐฉ๋ฌธ ์ˆœ์„œ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ–‰์ด ์ฒซ ๋ฒˆ์งธ๋กœ ๊ฒ€์‚ฌํ•  FOV.

์ถœ๋ ฅ ์˜ˆ์‹œ

# output_fov.csv ,x,y,comp_idx 0,52.30,48.10,"[0]" # Fiducial FOV (type=2, ๊ฐ€์žฅ ๋จผ์ €) 1,145.20,22.50,"[1,2]" # Barcode FOV (type=1, ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€๋Šฅ) 2,98.70,75.30,"[3,4,5]" # ์ผ๋ฐ˜ FOV (๋†’์ด=0) 3,200.10,120.40,"[6,7]" # ์ผ๋ฐ˜ FOV (๋†’์ด=1)
์ „์ฒด ์ œ์•ฝ ์กฐ๊ฑด ์š”์•ฝํ‘œ
๋ชจ๋“  ์ œ์•ฝ ์กฐ๊ฑด์„ ํ•œ ๋ˆˆ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ข…ํ•ฉ ํ‘œ์ž…๋‹ˆ๋‹ค.
#๋ถ„๋ฅ˜์ œ์•ฝ ์กฐ๊ฑด์š”์•ฝ
1.1FOV ํฌ๊ธฐTop FOV ํฌ๊ธฐinput_size.csv์˜ fov_size๋กœ ๊ณ ์ •
1.2Side FOV ํฌ๊ธฐTop FOV / 2 (๊ฐ ์ถ•), ์ค‘์‹ฌ์  ๊ณต์œ 
1.3Top+Side ํ†ตํ•ฉ ์ดฌ์ƒ๊ฐ™์€ ์œ„์น˜์—์„œ ๋™์‹œ ์ดฌ์ƒ
2.1๋ถ€ํ’ˆ ๋ฐฐ์น˜์ „์ฒด ๋ถ€ํ’ˆ ์ปค๋ฒ„๋ชจ๋“  ๋ถ€ํ’ˆ FOV์— 1ํšŒ ์ด์ƒ ํฌํ•จ
2.2FOV ์˜์—ญ ๋‚ด ์™„์ „ ํฌํ•จ๋ถ€ํ’ˆ 4๊ผญ์ง“์ ์ด FOV ์˜์—ญ ๋‚ด
2.3Fiducial FOV ์ œํ•œ์ฒซ ๋ฒˆ์งธ FOV์— ๋‹จ๋… ๋ฐฐ์น˜, ๋‹ค๋ฅธ ๋ถ€ํ’ˆ ๋ถˆ๊ฐ€
2.4Barcode FOV ๊ทœ์น™๋™์ผ FOV์— Barcode ์—ฌ๋Ÿฌ ๊ฐœ + ์ผ๋ฐ˜ ๋ถ€ํ’ˆ ํฌํ•จ ๊ฐ€๋Šฅ. fov.type = max(๋ถ€ํ’ˆ type). Fiducial ๋‹ค์Œ, ์ผ๋ฐ˜ ์ „์— ๊ฒ€์‚ฌ
2.5ํฐ ๋ถ€ํ’ˆ ๋ถ„ํ• ์œ ํšจ FOV(side=1์€ Side FOV) ์ดˆ๊ณผ ๋ถ€ํ’ˆ์€ ๋‹ค์ค‘ FOV๋กœ ์™„์ „ ์ปค๋ฒ„
2.6Side ๋ถ€ํ’ˆ ๋ฐฐ์น˜side=1 ๋ถ€ํ’ˆ์€ Side FOV(1/2) ๋‚ด 4๊ผญ์ง“์  ํฌํ•จ
2.7๋‹จ์ฐจ ํ˜ผํ•ฉ ๊ธˆ์ง€๋™์ผ FOV ๋‚ด ๋ถ€ํ’ˆ์€ ๊ฐ™์€ ๋†’์ด(๋‹จ์ฐจ) ๊ฐ’ ํ•„์ˆ˜
3.1๊ฒ€์‚ฌ ์ˆœ์„œFOV ํƒ€์ž…๋ณ„ ์ˆœ์„œFiducial(2) โ†’ Barcode(1) โ†’ ์ผ๋ฐ˜(0)
3.2Fiducial FOV ๊ฐ„ ์ˆœ์„œ๋จผ์ € ๋“ฑ๋ก๋œ Fiducial ์šฐ์„ 
4.1๊ฒ€์‚ฌ ๋ฆฌ์†Œ์Šค
& CT
Core ์—ญํ•  ํ• ๋‹นCore 0=์ด๋™/์ดฌ์ƒ, Core 1~2=๋ณต์›, Core 3+=๊ฒ€์‚ฌ
4.2Core ์ˆ˜ (๊ณ ์ • ์ž…๋ ฅ)max_core๋Š” ๋ฐ์ดํ„ฐ์…‹๋ณ„ ๊ณ ์ • ์ž…๋ ฅ (๋žœ๋ค 4–16)
4.3์ดฌ์ƒ ์‹œ๊ฐ„capture_time (๊ณ ์ •๊ฐ’)
4.43D ๋ณต์› ์‹œ๊ฐ„recon_time (๊ณ ์ •๊ฐ’)
4.5๋ถ€ํ’ˆ ๊ฒ€์‚ฌ ์‹œ๊ฐ„๊ฐ ๋ถ€ํ’ˆ๋ณ„ time ํ•„๋“œ (๊ฐœ๋ณ„๊ฐ’)
4.6Side ์ดฌ์ƒ ์‹œ๊ฐ„side ๋ถ€ํ’ˆ ํฌํ•จ FOV: max(capture_time, side_capture_time)
4.7Z์ถ• ๋‹จ์ฐจ ์ „ํ™˜ ์ง€์—ฐ๋‹จ์ฐจ ๋ณ€๊ฒฝ ์‹œ +5.0์ดˆ
5.1์นด๋ฉ”๋ผ ์ด๋™X, Y์ถ• ๋…๋ฆฝ ์ œ์–ด์‚ฌ๋‹ค๋ฆฌ๊ผด ์†๋„ ํ”„๋กœํŒŒ์ผ
5.2์ด๋™ ์‹œ๊ฐ„ ์‚ฐ์ •max(T_x, T_y)
📜 ๋ผ์ด์„ ์Šค

CC BY-NC-SA 4.0

๋ณธ ๋Œ€ํšŒ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ์…‹, ํ‰๊ฐ€ ๋„๊ตฌ(checker), ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋„๊ตฌ, ๋ฌธ์„œ๋Š” Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) ๋ผ์ด์„ ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

์กฐ๊ฑด ์˜๋ฏธ
BY์ถœ์ฒ˜ ํ‘œ๊ธฐ — ๋Œ€ํšŒ๋ช… ๋ฐ ์ฃผ์ตœ๋ฅผ ๋ช…์‹œ
NC๋น„์ƒ์—…์  — ์ƒ์—…์  ๋ชฉ์  ์‚ฌ์šฉ ๊ธˆ์ง€
SA๋™์ผ ์กฐ๊ฑด ๋ณ€๊ฒฝ ํ—ˆ๋ฝ — ํŒŒ์ƒ ์ €์ž‘๋ฌผ๋„ ๊ฐ™์€ ๋ผ์ด์„ ์Šค ์ ์šฉ
ํ—ˆ์šฉ: ํ•™์ˆ  ๋…ผ๋ฌธ ๊ฒŒ์žฌ, ๊ต์œก ๋ชฉ์  ์‚ฌ์šฉ, ๊ฐœ์ธ ์—ฐ๊ตฌ, ํฌํŠธํด๋ฆฌ์˜ค, ๋ฒค์น˜๋งˆํฌ ๋น„๊ต — ๋Œ€ํšŒ ์ฐธ๊ฐ€ ์—ฌ๋ถ€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ˆ„๊ตฌ๋‚˜ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
🚫 ๊ธˆ์ง€: ๋Œ€ํšŒ ์ œ๊ณต ์ž๋ฃŒ์˜ ์ƒ์—…์  ํ™œ์šฉ (์ƒ์šฉ ์ œํ’ˆยท์„œ๋น„์Šค์— ์ง์ ‘ ํƒ‘์žฌ, ์œ ๋ฃŒ ํŒ๋งค ๋“ฑ)
📜 ์ œ์ถœ ์ฝ”๋“œ ์‚ฌ์šฉ ๋™์˜: ์ฐธ๊ฐ€์ž๋Š” ์ฝ”๋“œ ์ œ์ถœ ์‹œ, ๊ณ ์˜ํ…Œํฌ๋†€๋Ÿฌ์ง€์— ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋‚ด๋ถ€ ์—ฐ๊ตฌยท์ œํ’ˆ ๊ฐœ๋ฐœ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉยท์ˆ˜์ •ยทํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋…์ ์ ยท์˜๊ตฌ์ ยท๋ฌด์ƒ ๋ผ์ด์„ ์Šค๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

📝 ๋…ผ๋ฌธ ์ธ์šฉ ์‹œ ๊ถŒ์žฅ ์‚ฌ์‚ฌ (Acknowledgement)

“๋ณธ ์—ฐ๊ตฌ๋Š” ICCAS 2026๊ณผ ์—ฐ๊ณ„ํ•˜์—ฌ(in conjunction with) ๊ฐœ์ตœ๋œ AI Contest๋ฅผ ์œ„ํ•ด ๊ณ ์˜ํ…Œํฌ๋†€๋Ÿฌ์ง€(Koh Young Technology)๊ฐ€ ์ œ๊ณตํ•œ AOI ๊ฒ€์‚ฌ ์ตœ์ ํ™” ๋ฐ์ดํ„ฐ์…‹ ๋ฐ ํ‰๊ฐ€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์œผ๋ฉฐ, ํ•ด๋‹น ์ž๋ฃŒ๋Š” CC BY-NC-SA 4.0 ๋ผ์ด์„ ์Šค๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.”