AI가 CAD를 실행하게 하기 — Kiro를 이용한 FreeCAD로의 STEP 생성
요약
본 기사는 AI 코딩 어시스턴트 Kiro를 활용하여 자연어 지시만으로 3D 모델링 및 CAD 워크플로우를 수행하는 과정을 다룹니다. 이전에는 STL 파일로 출력되어 편집에 한계가 있었으나, 이번에는 STEP 형식으로 모델을 생성함으로써 AI가 만든 형상을 전문 CAD 소프트웨어(FreeCAD)에서 열고 수정할 수 있음을 입증했습니다. 이를 통해 설계 → CAD 편집 → 구조 해석(CAE) → 로봇 제어 학습까지 이어지는 엔드 투 엔드 파이프라인 구축의 기반을 마련합니다.
핵심 포인트
- AI 코딩 어시스턴트 Kiro를 사용하여 자연어 지시만으로 3D 모델링 및 STEP 파일 생성이 가능합니다.
- STL은 단순 메쉬(mesh) 집합이라 CAD 편집에 부적합하며, STEP 형식은 B-rep 기반으로 실제 CAD 소프트웨어에서 수정 가능한 형상 데이터를 제공합니다.
- STEP 파일을 통해 AI가 생성한 모델을 FreeCAD와 같은 전문 CAD 툴에서 열고 필렛 추가 등 피처 기반 편집이 가능함을 입증했습니다.
- 본 워크숍은 설계(Design) → CAD 편집(Edit) → 구조 해석(CAE) → 강화학습(RL)까지 이어지는 완전한 엔드 투 엔드 파이프라인을 구축하는 과정을 보여줍니다.
서론
이전 기사에서는 AWS의 "Auto&Manufacturing - Kiro for Business Users" 워크숍을 소개했습니다. 해당 기사에서는 AI 코딩 어시스턴트인 "Kiro"를 사용하여 자연어 지시만으로 CFD 시뮬레이션과 3D 모델링을 수행했습니다.
이전 기사의 "응용 사례: 더 복잡한 산업용 기계의 3D 모델링" 섹션에서는 자연어 지시만으로 6축 다관절 로봇 팔의 3D 모델을 생성했습니다.
당시에 사용된 방법은 Python의 numpy-stl 라이브러리를 사용하여 삼각형 정점 좌표를 직접 계산하여 STL 파일을 출력하는 방식이었습니다. CAD 소프트웨어는 전혀 사용되지 않았습니다.
워크숍에서 STL을 채택한 이유는 단일 pip install numpy-stl 명령으로 환경을 설정할 수 있어 초보자가 접근하기 쉽기 때문입니다. 하지만 STL은 단순히 삼각형 메쉬 (triangle meshes)의 집합일 뿐이므로, CAD 소프트웨어에서의 피처 기반 편집(구멍 직경 변경, 필렛(fillet) 추가 등)은 사실상 어렵습니다. STL은 초기 단계의 형상 탐색이나 컨셉 확인에는 사용할 수 있지만, 실제 실무의 CAD 워크플로우에 직접 적용하기에는 적합하지 않습니다.
[이미지] 이전에 생성된 6축 로봇 팔의 STL 모델
이번에는 한 단계 더 나아가, 이 로봇 팔을 STEP 형식으로 다시 출력함으로써, AI가 생성한 3D 모델을 CAD 소프트웨어에서 열고 편집할 수 있음을 입증하고자 합니다.
참고: 이 워크숍에서는 Claude Opus 4.6이 Kiro CLI의 파운데이션 모델 (foundation model)로 사용됩니다. 생성된 코드의 품질과 동작은 모델 버전에 따라 다를 수 있습니다.
후속편이 게시되었습니다: 본 기사에서 STEP으로 내보내고 FreeCAD로 편집한 로봇 팔을 사용하여, Kiro가 FreeCAD FEM을 통해 구조 해석 (CAE)을 수행하도록 하고 응력(stress)과 변위(displacement)를 정량적으로 평가했습니다. 이제 설계 → CAD 편집 → 강도 검증으로 이어지는 엔드 투 엔드 파이프라인 (end-to-end pipeline)이 완성되었습니다.
그리고 4번째 후속편도 발행되었습니다: 위 CAE를 통해 강도가 검증된 로봇 팔을 사용하여 흡착식 그리퍼 (suction-cup gripper)를 추가하였고, NVIDIA Isaac Sim / Isaac Lab에서 **4,096개의 병렬 환경 (parallel environments)을 이용한 강화학습 (PPO)**을 수행했습니다. 이를 통해 AI가 이 글에서 CAD로 편집된 형상을 "어떻게 움직일지" 스스로 학습하는 단계에 도달했습니다.
STL과 STEP의 차이점
| 구분 | STL | STEP |
|---|---|---|
| 데이터 내용 | 삼각형 정점 좌표의 집합 | B-rep (면, 모서리, 정점의 수학적 정의) |
| ... | ... | ... |
STL이 비트맵 이미지 (JPEG)와 같다면, STEP은 파워포인트 (PowerPoint) 파일에 더 가깝습니다. JPEG로는 무엇이 그려져 있는지는 볼 수 있지만, 이미지 내의 개별 글자나 도형을 선택하여 편집할 수는 없습니다. 반면, 파워포인트는 텍스트 상자나 도형을 하나씩 선택하여 이동, 변형 또는 삭제할 수 있습니다. STEP도 이와 유사합니다. 면 (faces)이나 모서리 (edges)를 선택하여 필렛 (fillets)을 추가하거나 구멍을 뚫을 수 있습니다.
하지만 이 비유가 엄격하게 일치하는 것은 아닙니다. 파워포인트는 "어떤 순서로 객체가 만들어졌는지"에 대한 생성 이력을 유지하지만, STEP은 그렇지 않습니다. STEP이 유지하는 것은 "형상 그 자체"이지, "형상이 어떻게 만들어졌는지 (설계 이력, design history)"가 아닙니다. 예를 들어, SolidWorks에서 STEP 파일을 열면 이는 "덤 솔리드 (dumb solid)"로 읽히며 피처 트리 (feature tree)는 비어 있습니다. 즉, 면이나 모서리를 선택하여 새로운 가공 작업을 추가할 수는 있지만, 원래의 설계 단계를 되돌아가서 "이 구멍의 직경만 변경하기"와 같은 작업은 할 수 없습니다.
오늘의 흐름
이 글에서는 다음 세 단계를 거쳐 진행합니다.
Step 1: Kiro가 CadQuery 코드를 생성하고 STEP 파일을 출력함
(자연어 지시 -> Python 스크립트 -> STEP)
Step 2: Kiro가 FreeCAD의 Python API를 통해 STEP을 편집함
...
Step 1~2는 순수하게 Kiro에 대한 자연어 지시만으로 완료됩니다. Step 3는 사람이 직접 FreeCAD를 조작하는 과정으로, Step 2에서 Kiro가 스크립트를 통해 수행한 것과 동일한 편집이 GUI에서도 가능하다는 것을 확인합니다.
환경 설정
사용된 도구 (Tools used)
| 도구 (Tool) | 버전 (Version) | 용도 (Purpose) |
|---|---|---|
| CadQuery | 2.7.0 | Python을 이용한 STEP 파일 생성 |
| ... |
설치 단계 (Installation steps)
CadQuery는 OpenCASCADE (CAD 엔진)를 내장하고 있으므로, pip만으로는 설치할 수 없습니다. conda (miniforge)를 통해 설치해야 합니다. 다음은 macOS에서의 단계입니다.
# miniforge가 없다면 설치 (macOS)
brew install miniforge
# CadQuery 환경 생성 (Python 3.12 + CadQuery + OCP 통합 설치)
...
Windows의 경우, miniforge 설치 프로그램을 다운로드하여 실행하십시오. micromamba create 명령은 동일합니다. FreeCAD는 공식 사이트에서 구할 수 있습니다.
pip install numpy-stl 한 번으로 numpy-stl을 설치할 수 있었던 이전 워크숍과 비교했을 때, CadQuery는 conda 환경이 필요합니다. 이것이 이전 워크숍에서 STL을 채택한 이유 중 하나일 것입니다. 25분짜리 워크숍에서는 환경 설정의 안정성이 우선시되기 때문입니다.
STEP 모델 생성하기 (Generating the STEP model)
대상 모델: 6축 다관절 로봇 팔 (6-axis articulated robot arm)
이전 기사에서 STL 형식으로 소개되었던 6축 로봇 팔을 이번에는 CadQuery를 사용하여 STEP 형식으로 다시 제작합니다.
Kiro에게 전달하는 프롬프트 (Prompt to Kiro)
참고를 위해, 로봇 팔의 STL 버전을 생성하기 위해 이전 기사에서 사용했던 프롬프트의 발췌본을 아래에 제시합니다.
Please build a Python script called generate_robot_arm.py that generates
a 3D model of an industrial 6-axis articulated robot arm. Use only
numpy-stl, numpy, and matplotlib.
...
이번에는 Kiro에게 STL 버전과 동일한 형상 사양을 출력하되, STEP 형식으로 출력하도록 지시합니다.
Please write a script that outputs, in STEP format, the same shape
specification as the 6-axis robot arm we created previously
(demos/06_robot-arm/generate_robot_arm.py), using CadQuery.
...
생성된 코드의 주요 특징 (Highlights of the generated code)
Kiro가 생성한 CadQuery 스크립트의 특징적인 부분은 다음과 같습니다:
import cadquery as cq
# CadQuery 솔리드 모델링 (solid modeling) — STL 버전과의 차이점
def make_cylinder(radius, height):
...
STL 버전에서는 삼각형 정점 (vertex) 좌표를 직접 계산했지만, CadQuery 버전에서는 "원을 그리고 돌출시키기" 또는 "구멍 뚫기"와 같은 **CAD 방식의 연산 (CAD-style operations)**을 통해 모델을 구축합니다. CadQuery는 내부적으로 OpenCASCADE (CAD 커널)를 사용하여 솔리드 모델 (solid models)을 구축하므로, 출력된 STEP 파일은 B-rep (면과 모서리의 수학적 정의)를 유지합니다. 이것이 추후 편집이 가능한 근거가 됩니다.
실행 결과
STEP save complete: robot_arm.step
Number of parts: 10
Part list: ['base', 'swivel', 'shoulder_joint', 'upper_arm',
...
이름이 지정된 10개의 파트 (parts)를 포함하는 STEP 파일이 생성되었습니다.
[Image] 로봇 팔의 STEP 버전, 4면도
FreeCAD에서의 검증 및 편집
이 부분이 이 글의 핵심입니다. 생성된 STEP 파일을 FreeCAD에서 열고, 해당 파일에 대해 CAD 소프트웨어 연산을 수행합니다.
FreeCAD GUI에서 불러오기
먼저, FreeCAD의 GUI에서 STEP 파일을 엽니다.
[Image] FreeCAD GUI에서 열린 STEP 파일
왼쪽 패널의 모델 트리 (model tree)에는 10개의 파트가 이름별로 표시됩니다 (base, swivel, shoulder_joint, upper_arm, elbow_joint, forearm, wrist_j4/j5/j6, flange). 파트를 클릭하면 개별적으로 선택되며 (이미지에서 forearm이 연한 파란색으로 강조됨), 오른쪽 패널에는 "Fillet" 및 "Chamfer"와 같은 CAD 편집 도구들이 나열됩니다.
STL 파일을 FreeCAD에서 열면 모델 트리에 단일 메쉬 (mesh) 객체만 표시되며, 파트별 선택 및 B-rep 기반의 편집 도구를 사용할 수 없습니다. 이러한 차이점이 바로 STEP의 가치입니다.
FreeCAD Python API를 이용한 편집
GUI에서의 대화형 편집 외에도, FreeCAD의 Python API (FreeCADCmd)를 사용한 스크립트 기반 편집도 가능합니다. 블로그의 재현성을 위해, 이번에는 Python API를 통해 편집 연산을 실행했습니다.
편집 연산 1: 필렛 (fillet) 추가
upper_arm 링크 (upper_arm)의 긴 모서리에 R5mm 필렛을 추가합니다.
# FreeCAD의 Python API를 사용하여 필렛 (fillet) 추가
edges = shape.Edges
fillet_edges = [e for e in edges if e.Length > 400] # 긴 모서리 선택
...
필렛 추가 완료: 4개 모서리에 R5mm 적용
STL은 메쉬 (mesh, 삼각형의 집합)이기 때문에, "이 모서리에 필렛을 추가하라"와 같은 B-rep (Boundary Representation) 기반의 연산은 실질적으로 어렵습니다. 반면 STEP은 면/모서리 토폴로지 (topology)를 유지하므로, 모서리를 선택하여 정밀하게 필렛을 적용할 수 있습니다.
편집 연산 2: 구멍 (hole) 추가
로봇 팔 끝부분의 툴 플랜지 (tool flange, 엔드 이펙터 장착면) 중앙에 Ø16mm 관통 구멍을 추가합니다. 이 부분은 원래 6개의 볼트 구멍이 있었습니다.
# FreeCAD의 Python API를 사용하여 구멍 추가
center_hole = Part.makeCylinder(8, 17, ...)
new_shape = shape.cut(center_hole) # 불리언 (Boolean, 차집합) 연산
편집 전 부피: 44,214 mm^3
중앙 구멍 추가 완료: 직경 16mm
편집 후 부피: 42,532 mm^3
부피가 감소한 것을 통해 구멍이 올바르게 뚫렸음을 확인할 수 있습니다.
[이미지] 편집 후 — 등각 투영도 (필렛 + 구멍 추가됨)
편집 후 내보내기 (Exporting)
편집된 모델을 STEP과 STL 형식 모두로 내보냅니다.
STEP 저장: robot_arm_edited.step (102.5 KB)
STL 저장: robot_arm_edited.stl (177.8 KB)
편집 후에도 STEP 형식으로 저장할 수 있기 때문에, 추가 편집을 위해 다른 CAD 소프트웨어에서 다시 여는 것이 가능합니다. 하지만 STEP을 거칠 때마다 파라메트릭 디자인 히스토리 (parametric design history)가 유지되지는 않으므로 (앞서 언급한 "덤 솔리드 (dumb solid)" 문제), 최종적인 상세 설계는 일반적으로 CAD 소프트웨어의 네이티브 (native) 형식에서 수행됩니다.
STL 버전과의 비교
[이미지] STL 버전 vs. STEP 버전 비교
| STL 버전 (이전) | STEP 버전 (이번) |
|---|---|
| 파일 크기 | 60.6 KB |
| ... |
삼각형 개수의 차이는 STEP에서 STL로 변환할 때의 테셀레이션 (tessellation, 메쉬 세분화) 설정이 다르기 때문에 발생합니다. STEP 파일 자체에는 삼각형이 포함되지 않으며, 곡면은 수학적 정의 (NURBS 등)로 유지됩니다.
Discussion
설계 프로세스에서의 위치
[형상 탐색 / 컨셉 검토] -> [상세 설계] -> [도면] -> [제조]
^ 이전 (STL) ^ 이번 (STEP)
보기 전용 CAD 소프트웨어에서의 편집 시작점
이전의 STL 출력물은 "형상 탐색" 단계까지만 커버했습니다. 이번 STEP 출력을 통해, AI가 생성한 모델을 CAD 소프트웨어로 가져와 피처 추가 (Feature addition) 및 불리언 연산 (Boolean operations)을 통한 편집의 시작점으로 사용할 수 있는 단계에 도달했습니다.
그렇다고 해서 STEP으로 여는 것이 무엇이든 자유롭게 편집할 수 있다는 의미는 아닙니다. 이번에 우리가 시연한 것은 "필렛 (Fillet) 추가" 또는 "구멍 뚫기 (Drilling)"와 같은 새로운 가공 작업의 추가입니다. 반면, "기존 구멍의 직경을 10mm에서 12mm로 변경"하는 작업은 쉽지 않습니다. STEP은 "여기에 Ø10mm 구멍을 뚫었다"라는 설계 단계 (Design step)를 기록하지 않기 때문에, CAD 소프트웨어 관점에서는 그저 "우연히 이런 형상을 가진 덩어리"일 뿐입니다. 구멍 직경을 변경하려면 먼저 구멍을 메운 다음 12mm로 다시 뚫어야 하는 우회적인 절차를 거쳐야 합니다.
SolidWorks의 네이티브 포맷 (.sldprt)의 경우, "구멍: 직경 10mm"라는 피처 (Feature)가 설계 이력 (Design history)에 남아 있어 10을 12로 다시 쓰는 것만으로 충분합니다. STEP에는 이것이 없습니다. 이것이 업계에서 이를 "덤 솔리드 (Dumb solid)"라고 부르는 이유입니다.
즉, 현실적인 워크플로우는 AI가 생성한 STEP 모델을 "형상의 시작점"으로 사용하고, 이후 사람이 CAD 소프트웨어에서 상세 설계를 진행하는 것입니다.
기존 CAD 소프트웨어와의 통합
이 방법을 기존 CAD 워크플로우에 통합하기 위해 세 가지 접근 방식을 생각해 볼 수 있습니다:
STEP 임포트 방식 (이번에 시연한 방식): Kiro → CadQuery → STEP → CAD 소프트웨어로 임포트
API 코드 생성 방식: Kiro가 대상 CAD 소프트웨어용 API 코드를 작성하게 하여 직접 실행
MCP 통합 방식: CAD 소프트웨어를 위한 MCP 서버를 구축하여 Kiro에서 직접 조작
MCP (Model Context Protocol)는 AI 어시스턴트가 외부 도구와 통합하기 위한 표준 프로토콜이며, Kiro 또한 이를 지원합니다. 만약 CAD 소프트웨어를 위한 MCP 서버가 구현된다면, "플랜지에 Ø20mm 구멍을 추가해줘" → 결과 확인 → "중심에서 X 방향으로 10mm만큼 구멍 위치를 오프셋(offset)해줘"와 같은 대화형 설계 작업이 가능해집니다. 현재로서는 MCP 기능을 갖춘 CAD 소프트웨어 제품이 거의 없지만, FreeCAD와 같이 풍부한 Python API를 가진 소프트웨어의 경우 직접 MCP 서버를 구축하는 것이 기술적으로 가능합니다.
요약
이 글에서는 이전의 STL 출력 단계를 넘어, 다음과 같은 내용을 시연했습니다:
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기