第3章:关节定义与配置:标签详解
好,咱们接着聊。上一章我们把连杆(link)的结构理清了,这一章就轮到关节(joint)了。关节是什么?说白了,它就是连接两个连杆的“活动点”。没有关节,机械臂就是一堆死零件,动不起来。
我个人习惯把关节想象成“人体的关节”。肩关节、肘关节、腕关节——每个关节决定了相邻两块骨头怎么相对运动。在URDF里,<joint>标签就是干这个的。
3.1 关节标签的核心结构
一个典型的关节定义长这样:
<joint name="shoulder_pan_joint" type="revolute">
<parent link="base_link"/>
<child link="shoulder_link"/>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-3.14" upper="3.14" effort="100" velocity="1.0"/>
</joint>
嗯,这里要注意:name是关节的唯一标识,type决定了关节的运动方式。这两个属性缺一不可。
3.2 五个关键子标签详解
3.2.1 parent 和 child:父连杆与子连杆
每个关节必须明确指定父连杆和子连杆。父连杆是“固定端”,子连杆是“活动端”。
我在项目中遇到过一个问题:有同事把parent和child搞反了,结果机械臂的坐标系全乱套了。你想想看,父连杆是base_link,子连杆是shoulder_link,这表示shoulder_link相对于base_link运动。反过来就变成base_link跟着shoulder_link跑了——那还得了?
3.2.2 origin:关节原点
origin定义了关节在父连杆坐标系中的位置和姿态。它包含两个部分:
- xyz:平移量,单位米。比如
xyz="0 0 0.1"表示在Z方向偏移0.1米。 - rpy:旋转量,单位弧度。顺序是绕X轴、Y轴、Z轴。
举个例子:如果父连杆的原点在底座中心,你想让关节在底座正上方10厘米处,那就写 xyz="0 0 0.1"。如果你想让它还旋转45度,那就加 rpy="0 0 0.785"。
3.2.3 axis:旋转轴或移动轴
axis定义了关节的运动轴方向。对于旋转关节(revolute),它就是旋转轴;对于棱柱关节(prismatic),它就是移动方向。
轴向量是相对于父连杆坐标系的。比如 axis xyz="0 0 1" 表示绕Z轴旋转(或沿Z轴移动)。
为什么会这样?因为大多数机械臂的关节都是绕Z轴转的。你想想看,肩关节、肘关节,基本都是绕竖直方向旋转。当然也有例外,比如腕部的偏转关节可能绕X轴或Y轴。
axis xyz="0 0 2",ROS会自动归一化,但最好还是养成写单位向量的习惯。
3.3 关节类型对比
URDF支持6种关节类型。我挑最常用的三种详细说说:
| 类型 | 运动方式 | 自由度 | 典型应用 |
|---|---|---|---|
| fixed | 固定,无运动 | 0 | 连接不可动部件,如摄像头支架 |
| revolute | 绕轴旋转,有角度限制 | 1 | 肩关节、肘关节、腕关节 |
| prismatic | 沿轴平移,有位移限制 | 1 | 伸缩臂、升降台 |
| continuous | 绕轴旋转,无角度限制 | 1 | 车轮、无限旋转的关节 |
| floating | 6自由度自由运动 | 6 | 移动机器人基座(很少用) |
| planar | 在平面内运动(2平移+1旋转) | 3 | AGV小车(很少用) |
3.3.1 fixed 关节
固定关节就是“焊死”的关节。两个连杆之间没有相对运动。比如机械臂末端执行器上的摄像头支架,通常就用fixed关节连接。
<joint name="camera_joint" type="fixed">
<parent link="wrist_link"/>
<child link="camera_link"/>
<origin xyz="0.05 0 0.02" rpy="0 0 0"/>
</joint>
嗯,这里没有limit标签,因为固定关节不需要限制。
3.3.2 revolute 关节
旋转关节是最常见的。它绕一个轴旋转,并且有角度范围限制。比如肘关节,一般只能转0到180度。
<joint name="elbow_joint" type="revolute">
<parent link="upper_arm_link"/>
<child link="forearm_link"/>
<origin xyz="0 0 0.3" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<limit lower="0" upper="2.09" effort="50" velocity="0.5"/>
</joint>
注意看limit标签:lower和upper是弧度制的角度范围,effort是最大力矩(牛米),velocity是最大角速度(弧度/秒)。
3.3.3 prismatic 关节
棱柱关节是平移关节,比如伸缩臂、升降台。它沿一个轴做直线运动,也有范围限制。
<joint name="lift_joint" type="prismatic">
<parent link="base_link"/>
<child link="lift_link"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="0" upper="0.5" effort="200" velocity="0.2"/>
</joint>
这里lower和upper的单位是米。比如上面这个例子,升降台可以从0米升到0.5米。
3.4 知识体系总览
为了让你更直观地理解关节配置的整体结构,我画了一张图:
3.5 实际项目中的经验
最后分享一点实战经验。我在做六轴机械臂模型时,最常犯的错误就是关节原点定义不准确。比如肩关节的origin应该放在底座上表面中心,而不是底座底部。差个几厘米,运动学算出来就全偏了。
我的建议是:先画一个简单的连杆坐标系图,标出每个关节的原点和轴方向。然后再写URDF。这样能避免80%的配置错误。
check_urdf 命令检查模型,它会告诉你每个关节的父连杆、子连杆、原点信息。如果发现某个关节的坐标系方向不对,优先检查axis和origin。
好了,关节配置就讲到这里。记住:关节是机械臂的“灵魂”,定义好了关节,机械臂的运动逻辑就清晰了。下一章我们聊聊如何把连杆和关节组合成一个完整的机械臂模型。
可可精品资料库