我有一个有趣的问题我正在为v4开发openservo.org,我正试图确定一个弧的长度和方向。
我有一个磁性编码器,可以将轴的位置从0返回到4095。
伺服系统有两个逻辑端点,称之为最大和最小,在软件中设置,可随时更改,轴必须在最大和最小位置之间的一个弧上旋转(即移动)。例如,在图片中,蓝色的弧线是有效的,但红色的弧线并不适用于最小值和最大值之间的所有行程。
我试着用一个简单的整数运算法,它能告诉我任意两点A和B之间的距离,这两点可以是圆周上的任何地方,以最小值和最大值为界,A是当前位置,B是目标位置,或者B是当前位置,A是目标(用负距离表示从B到A)。注意我允许旅行的那一面是已知的,它不是“红色”就是“蓝色”。
问题是当4095/0存在于圆弧中,那么计算变得有点有趣。

最佳答案

下面是一个简单的算法:

#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点是某种已知单位,那么只需跳过上述算法中的度转换,并相应地更改变量名。

09-13 01:13