3

我有一个有趣的(无论如何对我来说)问题。我正在为 V4 开发 OpenServo.org,我正在尝试确定行程弧的长度及其方向。

我有一个磁性编码器,它可以将轴的位置从 0 返回到 4095。

舵机有两个逻辑端点,称为MAX 和MIN,它们是在软件中设置的并且可以随时更改,并且轴必须在MAX 和MIN 位置之间的一个圆弧上旋转(即行进)。例如,在图片中,蓝色弧线是有效的,但红色弧线并非适用于 MIN 和 MAX 之间的所有行程(包括 MIN 和 MAX)。

我正在尝试仅使用整数数学来制定一个简单的算法,该算法可以告诉我任何两点 A 和 B 之间的距离,该距离可以在圆周上的任何位置,以 MIN 和 MAX 为界,并且 A 作为当前位置,B 是目标位置,或者 B 是当前位置,A 是目标(由 B 到 A 的负距离表示)。请注意,我允许旅行的一侧是已知的,它是“红色”或“蓝色”。

问题是当 ARC 中存在 4095/0 时,计算变得有点有趣。

在此处输入图像描述

4

3 回答 3

2

您需要调整所有坐标,使它们位于限制点的同一侧。由于它是一个循环系统,您可以添加 4096 而不会影响绝对位置。

lowest = min(MIN, MAX);
if (A < lowest)
    A += 4096;
if (B < lowest)
    B += 4096;
distance = B - A;  /* or abs(B - A) */

在您的示例中,A 不会被调整,但 B 会被调整为 5156。差值为正 1116。

在 A=3000 和 B=2500 的第二个示例中,它们都高于 2000,因此都不需要调整。差值为-500。

于 2013-10-02T03:30:21.527 回答
1

这是一个简单的算法:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int rotate_diff(int a, int b, bool * clockwise);

int main(void) {
    int degrees_rotated, a, b;
    bool clockwise;

    a = 4040;
    b = 1060;
    degrees_rotated = rotate_diff(a, b, &clockwise);
    printf("A = %d, B = %d, rotation = %d degrees, direction = %s\n",
            a, b, degrees_rotated,
            (clockwise ? "clockwise" : "counter-clockwise"));

    return EXIT_SUCCESS;
}

int rotate_diff(int a, int b, bool * clockwise) {
    static const int min = 2000;

    if ( a <= min ) {
        a += 4096;
    }
    if ( b <= min ) {
        b += 4096;
    }

    int degrees_rotated = b - a;
    if ( degrees_rotated > 0 ) {
        *clockwise = false;
    } else {
        degrees_rotated = -degrees_rotated;
        *clockwise = true;
    }

    return degrees_rotated * 360 / 4096;
}

请注意,这会给您行进的度数,而不是行进的距离,因为您没有告诉我们轴的尺寸是多少。要获得经过的距离,显然将周长乘以经过的度数除以 360。如果您的点 0 到 4095 是某种已知单位,则只需跳过上述算法中的度数转换,并相应地更改变量名称。

于 2013-10-02T03:06:33.213 回答
0

除非我错过了什么,否则这应该会给出您需要的结果:

if MIN < A,B < MAX
    distance = A - B
else
   if A > MAX and B < MIN
       distance = A - (B + 4096)
   else if B > MAX and A < MIN
       distance = (A + 4096) - B
   else
       distance = A - B

(如果不需要方向,则获取距离的绝对值)

于 2013-10-02T03:04:30.660 回答