3. 机器人模型建模规范:坐标系约定、命名规则与装配体层级
各位工程师,大家好。欢迎来到第三章。
这一章,咱们不急着画图。先聊聊规矩。
你想想看,一个机器人模型,少则几十个零件,多则上百个。如果没有一套统一的规范,别说导出URDF了,光是找零件就能让你崩溃。我在项目里见过太多次,因为坐标系乱标、零件名随意起,最后导出URDF时各种报错,还得回头改模型,那叫一个痛苦。
所以,这一章的核心就三个字:定规矩。坐标系怎么摆?零件怎么命名?装配体结构怎么搭?咱们一条一条说清楚。
3.1 坐标系约定:ROS标准
ROS里对坐标系有明确的规定。说白了,就是让所有机器人用同一套“世界语言”。
我个人习惯,在SolidWorks里建模时,就严格按照ROS标准来。这样导出URDF后,基本不用再手动调整坐标。
| 轴 | 方向约定 | 说明 |
|---|---|---|
| X轴 | 机器人前进方向 | 对于移动机器人,就是车头方向;对于机械臂,通常是基座指向工作空间前方 |
| Y轴 | 机器人左侧方向 | 由右手定则确定,X轴逆时针旋转90°即为Y轴 |
| Z轴 | 机器人正上方 | 垂直地面向上,重力方向的反方向 |
| 旋转正方向 | 右手定则 | 拇指指向轴正方向,四指弯曲方向即为旋转正方向 |
具体到每个关节和连杆,坐标系怎么放?
- 基座坐标系(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 |
还有一点:不要用中文名。SolidWorks虽然支持中文,但URDF导出插件和ROS对中文的支持并不好。老老实实用英文,省得后面出乱码。
3.3 装配体层级结构设计:树状结构是王道
URDF的本质,是一棵树。每个节点是一个连杆,每条边是一个关节。
所以,你的SolidWorks装配体,也必须是一棵树。不能有环,不能有交叉。
我画了一张图,帮你理解这个结构:
在SolidWorks里怎么搭这个树?
- 顶层装配体:就是你的机器人总装。它包含所有子装配体和零件。
- 子装配体:对应URDF里的一个子树。比如“arm_subassembly”包含大臂、小臂、夹爪。
- 零件:对应URDF里的连杆。每个零件就是一个link。
- 配合关系:对应URDF里的关节。同心、重合、距离等配合,定义了关节的类型和运动范围。
- 装配体层级必须是一棵树,不能有环
- 每个子装配体只负责一个功能模块(如:左臂、右臂、底盘)
- 零件之间的配合,要能明确表达关节的运动自由度
- 不要跨层级引用零件(比如底盘子装配体里引用夹爪的零件)
为什么会强调“不能有环”?
因为URDF解析器是从根节点开始,一层层往下遍历的。如果有环,它就死循环了。我在调试一个六轴机械臂时,就因为一个配合关系搞成了闭环,结果导出URDF时直接报“Graph contains a cycle”。排查了半小时才找到问题。
3.4 实战建议:从建模开始就为URDF铺路
最后,给你几个我在实际项目中总结的“铁律”:
| 阶段 | 建议 | 原因 |
|---|---|---|
| 新建零件 | 先定义好坐标系原点 | 原点就是关节位置,后面不用再调 |
| 新建装配体 | 先画好层级结构图 | 避免后期改结构,工作量巨大 |
| 添加配合 | 只用“同心”和“重合” | 这两种配合最容易被URDF插件识别 |
| 命名 | 全部英文,统一前缀 | URDF导出插件不支持中文 |
| 保存 | 每个版本单独存档 | 方便回退,避免“改坏了重画” |