我有一个有趣的问题我正在为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点是某种已知单位,那么只需跳过上述算法中的度转换,并相应地更改变量名。