---
# System prepended metadata

title: 進度報告(2024/01/08)
tags: [Velocity Obstical, path planing, 進度報告]

---

# 進度報告(2024/01/08)

## 文獻閱讀
**Reciprocal Velocity Obstacles for Real-Time Multi-Agent Navigation**[^1]
當兩個或多個採用VO避障策略的agents相互閃避時，路徑會出現oscillation的現象。此篇paper便提出修改最初VO的策略，稱作RVO，目的是解決以上的狀況。
![image](https://hackmd.io/_uploads/H10foMuda.png)


### oscillation
稱兩個採用VO避障策略的agents分別為A、B，預設在沒有任何干擾的狀況下，agents會朝目標點直線前進，所以A以$\mathbf{v_A}$的速度直線行駛，B也以$\mathbf{v_B}$的速度直線行駛。
此時A、B相遇，A在速度space中產生了一個$VO^A_B(\mathbf{v_B})$，A的速度向量不能踏進這區域，否則便會在未來的某的時間點撞上B，而$\mathbf{v_A}$因為落在VO裡，因此A會選擇一個VO以外的速度$\mathbf{v'_A}$以避開B。同理B也會產生$VO^B_A(\mathbf{v_A})$，並且選擇這個區間以外的速度$\mathbf{v'_B}$以避開A。下個時間點，A與B皆改變了原本的速度(論文上說，agents會選擇離preferred速度$\mathbf{v^{pref}}$最近的$\mathbf{v'}$，也就是相對於朝終點的直線速度，變化量最小的VO外之速度)。此時，A會發現由於B改變了速度，$VO^A_B(\mathbf{v_B})$也因此移動了，導致原本落在VO中的$\mathbf{v_A}$向量不再落在VO中，為了更快到達目標點，A便再次將它的速度向量改回$\mathbf{v_A}$，同理，B也再次將它的速度向量改回$\mathbf{v_B}$。
A、B的決策造成彼此再次相遇，因此又回到文章上一段落，如此，A與B又重新選擇了新的速度向量，然後又改回來，不斷重複。造成兩agents的路徑抖動。
簡單來說，設兩agents彼此的避障責任各為$\alpha_A$、$\alpha_B$，兩數和應為1。而前述的狀況，由於A、B兩agents都達到了100%的避障($\alpha_A=\alpha_B=1$)，也就是總合為2，結果便是兩者都避障過頭了，造成扭動的現象。

### RVO
為了避免扭動產生，需要讓兩個相遇的agents分擔避障責任，RVO理論中，分擔方法為移動碰撞錐。
從最早的VO文獻得知，當A節點遇到B節點時，A相對於B會產生一碰撞錐。![image](https://hackmd.io/_uploads/S1UOfQOd6.png)
平移此碰撞錐，平移向量為B的速度向量$\mathbf{v_B}$，此平移過後的碰撞錐為VO。![image](https://hackmd.io/_uploads/BkUPmmdup.png)
如今，為了分擔避障責任，需要再次平移碰撞錐，也就是將VO變成RVO(Reciprocal Velocity Obstacle)
* 如果agent A面對B需要負擔100%的避障責任，在速度的space中，其碰撞錐之頂點便落在$\mathbf{v_B}$向量所指的那點，形成VO
* 如果agent A面對B僅僅需負擔0%的避障責任，代表A不用改變當前的速度。可以想像成碰撞錐之頂點落在原速度$\mathbf{v_A}$向量所指的那點。

將避障責任設為$\alpha$介於等於0~1之間，則碰撞錐的平移量為$\alpha\mathbf{v_B}+(1-\alpha)\mathbf{v_A}$。如此，$\alpha=1$，碰撞錐的平移量完全是$\mathbf{v_B}$形成原VO；$\alpha=0$，碰撞錐的平移量完全是$\mathbf{v_A}$。而平移過後的碰撞錐，便是RVO，如下圖:![image](https://hackmd.io/_uploads/SJMKUC_up.png)

### 多節點時的速度選擇策略
當在一個廣闊的空間有很多agents時，每一顆agent都要考慮所有其他agents相對於自己的碰撞追會耗費太多時間且沒效率，所以，文章作者幫agent定義了"Neighbor Region"，進入到這個鄰近區域的其他節點才會被認為是"相遇"，並考慮碰撞錐。儘管如此，當多個agents聚集在一起時，會出現屬於不同節點的碰撞錐幾乎把所有在速度space中可行的$\mathbf{v}$都覆蓋的情況，如圖:![image](https://hackmd.io/_uploads/SkSEXXYu6.png)
此時，對節點i來說，任一個可以更靠近目標點的速度向量都落在RVO中，所以i要在被碰撞錐覆蓋的$\mathbf{v_i}$集合中找出一個可能最不會撞上的速度向量，同時又可以朝i的目標點前進，因此，定義一個penalty，公式如下:
$$
penalty_i(v'_i)=w_i \dfrac{1}{tc_i(v'_i)}+\| v_i^{pref}-v'_i \|
$$
$v_i^{pref}$是以最佳速度朝目標點直線前進的速度向量，$w_i$是權重參數。依此公式，agent A會選擇一個逞罰量最小的速度向量前進。

### VO vs RVO 
![image](https://hackmd.io/_uploads/rJNjFXYda.png)

## 參考RVO程式
找到一分matlab版本的RVO程式，[它發布在github上](https://github.com/jimas95/Multi-Agent-Navigation.git)，程式的作者在README上說是基於上面那篇RVO的論文而寫的。它的有些註解好像不是英文，導致我花了一段時間看懂他的程式碼，其中最主要的應該是一個定義robot的類別檔，所有agent應該有的參數及function幾乎集中在這個class中。
![image](https://hackmd.io/_uploads/SJv9Kjv_p.png)
仔細檢查後，發現這程式跟原來的RVO論文還是有一些小出入，例如，選擇速度的penalty還額外考慮了速度變量(加速度大小應越小越好)，還有權重係數也應該是程式的作者自定義的，畢竟原論文好像沒有交代。儘管如此，大體架構應跟原RVO的論文大同小異。以下是其中幾個執行場景:
避障責任$\alpha_A=\alpha_B=0.5$
{%youtube gIjW3N4ggGU %}
避障責任$\alpha_A=0,\alpha_B=1$
{%youtube 7d9lCYpTgJk %}
多數agents的RVO
{%youtube oPsggGKP81w %}


### Reference
[^1]:J. van den Berg, Ming Lin and D. Manocha, "Reciprocal Velocity Obstacles for real-time multi-agent navigation," 2008 IEEE International Conference on Robotics and Automation, Pasadena, CA, 2008, pp. 1928-1935, doi: 10.1109/ROBOT.2008.4543489.
URL: https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=4543489&isnumber=4543169
