2011-07-19 20 views
-1

私は、Atmel atmega644paマイクロコントローラを使用してロボットを作成し、Cでプログラミングしています。座標を指定すると、距離を決定する関数を作成しようとしています(現在のロボットの位置から)その座標と(それ自身と比較して)回転する必要がある角度に設定します。座標との角度と距離を取得

私は角度計算に問題があります - 私がそれを与える座標にかかわらず、常にゼロより大きな角度を計算し、ロボットをスピンに送ります。また、明示的にmy_bearing()を0.0に設定すると、すべて正常に動作します。私はこの角度を正しい方向に向けることに取り組んでいますか?

私はturn()メソッドまたはmove()メソッドを含まないのは、ピンを回転または移動するように設定しているためです。私は角度と距離を設定するだけで問題を抱えている関数 - 残りの部分は割り込みサービスルーチンのセットです。

#define MY_START_X   7.5 
#define MY_START_Y   1.5 
#define MY_START_BEARING -90 

float my_x=MY_START_X, my_y=MY_START_Y; 
float go_x, go_y; 
volatile float bearing=MY_START_BEARING 

float my_bearing(void) 
{ 
    float goto_x = go_x - my_x;       // Adjust x to be relative to Me. I AM ORIGIN 
    float goto_y = go_y - my_y;       // Adjust y to be relative to Me. I AM ORIGIN 
    float final = atan2f(goto_y,goto_x)*(180/3.14)-bearing; 
    return final; // Calculate my bearing 
} 

float my_distance(void) 
{ 
    return sqrt((go_x-my_x)*(go_x-my_x)+(go_y-my_y)*(go_y-my_y)); 
} 
void waypoint(float x, float y) 
{ 

    go_x = x;         // Set my x to goto 
    go_y = y;         // Set my y to goto 

    bearing = my_bearing();      // Get my bearing 
    if(abs(bearing) > 1.0) 
    { 
     turn(bearing);        // Turn Accordingly 
     leave = 0; 
     while(leave == 0){};  // wait for ISR to run 
    } 
    move(FORWARD, my_distance()); // Go to my new x,y 
    leave = 0; 
    while(leave == 0){};    // wait for ISR to run 
} 

答えて

-1

あなたは正しい角度を得ていません。 まず、コーナーケースを考慮していない(0,2)はどういう意味ですか?2/0を行うことを意味します)。 また、象限についても考慮していません。 -2、-2は2,2と異なる軸受ですが、どちらの場合もx/y = 1です。

atan2を使用してください。これは四分円を占めています。

atan2をお持ちでない場合は、自分で象限を解決してから象限を使用してオフセットを調整してください。

+0

私はatan2を使用できますが、上記のコードを編集しました。初めに言った...私が作った他のすごい間違いはありますか? – Derek

+0

他に何も飛び出しません。重要な質問は、それは今働きますか? – Sysyphus

関連する問題