文档
CAM加工内核
从制造工作到数控和证据:规划、切割机、带有剩余体积支架的体素库存以及经过认证的碰撞检查。
从英文自动翻译。 查看英文原文
CAM 内核是什么
CAM 内核位于 packages/core/src/cam/kernel (20 源文件,大约 5 260 行)采用修订后的制造作业来加工 NC 以及有关该 NC 的证据。它选择刀具和切削数据,根据 CAD 功能规划操作,运行策略,发布 G 代码,根据体积毛坯独立重播 NC,并检查刀具组件的运动是否发生碰撞。其算法恒等式为 cadcamfun-cam-kernel@1.
| 模块 | 角色 |
|---|---|
| 材料 | 工件等级及其可加工性数据 |
| 刀具 | 刀具组件和默认库(70 刀具) |
| 切削数据 | 材料中刀具的速度、进给、深度、负载和偏转 |
| 规划师 | CAD 功能 → 使用刀具进行有序操作 |
| 执行 | 准备/运行:策略、发布、独立 NC 重播、库存谱系、声明和发布级别 |
| 运动学、头部 | trunnion table (AC / BC) and tilting head (B about Y) |
| 集会 | 3D 刀具组件(切削区域、刀柄、刀柄)作为轮廓及其旋转实体 |
| 碰撞 | 连续检查联合动作:证明清晰、碰撞或未解决 |
| 运动 | 同步五轴:位置→工作台姿势,每个移动分开并检查 |
| 库存 | 体积库存作为带有剩余体积支架的体素 |
| 机器间隙 | 每次 NC 移动时,刀柄和刀柄都靠在工作台上 |
| 凸的 | 凸包之间的精确距离 (GJK) |
export const prepareJob: (job: ManufacturingJob) => CamResult<PreparedJob>
export const executeJob: (prepared: PreparedJob) => CamResult<CamArtifact>
export const runJob: (job: ManufacturingJob) => CamResult<CamArtifact> // prepare, then execute
export const planOnly: (job: ManufacturingJob) => CamResult<{ operations; notes; unmachined }>
export const KERNEL_ALGORITHM = "cadcamfun-cam-kernel@1" 基于特征的规划
规划人员按照 CAM 程序员的方式,根据参数历史记录的实际特征对棱柱形零件进行排序:
- 面对股票顶部
- 轮廓周围和口袋内部粗糙(自适应或轮廓,有壁余量)
- 沉头孔、点钻、钻孔或螺旋镗孔、埋头孔、螺纹铣削
- 完成墙壁
- 当要求去毛刺时,用 2D 倒角打破顶部边缘
- 3D 自由曲面的粗加工和精加工
没有特征历史的实体(网格、基元布尔值、雕刻零件)是使用 3D 曲面策略加工的。规划仅选择工具和区域;作业运行时,会计算每个操作的切削数据。在 44 × 44 × 11 mm POM-C 毛坯上的实际运行计划了三个操作: face 使用面铣刀-50, surface-rough 与平16和 surface-finish 与球-10,发布为 verified-program 周期时间为 149 秒。那次跑步被吸引了 本土制造.
刀具和刀具组件
The default library has 70 cutters of nine kinds: flat (Ø1–16, plus aluminium ZrN variants), ball (Ø1–10), bull nose, face mill, spot drill, chamfer mill, engraver, thread mills (P0.5–P2) and drills. A cutter's assembly is its half-section profile from the tip, split into cutting zone, shank and holder.
{"id":"flat-6","name":"End mill Ø6 3F carbide ALTIN","kind":"flat","diameter":6,"flutes":3,
"material":"carbide","coating":"altin","fluteLength":15,"shankDiameter":6,"stickout":29,
"holder":{"diameter":40,"length":50}}
{"points":[{"r":0,"z":0},{"r":3,"z":0},{"r":3,"z":15},{"r":3,"z":29},{"r":20,"z":29},{"r":20,"z":79},{"r":0,"z":79}],
"parts":["cutting","cutting","shank","holder","holder","holder"],"length":79,"assumedHolder":false} 体素库存和剩余体积支架
库存是一个体素网格。经过一组移动后,每个体素都是物质的, 删除确定 (它的整个立方体位于切割器内部的某个采样位置)或 删除了可能的 (它的立方体位于切割器的扩展范围内:一半对角线加上一半样本间距)。因此,剩余体积是一个括号:不可能去除的材料肯定会留下,而不一定会去除的材料可能会留下。如果没有采样切割器覆盖体素,则永远不会将其称为已移除。倾斜工具的每个尖端点都有其轴,因此五轴扫描使用相同的两个测试。
export const voxelStock: (min: Vec3, max: Vec3, voxel: number) => VoxelStock // sample step = voxel / 2
export const removeTipPath: (stock: VoxelStock, cutter: Cutter, path: ReadonlyArray<Vec3>, axes?: ReadonlyArray<Vec3>) => void
export const remainingVolume: (stock: VoxelStock) => { lower: number; upper: number } const s = voxelStock({ x: 0, y: 0, z: -10 }, { x: 40, y: 30, z: 0 }, 0.5)
// 80 × 60 × 20 = 96 000 voxels, step 0.25
removeTipPath(s, flat6, path) // slot y = 15, x 8→32, then the ring 8..32 × 8..22, all at z −3
remainingVolume(s) // {"lower":9749.5,"upper":10740} 124 ms
// stock 12 000 mm³: between 1 260 and 2 250.5 mm³ removed 支架随着体素大小而变窄:将体素减半将使沿每面墙的松弛带减半。
连续碰撞检查
控制器在两点之间线性移动其关节,它们之间可能会发生冲突。 checkMotion checks the whole move: probes (the holder and shank, each non-cutting profile segment enclosed by a capsule) against obstacles (the table envelope and the part box). The lower bound is a Lipschitz argument: a signed distance changes by at most the displacement of the moving solid, so the move is bisected until every interval is proven clear by margin,对重叠进行采样,或者深度 (12) 耗尽。
| 判决 | 意义 |
|---|---|
| 清除 | 在每个间隔上,间隙的下限至少为余量 |
| 碰撞 | 采样的探测点位于障碍物内部; at 表示移动的位置(0 到 1) |
| 未解决的 | 深度内无法证明清晰的区间,且未发现重叠 |
// rapid along X at nose z 60
{"verdict":"clear","clearance":26.875,"evaluations":2}
// plunge from nose z 60 to nose z 0
{"verdict":"collision","clearance":-10,"at":1,"evaluations":2}
// standing poses
z 60 {"verdict":"clear","clearance":46.875,"evaluations":2}
z 20 {"verdict":"clear","clearance":6.875,"evaluations":2}
z 10 {"verdict":"unresolved","clearance":-3.125,"evaluations":4097}
z 5 {"verdict":"collision","clearance":-5,"at":0,"evaluations":1} 快速报告 26.875 而不是站立的 46.875,因为移动检查证明了下限:它减去了未进一步细分的每个间隔上的位移。鼻子-z-10 姿势说明了原因 unresolved 存在:经过认证的下界为负(包络可能重叠),但内部没有采样点,因此在 4 097 评估之后,检查器报告它可以证明什么,而不是猜测。封套是保守的:胶囊封闭了其固定器部分,因此可以报告重叠,而真正的工具只能接近。
故障排除
| 症状 | 原因 | 使固定 |
|---|---|---|
| 作业状态失败:作业架构版本不受支持 | 为不同的内核模式构建的作业 | 使用当前 schemaVersion 重建作业 |
| 剩余音量括号宽 | 体素对于特征来说太粗糙 | 使用较小的体素;松弛部分大约是沿每面墙的一个体素 |
| 快速碰撞 | 支架或柄套到达工作台或零件 | 提高间隙平面或缩短伸出量 |
| 长距离旋转运动未解决 | 远离旋转中心时,利普希茨边界很弱 | 分开移动,或接受检查员可以证明的保证金 |
| 计划使用意外刀具进行手术 | 刀具对材料和刚性的适应性 | 传递带有您想要的刀具的刀具库 |