4. 位置限位设置方法:机械限位与软件限位的配合、正负限位值的确定、限位回零策略
位置限位,说白了就是给机器人关节画一条「红线」。越过这条线,轻则撞坏机械结构,重则烧毁电机驱动器。我见过不少新手工程师,上来就调 PID,结果限位没设好,一上电关节直接打到底,把减速机齿都打崩了。所以这一节,咱们把限位这件事彻底聊透。
4.1 机械限位与软件限位的配合
限位分两层:机械限位是物理硬挡块,软件限位是代码里的软约束。两者缺一不可。
| 类型 | 作用 | 特点 | 典型实现 |
|---|---|---|---|
| 机械限位 | 物理阻挡,防止关节超出结构极限 | 不可编程,一旦碰撞即产生冲击 | 限位螺钉、缓冲块、硬挡板 |
| 软件限位 | 在代码中设定角度/位置阈值 | 可动态调整,响应快,无物理磨损 | 编码器值比较、位置环饱和限制 |
我个人习惯的做法是:机械限位留 2~3° 余量,软件限位再往里缩 1°。举个例子,某个关节实际结构能转到 +90°,那我机械限位就装在 +88° 的位置,软件限位设在 +87°。这样即使软件失效,机械限位还能兜底,而且不会硬碰硬撞停。
⚠ 注意:机械限位不是用来「日常停靠」的。如果每次回零都撞到机械限位才停,说明软件限位设得太松,或者回零逻辑有问题。我曾经在一个六轴项目上吃过这个亏——回零时靠撞限位来校准,结果三个月后限位块变形,关节零点漂了 0.5°。
4.2 正负限位值的确定
正负限位值怎么定?不是拍脑袋写的。我一般按下面三步来:
- 查机械图纸:确认关节的实际运动范围。比如肩关节,图纸上标注 ±135°,但实际装配后可能只有 ±132°(因为线缆干涉或密封圈挤压)。
- 手动盘车验证:断电状态下,用手转动关节到两端极限位置,记录编码器读数。这一步不能省。我遇到过图纸标 ±135°,结果手动转到 +130° 就卡死了——因为有个螺丝长了 2mm。
- 留安全余量:在实测极限值基础上,各缩回 2~3° 作为软件限位。如果关节运动速度高(比如超过 60°/s),余量要更大,建议 5°。
下面是一个典型的限位参数表示例:
| 关节 | 机械极限 | 实测极限 | 软件限位(正) | 软件限位(负) |
|---|---|---|---|---|
| J1 | ±170° | +168° / -169° | +165° | -166° |
| J2 | ±135° | +133° / -134° | +130° | -131° |
| J3 | ±90° | +88° / -89° | +85° | -86° |
💡 小技巧:软件限位值建议写在参数文件里,不要硬编码。这样现场调试时改起来方便,不用重新编译固件。我习惯用 YAML 或 JSON 格式,每个关节一个条目,注释里写上实测值和余量说明。
4.3 限位回零策略
回零,就是让关节找到一个「零点」。限位回零策略,说白了就是怎么利用限位信号来找到这个零点。常用的有三种:
- 撞限位回零:关节朝一个方向运动,直到触发限位开关,然后反向退回到零点位置。简单粗暴,但长期撞击会磨损限位开关和机械结构。
- 找索引脉冲回零:利用编码器的 Z 信号(索引脉冲)作为零点。精度高,无碰撞,但需要编码器有 Z 信号,且第一次上电时不知道 Z 信号在哪。
- 混合回零:先撞限位找到大致位置,再找 Z 信号精确定位。这是工业机器人最常用的方式。
我个人推荐混合回零。具体流程如下:
- 关节以低速(比如 5°/s)朝负方向运动。
- 触发负限位信号后,立即停止,记录当前位置。
- 反向运动,离开限位区约 10°。
- 再以低速朝正方向运动,寻找编码器 Z 信号。
- 找到 Z 信号后,将当前位置设为零点。
代码实现大致是这样:
void homing_routine(Joint *j) {
// 1. 朝负方向找限位
set_velocity(j, -5.0); // deg/s
while (!read_limit_switch(j, NEGATIVE)) {
// 等待触发
}
stop_motor(j);
// 2. 反向离开限位区
set_velocity(j, 5.0);
move_relative(j, 10.0); // 离开 10°
stop_motor(j);
// 3. 朝正方向找 Z 信号
set_velocity(j, 2.0);
while (!read_z_signal(j)) {
// 等待 Z 脉冲
}
stop_motor(j);
// 4. 设为零点
set_encoder_position(j, 0);
j->homing_done = true;
}
🔑 关键点:回零速度不能太快。我见过有人设 30°/s 回零,结果限位信号还没被控制器读到,关节已经冲过限位撞到机械挡块了。建议回零速度不超过 10°/s,找 Z 信号时不超过 3°/s。
嗯,这里还要提一个坑:限位信号抖动。机械限位开关在触发瞬间会有抖动,如果软件不做滤波,可能会误判多次触发。我一般会在限位信号上加 5ms 的软件去抖,或者用施密特触发器硬件滤波。
最后,用一张图总结一下限位设置的整体逻辑:
你看,整个流程其实不复杂。关键是把每一步做扎实:机械限位装准、软件限位留够余量、回零策略选对。做到这三点,关节限位这块基本就不会出大问题。