多種常用個體行爲的定義與應用

Steering Behaviors For Autonomous Characters
該文章中基於簡單的個體運動模型,講述了常見的幾種個體行爲。

模型屬性

簡單車輛模型:

名字 Name Style
質量 mass scalar
位置 position vector
速度 velocity vector
最大推力 max_force scalar
最大速度 max_speed scalar
運動方向 orientation N basis vectors

:如果是3D模型,則位置和速度有三個分量,運動方向是一個3×33\times 3的矩陣,或者是四元素。對於2D模型而言,位置和速度有兩個分量,運動方向是一個二維向量或者是一個方向角。

運動模型

簡單的車輛模型的物理基礎是前向歐拉積分(forward Euler integration)。車輛運動狀態的更新爲:

steering_force = truncate (steering_direction, max_force)
acceleration = steering_force / mass
velocity = truncate (velocity + acceleration, max_speed)
position = position + velocity

實際驅動力 = 幅度限制(方向,最大驅動力)
加速度 = 實際驅動力/質量
最新速度 = 幅度限制(當前速度+加速度,最大速度)
最新位置 = 當前位置+最新速度

類似於物理中的力與速度之間的關係運動,只是在其基礎上加上了幅度限制。

個體行爲

追蹤和逃跑

在這裏插入圖片描述

desired_velocity = normalize (position - target) * max_speed
steering = desired_velocity - velocity

期望速度 = 標準化(當前位置 - 目標位置)*最大速度
驅動 = 期望速度 - 當前速度。

追蹤:引導車輛運動向着空間中某一位置,這一行爲引導車輛將速度朝着目標。

如果是追蹤目標,則可能圍繞着目標運動,例如,穿過目標後又折回。而逃跑的目標則是運動速度與目標方向相反,如上圖所示。

追蹤目標最有效的方式是對目標下一步的速度進行預測,即在每一步使用簡單的預測器對目標的位置進行預測。因此,追蹤的核心是預測時的時間間隔TT。最基本的方法是將預測的時間間隔T設置爲常數,這會比一直追尋目標當位置(T=0T=0)更有效。更合理的策略是:當距離目標較遠時,選取較大的TT;當距離目標較近時,選取較小的TT。例如,可以選擇T=DcT=Dc,其中DD是追蹤者與目標之間的距離,cc是一個比例係數。如果想獲得更優的預測間隔TT,還需要考慮追蹤者與獵物的運動方向之間的相對關係,和兩者之間相對位置的關係。這兩種關係可以使用叉乘來量化,例如,速度方向(單位向量)叉乘,兩者之間相對距離叉乘目標運動的方向。同時,TT應該儘可能小,如果考慮兩者之間的速度方向時,如果在同一條直線上,則通過相對速度計算出來的TT爲0,此時只要追蹤者沿着當前速度運動即可捕捉到目標。

偏置追蹤

偏置追蹤(Offset Pursuit)是規劃一條經過目標附近的路徑,而不是直接朝着目標運動。例如,一個執行探測任務的太空飛船或執行空中掃射的飛機:只用儘可能的靠近目標,然後使用傳感器對目標進行掃描或者使用武器對目標進行打擊。這種行爲實現的方法是:動態計算一個靠近目標且距離目標距離爲RR的偏置點,在運動過程中追蹤偏置點而不是直接追蹤目標。在計算偏置點時,通常將預測得到的目標轉換到機體所在的局部座標系中,將局部目標投影到機體局部座標系的側平面上(side-up plane),並對偏置點進行歸一化並按照目標距離RR進行縮放,將其添加到局部目標點上並對其進行全局化。
在這裏插入圖片描述文中沒有配圖,自己根據理解畫了一張圖,圖中兩個座標系分別是全局座標系WgW_g和局部座標系WlW_l,綠色的圓代表目標點TT,藍色的圓圈則是一系列偏置點。此時圖中的無人機便向着藍色的偏置點運動,而不是直接飛向綠色的目標點TT

到達行爲

到達行爲(Arrival)與追蹤行爲有點類似,但是不同是到達行爲在接近目標時速度逐漸減小,最終到達目標時速度爲0,而追蹤行爲到達目標點時速度不爲0。如下圖所示,三角代表每個時間間隔機體所在位置,最終到達目標時速度爲0。到達行爲在距離目標點一定位置時開始減速,是該項爲的參數之一。在停止半徑之外時,預期速度爲speed_max,當到達停止半徑時,預期速度逐漸變小,最終在到達目標點時減小爲0。
在這裏插入圖片描述到達行爲的僞代碼如下:

target_offset = target - position
distance = length (target_offset)
ramped_speed = max_speed * (distance / slowing_distance)
clipped_speed = minimum (ramped_speed, max_speed)
desired_velocity = (clipped_speed / distance) * target_offset
steering = desired_velocity - velocity

在現實生活中,這種行爲的例子包括棒球運動員跑到目標點後停下腳步; 或駛向交叉路口並在交通信號燈處停車的汽車。

避障行爲

避障行爲賦予角色在混亂環境中躲避障礙物的機能力。這種行爲與逃跑行爲有點類似,但是也有不同之處。逃避行爲總是會使角色轉向離開給定的位置(尾部自己的人),而避障行爲只有在障礙物影響角色前進時纔會採取行動。 例如,如果汽車平行於牆壁行駛,此時不會觸發避障行爲,而是逃避行爲則嘗試轉向離開牆壁,最終垂直於牆壁行駛。
在這裏插入圖片描述

  避障行爲從角色的局部座標系考慮很方便。該行爲的目的是在角色前面保持一個自由空間的虛擬圓柱。圓柱體沿着角色的前軸放置,其直徑等於角色的邊界,並根據角色的速度和靈活性從角色的中心延伸一段距離。在此距離之外的障礙對角色在本時刻不會造成直接的威脅,可能在下一時刻對角色造成威脅。避障行爲依次考慮每個障礙(可能使用空間分配方案來消除距離障礙),並確定它們是否與圓柱體相交。如果從該點到本地原點的2D距離大於障礙物半徑與角色半徑的和,則將局部障礙物中心投影到側面 。同樣,可以很快排除完全位於角色後面或完全位於圓柱體前面的障礙物。對於剩餘的障礙物,執行線球相交計算。選擇與角色最接近的前向軸相交的障礙物作爲“最大威脅”。在圖7中,障礙物A不與圓柱體相交,障礙物B和C與圓柱相交。爲安全起見,應首先避免與障礙物B相撞,即選擇向左側轉動。

徘徊

徘徊(Wander)是一種隨機轉向行爲,一種最簡單的方式就是在每一步中都產生隨機的轉動力,這種方法沒有太大意義。一種更有趣的方法是保留轉向方向狀態,並在每個幀中對其進行較小的隨機改變。因此,在一個幀中,角色可能會向右上轉,而在下一幀中,角色仍將幾乎在同一方向上轉。轉向力沿一個方向“隨機行走”。這個想法可以通過很多種方法來實現,其中一個比較有趣的方法是將驅動力約束在機體正前方(小距離)一個半徑爲RR的圓上,這是,下一步對機體的驅動力在這個圓上隨機選取,如同8中的小圓。此時紅色線條即下一時刻機體產生的隨機驅動力。此時大圓的半徑RR限制了驅動力的大小。
在這裏插入圖片描述

路徑跟隨

  路徑跟隨行爲(Path following)使角色能夠沿着預定路徑(例如人行道,走廊或隧道)進行轉向。這種行爲不是類似火車那樣,嚴格的在軌道上面行駛。通俗的講,這種行爲類似於一羣人沿着一個長廊行走,每個人走過的路徑保持在走廊的中心線附近,並且通常平行於走廊的中心線,但是卻可以自由地、隨機的偏離它。在此可以將路徑理想化爲脊線(spine)和半徑(radius)。脊線可以表示爲樣條曲線或“折線”(一系列相連的線段)。因此路徑可以被定義爲“管狀”或“廣義圓柱狀”:沿指定脊線掃過的具有指定半徑的圓。路徑跟蹤行爲的目標是使角色沿着路徑移動,同時保持在脊柱的指定半徑內。如果角色最初遠離路徑,則必須先接近,然後再沿着路徑前進。如圖9所示,其中橙色線條爲脊線,其兩邊黃色線條所夾的區域爲路徑追蹤的時指定的路徑半徑約束,即儘可能在該區域內沿着脊線運動。
在這裏插入圖片描述
  爲了計算路徑跟隨時機體的轉向,可以對機體未來的位置進行預測。 預測的位置投影在路徑脊柱上的最近點如圖9所示。如果此投影距離(從預測位置到最近的路徑上的點)小於路徑半徑,則認爲該角色正確地遵循路徑且不需要矯正方向。 否則,角色會偏離路徑,或者距離路徑太遠。 爲了朝着路徑運動,尋求行爲被用來驅動角色轉向預測位置在路徑方向上的投影。 通過調整目標點,可以使得角色在不考慮方向或沿指定方向(從A到B或從B到A)的情況下沿着指定路徑運動。
在這裏插入圖片描述
  對路徑跟蹤行爲稍加改變,便可以將實現沿着牆壁走或者避免碰撞,如圖10所示。沿着牆壁走是指接近“牆”(或其他表面或路徑)然後在運動過程中沿着牆壁且保持一定的偏移量。

有關抵消目標的討論,請參見上文的抵消追求。約束是指限制在某區域內進行運動。路徑跟隨是一種遏制,其中允許區域是路徑脊柱周圍的圓柱體。收容措施的例子包括:在水族館裏游泳,曲棍球運動員在溜冰場內滑冰。要實現:首先預測角色的未來位置,如果該角色位於允許區域之內,則無需進行糾正轉向。否則,我們將轉向允許的區域。這可以通過使用帶有內部點的搜索來實現(例如,我們可以將未來位置投影到障礙物表面,然後擴展此偏移量以獲得目標點),或者可以確定路徑與邊界的交點,找到這一點表面法線,然後使用垂直於我們的前進方向的表面法線分量作爲校正的橫向轉向。

流場跟蹤

流場跟蹤(Flow field following)行爲,在該行爲中,機體將調整期運動方向與流場(也稱爲力場或矢量場)的局部切線對齊。流場定義了從空間中某點到流向量的映射:例如想象一下上面塗有箭頭的地板。流場跟蹤的實現非常簡單:估計角色的未來位置,並在該位置對流場的方向進行採樣。該流動方向(圖11中的向量F)爲“期望速度”,而轉向方向(向量S)可以是當前速度(向量V)與所需速度之間的差。
在這裏插入圖片描述

蜂擁行爲

該行爲詳細的請查看其他博客。

跟隨領導者行爲。

  跟隨領導者的行爲使得一個或多個角色跟隨另一個被指定爲領導者的移動角色。 通常,追隨者希望保持在領導者附近,而不會造成擁擠影響領導者運動,並小心翼翼地避開領導者的路(以防他們偶然發現自己在領導者面前)。 此外,如果有多個跟隨者,他們將避免彼此碰撞。 領導者跟隨的實現依賴於到達行爲(見上文),它渴望朝着某個點移動,並隨着距離的臨近而變慢。 到達目標是在領導者後面稍微偏移的點。 (偏移距離可能會隨速度增加。)如果跟隨者發現自己位於領導者前方的矩形區域,它將在恢復到達行爲之前橫向偏離領導者的路徑。 另外,追隨者使用分離行爲來防止彼此擁擠或者發生碰撞, 參見圖17。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章