关于 srdf
面向机器人开发者的 MoveIt SRDF 语义描述编写与校验技能,要求以有效 URDF 为基础,重点处理规划组、状态、末端执行器和碰撞语义。
主要功能
- 01直接编写 SRDF XML
- 02基于 URDF 定义规划组
- 03末端执行器与组状态指导
- 04与配对 URDF 交叉校验
- 05生成快照并在查看器审查
适用场景
- 01为机器人定义 MoveIt 规划组
- 02设置命名组状态和末端执行器
- 03依据 URDF 检查碰撞对条目
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ earthtojake/ text-to-cad --skill srdf安装后在 Claude Code 中输入/srdf确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEagents/openai.yamlreferences/authoring-contract.mddisabled-collisions.mdend-effectors.mdplanning-ledger.mdsrdf-workflow.mdvalidation.md详细介绍
SRDF
来源:由 earthtojake/text-to-cad 维护。 运行时应以已安装的本地技能文件为准;仓库链接仅用于追溯来源和审查发布内容。
此技能适用于在现有且有效的 URDF 基础上编写 MoveIt 语义机器人描述。SRDF 定义规划语义,不定义机器人的物理结构。.srdf 文件是事实来源:直接编写和编辑 XML。不存在 gen_srdf() 契约。
SRDF 的正确性是一个规划语义问题。常见故障并非 XML 无效,而是 SRDF 看起来合理,却让 MoveIt 使用了错误的规划组、工具链接、默认状态、不安全的禁用碰撞矩阵或错误的关节单位。由于语言模型不擅长空间和运动学推理,应根据 URDF 拓扑、MoveIt Setup Assistant 输出、采样碰撞分析或用户明确提供的数据,推导规划组、末端执行器、组状态和禁用碰撞。不要仅凭视觉主题进行推断,也不要凭记忆输入任何链接或关节名称:先提取 URDF 的链接/关节表,再从中复制名称。
设置
通过 uv 运行 cadgen,这样此技能的命令就会与 CAD 应用的服务共用同一安装及其预热构建守护进程:
- 下文的
cadgen指uvx --no-config --managed-python --python 3.13 --from cadgen==0.7.26 cadgen - 下文的
python指uvx --no-config --managed-python --python 3.13 --from cadgen==0.7.26 python
首次运行时会下载该安装包;无头浏览器会在首次生成快照时下载。之后的运行会复用两者。
格式边界
- URDF 负责机器人的物理结构:链接、关节、几何体、惯性参数、限位、从动关节、传动装置和机器人状态发布。
- SRDF 负责 MoveIt 语义:虚拟关节、被动关节、规划组、组状态、末端执行器和禁用碰撞对。
- SDF 负责仿真器/世界语义:物理参数、传感器、灯光、插件、世界和仿真专用元数据。
不要在 SRDF 中放置几何体、惯性参数、关节原点、链接位姿、网格引用、物理关节限位、传动装置或 ros2_control 接口。
展示模型
向用户展示你创建或修改的每个文件,以及用户要求查看的文件。快照和验证不能替代展示。
-
如果你的工具中包含
cad_show(宿主可能会为其添加前缀),请使用该工具并传入文件的绝对路径;何时再次调用,请遵循工具说明。cad_view会读取用户选中的内容;cad_screenshot会显示用户看到的内容。两者都不能用于审查你自己的工作。 -
否则,请从任意文件夹运行 CAD Viewer:
cadgen viewer --host 127.0.0.1 --json --detach--detach会在查看器能够响应请求后立即返回,并让查看器在后台运行:务必传入此参数,因为前台查看器不会退出(将其输出通过管道传给tail还可能导致 URL 永久丢失)。它会启动本机唯一的查看器,或复用已有查看器。从其唯一一行 JSON 中读取url(切勿猜测端口);对于每个文件,返回url?file=<其经过 URL 编码的绝对路径>。如果启动失败,请说明。
将 SRDF 与名称唯一匹配的 URDF 放在一起(机器人名称相同)。 审查规划组、具名状态和关节;视觉审查不能证明规划正确性。
必需工作流
- 从有效的 URDF 开始。 先使用
$urdf编写或修复 URDF,并对其进行验证。SRDF 通过文件同目录存放和机器人名称与该 URDF 配对,SRDF 中的每个名称都必须存在于 URDF 中。 - 提取 URDF 表格。 在编写任何 SRDF XML 之前,列出 URDF 的机器人名称、链接、关节(包括类型、父项、子项、限制和 mimic 标志)。只从此表格复制名称;切勿凭记忆输入。参见
references/srdf-workflow.md。 - 确定规划任务。 记录目标是机械臂 IK、夹爪控制、移动底座规划、双臂规划、工具使用,还是本地冒烟测试。
- 创建或更新规划记录。 编写 XML 之前,使用
references/planning-ledger.md;并在.srdf中以注释块的形式保留一份精简副本。 - 通过文件同目录存放与 URDF 配对。 将
.srdf保存在与.urdf相同的文件夹中,并使用相同的<robot name>——这是唯一的关联机制。验证器和查看器都会扫描文件夹,查找机器人名称匹配的 URDF 来确定配对;每个文件夹中,每个机器人名称只能对应一个 URDF。文件之间没有用于关联的元数据元素。参见references/authoring-contract.md。 - 审慎定义虚拟关节和被动关节。 根据机器人模型的需要使用它们。
- 根据 URDF 拓扑定义规划组。 对于串联机械臂,如果基座和末端在 URDF 树中构成真实的父子路径,应优先使用链式组(验证器会检查这一点)。仅在有明确意图时使用关节、链接或子组定义。
- 确定组成员关系后再定义末端执行器。 避免末端执行器组与其父组重叠。记录实际的目标链接/TCP 链接。
- 使用 URDF 原生单位定义组状态。 旋转关节和连续关节的值单位为弧度;移动关节的值单位为米。不要在 SRDF 中存储角度值。值必须处于 URDF 限制范围内,且不得为固定关节或 mimic 关节设置值。
- 根据证据生成禁用碰撞项。 使用从 URDF 关节表推导出的相邻关系、MoveIt Setup Assistant 采样结果,或用户明确提供的碰撞矩阵。不要凭空编造大范围的禁用列表。参见
references/disabled-collisions.md。 - 使用
cadgen srdf validate验证每个新建或修改的.srdf;该命令会针对配对的 URDF 交叉验证所有名称、链、状态和配对关系。修复发现的问题并重新验证,直到检查通过。 - 条件允许时运行 MoveIt 冒烟测试。 直接使用 MoveIt Setup Assistant 或项目的 MoveIt 启动项。
- 报告假设和跳过的检查。 包括未完成的验证、缺少 MoveIt 环境、人工推断的禁用碰撞项,以及推断出的目标链接。
命令
按照 Setup 的定义运行 cadgen。cadgen doctor <skill-dir> 会报告正在使用的安装,并检查其是否与此 skill 指定的版本一致——文档在使用其他版本时可能会悄然产生偏差。验证本身只需要 Python 标准库;只有快照需要浏览器。使用 cadgen <verb> --help 查看当前完整的命令接口。
验证器格式如下:
cadgen srdf validate path/to/robot.srdf
cadgen srdf validate path/to/robot.srdf --strict
cadgen srdf validate path/to/robot.srdf --json
验证器会解析 SRDF,定位配对的 URDF(同一文件夹中机器人名称匹配的 .urdf;未找到、找到多个或文件无效都会报错),并进行交叉验证:组/关节/链接/子组名称是否存在、链路径是否可解析、子组是否存在循环、虚拟关节/被动关节、末端执行器拓扑、组状态成员关系/限制/完整性、禁用碰撞对(包括 Adjacent 原因是否属实),以及拼写错误的元素。每个阶段都会在一次检查中收集所有发现项(严重级别、代码、XML 路径),但结构错误会中止跨文件检查阶段——每次修复后都要重新运行。每次运行只验证一个文件:--strict 会将警告视为失败;--json 会输出一行 {"ok", "path", "issues": [{"severity", "code", "message", "element", "hint"}], "summary"},其中 element 是 XML 路径。目标文件验证失败时,命令会以非零状态码退出。相对目标路径以当前工作目录为基准解析。
硬性规则
- SRDF 与其 URDF 位于同一文件夹,且共享相同的
<robot name>;只有同文件夹加名称匹配这一种配对机制,并且该文件夹中每个机器人名称只能对应一个 URDF。 - 每个 link、joint、group 和 subgroup 名称都必须来自 URDF 表,或来自同一文件中定义的 group。
- Group state 使用 URDF 原生单位:revolute/continuous 使用弧度,prismatic 使用米。
- 禁用的碰撞对必须注明真实原因和来源。
- 末端执行器 group 不应与其父规划 group 共享 link。
- 目视检查渲染效果很有用,但无法证明规划正确性。
Snapshot 工具
cadgen snapshot 会将机器人渲染为 PNG 静态图,使用所有渲染技能共用的 CLI 和无头浏览器运行时,因此快照与 CAD Viewer 中显示的内容一致。
cadgen snapshot path/to/robot.srdf review.png
将 .srdf 文件传给它;工具会按后缀路由,并渲染配对 URDF 的几何体——也就是同一文件夹中 <robot name> 匹配的 .urdf,配对方式与 cadgen srdf validate 完全相同。如果没有匹配项,或匹配项超过一个,工具会在渲染前拒绝执行,并说明查找的机器人名称以及找到的 .urdf 文件。使用 --joint-values 设置机器人姿态——接受 {joint: degrees} JSON;未指定的关节保持 CAD Viewer 打开机器人时的姿态:各关节先使用默认值,然后使用此 SRDF 中声明的 home group state(数据包中的 "jointValues" job 字段含义相同)。快照使用 Viewer 自身的场景绘制机器人,因此显示效果与 Viewer 一致;无法加载的 link 网格会导致操作失败,而不会直接省略该 link。机器人以米为单位建模,系统会根据机器人场景比例自动调整画面取景。
普通快照使用 Solid 模式和 Light 外观。显示模式为 solid(默认)或 parts(每个 link 使用独立颜色),两者各自采用默认值;--grid 会在机器人下方绘制测量网格,--preview 则会改用 Preview 共用的摄影场景,并采用透视投影。内联显示 JSON 和 JSON 文件均为 Viewer 的显示对象:包含 mode、grid、appearance(light 为默认值,或 dark)、camera(投影方式和焦距)以及 clip。
顶层的 --camera 和 --joint-values 在所有显示模式下均有效。
display.clip 会像 Viewer 的 Clip 一样裁切机器人
({"clip":{"axis":"x","at":0.05}},at 的单位为米);exploded,以及 shaded、xray、
hidden-line 和 wireframe 描述的是 STEP 模型的 CAD 边线和部件,此处会按名称拒绝这些选项。Viewer 生成的 Quick Edit job 会原样重放:包括其 jointValues、selection.hide(Links 面板中按 id 隐藏的部件)、clip 和 annotation(cadgen snapshot --job <file>)。Quick Edit 可提供内联 JSON 或 .snapshot.json 路径;使用 --job 前,请先将内联 JSON 保存到临时文件。编辑前请检查提供的注释。没有注释时,捕获的视图仅为可选的上下文信息;根据请求需要决定是否渲染。
Link 网格相对于描述文件解析,因此必须确保网格文件存在:未下载内容的 Git LFS 指针会报错 "No link mesh loaded for robot"。请先运行 git lfs checkout <mesh dir>。
SRDF 的几何体来自其配对 URDF,因此 SRDF 没有独立的 snapshot 入口;多态的 cadgen snapshot 会按后缀路由。语法为 cadgen snapshot TARGET [OUT] [flags],与每种格式入口使用的语法相同。使用 cadgen snapshot --help 查看完整的当前接口。
参考资料
- 编写约定(结构、URDF 配对、标准骨架):
references/authoring-contract.md - SRDF 工作流(提取 URDF 表、编辑循环):
references/srdf-workflow.md - 规划台账:
references/planning-ledger.md - 验证与核验流程:
references/validation.md - 末端执行器:
references/end-effectors.md - 禁用的碰撞:
references/disabled-collisions.md