资讯详情

资讯详情

text-to-cad 实战:用 Python 将自然语言生成 STEP 与 URDF 模型

1. 从一段文字到三维模型text-to-cad 到底在解决什么问题第一次听到 “text-to-cad” 这个词很多人脑子里浮现的可能是“对着电脑说一句‘给我画个齿轮’然后 CAD 里就自动蹦出一个齿轮”。方向没错但真实情况比这个要复杂一些也有意思得多。text-to-cad 本质上是一套把自然语言描述转换成结构化三维模型数据的流程最终产物通常不是某个私有格式的图纸而是像 STEP、URDF 这类通用性很强的中间格式。你可以把它理解成一个“翻译器”一边是人类随口说出的需求另一边是 CAD 软件、仿真环境、机器人系统能读懂的几何语言。这件事为什么值得单独拿出来讲因为传统 CAD 建模的门槛并不低。你得熟悉草图约束、拉伸切除、倒角圆角、装配关系还得知道不同软件之间的导入导出规则。一个简单的支架从想清楚到画出来新手可能折腾半小时。而 text-to-cad 想做的是把“描述需求”和“生成模型”之间的那堵墙拆掉一部分。它特别适合几类人做机器人仿真的工程师需要快速产出 URDF 模型做机械设计的从业者想用脚本批量生成标准件还有学 Python 但不想深啃 CAD 操作的学生和爱好者用代码驱动几何反而更顺手。我自己的体会是text-to-cad 不是要取代 CAD 工程师而是把重复性、参数化的建模工作交给程序。你负责定义“要什么”程序负责“怎么画”。这个思路一旦跑通效率提升是肉眼可见的。下面我就按实际落地的顺序把整套思路、关键细节、实操过程和踩过的坑完整地拆一遍。2. 整体设计与技术选型为什么是 Python STEP URDF2.1 核心链路的拆解一套能跑起来的 text-to-cad 流程通常包含四个环节文本解析、参数提取、几何生成、格式导出。文本解析负责把“一个长 80 宽 40 厚 5 的底板四角打直径 6 的孔”这种话拆成结构化的字段参数提取把字段映射成数值和约束几何生成调用建模库把数值变成实体格式导出把实体写成 STEP 或 URDF。每个环节都可以用不同工具实现但选型决定了你后面顺不顺手。我见过有人一上来就想接大语言模型做端到端生成结果卡在几何合法性上——模型看着像那么回事实际导入 CAD 就报错面不闭合、实体自相交。所以我的建议是先把参数化模板跑通再考虑用语言模型做前端解析。这样即使解析出错几何生成这一层是稳的问题定位也快。2.2 为什么选 Python 作为主语言热词里 Python 的出现频率极高这不是偶然。Python 在 text-to-cad 里扮演的是“胶水语言”的角色原因有三点。第一几何建模库生态成熟像 CadQuery、build123d 这类库能用接近自然语言的方式描述几何写起来比传统 CAD 脚本直观得多。第二Python 和 URDF 的配合非常自然URDF 本身就是 XMLPython 处理 XML 和字符串拼接轻车熟路。第三调试成本低改一行跑一次比在 CAD 软件里点来点去快得多。提示如果你之前只装过 Python 但没配过环境变量建议先把python --version和pip --version在命令行里跑通再往下走。环境没理顺后面每一步都会别扭。2.3 STEP 与 URDF 的分工这两个格式经常被混着提但用途完全不同。STEP是通用的三维几何交换格式几乎所有 CAD 软件都能读适合做设计交付、图纸合并、后续加工。URDF是机器人领域描述连杆和关节的格式它关心的不只是外形还有质量、惯性矩阵、关节类型和运动范围。所以如果你的目标是“生成一个能导入仿真环境的机器人模型”URDF 是终点如果目标是“生成一个能继续编辑的零件”STEP 才是终点。实际项目里我通常两个都导出STEP 留给人看和改URDF 留给仿真跑。格式主要用途是否含运动学信息典型读取方STEP几何交换、加工、编辑否各类 CAD 软件URDF机器人仿真、运动学是仿真环境、运动规划库STL3D 打印、网格显示否切片软件、查看器2.4 方案取舍背后的逻辑有人会问为什么不直接用 CAD 软件自带的脚本接口答案是跨平台和可复现。软件自带脚本往往绑定特定版本换台机器就出问题。而 Python 方案只要依赖装好在任何系统上跑出来的结果基本一致。另外text-to-cad 的核心价值在于“批量”和“参数化”这两点用纯脚本实现比在图形界面里操作要可靠得多。我做过一个对比手动改 20 个尺寸不同的法兰平均每个 4 分钟用脚本模板改参数表后一次性生成总共不到 1 分钟。3. 核心细节解析与实操要点从文本到几何的关键环节3.1 文本解析把“人话”变成字段文本解析是整条链路里最容易被低估的一环。很多人以为随便写个正则就能搞定实际上一句话里可能同时包含尺寸、数量、位置、形状和约束。我的做法是定义一个参数字典把常见描述映射成键值对。比如“底板长 80 宽 40 厚 5”解析成{length: 80, width: 40, thickness: 5}。这一步不需要多高深的技术关键是字段命名要统一单位要明确。import re def parse_description(text): params {} patterns { length: r长\s*(\d(?:\.\d)?), width: r宽\s*(\d(?:\.\d)?), thickness: r厚\s*(\d(?:\.\d)?), hole_diameter: r直径\s*(\d(?:\.\d)?), } for key, pattern in patterns.items(): match re.search(pattern, text) if match: params[key] float(match.group(1)) return params这段代码很朴素但能用。实测下来对于结构固定的描述正则的准确率比想象中高。真正麻烦的是“四角打孔”这种位置描述需要额外约定孔位规则比如默认四角内缩一个边距。注意单位一定要在解析阶段统一。我踩过的坑是文本里写“厚 5 毫米”代码按米处理结果模型小了 1000 倍导入仿真直接看不见。3.2 几何生成参数化模板是核心资产几何生成这一层我强烈建议用参数化模板而不是每次从零构建。所谓模板就是把一个零件的建模过程写成函数输入是参数字典输出是实体对象。以 CadQuery 为例一个带孔底板的模板大概长这样import cadquery as cq def make_base_plate(length, width, thickness, hole_dia, margin8): plate ( cq.Workplane(XY) .box(length, width, thickness) .faces(Z) .workplane() .rect(length - 2 * margin, width - 2 * margin, forConstructionTrue) .vertices() .hole(hole_dia) ) return plate这个模板的好处是所有尺寸都由参数控制改一个数字模型立刻变。你可以把它理解成“几何的函数化”。我手里积累了几十个这样的模板覆盖底板、法兰、支架、齿轮毛坯等常见件遇到新需求先看能不能套模板套不上再新建。这套方法让我的建模速度从“每次半小时”变成“每次几分钟”。3.3 格式导出STEP 和 URDF 的写法差异导出 STEP 相对简单CadQuery 直接提供exporters.export方法。导出 URDF 就麻烦一些因为 URDF 需要你手动组织连杆、关节、视觉几何、碰撞几何和惯性参数。我的做法是先用几何库生成网格文件再写一个 URDF 模板把网格路径、质量、惯性矩阵填进去。from cadquery import exporters # 导出 STEP exporters.export(plate, base_plate.step) # 导出 STL 供 URDF 引用 exporters.export(plate, base_plate.stl)URDF 里的惯性矩阵如果懒得算可以用简化公式估算。比如一个长方体质量 m长 a 宽 b 高 c绕中心轴的转动惯量分别是m(b²c²)/12、m(a²c²)/12、m(a²b²)/12。这个估算在仿真里够用除非你做高精度动力学分析。3.4 参数校验别让错误模型流到下游参数校验是很多人会跳过的一步但它是保证输出可用的关键。我一般会检查三类问题尺寸是否为正数、孔位是否落在实体范围内、壁厚是否过薄导致几何无效。比如底板厚 5孔直径 6如果孔边距小于 3孔就会切穿边缘生成失败。这些检查用几行断言就能完成但能省下大量排查时间。def validate(params): assert params[length] 0, 长度必须为正 assert params[thickness] 0, 厚度必须为正 assert params[hole_diameter] params[width], 孔径不能超过宽度4. 实操过程与核心环节实现一个完整案例跑通4.1 环境准备与依赖安装先把环境搭起来。Python 建议用 3.8 以上版本太老的版本有些库不支持。安装依赖的时候CadQuery 的安装稍微特殊一点推荐用 conda 或者 pip 的官方指引不要随便找个来路不明的包。核心依赖就三个cadquery负责几何numpy负责数值计算lxml负责 URDF 的 XML 生成。pip install cadquery numpy lxml装完之后跑一句import cadquery确认没报错。如果报缺少 C 运行库之类的错误去装对应的运行库即可这是 Windows 上常见的问题和 CAD 软件安装时遇到的运行库报错是同一类原因。4.2 案例需求生成一个带四孔底板并导出 URDF假设需求是“生成一个长 100 宽 60 厚 8 的底板四角打直径 6 的孔边距 10导出 STEP 和 URDF”。这个需求足够典型覆盖了解析、生成、导出全流程。第一步解析参数。把这句话丢进前面的解析函数得到{length: 100, width: 60, thickness: 8, hole_diameter: 6}边距单独设为 10。第二步生成几何。调用模板函数得到实体。这里有个细节孔的位置由rect的顶点决定边距通过rect的尺寸控制。rect(length - 2*margin, width - 2*margin)保证孔心距离边缘正好是 margin。第三步导出 STEP。直接调用导出方法文件生成后可以用任意 CAD 软件打开检查。第四步导出 URDF。先导出 STL 网格再写 URDF 文件。URDF 里定义一个base_link视觉和碰撞都引用同一个 STL惯性参数按长方体公式估算。mass 0.5 # 假设质量 0.5 kg ixx mass * (0.06**2 0.008**2) / 12 iyy mass * (0.1**2 0.008**2) / 12 izz mass * (0.1**2 0.06**2) / 12这些数值填进 URDF 的inertia标签即可。实测下来这样生成的 URDF 导入常见仿真环境都能正常显示和运动。4.3 参数计算过程边距与孔径的关系边距这个参数值得单独说一下。孔心到边缘的距离至少要大于孔径的一半加上一个安全余量否则孔会切穿边缘。公式是margin hole_diameter / 2 safety。以孔径 6 为例半径 3安全余量取 2边距至少 5。案例里取 10是留了充足余量实际加工也更稳。如果你把边距设成 4几何生成可能不报错但模型边缘会非常薄导入仿真后碰撞检测容易出问题。4.4 批量生成参数表驱动的高效做法单个模型跑通后批量生成就是水到渠成的事。把参数写成 CSV 或列表循环调用模板函数每个参数组合生成一套文件。我通常按“零件名_序号”命名避免覆盖。批量生成时要注意内存几何对象用完及时释放不然生成几百个模型后内存会涨得厉害。param_list [ {length: 100, width: 60, thickness: 8, hole_diameter: 6}, {length: 120, width: 80, thickness: 10, hole_diameter: 8}, ] for i, params in enumerate(param_list): plate make_base_plate(**params) exporters.export(plate, fplate_{i}.step)这套流程跑下来从描述到成品文件熟练之后几分钟就能完成一批。相比手动建模优势在参数明确、结果可复现、改需求成本极低。5. 常见问题与排查技巧实录5.1 几何生成失败的典型原因几何生成报错是最常见的问题原因通常集中在几类。第一类是尺寸矛盾比如孔径大于板宽孔直接切没了实体。第二类是壁厚过薄两个特征之间的材料太薄布尔运算失败。第三类是单位混乱毫米和米混用。排查的时候先把参数打印出来逐个核对量级再看几何操作顺序是否合理。我的经验是先做最简单的实体再逐步加特征每加一步导出一次检查问题定位会快很多。5.2 导入仿真环境不显示或位置错乱URDF 导入仿真环境后模型不显示八成是网格路径写错了。URDF 里的filename是相对路径相对于 URDF 文件所在目录。如果网格放在子文件夹路径要写对。位置错乱通常是坐标系没对齐几何生成时的原点要和 URDF 里视觉原点的定义一致。我一般让几何原点在零件底面中心URDF 里视觉原点也设成对应偏移这样导入后位置就是对的。5.3 常见问题速查表问题现象可能原因排查方向几何生成报错尺寸矛盾、壁厚过薄打印参数逐步简化特征模型尺寸不对单位混用检查解析阶段单位统一URDF 不显示网格路径错误核对相对路径和文件名仿真中位置偏移坐标系不一致对齐几何原点与视觉原点批量生成内存暴涨对象未释放循环内及时清理几何对象5.4 独家避坑经验说几个文档里不会写的点。第一CadQuery 的链式调用里workplane的切换很容易搞错方向建议每步之后导出看一眼别一口气写完再调。第二URDF 的惯性矩阵如果填零有些仿真环境会直接报错或者行为异常哪怕估个粗略值也比零强。第三批量生成时文件名不要用中文和空格某些下游工具读取会出问题。第四STEP 导出后建议用至少两个不同的 CAD 软件打开验证因为不同软件对几何容差的处理不一样一个能开不代表另一个能开。6. 后续扩展与个人体会这套 text-to-cad 流程跑通之后能扩展的方向不少。往上走可以接一个语言模型做前端把更自由的自然语言转成参数字典但前提是几何生成层足够稳。往深走可以把模板库做成配置驱动用 YAML 或 JSON 描述零件结构代码只负责解释执行。往应用走可以结合参数优化自动生成一批候选模型再筛选最优解。我个人在实际操作中的体会是text-to-cad 的价值不在于“全自动”而在于“可复现”和“可批量”。它把建模从手工劳动变成了可版本管理的代码资产。你写的每一个模板函数都是可以反复调用的积木。刚开始可能觉得搭这套东西费劲但一旦模板库成型后面每个新需求都是拼积木。踩过几次坑之后我越来越倾向于把几何逻辑写死、把参数留活这样既保证稳定性又保留灵活性。如果你也在做类似的事建议先从一个小零件开始把解析、生成、导出、校验四步都跑一遍再逐步扩大模板库这条路走起来会踏实很多。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →