4. 位置限位设置方法:机械限位与软件限位的配合、正负限位值的确定、限位回零策略

位置限位,说白了就是给机器人关节画一条「红线」。越过这条线,轻则撞坏机械结构,重则烧毁电机驱动器。我见过不少新手工程师,上来就调 PID,结果限位没设好,一上电关节直接打到底,把减速机齿都打崩了。所以这一节,咱们把限位这件事彻底聊透。

4.1 机械限位与软件限位的配合

限位分两层:机械限位是物理硬挡块,软件限位是代码里的软约束。两者缺一不可。

类型 作用 特点 典型实现
机械限位 物理阻挡,防止关节超出结构极限 不可编程,一旦碰撞即产生冲击 限位螺钉、缓冲块、硬挡板
软件限位 在代码中设定角度/位置阈值 可动态调整,响应快,无物理磨损 编码器值比较、位置环饱和限制

我个人习惯的做法是:机械限位留 2~3° 余量,软件限位再往里缩 1°。举个例子,某个关节实际结构能转到 +90°,那我机械限位就装在 +88° 的位置,软件限位设在 +87°。这样即使软件失效,机械限位还能兜底,而且不会硬碰硬撞停。

⚠ 注意:机械限位不是用来「日常停靠」的。如果每次回零都撞到机械限位才停,说明软件限位设得太松,或者回零逻辑有问题。我曾经在一个六轴项目上吃过这个亏——回零时靠撞限位来校准,结果三个月后限位块变形,关节零点漂了 0.5°。

4.2 正负限位值的确定

正负限位值怎么定?不是拍脑袋写的。我一般按下面三步来:

  1. 查机械图纸:确认关节的实际运动范围。比如肩关节,图纸上标注 ±135°,但实际装配后可能只有 ±132°(因为线缆干涉或密封圈挤压)。
  2. 手动盘车验证:断电状态下,用手转动关节到两端极限位置,记录编码器读数。这一步不能省。我遇到过图纸标 ±135°,结果手动转到 +130° 就卡死了——因为有个螺丝长了 2mm。
  3. 留安全余量:在实测极限值基础上,各缩回 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 信号精确定位。这是工业机器人最常用的方式。

我个人推荐混合回零。具体流程如下:

  1. 关节以低速(比如 5°/s)朝负方向运动。
  2. 触发负限位信号后,立即停止,记录当前位置。
  3. 反向运动,离开限位区约 10°。
  4. 再以低速朝正方向运动,寻找编码器 Z 信号。
  5. 找到 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 的软件去抖,或者用施密特触发器硬件滤波。

最后,用一张图总结一下限位设置的整体逻辑:

位置限位设置与回零流程 机械限位安装 软件限位设定 正负限位值确定 限位回零策略选择 撞限位回零 简单,有磨损 找 Z 信号回零 高精度,无碰撞 混合回零 推荐方案 限位验证与调试(手动盘车 + 低速测试)

你看,整个流程其实不复杂。关键是把每一步做扎实:机械限位装准、软件限位留够余量、回零策略选对。做到这三点,关节限位这块基本就不会出大问题。