2012-06-22 31 views
1

我遇到了一個問題,我爲我的算法陷入了一些下溢問題。 我基本上是從貝塞爾曲線中取出一條路徑,爲了處理這個問題,我必須使用一些向量乘法(交叉和點積),以使兩個向量之間的角度和時鐘 - 逆時針方向從一個到另一個一。 問題是,當路徑是直線時,其中一個控制變量存在下溢問題,基本上阻塞執行並導致錯誤。在C中處理下溢「如果」條件 - 使用布爾值

下面是代碼:

void BezierInterp() { 
    NumOfSetpoints = 10; 
    float seqTH[11]; 
    float orient[10]; 
    float divider; 
    math.MatrixMult((float*) BCoeff, (float*) waypointX, 11, 4, 1, 
      (float*) setpoint0); 
    math.MatrixMult((float*) BCoeff, (float*) waypointY, 11, 4, 1, 
      (float*) setpoint1); 
    float dx1, dy1, dx2, dy2, dxy1, dxy2, dir; 
    dx1 = cos(state[2]); 
    dy1 = sin(state[2]); 
    dx2 = setpoint0[1] - setpoint0[0]; 
    dy2 = setpoint1[1] - setpoint1[0]; 
    dxy2 = sqrt(sq(dx2) + sq(dy2)); 
    dir = dx1 * dy2 - dx2 * dy1; 
    if (dxy2<0.0001 && dxy2>-0.0001) { 
     seqTH[0] = 0.0; 
    } 
    else{ 
    if (dir >= 0) { 
     seqTH[0] = acos((dx1 * dx2 + dy1 * dy2)/(dxy2)); 
    } else { 
     seqTH[0] = -acos((dx1 * dx2 + dy1 * dy2)/(dxy2)); 
    }} 
    for (uint8_t i = 1; i <= 9; i = i + 1) { 
     dx2 = setpoint0[i + 1] - setpoint0[i]; 
     dy2 = setpoint1[i + 1] - setpoint1[i]; 
     dxy2 = sqrt(sq(dx2) + sq(dy2)); 
     dx1 = setpoint0[i] - setpoint0[i - 1]; 
     dy1 = setpoint1[i] - setpoint1[i - 1]; 
     dxy1 = sqrt(sq(dx1) + sq(dy1)); 
     dir = dx1 * dy2 - dx2 * dy1; 
     divider= dxy1 * dxy2; 
     if (divider<0.0001 && divider>-0.0001) { 
       seqTH[0] = 0.0; 
      } 
     else { 
     if (dir >= 0) { 
      seqTH[i] = acos((dx1 * dx2 + dy1 * dy2)/(divider)); 
     } else { 
      seqTH[i] = -acos((dx1 * dx2 + dy1 * dy2)/(divider)); 
     }} 
    } 
    print_array("seqTh", seqTH, 11, 6); 
    orient[0] = state[2] + seqTH[0]; 
    if (orient[0]<0.0001 && orient[0]>-0.0001){orient[0]=0.0001;} 
    for (uint8_t i = 1; i <= 9; i = i + 1) { 
     orient[i] = orient[i - 1] + seqTH[i]; 
     if (orient[i]<0.0001 && orient[i]>-0.0001){orient[i]=0.0001;} 
    } 
    print_array("orient", orient, 10, 6); 
    for (uint8_t i = 1; i <= 9; i = i + 1) { 
     setpoint2[i] = orient[i - 1]; 
     setpoint3[i] = Vref * cos(orient[i - 1]); 
     setpoint4[i] = Vref * sin(orient[i - 1]); 

    } 
    setpoint2[10] = orient[9]; 
    setpoint3[10] = 0; 
    setpoint4[10] = 0; 
    setpoint5[10] = 0; 
    } 
} 

當您在試圖避免的錯誤看,我把幾臺,如有條件,但還不夠。 其實問題可能來自dir=dx1 * dy2 - dx2 * dy1;。那就是當沿x或y軸移動太小而不能成爲浮動時。 朋友建議使用布爾值,但我不知道如何。 也許定義boolean dir;,然後如果值太小將爲0,否則將被視爲1,在這種情況下,我可以使用我現在用於檢測方向的相同過程。

你有什麼建議或者不同的解決方案嗎? 在此先感謝 斯內德

回答

0

我不熟悉你使用的方法,但是當我在過去做到了這一點,我發現貝塞爾(其中兩個端點和退化情況兩個控制點落在一條直線上)作爲特例。

這當然也快得多。