3

(とにかく私にとって) 興味深い問題があります。私は V4 の OpenServo.org に取り組んでおり、円弧の長さとその方向を決定しようとしています。

シャフトの位置を 0 から 4095 に戻す磁気エンコーダーがあります。

サーボには 2 つの論理的な終点があり、MAX と MIN と呼ばれます。これらはソフトウェアで設定され、いつでも変更できます。シャフトは、MAX と MIN の位置の間で 1 つの円弧上を回転 (つまり、移動) する必要があります。たとえば、図の青い弧は有効ですが、赤い弧は MIN と MAX を含むすべての移動に対応しているわけではありません。

整数演算のみを使用して、円周上の任意の 2 点 A と B の間の距離を知ることができる単純なアルゴリズムを作成しようとしています。MIN と MAX で囲まれ、A が現在の場所であり、B がターゲットの位置、または B が現在の場所で、A がターゲットです (B から A までの負の距離で示されます)。私が旅行を許可した側はわかっていることに注意してください。それは「赤」または「青」です。

問題は、4095/0 が ARC に存在する場合、計算が少し興味深いものになることです。

ここに画像の説明を入力

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 の 2 番目の例では、どちらも 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 に答える