检测360度转弯算法

Uro*_*jak 5 java algorithm android rotation accelerometer

我成功检测到手机绕轴的 0-360 度旋转(滚动),但现在我很难设计一种有效的算法来检测一整圈。我的工作但我认为不像我想要的那样优雅和有效的算法是:

private boolean detectRoll;
private boolean[] checkpointsR = new boolean[4];
private boolean fullRollTurn;

public void detectingRoll() {
    setDetectRoll(true);
    checkpointsR[0] = true;
    for (int i = 1; i < 4; i++) {
        if (roll > 90 * i && roll < 90 * (i + 1)
            && checkpointsR[i - 1] == true) {
            checkpointsR[i] = true;
        }
    }

    if (areAllTrue(checkpointsR) && roll > 0 && roll < 45) {
        fullRollTurn = true;
        // reset rollCheckpoints
        for (int i = 1; i < 4; i++) {
            checkpointsR[i] = false;
        }
    }
}

public static boolean areAllTrue(boolean[] array) {
    for (boolean b : array)
        if (!b)
            return false;
    return true;
}

public void setDetectRoll(boolean detectRoll) {
    this.detectRoll = detectRoll;
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激。

And*_*nes 1

好吧,您的代码仅检测因增加而导致的转弯roll。在另一个方向,即因roll跌倒而转向,

    if (checkpointsR[i - 1] == true) 
    {
        checkpointsR[i] = true; 
    }
Run Code Online (Sandbox Code Playgroud)

永远不会触发。

虽然这很容易修复,但如果您拥有的唯一传感器输入是roll,则固定检查点方法总是会出现问题。最好的可视化方式是,你的检查点是一个圆圈上的小红点,而手机的旋转对应于一只蚂蚁在圆圈边缘爬行。假设当蚂蚁经过一个点时,它会变成绿色,这代表检查点被设置为true。如果蚂蚁从两个检查点A和之间开始B,它可以通过爬行通过B,一路绕到A,然后转身再次朝另一个方向前进来“欺骗”它们。所有检查点都将变成绿色,但蚂蚁不会完成一整圈。

解决这个问题的方法是改变两件事:首先,为检查点提供三种状态:unvisitedclockwiseanticlockwise。其次,在检查点顶部启动蚂蚁

以下是新规则:

  • unvisited每个点都以(红点)开始。
  • 如果蚂蚁以顺时针方向通过检查点,则将其状态设置为clockwise(从该点顺时针指向的绿色小箭头)
  • 如果蚂蚁以逆时针方向通过检查点,则将其状态设置为anticlockwise(一个绿色小箭头从该点指向逆时针方向)
  • clockwise如果所有检查点都为或全部为,则一轮已完成anticlockwise

这可以通过三个检查点来实现,只要第一个检查点位于蚂蚁的初始位置下方,就可以将其放置在圆上的任何位置。{initial, inital + 120, initial + 240}但出于对称性的考虑,我还是建议这样做。

(蚂蚁思想实验适用于两个检查点,但是当你有两个检查点时,问题是有一对区域,它们之间有一个非唯一的检查点,这会混淆蚂蚁实际通过哪个检查点的检测蚂蚁从一个区域到另一区域)