英吋 C++

ODE – Chapter 5 《World》

Chapter 5 《World》

    世界裡的物件(object)包含剛體(rigid body)和關節(joint)。不同世界的物件是無法互相作用的,舉例來說,兩個世界的剛體是無法碰撞的。
    世界裡所有的物件都擁有相同的時間點(point in time),因此,為了模擬不同頻率(rate)的碰撞系統,就須使用不同的世界。
    大部分的狀況下,都只需要一個世界即可。

    dWorldID dWorldCreate();

    產生一個空的世界,並且回傳世界的ID。

    void dWorldDestroy (dWorldID);

    摧毀世界裡所有的東西(所有的剛體、關節,但不包括關節群組)。關節群組底下的關節將會被停用,且可以藉由呼叫dJointGroupEmpty()來摧毀之。

    void dWorldSetGravity (dWorldID, dReal x, dReal y, dReal z);
    void dWorldGetGravity (dWorldID, dVector3 gravity);

    設定和取得世界的全域重力(gravity)向量。單位為:「m/s/s(每公尺/秒平方)」。依照地球的重力來說,假設+Z軸為向上向量,就是(0, 0, -9.81)。預設的重力為(0, 0, 0)。

    void dWorldSetERP (dWorldID, dReal erp);
    dReal dWorldGetERP (dWorldID);
    
    設定和取得全域ERP,用來控制每個時間推進(time step)所能修正的錯誤程度。

    void dWorldSetCFM (dWorldID, dReal cfm);
    dReal dWorldGetCFM (dWorldID);

    設定和取得全域CFM(constraint force mixing)。CFM的值通常介於10-9e到1之間。
    如果是用單精準浮點數(float),則預設值為10-5e;如果是雙精準浮點數(double)則為10-10e。

    void dWorldSetAutoDisableFlag (dWorldID, int do_auto_disable);
    int dWorldGetAutoDisableFlag (dWorldID);
    void dWorldSetAutoDisableLinearThreshold (dWorldID, dReal linear_threshold);
    dReal dWorldGetAutoDisableLinearThreshold (dWorldID);
    void dWorldSetAutoDisableAngularThreshold (dWorldID, dReal angular_threshold);
    dReal dWorldGetAutoDisableAngularThreshold (dWorldID);
    void dWorldSetAutoDisableSteps (dWorldID, int steps);
    int dWorldGetAutoDisableSteps (dWorldID);
    void dWorldSetAutoDisableTime (dWorldID, dReal time);
    dReal dWorldGetAutoDisableTime (dWorldID);

    設定和取得新剛體創造時,預設自動關閉的參數。詳見6.5自動關閉的相關說明。
    預設的參數如下:

        • AutoDisableFlag = disabled
        • AutoDisableLinearThreshold = 0.01
        • AutoDisableAngularThreshold = 0.01
        • AutoDisableSteps = 10
        • AutoDisableTime = 0

    void dWorldImpulseToForce (dWorldID, dReal stepsize, dReal ix, dReal iy, dReal iz, dVector3 force);

    如果你需要在剛體上施加線性或有角度的推進力(impulse)而非力量(force)力矩(torque)。,那麼你可以在呼叫dBodyAdd…之類的方法之間,使用這個方法轉換將要施加的推進力,變成力量或力矩向量。
    這方法需要傳遞推進力(ix, iy, iz)和接收的力量向量force。方法只是簡單的依照1/stepsize縮放推進力,這裡的stepsize是指下一次的的推進時間。
    這個方法也須傳遞dWorldID,因為將來計算力量時,可能會需要使用到世界中的一些設定。

    void dCloseODE();

    有些ODE額外使用到的記憶體(內存;memory)是無法透過一些普通的方法來清除的(像是dWorldDestroy())。可以在程式最後呼叫這個方法來避免ODE回報記憶體洩漏(memory leak)的錯誤。

    
    5.1 Stepping Functions
        
        void dWorldStep (dWorldID, dReal stepsize);
        
        世界推進的腳步(step)。這個方法會使用「巨大矩陣」,耗費時間為m*m*m、記憶體消耗為m*m,這裡的m是約束條件(constraint)的總行數(row)。
        對於大型系統來說,這個方法會使用大量的記憶體,且計算緩慢。但這方法是目前最為準確的。

        void dWorldQuickStep (dWorldID, dReal stepsize);

        世界推進的腳步(step)。這裡會使用到遞迴方法,耗費時間為m*N、記憶體消耗為m,這裡的m是約束條件(constraint)的總行數(row),N為遞迴的數量。
        對於大型系統來說,速度會明顯地比dWorldStep()快速許多,但少些準確度。
        QuickStep對於堆疊(stack)物件是很好的,尤其是搭配適當的auto-disable設定。但是對於奇異(near-singular)的系統來說,準確度是非常差的。當使用高摩擦係數的接觸點、motors或某些連接結構,就會產生奇異系統。
        舉例來說,一個擁有多隻腳的機器人坐在地上,就有可能成為奇異系統。
        這裡有一些克服QuickStep不夠準確的方法:
            • 增加CFM。
            • 減少系統中的接觸點數量(像是使用機器人或生物最少的腿數)。
            • 避免使用過度摩擦係數的接觸點。
            • 恰當的使用可滑動的接觸點(contact slip)。
            • 避免運動循環(kinematic loops),然而有腿的生物無法避免運動循環。
            • 避免使用過度的動力(motor strength)。
            • 使用force的動力(force-based motors)取代速度的動力(velocity-based motors)。

        void dWorldSetQuickStepNumIterations (dWorldID, int num);
        int dWorldGetQuickStepNumIterations (dWorldID);

        設定和取得每次推進時QuickStep的重複次數。更密集的次數會讓結果更為準確,同時也需要更長時間的計算作為代價。預設值為20次。

    5.2 Contact Parameters
        
        void dWorldSetContactMaxCorrectingVel (dWorldID, dReal vel);
        dReal dWorldGetContactMaxCorrectingVel (dWorldID);

        設定和取得接觸點(contact)可允許的最大速度修正值,預設值為無限(也就是沒有限制)。減少這個值可以避免深處的內嵌物件『凸』出來。

        void dWorldSetContactSurfaceLayer (dWorldID, dReal depth);
        dReal dWorldGetContactSurfaceLayer (dWorldID);

        設定和取得圍繞在幾何體物件的外觀階層(surface layer)深度。這用來允許接觸點在停止之前可以深入表層的深度。預設值為0。稍微增加一點點(例如0.001)可以避免接觸點不斷產生和摧毀的抖動問題。

–End

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.