AI가 설계하고 AI가 검증한다 — Kiro × FreeCAD FEM을 이용한 로봇 팔 CAE
요약
본 기사는 AI 코딩 어시스턴트 Kiro와 FreeCAD FEM을 결합하여 로봇 팔의 구조 해석(CAE) 과정을 수행한 내용을 다룹니다. 자연어 지시만으로 STEP 모델을 불러오고, Gmsh를 이용해 메쉬를 생성하며, CalculiX 같은 FEA 솔버를 사용하여 응력과 변위를 정량적으로 계산합니다. 이 과정은 로봇 팔의 파손 여부와 구조적 안정성을 검증하는 표준 엔지니어링 프로세스를 AI가 자율적으로 수행함을 보여줍니다.
핵심 포인트
- AI 코딩 어시스턴트 Kiro를 활용하여 자연어 지시만으로 복잡한 CAE(구조 해석) 파이프라인을 구축하고 실행할 수 있습니다.
- 로봇 팔의 구조적 안정성 검증은 응력(Stress)과 변위(Displacement) 계산을 통해 이루어지며, 이는 엔지니어링 설계의 필수 단계입니다.
- 전 과정이 GUI 없이 명령줄 및 스크립트만 사용하는 '헤드리스(Headlessly)' 방식으로 진행되어 자동화된 워크플로우를 입증했습니다.
- Gmsh는 CAD 형상으로부터 유한 요소 메쉬를 생성하고, CalculiX와 같은 FEA 솔버가 이 메쉬를 기반으로 실제 물리적 해석을 수행합니다.
서론
이 기사는 Kiro × Design & Development 시리즈의 세 번째 편입니다.
- Part 1:
Kiro를 활용한 AI 보조 엔지니어링 — 텍스트로부터의 CFD 및 3D 모델링 — CAD나 CAE 소프트웨어 없이 오직 Python(numpy-stl, 격자 볼츠만 방법 (lattice Boltzmann method))만을 사용하여 CFD 시뮬레이션을 실행하고 3D 모델을 생성합니다. - Part 2:
AI에게 CAD 실행 맡기기 — Kiro를 이용한 STEP 생성부터 FreeCAD까지 — 로봇 팔을 STEP 형식으로 출력하고 FreeCAD에서 필렛 (fillet)과 구멍 (hole)을 추가합니다. - Part 3:
AI가 설계하고 AI가 검증한다 — Kiro × FreeCAD FEM을 이용한 로봇 팔 CAE(본 기사) — 로봇 팔의 구조 해석을 수행하고, FreeCAD를 통해 응력 (stress)과 변위 (displacement)를 정량적으로 평가합니다. - Part 4:
AI가 설계한 로봇 × NVIDIA Isaac에서의 4,096 병렬 RL — 결과 — 본 기사에서 강도가 검증된 로봇 팔에 흡착 컵 그리퍼 (suction-cup gripper)를 추가하고, 4,096개 환경의 병렬 PPO를 통해 흡착 컵 집기 (suction-cup pickup)를 학습합니다.
이 시리즈에서는 AWS의 AI 코딩 어시스턴트인 "Kiro"를 사용하여 자연어 지시만으로 제조를 위한 설계 및 분석 작업을 수행합니다.
우리는 FreeCAD로 파트들을 초안 작성하고 편집했습니다. 다음으로, Kiro에 대한 순수한 자연어 지시만으로 **FreeCAD FEM을 이용한 구조 해석 (CAE)**을 실행하고, 로봇 팔 전체에 하중이 가해질 때의 응력 분포와 변위를 정량적으로 평가합니다.
참고: 본 기사에서는 Claude Opus 4.6이 Kiro CLI의 파운데이션 모델 (foundation model)로 사용되었습니다. 생성된 코드의 품질과 동작은 모델 버전에 따라 다를 수 있습니다.
후속편이 게시되었습니다: 본 기사에서 강도가 검증된 로봇 팔에 흡착 컵 그리퍼를 추가하고, NVIDIA Isaac Sim / Isaac Lab에서 **4,096 병렬 환경을 이용한 강화학습 (PPO)**을 실행했습니다. 본 기사의 CAE를 통해 "파손되지 않고 충분히 가볍다"고 판단된 로봇 팔을 AI 스스로가 "어떻게 움직일지" 학습하는 단계에 도달했습니다.
오늘의 흐름
Step 1: [CAD 편집 에디션]에서 생성된 STEP 모델 로드
Step 2: Gmsh를 사용하여 메쉬 (Mesh) 생성 (유한 요소로 세분화)
Step 3: 재료 (Material), 경계 조건 (Boundary conditions), 하중 (Load) 설정
...
FreeCAD FEM을 헤드리스 (Headlessly) 방식으로 실행하는 과정에서 약간의 시행착오가 필요했습니다. 그 뒷이야기는 이 글의 끝에 있는 부록 섹션에 요약되어 있으니, 관심 있는 분들은 참고하시기 바랍니다. 본문에서는 결과부터 시작하겠습니다.
구조 해석 (FEA)이란 무엇인가?
구조 해석 (Structural analysis)은 "이 형상에 이 힘이 가해졌을 때, 어디에 얼마만큼의 응력 (Stress)이 발생하며, 얼마나 변형되는가"를 계산하는 시뮬레이션입니다. 형상을 작은 요소 (Finite elements, 유한 요소)로 나누고, 각 요소의 탄성 거동을 행렬 (Matrix)로 표현하며, 전체를 하나의 방정식 시스템 (강성 방정식, Stiffness equations)으로 풀어 각 노드 (Node)에서의 변위 (Displacement)를 얻습니다. 이후 변위로부터 응력 (Stress)과 변형률 (Strain)을 계산합니다.
로봇 팔 설계에서 구조 해석은 다음과 같은 사항을 검증하는 표준 프로세스입니다:
- 팔 끝에 페이로드 (Payload, 가중치)를 실었을 때 팔이 파손되는지 여부 (응력이 재료의 항복 강도 (Yield stress)를 초과하는지 확인)
- 하중 하에서 팔이 얼마나 휘어지는지 (Deflection, 변위가 위치 결정 정확도에 직접적인 영향을 미침)
- 응력이 어디에 집중되는지 (보강이 필요한 위치 식별)
사용된 도구
이 글은 전 과정이 헤드리스 (Headlessly) 방식(GUI 없음 — 명령줄 및 스크립트만 사용)으로 실행됩니다. Kiro는 인간처럼 GUI 애플리케이션을 조작할 수는 없지만, CLI 명령과 Python 스크립트를 자율적으로 조합하고 실행할 수 있으므로, 전체 과정을 헤드리스를 전제로 진행합니다.
| 도구 | 버전 | 용도 |
|---|---|---|
| FreeCAD | 1.1.0 | STEP 로드, brep 내보내기 |
| ... |
Gmsh: 오픈 소스 3D 유한 요소 메쉬 생성 (finite-element mesh generation) 도구입니다. STEP 또는 brep와 같은 CAD 형상을 입력으로 받아 사면체 (tetrahedral) 또는 육면체 (hexahedral) 요소로 구성된 메쉬를 생성합니다. -
CalculiX: 오픈 소스 3D 구조 FEA 솔버 (solver, 응력과 변위를 계산하기 위해 방정식 시스템을 푸는 계산 엔진)입니다. 선형/비선형 (linear/nonlinear), 정적/동적 (static/dynamic), 그리고 열 해석 (thermal analyses)을 지원합니다. 상용 소프트웨어인 Abaqus와 동일한 .inp 키워드 구문을 채택하고 있어 Abaqus 사용자들에게도 친숙합니다. 계산 엔진 자체는 ccx (CalculiX Crunchier의 약자) 명령어를 통해 실행됩니다.
분석 대상
CAD 편집 에디션에서 생성된 6축 다관절 로봇 팔 (6-axis articulated robot arm, STEP) 전체를 분석합니다. 10개의 부품 (base, swivel, shoulder_joint, upper_arm, elbow_joint, forearm, wrist_j4/j5/j6, flange)을 불리언 합집합 (Boolean Fuse)으로 결합하여 하나의 단일 솔리드 (single solid)로 분석합니다.
자세 (Pose): J2=-30°, J3=60°, J5=-45° (작업 자세)
-
J1=베이스 스위블 (base swivel), J2=어깨 전후 기울기 (shoulder forward/back tilt), J3=엘보우 상하 기울기 (elbow up/down tilt), J4-J6=3개의 손목 축 (wrist axes). 즉, 팔꿈치가 굽혀지고 팔이 대각선 위쪽 전방으로 뻗은 일반적인 작업 자세입니다.
재질 (Material): 알루미늄 합금 6061-T6
-
산업용 로봇 프레임에서 가장 흔히 선택되는 재질 중 하나로, 전 세계 로봇 프레임 사용량의 약 70%를 차지한다고 알려져 있습니다. 우수한 비강도 (strength-to-weight ratio), 높은 가공성 (machinability), 그리고 낮은 비용이 그 이유입니다.
-
경계 조건 (Boundary conditions): 베이스 바닥면은 고정되며, 플랜지(끝단)에는 100 N (≈10 kg)의 하향 하중이 가해집니다. 실제 로봇 팔은 바닥이나 장착 프레임에 볼트로 고정되므로, 바닥면을 완전히 고정하는 것은 로봇 유한요소해석 (FEA)의 표준적인 경계 조건입니다. 집중된 끝단 하중은 팔을 "뿌리가 고정된 캔틸레버 보 (cantilever beam fixed at its root)"로 취급하는 가장 단순화된 모델입니다. 10 kg은 중형 산업용 로봇(도달 거리 약 1 m)의 일반적인 가용 하중 (payload) 범위 내에 해당합니다.
-
실제 운용 시에는 중력 토크 (gravity torque), 운동 관성 (motion inertia), 오프셋 하중 (offset loads, 플랜지에서 중심이 벗어난 무게 중심이 모멘트 암을 연장함) 등으로 인해 해석 조건이 더 가혹해집니다. 본 기사는 정적 (static)인 가장 단순한 사례에 대한 검증입니다.
재료 특성 (알루미늄 합금 6061-T6)
| 특성 (Property) | 값 (Value) |
|---|---|
| 영률 (Young's modulus) | 69 GPa |
| ... | |
| 안전율 (Safety factor) = 항복 응력 (yield stress) ÷ 최대 응력 (maximum stress). 연성 재료 (ductile materials)로 제작된 일반적인 기계 부품의 경우, 보통 1.5–2.0 이상의 안전율을 가이드라인으로 사용합니다. |
본 기사의 위치 (모델에 관한 참고 사항)
이번에 분석하는 STEP 모델은 CAD 편집 에디션에서 CadQuery를 사용하여 교육용 자료로 제작된, **내부가 재료로 완전히 채워진 "솔리드 모델 (solid model)"**입니다. 실제 산업용 로봇 팔은 경량화와 저비용을 모두 달성하기 위해 상완 (upper-arm) 및 전완 (forearm) 링크에 2–5 mm 두께의 중공 알루미늄 박스 또는 주조된 중공 파이프를 사용합니다. 솔리드 모델은 실제 제품보다 단면적이 한 자릿수(an order of magnitude) 더 크기 때문에, 응력 (stress)과 변위 (displacement)의 절대값은 실제 제품보다 한 자릿수 이상 작게 나타납니다.
이 글의 주요 목적은 "FEM 워크플로우(mesh → material → boundary conditions → solver → result visualization)를 AI(Kiro)에 대한 자연어 지시만으로 완료할 수 있음"을 입증하는 것이며, 실제 로봇의 강도를 인증하는 것이 아닙니다. 그럼에도 불구하고, 이 절차와 툴 체인(tool chain)은 실제 하드웨어에 직접 적용할 수 있으며, 입력된 STEP 파일을 박판 중공(thin-walled hollow) 파일로 교체하면 동일한 스크립트로 실제 제품에 더 가까운 수치를 얻을 수 있습니다.
Kiro에 대한 지시 사항
로봇 팔 전체의 강도를 확인하기 위해, 우리는 Kiro에게 다음과 같은 지시를 내렸습니다:
CAD 편집 에디션에서 생성된 로봇 팔의 STEP 파일(robot_arm.step)을 사용하여
로봇 팔 전체에 대한 구조 해석을 수행해 주세요.
...
분석 결과
메시 생성(mesh generation)부터 CalculiX 실행 및 결과 시각화에 이르기까지, Kiro는 모든 과정을 헤드리스(headless) 방식으로 수행했습니다. 우리는 FreeCAD의 GUI를 열지 않았습니다. ccx는 Python에서 직접 호출되었으며, 결과물인 .frd 파일은 읽혀서 요약되었습니다. FEM을 헤드리스로 실행하는 것은 간단한 작업이 아니며, 우리는 세 번의 방법 변경 끝에 마침내 분석을 완료할 수 있었습니다 (기술적인 이야기는 이 글 끝의 부록 섹션에 요약되어 있습니다).
아래의 결과 이미지들은 FreeCAD의 FEM 워크벤치(workbench)에서 동일한 .frd 파일을 열어 얻은 것입니다. 이 글에서는 GUI를 사용하지 않고 분석을 수행하지만, 결과 파일은 GUI에서도 읽을 수 있으며, 이는 컬러맵(colormap)을 전환하거나 모델을 회전시켜 대화형으로 검사할 때 편리합니다.
응력 분포 (Von Mises stress)
Von Mises 응력(Von Mises stress)은 복잡한 3차원 응력 상태(인장/압축/전단 6개 성분)를 인장 시험(uniaxial stress)에서 측정된 항복 강도(yield stress)와 직접 비교할 수 있는 단일 스칼라 값으로 변환하는 지표입니다. 이는 금속과 같은 연성 재료(ductile materials)의 항복(yielding)을 판단할 때 가장 흔히 사용되는 기준입니다. 만약 σ_vm < yield stress라면
, 영구 변형이 발생하지 않는다고 판단할 수 있습니다. 우리가 사용한 Aluminum 6061-T6의 경우, 기준값은 276 MPa입니다.
최대 Von Mises 응력 (Maximum Von Mises stress): 0.13 MPa
안전 계수 (Safety factor): 2,144 (항복 응력 276 MPa ÷ 최대 응력 0.13 MPa)
응력은 팔꿈치 관절(elbow joint) 주변과 상완 링크(upper-arm link)의 베이스 부분에 집중되어 있습니다. 베이스와 손목(wrist) 근처의 응력은 낮습니다. 이는 로봇 팔의 구조상 합리적인 결과입니다. 굽힘 응력(bending stress)은 긴 링크의 뿌리 부분에 집중되기 때문입니다.
변위 분포 (Displacement distribution)
응력이 "파손될 것인가"에 대한 지표라면, 변위(displacement)는 "사용 가능한가"를 판단하는 또 다른 평가 축입니다. 로봇 팔의 경우 위치 정밀도(positioning accuracy)가 중요합니다. 만약 하중 하에서 팔이 휘어져 끝단(tip)이 가르쳐진 좌표에서 벗어난다면, 파손되지 않더라도 그 팔은 사용할 수 없습니다.
최대 변위 (Maximum displacement): 5.76 μm (0.00576 mm)
변위는 베이스(고정단)에서 플랜지(flange, 끝단)로 갈수록 커집니다. 100 N 하중 하에서의 최대 변위 5.76 μm는 산업용 로봇의 위치 정밀도(일반적으로 약 ±0.05 mm)와 비교했을 때 충분히 작은 수치입니다.
과도한 마진 — 100 N(≈10 kg) 하중에 대해 2,000 이상의 안전 계수와 위치 정밀도보다 한 자릿수 낮은 변위 — 이 발생하는 이유는 이 모델이 재질이 내부까지 완전히 채워진 "알루미늄 솔리드 모델(aluminum solid model)"이기 때문입니다. 실제 산업용 로봇 팔은 상완 및 전완 링크에 몇 mm 두께의 박벽 중공 구조(thin-walled hollow structures, 알루미늄 박스 또는 주조 파이프)를 사용하며, 단면적은 솔리드 모델의 1/5에서 1/10 수준에 불과합니다.
부록: 구조 해석을 실행하기 전의 시행착오
CAD 편집 에디션에서의 CAD 편집과 비교했을 때, 이번 구조 해석은 순탄하게 진행되지 않았습니다. 하지만 결론부터 말씀드리자면, 이 글의 핵심 포인트 중 하나는 Kiro가 에러 메시지로부터 시작하여 문제를 세분화하고, 세 번의 방법 전환 끝에 마침내 해석을 완료해냈다는 점입니다.
전제로, FreeCAD FEM으로 구조 해석 (structural analysis)을 실행하려면 다음 네 가지 단계를 연결해야 합니다: (1) 형상의 메쉬 세분화 (mesh subdivision) → (2) CalculiX를 위한 입력 파일 (.inp) 생성 → (3) 솔버 (solver) ccx 실행 → (4) 결과 읽기. 어떤 단계를 FreeCAD에 위임하고 어떤 단계를 직접 수행할지를 결정하는 것이 방법론을 결정합니다.
시도 1: 모든 것을 FreeCAD FEM의 Python API에 위임 → 실패
가장 간단한 방법은 분석 객체 (analysis object), 솔버 (solver), 재료 (material), 경계 조건 (boundary conditions) 및 메쉬 (mesh)를 모두 FreeCAD FEM이 제공하는 Python API (ObjectsFem)를 통해 설정하고, FreeCAD가 직접 .inp 파일을 작성하게 하며, FemToolsCcx가 ccx를 실행하도록 하는 것입니다. 이 아이디어는 GUI에서 수동으로 수행하는 것과 동일한 절차를 스크립트를 통해 자동화하는 것입니다.
두 가지 문제가 발생했습니다.
문제 1: 버전에 따라 API 이름이 변경되어 기존 샘플 코드가 그대로 작동하지 않음
FreeCAD FEM 모듈은 여전히 활발하게 리팩토링 (refactoring)되고 있으며, 함수 및 속성 이름이 버전에 따라 변경됩니다 (예: makeSolverCalculixCcxTools → FreeCAD 1.1.0에서는 대문자 X가 포함된 makeSolverCalculiXCcxTools; mesh_obj.Part → mesh_obj.Shape).
FreeCAD 공식 위키 (Wiki)에는 FEM 워크벤치 (workbench)를 위한 GUI 절차가 상세히 기록되어 있지만, ObjectsFem.makeSolverCalculiXCcxTools와 같은 내부 Python API의 시그니처 (signature)를 체계적으로 다루는 참조 자료는 없습니다. 공식적으로 제공되는 것은 GUI 튜토리얼과 샘플 스크립트뿐이며, 그 외의 경우에는 소스 코드 (src/Mod/Fem/femobjects/ 하위)와 단편적인 포럼 게시글을 읽고 사용법을 추론해야 합니다. Kiro 역시 처음에는 검색을 통해 찾은 샘플(이전 버전을 대상으로 함)을 시도했다가 AttributeError에 부딪혔고, 그로부터 코드를 수정하기 위해 곧바로 최신 소스 코드를 읽는 방식으로 넘어갔습니다.
문제 2: ConstraintForce의 하중 방향 설정 시 NodeLoadTable 에러 발생
FreeCAD의 ConstraintForce
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기