3. 机器人模型建模规范:坐标系约定、命名规则与装配体层级

各位工程师,大家好。欢迎来到第三章。

这一章,咱们不急着画图。先聊聊规矩。

你想想看,一个机器人模型,少则几十个零件,多则上百个。如果没有一套统一的规范,别说导出URDF了,光是找零件就能让你崩溃。我在项目里见过太多次,因为坐标系乱标、零件名随意起,最后导出URDF时各种报错,还得回头改模型,那叫一个痛苦。

所以,这一章的核心就三个字:定规矩。坐标系怎么摆?零件怎么命名?装配体结构怎么搭?咱们一条一条说清楚。

3.1 坐标系约定:ROS标准

ROS里对坐标系有明确的规定。说白了,就是让所有机器人用同一套“世界语言”。

我个人习惯,在SolidWorks里建模时,就严格按照ROS标准来。这样导出URDF后,基本不用再手动调整坐标。

轴 方向约定 说明
X轴 机器人前进方向 对于移动机器人,就是车头方向;对于机械臂,通常是基座指向工作空间前方
Y轴 机器人左侧方向 由右手定则确定,X轴逆时针旋转90°即为Y轴
Z轴 机器人正上方 垂直地面向上,重力方向的反方向
旋转正方向 右手定则 拇指指向轴正方向,四指弯曲方向即为旋转正方向
⚠️ 避坑指南: 我曾经遇到一个项目,团队里有人把Z轴朝下了。结果在Gazebo里仿真,机器人直接“钻地”了。检查了半天才发现是坐标系反了。记住:Z轴永远朝上,这是ROS的铁律。

具体到每个关节和连杆,坐标系怎么放?

  • 基座坐标系(base_link):通常放在机器人底盘的几何中心,Z轴朝上,X轴朝前。
  • 关节坐标系:每个关节的原点,放在关节的旋转中心或移动轴线上。对于旋转关节,Z轴就是旋转轴。
  • 末端执行器坐标系(tool0):放在工具末端,Z轴指向工具的工作方向。

嗯,这里要注意:所有连杆的坐标系原点,都必须定义在关节轴上。这是URDF能正确计算运动学的基础。

3.2 零件命名规则:让名字自己会说话

零件命名,看似小事,实则大事。

我见过有人用“Part1”、“Part2”、“最终版”、“改改改”这种名字。结果呢?导出URDF时,连杆名字全乱套,根本分不清哪个是哪个。

我的建议是:用有意义的英文名,加上统一的前缀或后缀。

元素 命名规则 示例
连杆(Link) link_ + 部位名称 link_base, link_arm1, link_gripper
关节(Joint) joint_ + 连接关系 joint_base_to_arm1, joint_arm1_to_arm2
零件文件 机器人名_部位_版本 myrobot_arm1_v2.SLDPRT
装配体文件 机器人名_总装/子装 myrobot_main_assembly.SLDASM
💡 个人经验: 我习惯在零件名里加上“L”或“R”表示左右。比如“link_wheel_L”、“link_wheel_R”。这样在装配时一目了然,不会搞混。

还有一点:不要用中文名。SolidWorks虽然支持中文,但URDF导出插件和ROS对中文的支持并不好。老老实实用英文,省得后面出乱码。

3.3 装配体层级结构设计:树状结构是王道

URDF的本质,是一棵树。每个节点是一个连杆,每条边是一个关节。

所以,你的SolidWorks装配体,也必须是一棵树。不能有环,不能有交叉。

我画了一张图,帮你理解这个结构:

URDF树状结构 vs SolidWorks装配体层级 URDF树状结构 → SolidWorks装配体层级 base_link (底盘) joint_base_to_arm1 link_arm1 (大臂) joint_arm1_to_arm2 link_arm2 (小臂) joint_arm2_to_gripper link_gripper (夹爪) 💡 关键原则:每个连杆只能有一个父关节,但可以有多个子关节 SolidWorks装配体中,子装配体对应URDF的子树,零件对应连杆,配合关系对应关节

在SolidWorks里怎么搭这个树?

  1. 顶层装配体:就是你的机器人总装。它包含所有子装配体和零件。
  2. 子装配体:对应URDF里的一个子树。比如“arm_subassembly”包含大臂、小臂、夹爪。
  3. 零件:对应URDF里的连杆。每个零件就是一个link。
  4. 配合关系:对应URDF里的关节。同心、重合、距离等配合,定义了关节的类型和运动范围。
📌 核心要点:
  • 装配体层级必须是一棵树,不能有环
  • 每个子装配体只负责一个功能模块(如:左臂、右臂、底盘)
  • 零件之间的配合,要能明确表达关节的运动自由度
  • 不要跨层级引用零件(比如底盘子装配体里引用夹爪的零件)

为什么会强调“不能有环”?

因为URDF解析器是从根节点开始,一层层往下遍历的。如果有环,它就死循环了。我在调试一个六轴机械臂时,就因为一个配合关系搞成了闭环,结果导出URDF时直接报“Graph contains a cycle”。排查了半小时才找到问题。

3.4 实战建议:从建模开始就为URDF铺路

最后,给你几个我在实际项目中总结的“铁律”:

阶段 建议 原因
新建零件 先定义好坐标系原点 原点就是关节位置,后面不用再调
新建装配体 先画好层级结构图 避免后期改结构,工作量巨大
添加配合 只用“同心”和“重合” 这两种配合最容易被URDF插件识别
命名 全部英文,统一前缀 URDF导出插件不支持中文
保存 每个版本单独存档 方便回退,避免“改坏了重画”
💡 我的小习惯: 在SolidWorks里,我会在装配体顶层加一个“坐标系零件”(一个只有坐标轴的虚拟零件)。这样所有子装配体都参考这个坐标系来定位,保证全局坐标系统一。