我尝试用 4 个手臂构建一个 Rubiks Cube Solver 来抓取立方体。我正在使用 lejos 固件版本 0.9.0。我的问题是如何检测到电机停转?
例如:Motor.A 正转,而电机将被阻塞/停止,则 Motor.A 应停止。
我希望任何人都可以帮助我。
我尝试用 4 个手臂构建一个 Rubiks Cube Solver 来抓取立方体。我正在使用 lejos 固件版本 0.9.0。我的问题是如何检测到电机停转?
例如:Motor.A 正转,而电机将被阻塞/停止,则 Motor.A 应停止。
我希望任何人都可以帮助我。
这可能是您正在寻找的:
isStalled()
NXTRegulatedMotor.isStalled()
- 如果电机当前停止,则返回真。(即移动计数显示的旋转度数低于预期)
http://www.lejos.org/nxt/nxj/api/lejos/nxt/NXTRegulatedMotor.html#isStalled()
您应该注意的另一种方法是:
setStalledThreshold()
NXTRegulatedMotor.setStallThreshold()
- 设置检测电机失速的参数。如果运动误差(电机滞后于调节位置的量)大于误差的时间长于时间,则电机将被识别为失速。
http://www.lejos.org/nxt/nxj/api/lejos/nxt/NXTRegulatedMotor.html#setStallThreshold(int, int)
最后,这是一个如何将它们组合在一起的示例:
public static void main(String[] args)
{
boolean stalled = false;
NXTRegulatedMotor motor_arm = Motor.A;
motor_arm.setStallThreshold(1, 100);
motor_arm.setSpeed(400);
motor_arm.backward();
while (! stalled)
{
LCD.drawString("Motor is rotating", 0, 0);
if(motor_arm.isStalled())
{
motor_arm.stop();
stalled=true;
LCD.drawString("Motor is stalled", 0, 0);
Delay.msDelay(3000);
}
Delay.msDelay(100);
}
}
注意:的值setStalledThreshold()
可能与机械相关,如果您使用齿轮将电机连接到失速机构,则正确失速检测的值可能会因机器人的设计而异。
祝你好运!:)
我认为检查位置是否发生变化是唯一的方法。发送移动命令,等待,检查位置,看看是否是你要求的。
根据文档,motor.getPosition() 应该与 motor.getTachoCount() 相同。如果不是,那么您可以假设电机已停转。
公共浮动 getPosition()
返回电机调节器试图保持的当前位置。通常这将是电机的实际位置,并且与 getTachoCount() 返回的值相同。但是,在某些情况下(处于停止过程中的 activeMotors,或已被强制离开位置的 activeMotors),这两个值可能不同。请注意,如果监管已暂停,则调用此方法将重新启动它。
所以你只需要检查两个值是否相等:
public boolean isStealed() {
motor.getPosition() == motor.getTachoCount();
}