私は、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
}
私はatan2を使用できますが、上記のコードを編集しました。初めに言った...私が作った他のすごい間違いはありますか? – Derek
他に何も飛び出しません。重要な質問は、それは今働きますか? – Sysyphus