ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

text-to-cad 实战:从自然语言到 STEP 与 URDF 的完整技术链路

text-to-cad 实战:从自然语言到 STEP 与 URDF 的完整技术链路 1. 从一句话到三维模型text-to-cad 到底在解决什么问题第一次听到 text-to-cad 这个词我的反应和大多数人一样用一句话就能生成 CAD 模型这靠谱吗毕竟在传统制造业和机械设计圈子里CAD 建模一直是个门槛不低的手艺活——你得懂草图约束、懂特征树、懂基准面的选择逻辑更别提后面还有装配、干涉检查、工程图这一整套流程。一个熟练的机械工程师培养周期动辄三五年而 text-to-cad 想做的事情是把描述需求和得到模型之间的这段路尽可能缩短。说白了text-to-cad 就是一套把自然语言描述转换成 CAD 可用的三维几何数据的方案。你输入一个 80x60x10mm 的矩形底板四角各有一个直径 6mm 的通孔孔中心距边缘 10mm它输出一个可以被 CAD 软件打开、可以继续编辑、可以导出 STEP 的实体模型。这件事的价值不在于取代工程师而在于把那些重复性的、标准化的、描述清楚就能画出来的零件从手动建模二十分钟压缩到描述加校验两分钟。它适合谁我梳理了一下大概三类人最需要第一类是经常要做标准件、夹具、支架、外壳这类结构相对固定的工程师批量出图的时候能省下大量机械劳动第二类是做仿真和机器人方向的朋友需要快速生成 URDF 描述的运动学模型用来在仿真环境里跑验证第三类是做增材制造和数控加工的需要把设计意图快速转成 G-code 可加工的几何体。这三类需求的共同点是几何结构有规律、参数化程度高、对精确到丝的极致曲面造型要求没那么高。但我也得先把丑话说在前面text-to-cad 目前的能力边界很清楚。它擅长的是参数化、规则化、可用特征树描述的零件比如板类、轴类、法兰、支架、简单壳体。你要是让它生成一个复杂的自由曲面叶轮或者带大量倒角过渡的消费电子产品外壳那基本是自讨苦吃。理解这个边界比盲目吹捧工具有用得多。2. 拆解 text-to-cad 的核心技术链路2.1 从自然语言到结构化参数意图解析这一关text-to-cad 的第一步是把人话翻译成机器能算的参数。这一步看着简单实际上是最容易翻车的地方。因为自然语言里充满了省略和歧义。比如打个孔你没说直径、没说深度、没说是不是通孔、没说在哪个面上——这些信息在人类工程师脑子里是默认的但机器不知道。所以一套靠谱的 text-to-cad 流程通常会在解析阶段做三件事。第一是实体识别把描述里的几何体、尺寸、位置关系、特征操作抽出来形成结构化的中间表示。第二是缺省推断对于没说的参数按照行业惯例补一个合理默认值比如通孔默认贯穿整个厚度倒角默认 1mm 或者 0.5mm。第三是歧义消解当描述有冲突时要么按优先级规则处理要么直接反问用户确认。我实测下来解析环节最有效的做法不是硬啃大模型而是用大模型做意图理解用规则引擎做参数校验。大模型负责把四角各一个孔理解成四个孔位置在矩形四个角规则引擎负责检查孔中心距边缘 10mm、孔径 6mm、板宽 60mm这三个数放在一起会不会导致孔壁太薄甚至破边。这种大模型加规则的组合比纯大模型稳定得多也比纯规则灵活得多。2.2 中间表示为什么 STEP 和 URDF 是两条不同的路这里有个很多人一开始会混淆的点text-to-cad 生成的东西到底该是什么格式答案取决于你要拿它干什么。如果你是要做机械设计和制造那目标格式基本就是 STEP。STEP 是 ISO 10303 标准下的三维数据交换格式它描述的是精确的边界表示几何也就是 B-rep。你导出的 STEP 文件在 SolidWorks、中望 CAD、FreeCAD 里打开看到的是一个实心实体可以测量、可以继续加特征、可以出工程图、可以送去加工。STEP 的核心优势是精确和通用它是制造业事实上的交换标准。如果你是要做机器人仿真那目标格式往往是 URDF。URDF 是统一机器人描述格式它描述的不是精确几何而是运动学树——哪个是父连杆、哪个是子连杆、关节类型是旋转还是平移、关节轴朝哪个方向、质量和惯性矩阵是多少。URDF 里也会引用几何体但那些几何体通常用简单的碰撞体近似比如用长方体或圆柱代替复杂外形目的是让物理引擎算得快。这两条路的差别本质上是精确制造和快速仿真的差别。我个人的经验是先统一生成 STEP 作为几何真值再从 STEP 派生 URDF 的碰撞体和视觉体。这样几何只有一个源头不会出现仿真里看着对、加工出来不对的尴尬。至于 G-code那是更下游的东西通常是在 STEP 基础上做 CAM 刀路规划后生成的text-to-cad 一般不直接产出 G-code但可以产出适合切片或 CAM 的干净实体。2.3 几何内核text-to-cad 的发动机不管前端怎么解析最后都得落到几何内核上把模型算出来。目前主流的开源几何内核是 OpenCASCADE商业的则有 Parasolid、ACIS 这些。text-to-cad 方案里绝大多数都是基于 OpenCASCADE 做二次开发因为它是开源的、功能相对完整、对 STEP 的支持也成熟。几何内核干的事情是把拉伸一个矩形、在四个角打四个孔、给外边缘倒角这种特征序列真正算成一张张曲面、一条条边、一个个顶点并且保证拓扑关系正确、没有自交、没有破面。这一步的难点在于布尔运算的稳定性。打孔本质上是做布尔减运算当孔的位置离边缘太近、或者两个特征刚好相切的时候布尔运算很容易失败或者产生退化面。这也是为什么很多 text-to-cad 工具在简单零件上表现很好一遇到复杂特征组合就开始报错。我的建议是在生成阶段就主动做几何合法性检查比如检查最小壁厚、检查特征之间是否干涉、检查布尔运算的容差设置。与其等内核报错不如在参数层面就拦住明显不合理的输入。3. 手把手搭一套可用的 text-to-cad 流程3.1 环境准备与工具选型要自己搭一套 text-to-cad工具链的选择很关键。我推荐一套经过验证的组合兼顾开源、可控和上手难度。环节推荐工具选它的理由意图解析大语言模型 API理解自然语言描述输出结构化 JSON参数校验Python Pydantic类型校验、范围校验、默认值填充几何建模CadQuery 或 build123d基于 OpenCASCADE 的 Python 建模库代码即模型格式导出CadQuery 内置导出直接导出 STEP、STLURDF 可自行拼装仿真对接手写 URDF 模板从几何参数生成 URDF 的 link 和 jointCadQuery 是我最常用的一个它的思路是用 Python 代码描述模型天然适合被程序生成。比如画一块带孔底板代码大概长这样import cadquery as cq # 底板参数 length 80.0 width 60.0 thickness 10.0 hole_dia 6.0 edge_dist 10.0 # 建模 result ( cq.Workplane(XY) .box(length, width, thickness) .faces(Z) .workplane() .rect(length - 2*edge_dist, width - 2*edge_dist, forConstructionTrue) .vertices() .hole(hole_dia) ) # 导出 cq.exporters.export(result, base_plate.step)这段代码就是 text-to-cad 的最后一公里——大模型解析出来的参数填进这个模板就能生成模型。你可以把参数部分做成变量让解析结果直接注入。3.2 参数计算几个必须自己算清楚的数text-to-cad 最容易出问题的地方是参数之间的隐含约束。工具不会替你算这些你得自己心里有数。我列几个最常踩的坑。孔壁最小厚度。假设板宽 60mm孔中心距边缘 10mm孔径 6mm那么孔边缘到板边缘的距离是 10 - 3 7mm。这个 7mm 就是孔壁厚度。对于大多数金属件这个值建议不小于 1.5 倍的孔径也就是 9mm 左右对于塑料件可以小一些但也不建议低于 1mm。如果算下来太薄要么加大边距要么缩小孔径。孔间距与孔壁干涉。如果两个孔中心距是 20mm孔径都是 6mm那么两孔之间的材料宽度是 20 - 6 14mm没问题。但如果中心距只有 8mm那两孔就重叠了布尔运算直接失败。这个检查必须在生成前做。倒角与壁厚的配合。给外边缘倒 2mm 的角如果板厚只有 3mm倒角就会吃掉大部分厚度甚至导致边缘变成尖角。一般倒角尺寸不超过板厚的三分之一比较稳妥。螺纹底孔与公称直径。如果你要生成螺纹孔M6 的螺纹底孔通常是 5.0mm 到 5.2mm不是 6mm。这个数搞错了攻丝的时候要么攻不动要么滑牙。text-to-cad 如果直接按直径 6mm 的孔生成那是个光孔不是螺纹底孔这点必须区分清楚。3.3 从参数到 STEP完整实操记录我把整个流程走一遍你可以照着复现。假设需求是生成一个 100x80x8mm 的安装板四角各一个 M6 螺纹底孔孔中心距边缘 12mm外边缘倒 2mm 角。第一步解析成结构化参数{ type: plate, length: 100.0, width: 80.0, thickness: 8.0, holes: { count: 4, pattern: corners, type: threaded, thread_size: M6, edge_distance: 12.0 }, chamfer: 2.0 }第二步参数校验。M6 螺纹底孔按 5.0mm 算孔中心距边缘 12mm孔边缘到板边缘距离是 12 - 2.5 9.5mm大于 1.5 倍孔径7.5mm合格。倒角 2mm 小于板厚 8mm 的三分之一2.67mm合格。第三步生成模型import cadquery as cq length, width, thickness 100.0, 80.0, 8.0 tap_dia 5.0 edge_dist 12.0 chamfer_size 2.0 plate ( cq.Workplane(XY) .box(length, width, thickness) .edges(|Z) .chamfer(chamfer_size) .faces(Z) .workplane() .rect(length - 2*edge_dist, width - 2*edge_dist, forConstructionTrue) .vertices() .hole(tap_dia) ) cq.exporters.export(plate, mounting_plate.step)第四步验证。把 STEP 导进 FreeCAD 或者中望 CAD量一下尺寸确认孔位、孔径、倒角都对。我一般还会检查一下体积用体积反推材料用量顺便验证模型是不是实心的。3.4 从 STEP 到 URDF机器人仿真的对接如果你做的是机器人方向下一步就是把几何体变成 URDF。URDF 不需要精确几何它需要的是连杆的惯性参数和关节的运动学参数。我的做法是从 STEP 里提取每个连杆的包围盒和体积用体积乘以材料密度得到质量用包围盒近似惯性矩阵然后手写 URDF 模板。一个简单的 URDF link 大概长这样link namebase_link visual geometry box size0.1 0.08 0.008/ /geometry /visual collision geometry box size0.1 0.08 0.008/ /geometry /collision inertial mass value0.5/ inertia ixx0.0003 ixy0 ixz0 iyy0.0004 iyz0 izz0.0005/ /inertial /link注意单位URDF 默认用米和千克而 CAD 里通常是毫米。这个单位换算如果搞错仿真里模型要么大得离谱要么小得看不见。我踩过这个坑一个 100mm 的板子在仿真里变成了 100 米整个场景都废了。4. 常见问题与排查技巧实录4.1 生成失败与几何报错的排查顺序text-to-cad 跑不通的时候别急着怀疑大模型先按这个顺序排查。现象可能原因排查方法布尔运算失败特征干涉或相切检查孔位、孔距、壁厚是否合理导出 STEP 报错模型非实体或存在破面在 FreeCAD 里做几何检查模型尺寸不对单位混淆mm 与 m检查解析参数和建模代码的单位孔位偏移坐标系或基准面选错确认建模时的 workplane 设置倒角失败倒角尺寸超过壁厚减小倒角值或调整特征顺序我遇到最多的是布尔运算失败十有八九是孔打得太靠边或者两个特征刚好相切。解决办法很简单把孔往里挪一点或者把相切改成明确相交或明确分离别让内核去处理临界情况。4.2 大模型解析不准怎么办大模型有时候会把四角各一个孔理解成四个孔均匀分布或者把通孔理解成盲孔。我的应对策略是加一层确认机制解析完之后把结构化参数用自然语言回显给用户让用户确认。比如我理解你要的是一块 100x80x8mm 的板四角各一个 M6 螺纹底孔孔中心距边缘 12mm外边缘倒 2mm 角对吗用户点确认再生成。这一层确认能挡掉大部分误解成本很低收益很高。另外给大模型提供 few-shot 示例也很有效。在提示词里放两三个描述到 JSON的样例解析准确率会明显提升。这比反复调提示词措辞管用。4.3 导出格式的兼容性坑STEP 虽然通用但不同软件对 STEP 的解析有细微差别。我遇到过在 FreeCAD 里打开正常的模型导进某个商业 CAD 后圆角变成了多段线。这通常是 STEP 的精度设置问题。导出时把精度调高一些比如线性容差设到 0.001mm角度容差设到 0.1 度能减少这类问题。STL 是另一回事。STL 是三角网格没有精确几何精度取决于网格密度。如果你要 3D 打印STL 够用但如果你要拿去加工必须用 STEP。别拿 STL 去做 CAM出来的刀路会是一堆小平面加工表面质量很差。URDF 的坑主要在单位和不支持的特性上。URDF 不支持复杂的几何体只支持 box、cylinder、sphere 和 mesh。如果你把整个复杂 STEP 转成 mesh 塞进 URDF文件会很大仿真会变慢。所以碰撞体一定要简化用包围盒或者几个基本体拼一下就行。4.4 批量生成时的性能与稳定性如果你要批量生成几百个零件单次跑没问题不代表批量跑没问题。我总结了几个批量场景下的经验。第一加超时和重试。几何内核偶尔会卡住给每个生成任务设个 30 秒超时超时就跳过并记录别让一个卡死的任务拖垮整批。第二参数校验前置。批量任务里先把所有参数校验一遍把明显不合理的挑出来别等到建模阶段才报错。这样能省下大量无效计算。第三输出文件命名规范化。用零件类型加关键参数命名比如plate_100x80x8_m6x4.step后面找文件的时候你会感谢自己。第四保留中间 JSON。解析出来的结构化参数一定要存下来模型生成失败的时候你可以直接拿 JSON 去调试不用重新跑一遍大模型。5. 我对 text-to-cad 的实际使用体会用了一段时间下来我最大的感受是text-to-cad 的价值不在于全自动而在于半自动。它把最枯燥的参数填写和重复建模环节自动化了但设计意图的确认、几何合理性的判断、下游工艺的对接还是得人来把关。把它当成一个执行力很强但需要明确指令的助手而不是一个能读懂你心思的设计师心态就对了。另外我强烈建议把生成的模型和参数都纳入版本管理。同一个零件今天生成的和一个月后生成的如果参数变了你得能追溯到底改了什么。我现在的做法是每次生成都存一份 JSON 参数和对应的 STEP用 Git 管起来出问题的时候 diff 一下就知道哪里变了。最后分享一个小技巧如果你经常生成同一类零件别每次都让大模型从头解析把常用的零件模板固化下来大模型只负责填参数。这样又快又稳还省 token。模板化加参数化才是 text-to-cad 在工程实践里真正好用的形态。
返回列表