
The AOI equipment has a single imaging head with a Top camera (top-down view) and multiple Side cameras (angled views) mounted together.
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.
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.
side=1 components have increased capture time of max(capture_time, side_capture_time).
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.
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).
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!
capture_time (input parameter, fixed)time)capture_timecapture_timeEven with the same component layout, the total Cycle Time varies significantly depending on how FOVs are grouped and the inspection order.
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
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
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
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=0 → Top camera only (most components) — OK if within Top FOVside=1 → Top + Side camera required — must be fully within the smaller Side FOVsolver.py. The max_core is given as a fixed input parameter (random 4–16 per dataset).simulation_data/ are for development and testing. Final official scoring uses a separate hidden test set.
| # | Constraint | Details |
|---|---|---|
| 1.1 | Top 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.2 | Side 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.0The 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.3 | Top + 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.
|
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.
| # | Constraint | Details |
|---|---|---|
| 2.1 | Full 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.2 | Fully 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.3 | Fiducial 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.4 | Barcode 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 allowedBarcode (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.5 | Large 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.6 | Side 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/4side_tl_y = fov.y - fov_height/4, side_br_y = fov.y + fov_height/4All 4 corners of the Side component must be within this area to pass. |
| 2.7 | Step 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 |
| # | Constraint | Details |
|---|---|---|
| 3.1 | FOV 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.2 | Fiducial 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. |
| # | Constraint | Details |
|---|---|---|
| 4.1 | Core 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.2 | Core 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.3 | Capture Time | Time required to capture (acquire image) each FOV. Uses the capture_time value from input_parameter.csv.
|
| 4.4 | 3D Reconstruction Time | Time to generate 3D data from the captured image. Uses the recon_time value. |
| 4.5 | Component 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.6 | Side 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.7 | Z-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.
|
| # | Constraint | Details |
|---|---|---|
| 5.1 | Independent 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.2 | Travel 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 |
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.
Specific rectangular regions on the PCB have different heights. Defined in input_step_region.csv.
| Step Mixing Prohibited | Cannot place step=0 and step=1 components in the same FOV |
| Step Transition Delay | If consecutive FOVs have different steps: +5.0s extra (camera vibration settling time after Z-axis move) |
| Optimization Strategy | Visit all step=0 FOVs first โ then all step=1 FOVs (only 1 transition) |
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).
| Field | Description |
|---|---|
tl_x, tl_y, br_x, br_y | Component top-left / bottom-right coordinates (mm) |
type | 0: Normal / 1: Barcode / 2: Fiducial |
side | Side camera capture required (0 or 1) |
step | Step (height) level (0 or 1) |
time | Per-component inspection time (seconds) |
| Field | Description |
|---|---|
pcb_size | PCB size (mm) |
fov_size | FOV size (mm) |
| Field | Description |
|---|---|
capture_time | Capture time (seconds) |
recon_time | 3D Reconstruction time (seconds) |
side_capture_time | Side capture time (seconds) |
max_core | Max core count (4–16, random per dataset) |
v_x, v_y, a_x, a_y | x/y axis velocity (mm/s), Acceleration (mm/s²) |
| Field | Description |
|---|---|
tl_x, tl_y, br_x, br_y | Step region top-left / bottom-right coordinates (mm) |
| Field | Description |
|---|---|
x, y | FOV center coordinates (mm) |
comp_idx | Component indices in this FOV (JSON array) |
| # | Category | Constraint | Summary |
|---|---|---|---|
| 1.1 | FOV Size | Top FOV Size | Fixed by fov_size in input_size.csv |
| 1.2 | Side FOV Size | Top FOV / 2 (per axis), shared center | |
| 1.3 | Top+Side Combined Capture | Simultaneous capture at same position | |
| 2.1 | Component Placement | Full Component Coverage | All components in at least 1 FOV |
| 2.2 | Fully Contained Within FOV | All 4 corners inside FOV area | |
| 2.3 | Fiducial FOV Restriction | First FOV, exclusive โ no other components allowed | |
| 2.4 | Barcode FOV Rules | Multiple Barcodes per FOV OK. Normal components can be included. fov.type = max(comp types). Inspect after Fiducial, before Normal | |
| 2.5 | Large Component Split | Components exceeding effective FOV (Side FOV for side=1) covered by multiple FOVs | |
| 2.6 | Side Component Placement | side=1 comps: all 4 corners in Side FOV (1/2) | |
| 2.7 | Step Mixing Prohibited | Components in same FOV must have same step value | |
| 3.1 | Inspection Order | FOV Type-based order | Fiducial(2) โ Barcode(1) โ Normal(0) |
| 3.2 | Fiducial FOV Ordering | Lower-indexed Fiducial first | |
| 4.1 | Inspection Resources & CT | Core Role Assignment | Core 0=Move/Capture, Core 1~2=3D Recon, Core 3+=Inspection |
| 4.2 | Core Count (Fixed Input) | max_core is a fixed input constraint per dataset (random 4–16) | |
| 4.3 | Capture Time | capture_time (fixed value) | |
| 4.4 | 3D Reconstruction Time | recon_time (fixed value) | |
| 4.5 | Component Inspection Time | Per-component time field (individual values) | |
| 4.6 | Side Capture Time | FOV with side comps: max(capture_time, side_capture_time) | |
| 4.7 | Z-axis Step Transition Delay | +5.0s on step change | |
| 5.1 | Camera Movement | Independent X, Y Control | Trapezoidal velocity profile |
| 5.2 | Travel Time Calculation | max(T_x, T_y) |
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 |
|---|---|
| BY | Attribution — Credit the competition name and organizer |
| NC | NonCommercial — No commercial use |
| SA | ShareAlike — Derivatives must use the same license |
📝 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 ์ฅ๋น์๋ ํ๋์ ์ดฌ์ ํค๋์ Top ์นด๋ฉ๋ผ(์โ์๋)์ ์ฌ๋ฌ ๋์ Side ์นด๋ฉ๋ผ(๋น์ค๋ฌํ ๊ฐ๋)๊ฐ ํจ๊ป ํ์ฌ๋์ด ์์ต๋๋ค.
๋ถํ์ ์๋ฉด์ ์์ง์ผ๋ก ์ดฌ์ํฉ๋๋ค. ๋ถํ ์ ๋ฌด, ์์น ์ค์ฐจ, ๋ฐฉํฅ ๋ฑ์ ๊ฒ์ฌํฉ๋๋ค. ๋ชจ๋ ๋ถํ์ด Top ์ดฌ์ ๋์์ด๋ฉฐ, Side ๋ถํ (side=1)์ Side ์ดฌ์๋ ์ถ๊ฐ๋ก ์ํํฉ๋๋ค.
๋ถํ์ ์ธก๋ฉด ๋ฉ๋ ํ๋ ์ ๋น์ค๋ฌํ ์ดฌ์ํฉ๋๋ค. Side ๋ถํ (side=1)๋ง ํด๋น๋๋ฉฐ, ๋ณธ ๋ํ์์๋ ์ดฌ์ ์์ญ(Side FOV)์ Top์ ์ ๋ฐ ํฌ๊ธฐ๋ก ๊ฐ์ ํฉ๋๋ค.
side=1)์ด ํฌํจ๋ FOV๋ ์ดฌ์ ์๊ฐ์ด max(capture_time, side_capture_time)์ผ๋ก ์ฆ๊ฐํฉ๋๋ค.
๋ถํ(Component)์ PCB ์์ ์ค์ฅ๋ ์ ์ ๋ถํ(์ ํญ, IC ๋ฑ)์ด๋ฉฐ, FOV(Field of View)๋ ์นด๋ฉ๋ผ๊ฐ ํ ๋ฒ์ ์ดฌ์ํ๋ ์ง์ฌ๊ฐํ ์์ญ์
๋๋ค.
์นด๋ฉ๋ผ๋ FOV ๋จ์๋ก ์ด๋ํ๋ฉฐ, ํ FOV ์์ ์ฌ๋ฌ ๋ถํ์ ๋ด์ ํ ๋ฒ์ ์ดฌ์ํฉ๋๋ค. FOV ํฌ๊ธฐ๋ ๊ณ ์ ์ด๊ณ , ์ฐธ๊ฐ์๋ FOV์ ์์น์ ๊ฐ์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
์ด ์นด๋ฉ๋ผ๊ฐ PCB ์๋ฅผ ํจ์จ์ ์ผ๋ก ๋์๊ฐ๋ฉฐ ์ดฌ์ํ๋ ค๋ฉด 3๊ฐ์ง ๊ฒฐ์ ์ด ํ์ํฉ๋๋ค. ๊ฐ ๊ฒฐ์ ์ด ์๋ก ์ํฅ์ ์ฃผ๊ธฐ ๋๋ฌธ์ ์กฐํฉ ํญ๋ฐ(NP-hard)์ด ๋ฐ์ํ๋ฉฐ, ์ด ์ธ ๊ฐ์ง ๊ฒฐ์ ์ด Cycle Time(CT)์ ๊ฒฐ์ ํฉ๋๋ค.
AOI ์ฅ๋น๋ PCB๋ฅผ ํ ๋ฒ์ ๋ค ๊ฒ์ฌํ์ง ์์ต๋๋ค. FOV ๋จ์๋ก ์ดฌ์ → 3D ๋ณต์ → ๋ถํ ๊ฒ์ฌ๋ฅผ ๋ฐ๋ณตํ๋ฉฐ, ์๋ก ๋ค๋ฅธ Core๊ฐ ๋์์ ์์ ํ์ฌ ์๊ฐ์ ๋จ์ถํฉ๋๋ค. ์๋ 8๋จ๊ณ๋ฅผ ํด๋ฆญํ๋ฉฐ ํ์ดํ๋ผ์ธ์ด ์ด๋ป๊ฒ ๋์๊ฐ๋์ง ๋ฐ๋ผ๊ฐ ๋ณด์ธ์!
capture_time (์
๋ ฅ ํ๋ผ๋ฏธํฐ, ๊ณ ์ ๊ฐ)time)capture_timecapture_time๋์ผํ ๋ถํ ๋ฐฐ์น์์๋ FOV๋ฅผ ์ด๋ป๊ฒ ๋ฌถ๊ณ , ์ด๋ค ์์๋ก ๊ฒ์ฌํ๋๋์ ๋ฐ๋ผ ์ ์ฒด Cycle Time์ด ํฌ๊ฒ ๋ฌ๋ผ์ง๋๋ค.
PCB ์ขํ๊ณ์ ์์์ (์์ )์ ์ ์ํ๋ ๊ธฐ์ค์ ์
๋๋ค. PCB๊ฐ ์ฅ๋น์ ๋์ผ ๋ ๋ฏธ์ธํ ์์น ์ค์ฐจ๊ฐ ๋ฐ์ํ๋ฏ๋ก, Fiducial ์ขํ๋ฅผ ๋จผ์ ์ธก์ ํ์ฌ ์ ์ฒด ์ขํ๊ณ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ํน์ง: ๋ฐ๋์ ์ฒซ ๋ฒ์งธ FOV์ ๋จ๋
๋ฐฐ์น / Fiducial FOV์๋ ๋ค๋ฅธ ๋ถํ ํฌํจ ๋ถ๊ฐ
PCB ๋ชจ๋ธ ๊ตฌ๋ถ์์
๋๋ค. ๋ฐ์ฝ๋๋ฅผ ํตํด ์ด๋ค PCB ๋ชจ๋ธ์ธ์ง ์๋ณํ๋ฉฐ, ๋ชจ๋ธ๋ณ ๊ฒ์ฌ ํ๋ก๊ทธ๋จ์ ์ ์ฉํ๊ธฐ ์ํด Fiducial ๋ค์์ผ๋ก ๋จผ์ ๊ฒ์ฌํฉ๋๋ค.
ํน์ง: Fiducial ๋ค์์ผ๋ก ๊ฒ์ฌ / ๋์ผ FOV์ ์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ / PCB๋น 0~4๊ฐ
์ค์ ๊ฒ์ฌ ๋์์ธ SMD ๋ถํ(์ ํญ, ์ฝ๋ด์, IC ๋ฑ)์
๋๋ค. ๋ถํ์ ์์นยท๋ฐฉํฅยท๋ฉ๋ ์ํ ๋ฑ์ 3D๋ก ๊ฒ์ฌํฉ๋๋ค.
ํน์ง: Fiducial/Barcode ์ดํ ๊ฒ์ฌ / ์์ ์์ ์ต์ ํ ๊ฐ๋ฅ
์ผ๋ถ Side ๋ถํ (side=1)์ Top ์นด๋ฉ๋ผ ์ธ์ Side ์นด๋ฉ๋ผ(์ธก๋ฉด ๋ฉ๋ ๊ฒ์ฌ)๋ ํ์ํฉ๋๋ค. Side FOV๋ Top FOV์ ์ ๋ฐ ํฌ๊ธฐ์ด๋ฉฐ, ๊ฐ์ ์ค์ฌ์ ์ ๊ณต์ ํฉ๋๋ค.
side=0 → Top ์นด๋ฉ๋ผ๋ก๋ง ๊ฒ์ฌ (๋๋ถ๋ถ์ ๋ถํ) — Top FOV ์์ด๋ฉด OKside=1 → Top + Side ์นด๋ฉ๋ผ ๋ชจ๋ ํ์ — ๋ ์์ Side FOV ์์ ์์ ํ ํฌํจ๋์ด์ผ ํจsolver.py ํ๋๋ง ๊ตฌํํ๋ฉด ๋ฉ๋๋ค. max_core๋ ๋ฐ์ดํฐ์
๋ณ ๊ณ ์ ์
๋ ฅ ํ๋ผ๋ฏธํฐ(๋๋ค 4–16)์ด๋ฉฐ, Cycle Time + Computation Time์ผ๋ก ํ๊ฐํฉ๋๋ค.simulation_data/์ 96๊ฐ ๋ฐ์ดํฐ์
์ ๊ฐ๋ฐ ๋ฐ ํ
์คํธ์ฉ์
๋๋ค. ์ต์ข
๊ณต์ ์ฑ์ ์ ๋ณ๋์ ๋น๊ณต๊ฐ ํ
์คํธ์
์ผ๋ก ์งํ๋ฉ๋๋ค.
| # | ์ ์ฝ ์กฐ๊ฑด | ์์ธ ์ค๋ช |
|---|---|---|
| 1.1 | Top FOV ํฌ๊ธฐ | Top ์นด๋ฉ๋ผ์ ์ดฌ์ ์์ญ. input_size.csv์ fov_size ๊ฐ์ผ๋ก ์ฃผ์ด์ง๋๋ค.x์ถ๊ณผ y์ถ ๊ฐ๊ฐ์ FOV ํฌ๊ธฐ๊ฐ ๋ณ๋๋ก ์ ์๋ฉ๋๋ค. ์์ (input_size.csv)
fov_size x=50mm, y=50mm โ Top FOV๋ ๊ฐ๋ก 50mm × ์ธ๋ก 50mm ์ง์ฌ๊ฐํ |
| 1.2 | Side FOV ํฌ๊ธฐ | ๋ณธ ๋ํ์์๋ Side ์นด๋ฉ๋ผ์ ์ดฌ์ ์์ญ์ Top FOV์ ์ ๋ฐ์ผ๋ก ๊ฐ์ ํฉ๋๋ค (๊ฐ ์ถ ๊ธฐ์ค).side_fov_w = fov_width / 2.0, side_fov_h = fov_height / 2.0Side FOV์ Top FOV๋ ์ค์ฌ์ ์ ๊ณต์ ํฉ๋๋ค. ์์
Top FOV๊ฐ 50×50mm์ด๋ฉด โ Side FOV๋ 25×25mm, ์ค์ฌ์ ๋์ผ |
| 1.3 | Top + 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๋ก ๋ชจ๋ ์ปค๋ฒ ๊ฐ๋ฅํฉ๋๋ค.
|
side=1)์ ํ๋์ Side FOV ์์ญ ์์ ์์ ํ ํฌํจ๋์ด์ผ ํฉ๋๋ค. Top FOV ์์ ์๋๋ผ๋ Side FOV ๋ฐ์ด๋ฉด ์ ์ฝ ์๋ฐ์
๋๋ค.
| # | ์ ์ฝ ์กฐ๊ฑด | ์์ธ ์ค๋ช |
|---|---|---|
| 2.1 | ์ ์ฒด ๋ถํ ์ปค๋ฒ | ๋ชจ๋ ๋ถํ์ ์ต์ 1๊ฐ์ FOV์ ํฌํจ๋์ด์ผ ํฉ๋๋ค. ๋๋ฝ๋ ๋ถํ์ด ์์ผ๋ฉด ์ ์ฝ ์๋ฐ์
๋๋ค.
๊ฒ์ฆ ๋ฐฉ๋ฒ (checker.py)
๊ฐ ๋ถํ์ ๋ํด comp_mask[idx]๊ฐ 1์ธ์ง ํ์ธ. ํ๋๋ผ๋ 0์ด๋ฉด ์คํจ. |
| 2.2 | FOV ์์ญ ๋ด ์์ ํฌํจ | ๋ถํ์ 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.3 | Fiducial FOV ์ ํ | Fiducial ๋ถํ(type=2)์ ๋ฐ๋์ ์ฒซ ๋ฒ์งธ FOV์ ๋จ๋
๋ฐฐ์น๋ฉ๋๋ค. Fiducial FOV์๋ ๋ค๋ฅธ ๋ถํ ํฌํจ ๋ถ๊ฐ. Fiducial์ PCB ์ขํ๊ณ์ ์์์ (์์ )์ผ๋ก, ์ ๋ฐํ ์์น ๋ณด์ ์ ์ฌ์ฉ๋ฉ๋๋ค. |
| 2.4 | Barcode 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.6 | Side ๋ถํ ๋ฐฐ์น | 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/4side_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๊ฐ โ ํต๊ณผ |
| # | ์ ์ฝ ์กฐ๊ฑด | ์์ธ ์ค๋ช |
|---|---|---|
| 3.1 | FOV ํ์ ๋ณ ์์ | 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.2 | Fiducial FOV ๊ฐ ์์ | Fiducial FOV๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๋, input_component.csv์์ ์ธ๋ฑ์ค๊ฐ ์์ Fiducial์ด ์ํ FOV๋ฅผ ๋จผ์ ๊ฒ์ฌํฉ๋๋ค.
์์
Fiducial ๋ถํ์ด index=0๊ณผ index=5์ ์๋ค๋ฉด โ index=0์ FOV๊ฐ ๋ฐ๋์ index=5์ FOV๋ณด๋ค ์์ ์์ผ ํฉ๋๋ค. |
| # | ์ ์ฝ ์กฐ๊ฑด | ์์ธ ์ค๋ช |
|---|---|---|
| 4.1 | Core ์ญํ |
Core 0: ์นด๋ฉ๋ผ X/Y ์ด๋ + FOV ์ดฌ์ (ํญ์ ์์ฐจ ์คํ) Core 1~2: 3D ๋ณต์ ์ ๋ด (์ดฌ์ ์๋ฃ ํ, ๋ ์ค ๋น Core์ ํ ๋น) Core 3 ์ด์: ๋ถํ๋ณ ๊ฒ์ฌ (๋ณต์ ์๋ฃ ํ, ๊ฐ์ฅ ๋น Core์ ํ ๋น) Core 0์ ์์ (๋งค FOV๋ง๋ค)
[์ด์ FOV ์์น โ ๋ค์ FOV ์์น ์ด๋] โ [์ดฌ์] โ [๋ค์ FOV ์ด๋] โ ...์ฆ, Core 0์ ์ฌ์ง ์๊ณ ์ด๋โ์ดฌ์โ์ด๋โ์ดฌ์์ ๋ฐ๋ณตํฉ๋๋ค. |
| 4.2 | Core ์ (๊ณ ์ ์ ๋ ฅ) | 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.4 | 3D ๋ณต์ ์๊ฐ | ์ดฌ์๋ ์ด๋ฏธ์ง๋ก๋ถํฐ 3D ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ์๊ฐ. recon_time ๊ฐ. |
| 4.5 | ๋ถํ ๊ฒ์ฌ ์๊ฐ | ๊ฐ ๋ถํ๋ณ ๊ฒ์ฌ ์๊ฐ์ input_component.csv์ time ํ๋์ ๊ฐ๋ณ ์ ์๋ฉ๋๋ค.FOV ์์ ๋ถํ๋ค์ด ์์๋๋ก ๊ฐ์ฅ ๋น ๊ฒ์ฌ Core์ ํ ๋น๋ฉ๋๋ค. |
| 4.6 | Side ์ดฌ์ ์๊ฐ | FOV์ Side ๋ถํ (side=1)์ด 1๊ฐ๋ผ๋ ํฌํจ๋๋ฉด, Top๊ณผ Side ์นด๋ฉ๋ผ๊ฐ ๋์ ์ดฌ์ํ๋ฏ๋ก ์ดฌ์ ์๊ฐ์ ๋ ์ค ๊ธด ์ชฝ์ด ๋ฉ๋๋ค.
Side ๋ถํ ํฌํจ FOV: imaging_time = max(capture_time, side_capture_time) Side ๋ถํ ๋ฏธํฌํจ FOV: imaging_time = capture_time |
| 4.7 | Z์ถ ๋จ์ฐจ ์ ํ ์ง์ฐ | ์ฐ์๋ ๋ FOV์ ๋จ์ฐจ(๋์ด) ๊ฐ์ด ๋ค๋ฅด๋ฉด ์นด๋ฉ๋ผ์ Z์ถ ๋์ด๋ฅผ ์ ํํด์ผ ํ๋ฉฐ, 5.0์ด์ ์ถ๊ฐ ์ง์ฐ์ด ๋ฐ์ํฉ๋๋ค. Z์ถ ์ด๋ ์์ฒด๋ ๋น ๋ฅด์ง๋ง, ์ด๋ ํ ์นด๋ฉ๋ผ ์ง๋(ํ๋ค๋ฆผ)์ด ์์ ๋ ๋๊น์ง์ settling time์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ดฌ์ ํ์ง์ ๋ณด์ฅํ๋ ค๋ฉด ์ง๋์ด ์์ ํ ์๋ฉธ๋ ๋ค ์ดฌ์ํด์ผ ํฉ๋๋ค. ์ด ์ง์ฐ์ Core 0์์ ์ด๋ ํ, ์ดฌ์ ์ ์ ์ถ๊ฐ๋ฉ๋๋ค.
๊ฐ์ ๋จ์ฐจ: Core 0 = [์ด๋] โ [์ดฌ์]
๋ค๋ฅธ ๋จ์ฐจ: Core 0 = [์ด๋] โ [+5.0์ด Z์ ํ] โ [์ดฌ์]
🔥
5์ด๋ ๋งค์ฐ ํฐ ํ๋ํฐ์
๋๋ค. ์ด๋ ์๊ฐ์ด ๋ณดํต 0.1~0.5์ด์ธ ๊ฒ์ ๋นํด 10~50๋ฐฐ ํฝ๋๋ค. ๊ฐ์ ๋จ์ฐจ์ FOV๋ฅผ ์ฐ์ ๋ฐฐ์นํ์ฌ ์ ํ ํ์๋ฅผ ์ต์ํํ๋ ๊ฒ์ด ํต์ฌ ์ ๋ต์
๋๋ค.
|
| # | ์ ์ฝ ์กฐ๊ฑด | ์์ธ ์ค๋ช |
|---|---|---|
| 5.1 | X, 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์ด |
max(T_x, T_y)์ด๋ฏ๋ก, ํ ์ถ์ ์ด๋ ๊ฑฐ๋ฆฌ๋ง ๊ธธ๊ณ ๋ค๋ฅธ ์ถ์ ์งง์ ๊ฒฝ์ฐ ์ํด๊ฐ ์ ์ต๋๋ค. ์๋ฅผ ๋ค์ด X์ถ์ผ๋ก 200mm ์ด๋ํ๋ฉด์ Y์ถ์ผ๋ก 10mm ์ด๋ํ๋ฉด, Y์ถ์ ์ฌ์ค์ ๊ณต์ง์
๋๋ค. FOV ์์๋ฅผ ์ ํ ๋ ํ ์ถ ๋ฐฉํฅ์ผ๋ก ์ญ ํ๋ค๊ฐ(sweep) ๋ค์ ์ค๋ก ๋์ด๊ฐ๋ ํจํด์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์จ์ ์
๋๋ค.
PCB ์์ ํน์ ์ง์ฌ๊ฐํ ์์ญ์ด ๋ค๋ฅธ ๋์ด๋ฅผ ๊ฐ์ง๋๋ค. input_step_region.csv์ ์ ์๋ฉ๋๋ค.
| ๋จ์ฐจ ํผํฉ ๊ธ์ง | ํ๋์ FOV ์์ ๋์ด=0๊ณผ ๋์ด=1 ๋ถํ ๋์ ๋ฐฐ์น ๋ถ๊ฐ |
| ๋จ์ฐจ ์ ํ ์ง์ฐ | ์ฐ์ FOV์ ๋จ์ฐจ๊ฐ ๋ค๋ฅด๋ฉด +5.0์ด ์ถ๊ฐ (Z์ถ ์ด๋ ํ ์นด๋ฉ๋ผ ์ง๋ settling time) |
| ์ต์ ํ ์ ๋ต | ๋์ด=0 FOV๋ค์ ๋จผ์ ๋ชจ๋ ์ํ โ ๋์ด=1 FOV๋ค ์ํ (์ ํ 1ํ) |
์๋๋ ์ค์ ๋จ์ฐจ ๋ณด๋๋ฅผ ๋จ์ํํ ๋ค์ด์ด๊ทธ๋จ์ ๋๋ค. ํฐ ๋ชจ๋(BGA ๋ฑ)์ด ์ค์ฅ๋ ์์ญ์ ๋์ด๊ฐ ๋์ ๋จ์ฐจ ์์ญ(step=1)์ด ๋ฉ๋๋ค.
| ํ๋ | ์ค๋ช |
|---|---|
tl_x, tl_y, br_x, br_y | ๋ถํ ์ข์๋จ/์ฐํ๋จ ์ขํ (mm) |
type | 0: ์ผ๋ฐ ๋ถํ / 1: Barcode / 2: Fiducial |
side | Side ์นด๋ฉ๋ผ ์ดฌ์ ์ฌ๋ถ (0 or 1) |
step | ๋์ด(๋จ์ฐจ) ๋ ๋ฒจ (0 ๋๋ 1) |
time | ๋ถํ๋ณ ๊ฒ์ฌ ์๊ฐ (์ด) |
| ํ๋ | ์ค๋ช |
|---|---|
pcb_size | PCB ํฌ๊ธฐ (mm) |
fov_size | FOV ํฌ๊ธฐ (mm) |
| ํ๋ | ์ค๋ช |
|---|---|
capture_time | ์ดฌ์ ์๊ฐ (์ด) |
recon_time | 3D ๋ณต์ ์๊ฐ (์ด) |
side_capture_time | Side ์ดฌ์ ์๊ฐ (์ด) |
max_core | ์ต๋ Core ์ (4~16, ๋ฐ์ดํฐ์ ๋ณ ๋๋ค) |
v_x, v_y, a_x, a_y | x/y์ถ ์๋(mm/s), ๊ฐ์๋(mm/s²) |
| ํ๋ | ์ค๋ช |
|---|---|
tl_x, tl_y, br_x, br_y | ๋จ์ฐจ ์์ญ์ ์ข์๋จ/์ฐํ๋จ ์ขํ (mm) |
| ํ๋ | ์ค๋ช |
|---|---|
x, y | FOV ์ค์ฌ ์ขํ (mm) |
comp_idx | FOV์ ํฌํจ๋ ๋ถํ ์ธ๋ฑ์ค (JSON ๋ฐฐ์ด) |
| # | ๋ถ๋ฅ | ์ ์ฝ ์กฐ๊ฑด | ์์ฝ |
|---|---|---|---|
| 1.1 | FOV ํฌ๊ธฐ | Top FOV ํฌ๊ธฐ | input_size.csv์ fov_size๋ก ๊ณ ์ |
| 1.2 | Side FOV ํฌ๊ธฐ | Top FOV / 2 (๊ฐ ์ถ), ์ค์ฌ์ ๊ณต์ | |
| 1.3 | Top+Side ํตํฉ ์ดฌ์ | ๊ฐ์ ์์น์์ ๋์ ์ดฌ์ | |
| 2.1 | ๋ถํ ๋ฐฐ์น | ์ ์ฒด ๋ถํ ์ปค๋ฒ | ๋ชจ๋ ๋ถํ FOV์ 1ํ ์ด์ ํฌํจ |
| 2.2 | FOV ์์ญ ๋ด ์์ ํฌํจ | ๋ถํ 4๊ผญ์ง์ ์ด FOV ์์ญ ๋ด | |
| 2.3 | Fiducial FOV ์ ํ | ์ฒซ ๋ฒ์งธ FOV์ ๋จ๋ ๋ฐฐ์น, ๋ค๋ฅธ ๋ถํ ๋ถ๊ฐ | |
| 2.4 | Barcode FOV ๊ท์น | ๋์ผ FOV์ Barcode ์ฌ๋ฌ ๊ฐ + ์ผ๋ฐ ๋ถํ ํฌํจ ๊ฐ๋ฅ. fov.type = max(๋ถํ type). Fiducial ๋ค์, ์ผ๋ฐ ์ ์ ๊ฒ์ฌ | |
| 2.5 | ํฐ ๋ถํ ๋ถํ | ์ ํจ FOV(side=1์ Side FOV) ์ด๊ณผ ๋ถํ์ ๋ค์ค FOV๋ก ์์ ์ปค๋ฒ | |
| 2.6 | Side ๋ถํ ๋ฐฐ์น | side=1 ๋ถํ์ Side FOV(1/2) ๋ด 4๊ผญ์ง์ ํฌํจ | |
| 2.7 | ๋จ์ฐจ ํผํฉ ๊ธ์ง | ๋์ผ FOV ๋ด ๋ถํ์ ๊ฐ์ ๋์ด(๋จ์ฐจ) ๊ฐ ํ์ | |
| 3.1 | ๊ฒ์ฌ ์์ | FOV ํ์ ๋ณ ์์ | Fiducial(2) โ Barcode(1) โ ์ผ๋ฐ(0) |
| 3.2 | Fiducial FOV ๊ฐ ์์ | ๋จผ์ ๋ฑ๋ก๋ Fiducial ์ฐ์ | |
| 4.1 | ๊ฒ์ฌ ๋ฆฌ์์ค & CT | Core ์ญํ ํ ๋น | Core 0=์ด๋/์ดฌ์, Core 1~2=๋ณต์, Core 3+=๊ฒ์ฌ |
| 4.2 | Core ์ (๊ณ ์ ์ ๋ ฅ) | max_core๋ ๋ฐ์ดํฐ์ ๋ณ ๊ณ ์ ์ ๋ ฅ (๋๋ค 4–16) | |
| 4.3 | ์ดฌ์ ์๊ฐ | capture_time (๊ณ ์ ๊ฐ) | |
| 4.4 | 3D ๋ณต์ ์๊ฐ | recon_time (๊ณ ์ ๊ฐ) | |
| 4.5 | ๋ถํ ๊ฒ์ฌ ์๊ฐ | ๊ฐ ๋ถํ๋ณ time ํ๋ (๊ฐ๋ณ๊ฐ) | |
| 4.6 | Side ์ดฌ์ ์๊ฐ | side ๋ถํ ํฌํจ FOV: max(capture_time, side_capture_time) | |
| 4.7 | Z์ถ ๋จ์ฐจ ์ ํ ์ง์ฐ | ๋จ์ฐจ ๋ณ๊ฒฝ ์ +5.0์ด | |
| 5.1 | ์นด๋ฉ๋ผ ์ด๋ | X, Y์ถ ๋ ๋ฆฝ ์ ์ด | ์ฌ๋ค๋ฆฌ๊ผด ์๋ ํ๋กํ์ผ |
| 5.2 | ์ด๋ ์๊ฐ ์ฐ์ | max(T_x, T_y) |
๋ณธ ๋ํ์์ ์ ๊ณตํ๋ ๋ฐ์ดํฐ์ , ํ๊ฐ ๋๊ตฌ(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 ๋ผ์ด์ ์ค๋ก ์ ๊ณต๋ฉ๋๋ค.”