2011-07-19 86 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

相關問題