2012-01-22 3 views
1

О.К., я собираюсь разобраться, что происходит. У меня есть оператор case в основном цикле (состояние 6 относится к случаю в выходном примере ниже). На какое-то время все работает нормально, затем я начинаю получать результаты haywire, где простое вычитание дает неправильный результат. Вот фрагмент кода:Вычитание и фабрики, работающие, а не работающие с программами

case turning: 
Serial.print("state: "); 
Serial.print(state); 
Serial.print("Waypoint: "); 
Serial.print(waypointIndex); 
Serial.print(" Location: "); 
Serial.print(location.x); 
Serial.print(" "); 
Serial.print(location.y); 
Serial.print(" heading: "); 
Serial.print(heading); 
Serial.print("target heading: "); 
Serial.print(targetHeading); 
Serial.print(" heading delta: "); 
headingDelta = fabs(heading-targetHeading); 
Serial.print(headingDelta); 
Serial.print("small? "); 
Serial.print((headingDelta<0.25)); 
Serial.print("\n"); 

if (headingDelta < 0.25) { 
    Stop(); 
    state = travel; 
} 
else { 
    if (turn>=0) { 
    Left(255,255); // turn left 
    } 
    else { 
    Right(255,255); // turn right 
    } 
} 
break; 

Вот кусок выхода:

state: 6Waypoint: 2 Location: 111.98 18.12 heading: 0.95target heading: 1.57 heading delta: 0.62small? 0 

state: 6Waypoint: 2 Location: 111.98 18.12 heading: 0.95target heading: 1.57 heading delta: 0.62small? 0 

state: 6Waypoint: 2 Location: 111.98 18.12 heading: 1.35target heading: 1.57 heading delta: 0.22small? 1 

state: 6Waypoint: 3 Location: 142.73 47.69 heading: 0.55target heading: 0.00 heading delta: 0.00small? 0 

state: 6Waypoint: 3 Location: 142.73 47.69 heading: 0.55target heading: 0.00 heading delta: 0.00small? 0 

state: 6Waypoint: 3 Location: 142.73 47.69 heading: 0.55target heading: 0.00 heading delta: 0.00small? 0 

С 4-го выхода, вдруг мои headingDelta печатает как ноль, когда ясно, что это не так, и все же логика проверки о том, мало ли это, говорит, что это не мало!

Я вытаскиваю волосы. Что происходит? Это на Romeo, который является совместимой с Arduino платой ATmega328.

ответ

1

Похоже targetHeading стал NaN или +/-Inf и Serial.print(...) просто выводит 0.0, когда он встречает один из этих значений. Возможно, вы делите на 0 где-то при вычислении targetHeading.

+0

Спасибо за ваш быстрый и правильный ответ! Оказывается, я принимал арктангенс неправильных предметов и имел artan (0/0), давая NaN. И я также очень хотел, чтобы функция atan2 также работала. – ViennaMike

Смежные вопросы