---
# System prepended metadata

title: Motorcycle Tracking
tags: [progress]

---

###### tags: `progress`

# Motorcycle Tracking

* [Evaluation on kuang-fu rd](https://hackmd.io/uk_LeEneTIinvGUswygOHA)
* paper with code: 
https://paperswithcode.com/task/3d-multi-object-tracking
* waymo open dateset challenge report:
https://sites.google.com/view/cvpr20-scalability/wod-reports?authuser=0
* center-based tracking 
* 87趴像 可參考寫法
Dynamic Multi-LiDAR Based Multiple Object
Detection and Tracking
* [[Probability Data Association(pda)](https://zhuanlan.zhihu.com/p/176851546)]
**context**
[TOC]

[[data moto video demo](https://www.youtube.com/watch?v=LQPgMzRAOss&feature=youtu.be)]

## issue list
- [x] 1. multi-lidar grouping method => delete smaller, overlapped one
     當側邊和上面照到同個物體（左右兩側車輛），側邊lidar照得比較完整，但因為存在時間沒有上面久，會一直被groupTarget()拿掉
=>有誤, 並不是被groupTarget()拿掉,而是本來就沒有產生
::: warning
**Doing**
- [ ] 2. motorbike merge
    對於車機車,機車和機車很接近時，會merge成一個track
    對於鑽車陣的機車而言,因為此時機車跟ego很近,不希望因為merge而沒看到, 或merge而亂連
    [issue video](https://youtu.be/k74zGtsEJTw)
- [ ] 3. ground over-segmentation
    用一個general slope去濾點, 會濾掉過多的點, 在追蹤上會讓點變少看不到
    [ground segmentation](/sBvXv4W6QKGD-PWhmzL7OA)
:::
- [ ] 4. Shape-caused tracker update
    在tracking時, 應該要考慮shape變化, 因為若用centroid, 則速度會受到看到的形狀影響, ex. 靜止物體因ego接近看到形狀越多而有假的速度（centroid在跑）
    但要考慮多顆lidar時看到的perpective不同
    (如何判斷split是否唯一台車？)
- [ ] 5. tracking過程可能不能只看distnance confidence, 考慮過去trajectory, associate應該要follow trjectory而smooth過去, 可以改善當物體移動時突然連到旁邊而有一個鋸齒狀的軌跡 
::: spoiler **check points**:
* merge
1. 00:35
一開始機車　=> merge(機車還在) => (超過0.3s）只剩車，機車的merge track　=> 機車回來
2. 01:15
前方兩台機車merge
3. 03:35 - 03:57
連續機車往前行,經過３台停等車都merge(最遠20m處)

* others
1. 01:34
對向機車initialize剛出現時往ego衝，（將initialize時的點也加入trajectory看是不是因為後方消失而連錯）
2. 01:40
對向多台機車，連結凌亂（可能是某幾台在某幾frame消失連錯）
:::
## Issue 1 (closed)
想說若兩個不同sensor的target同時存在的話, 去判別top polygon的overlap情況, 把小的拿掉
### oberservation
* 對於side lidar而言, 蠻容易associate到top lidar的物件, 所以有時候會一直看不到side lidar的object, 因為他跟top都更新到同一個obj(top的)
* 我們只在top時發布marker, 所以同一個target的polygon只會顯示top的, 不會看到side obj的polygon

![](https://i.imgur.com/vIJtCDR.png)

> 在termina顯示的是right_lidar拿到的obj數目,right_lidar的右後方車輛associate到應該是top的target id 33.（虛線polygon為right_filtered_obj)

![](https://i.imgur.com/pFVeUHC.png)

> 右後方的車,機車都associate應該是top-lidar產生的target 42,33上面.

### conclusion
這個狀況主要在討論兩顆lidar打到同一物體不同面向時, 擔心會產生互相干擾association的問題（且會有redudant的target）,但發現側邊光達傾向一直associate到top-lidar的target,所以反而問題不大.
至少在兩顆lidar都看到的情況下, 可以得到穩定的tracker, 不影響原本追蹤功能.

**因此這個overlap的功能先閒置, 因為目前兩個lidar打到同一個物體時, 通常都只會associate到top的物體**

## Issue 2 Proposed methods－針對merge問題
real-time close object segmentation/tracking in urban area
[[Efficient Tracking of Closely Spaced Objects in Depth Data using
Sequential Dirichlet Process Clustering](https://cse.buffalo.edu/~jsyuan/papers/2017/Efficient%20Tracking%20of%20Closely%20Spaced%20Objects%20in%20Depth%20Data%20using%20Sequential%20Dirichlet%20Process%20Clustering.pdf)]
提到對real-time object tracking而言, 常常會有under-segment的問題
提到文獻13 probabilistic distance based clustering => 可能跟我分布分群的感覺有點像?
[[Generative Object Detection and Tracking in 3D Range Data, ICRA 2012](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=6224585)]

### I.改善分群方式 (closed)
description: 對於較近的region設為15m處的threshold, 較遠處的則完全靠range/distance來決定　[0928 ppt]

#### Result
癥結點: 並沒有直接解決issue 2的問題, 只是把較近的機車的threshold調低了，且只有在某些special case作用, 後面很多case還是沒有解決, 且還是需要吃15m這個條件

---
### II.透過tracking結果回饋回來 [Merge Detector]
若一開始知道是兩個物體，有沒有辦法透過這個線索讓後面不要只merge成一個，而還是顯示兩個track(即使我cluster成一個)？

用歷史hull predict的位置, 先跟進來的detection做比較, 若有one detection to multiple track ＝> 認為detection merge了, ~~拿predict的hull去update track(因為還是有看到, 只是merge了), 不用拿detection~~ [改善](## Merge Measurement Reconstruction) 


#### 可能產生的問題：
* 用prediction來update不夠準, 因為prediction通常比較慢
* 這樣等於是相信detection**傾向於錯誤的merge**, 真正的merge反而會失效(也就是比較碎一點,但若都有追到應該還好)
![](https://i.imgur.com/QjU9uoS.png)
> id 1, 22為一台車


* 若機車track剛產生沒多久,機車的predict會追太不上, 也就是沒辦法overlap問題（需要imm predict較精確）.確認若track產生很久, predict即使是機車也有很高的重疊(幾乎完全疊)

    ![](https://i.imgur.com/5vgQPE7.png)
> 紅色為predict, 黃色為detection拿來做track的結果, id 26機車predict並沒有跟detection重疊

#### Result (prediction update)
Segment demo: [merge resolve by tracking](https://www.youtube.com/watch?v=9OFkEy1gct0&feature=emb_logo)
看起來幾乎所有原本會merge的機車都被保留下來了（粉紅色track為修改後的輸出,藍色為這個frame的detection）

---

### Check of [tracking feedback merge detector](###II.透過tracking結果回饋回來): whole route of kung-fu rd
:::info
almost done
:::
- [x] 重疊的track會影響merge detector的判斷, 用removeOverlappedTargets()移除就可以了

![](https://i.imgur.com/QjU9uoS.png)
> id 19 兩個重疊的track

- [x] 大車一大部分看不到 (7 sec)
![](https://i.imgur.com/cINWb6f.png)
**判別merge是正常 or 不正常
當overlap, 要相信tracker還是相信meas**
因為lidar在遠處的cluster會比較碎, 越近, 會因為看到比較多而較完整merge
但若此時僅採用上個frame的破碎的track來update, 則反而看不到全貌，持續破碎，應該相信meas

> 增加對於merge track的一些假設 : 
應該可以透過**所有track的交集的總面積**去限制, 若跟detection比例小於一個threshold **T(目前設0.3)**, 不啟用, 用拿到的detection
=>小於閥值，覺得應該是真的merge, 相信detection, 表示到這個frame形狀變化大, 相信分群的結果
=>針對機車或不正當的merge, 應該只是**因為物體距離太近**造成, 因此**merge前後我們看到的物體形狀沒有太大的改變, 則overlap的ratio應該要很高**
if ( sum(overlapped area) / area(det) > T ) :
    merged = true

![](https://i.imgur.com/G2nwphA.png)

## Merge Measurement Reconstruction

#### 如何進行measurement的reconstruction?
對於measurement merge/split的問題 
Extend targets: each target can generate multiple measurements
Extend tracking: target和measurement並不是一對一的hard association
[extended target tracking [ref](https://ieeexplore.ieee.org/document/9020858)]
現在大部分對於tracking的假設是one-to-one association, 也就是一個target只會產生一個measurement, 也變成是clustering時就要避免掉merge/split
雖然可以用pda(single)/jpda(multiple), 在association時就考慮多個mea對到一個track, 但若用multi-measurements to one track, time complexity會較高(取決於target及measurement數目), 在機車繁多的車流空間中可能會影響運算效能, **為了提高computational efficiency, 因此主張在clustering就先解決掉, 不要拿到association再做**

> **問題敘述**
> 已知merge tracks數量, 及其merged measurement, 如何去將measurement重新分出所需的cluster來update tracks
Reference: 
1. ~~k-means~~
[Feature-Based Probabilistic Data Association (FBPDA)
for Visual Multi-Target Detection and Tracking
under Occlusions and Split and Merge Effects](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=5309694)
Intro提到可以用**k-means** <- 對我們的問題應該是最快且有效的（因為已知merge track群數，要分出這樣數目的measurement)
結果: 由於object unbalanced dimension, 傾向於對分成等大小的群, 沒有考慮物體本身的shape/geometry
2. Gaussian geometry model
3. ICP

> 當完成Merge detection, 我們須對merge的物件做重新分群的動作, 以便得到正確的measurement來update track.

### K-means (close)

發現kMeans在我們這種case下會分的不好, 因為物件形狀的關係, 用中心距離去分會有很大的問題.
車體上半部與機車的距離永遠會比較近
對離群點無法處理
車的中心到車側的距離反而比機車到車側大, 車側一定會分錯
![](https://i.imgur.com/N9TJKOG.png)


### Gaussian distribution(simplied GMM)

#### Concept
* 希望可以考慮obj原本形狀的分佈, 不要只看點與點的距離去分, 這樣當機車靠近車尾端時車輛L尾端就不會被分給機車（K-Mean)

若用data分佈的方式, 將每個track的所有data點fit成Gaussian
再去計算merge群的每點屬於各個track的機率
就可以將track的幾何考慮進來

:::success

*p(z|trk_geomtery) ~ N(z|nu, sigma)*

z表laser點
nu, sigma 為 sample mean 及 sample variance
計算個別點**z**屬於track **trk**的likelihood p(z|trk_geometry), 歸給likelihood大的
沒有考慮到track prior, 可以視為假設merge track內每個prior(發生機率)相同

:::

![](https://i.imgur.com/sWBtkmT.png)
> grid size = 1m, 紫色為各track的點計算sample variance而來


機車的data很聚集, covariance小, 再加上機動性高（predict不一定追的上）, 所以在機車離群點還是會有些點會分到車子
**（但我覺得只有1.2個點還好, 大致兩群有出來就可以）**

![](https://i.imgur.com/T9vJAc2.png)

> 可看得出來機車離群點反而會因為車子geometry而被分錯（斜）

遇過的BUG: 260 + 17 SEc 黑色機車銀色車
明明前幾個frame都有分成兩群,表示tracker應該會一直update
但到某個frame機車卻不見了,導致detect不到
=>確定是因為track不見而沒偵測到（沒有黃色poly）, 不是有偵測到而分錯（橘色粗poly）
**雖然obj有一直被正確的分開, 但被groupTarget移除惹(距離很近）,導致track不見,下個frame detect不到**


#### Adjustment (best now) [[1026 merge detector](https://docs.google.com/presentation/d/1Q7_AOScKGnqDntxlXJ4nUmDtsLmgEc8IF289lzu7zPE/edit#slide=id.ga4f359fb72_0_10)]
* **groupTarget**內增加限制若為MergeDetector分開的merge_tracking, **不要移除** 移除會有太多的原本破碎產生的false alarm, 導致後面一直判定為merge, 整體太碎
* 因為有時點會橫跨兩群, 像是上圖機車離群點可能會分給車輛, 車輛poly會橫跨, 所以polygon可能會overlap, 導致成功分開的track又被刪掉, 先把removeOverlap拿掉(不知道ratio調大是否能改善, 因為機車物件本來就小)

**對於std_x, std_y < 30m 調整cov scale 1.3就好, 1.5會讓機車太大, 調整1.3就分開了, 且機車也不會在L型尾端時被分給車子**

![](https://i.imgur.com/jp9Enva.png)

**目前看來, 這個分法可以分的不錯, 只要detector有偵測到, 都可以蠻準的分開**


### ICP
把比較大的target對整個merge measurement做ICP, 測試結果可以match的很好
但**無法考慮到形狀變化**的情況, (物體本身因occlusion或FOV而導致前後frame形狀變化)
> if true_target(t) < target(t|t-1)
    > 好辦, 把predict(t|t-1)和merge detection重疊部份分出來就好, 剩下另外一群
> else if true_target(t) > target(t|t-1)
    > 麻煩, 因為對於多出來的part無法分類到某群

![](https://i.imgur.com/j1LlBCv.png)


>黃色為merge detection,綠色為Gaussian分出來的, 桃紅色為ICP基於上個predict frame做完的結果. 因為上個frame只看到後車屁股, 會導致在這個frame車體前端多出來的部份無法歸類為哪群, 無法處理因occlusion等造成的形狀改變

把target和merge detection做ICP, 看起來所有target都對的蠻好的
Note: 先挑大個target做, 做完記得挖掉重疊的detection, 再做小的, 要不然小的target在match時cost會被大車的拉走, match會歪




## tracking-based Merge Detector:

有些決定merge是看track和measurement的CoG, 看是否落在track的某個gate範圍內, 容易fail
我是考慮track/mea的大小形狀去看有沒有重疊, 幾乎不會fail

以我的方式而言, 當我決定merge時, 其實同時已經做完追蹤, 知道現在這個det內有幾個track
做point-to-track cluster相當於做的是point的追蹤(決定每點屬於那個track)
做point-to-track cluster是用來產生meas 來 update track state

但因為lidar點多, 若每個物體都改成point-to-track追蹤, 應該耗資源大, 又不一定效果好, 因此對於track state還是只做centroid的update

**問題在於, 當我可以抓出所有merge時, 如何決定哪些merge是需要被處理的?(真正的merge)
會發生同物體因上個frame occlusion等split 而在下個frame被我判斷為merge強制分開**

valid merge rule 相信是正確的merge
1. total_overlapped_areas/area_obj <= 0.25
    若重疊比例佔detection範圍極小, 表示可能是真的有些點在上個frame occlusion或lose, 才碎掉, 到這個frame回來, 才能merge在一起, 是有效merge.
    
2. ~~（待加） total_overlapped_areas/area_obj >= 0.9 (極高)
    若重疊比例極高, 可能是發生在靜止物體在上個frame碎掉, 這個frame救回來, 所以相信是有效merge~~
    ![](https://i.imgur.com/lqlAMxu.jpg)

    （若一動一靜, 或兩者不同物體, 則overlap比例不可能這麼高, 因為中間會有些merge detection面積是空的）~~
    不好, 因為有時比例就會這麼高（當物體真的很近, 或者前個frame有發生像前面離群點分錯, 則overlap面積就會很高）

3. 若考慮碎掉的物體移動應該要相同, 去做split或merge猜測？
4. rigid body, 把前面碎掉的tracker merge起來, 跟現在merge detection比較相似度？ 若是物體碎掉, 不是兩個, 應該不會有形變, 相似度高
相似度的量化, ICP? polygon?

---

想法: ICP去match target, 大小車可以得到還不錯的match(移動小車會有一點點shift)
若可用ICP去算每個target前後兩frame的transformation(移動量, rot+trans)
去比較target移動量的相似程度, 來判別是否視同一個物體
若同一個, 移動量應該很接近 （rigid body)
**除非現在有兩物體同motion且merge, 才有可能偵測不到
可能停很近機車, 或並行的車輛**

ICP locate target at time t => calculate moving from t1-1 to t => compare

跟直接用UKF的估的motion比起來, 應該會比較robust, 因為我們是直接定位這個frame的物體(measurement), 有考慮物體的幾何, 然後跟上個frame算轉換. UKF估的還是質心, 可能會有一點飄. 
希望由ICP來得到物體更精確的transform來當rigid motion依據, 而不是用filter的motion estimation

### trying
:::warning
Doing 
:::
[1109 meeting](https://docs.google.com/presentation/d/1-yt1-pM196lBhJubPPJdMZ62Xw8dhTER_1EFdxaKARM/edit?usp=sharing)
在量化不同target transformation的差異, 可以只看traslation difference或看整個transformation norm
但我發現當把rotation考慮進來, 也就是看transformation norm, 會比較難找到一個rigid_motion_的threshold, 因此先只看移動量即可, 目前設0.1看起來尚可

**等於是我判斷了merge前先判斷了上一個frame target是不是split**

影響：
路邊停止中的機車車輛會被排除
=> 反正都在靜止中, 我覺得merge比較沒關西, 當其中一方動起來就會自然分開了
=> 主要是兩方運動不一但被merge, 就會有一方看不到
機車並行看起來不會受影響

思考：若是三個物體, 若其中兩個靜一個動, 還是要分開
=> 只要有一個target和其他不是rigid 就分開

---
**rigid_motion_threshold_** (unit: m/sec)
| value | 成果                                         |
| ----- | -------------------------------------------- |
| 1.5   | 整段看起來還行, 大部分rigid都有分對, 動可以維持 |
| 1     | ~~有些機車通過時會誤判~~                         |
| 0.5   | 都不會誤判,且碎掉的也能維持住                |
 gan  0.1 itri 在 s270 s260 有時blue guy分不開
 260比較穩定
 其他機車都分的開
 
 人一般行走速度為**3.75 - 5.43km/hr**, 因此我認為不要大於1.5m/sec（5.4km/hr）較好


### Occlusion
對於一般urban地區而言, occlusion通常是一兩個frame的把物體截斷, 因此在下個frame時segmentation形狀會回來, 在運作上不會造成大影響
但當要處理merge時, 若判斷是否merge, 則occlusion的case就會使我造成誤判, 把不應該分開的物體分開.
因此, 如何在處理merge時，還要考量到occlusion與否. 直接從occlusion的角度.
如果從motion的角度, 又可能使同時動或同時靜的物體分不開（fail）, 治標不治本.

### Problem
有時候總有一台blue guy會到尾巴merge,看起來是merge detect沒抓到,但不確定原因（因為時有時無）

bag play rate 0.8必有兩台機車掛掉
play rate 0.5都可以分的開

---
* progress/1103/abrupt_v_from_bus_s190.mp4
![](https://i.imgur.com/Zc4J13n.png)

在 s=190sec處路邊大巴士跟機車merge時, 會有一個大速度往後衝, 主要是因為中間某個frame大巴後面一小塊碎掉, 導致那塊後來被我重新分群後形狀變大而有一個平行車體的速度, 調整分群點數從10->15拿掉那小塊就行了
（調10是因為在測試路段停等機車很多看不到, 預設是20）



### 對於偵測錯誤的case
源自於前個frame split, 當終於得到完整的detection時, 卻被我另外分開了
#### occlusion 
* 比例極低, 整段只有最後停等機車通過時有可能, 1-2 frame, 好像只發生在離很近的機車遮擋到後方車輛的case (5%)

#### 遠方車輛漸近時並不是一塊, 而會先碎成多塊, 隨著距離越近merge成一塊 (to be confirmed)
1. 因為地面over-segment, 導致前方對向來車輛較易分成兩塊 (80%)
2. 跟點本身稀疏度/密度有關, 都是比較遠的, 較長的bus會, 稀疏再加上over-segment （15%）

- [x] 拿新的ground filter測試, 若能real-time, 應該就不會over-segment了
    - 比較不會over-seg 好很多
    

    
地板過度濾的部份, 發現比較有問題的都是對象來車, 尤其黑車

在引擎蓋到擋風玻璃處本來就點少, 加上那塊容易被當成地板, 容易使車碎成前後塊.
若新的地板可以real-time, 應該可以解決（新的包在非地板區塊的效果不錯, 不會濾掉太多車體）


其中, 對象來車又以黑車碎的比較嚴重, 主要是黑車相對於白車在側面車身的點稀疏（引擎蓋到擋風玻璃處差不多）, 更容易斷成兩截, 白車側面處還算密集, 可保持一台。
    
    
**巴士除了前後碎成兩塊外, 還有在另一側會有一些小碎塊干擾, 是因為玻璃折射？**
![](https://i.imgur.com/AjPgQ2B.png)



#### 1112
對原本的scan match, 好像很多都是沒有match到, 造成motion diff很大, 才會一直分開
若只考慮有match到的, 去算motion diff, 沒有match到的直接讓他merge（用原detection), 則問題好很多（check moving cars)

沒有match到通常發生在移動速度比較快的車/大車, 我猜可能是predict太慢讓他追不上, match不好

這樣修改後, 若是遠方漸進車子碎掉的case, 幾乎都不會被我誤抓出來, 可以正常merge了
!!!! 260+23sec黑色大大經過前面第二台車時, 尾巴有一點merge, 因為match不到 NO
-看起來是機車大大 missing?

好像只有在play rate 0.8才會？？？？
0.5看正常
乾用0.8但從275播放又match得到 啥鬼
入果跟播放時間點有關系, 應該跟missing有關, 但都離開始播放時間點很遠阿？？？（8sec和23秒）

#### 1124
策略: 用ICP去得到precise motion, 來判別是不是應該要split
若一個detection內發現有多個track並不是以相似motion運動, 則應該本來就是不同track/object, 應該要分開

:::warning
**ICP有時會因為以下而無法converge**
```
    1.點不足 (可能是因為前一個frame沒有分好, track拿到很遠離群點, 導致我在用涵蓋面積去exclude掉track時, 把所有點都排除, 沒有剩餘點做ICP)
    2.兩個frame間點缺漏 (scan difference from occlusion..etc.)
    3.Prediction的速度還沒追上來, 導致initial guess不准（還要確認）
```
**ICP即使converge**
```
    4.速度大的東西（10m/s)基本上都match的不太好 （即使點沒有闕漏或速度差夠。看起來是initial（predict）給的位置會有一點點差，大概1m，rot沒問題，但icp後騎士會翻轉？？）
```
:::

- [ ] 因為前個frame recluster沒有分好, 導致離群點會把所有點排除, 可以改成不要排除所有在已經match的track的點, 而只排除相對於此track geometry信賴區間(馬式距離去算)較大的點, 就不會算到離群點的面積惹
- [x] 分群過程中，增加條件，prob(pt|T)需大於一定值才會被分進track，否則拿掉當成outlier, 此舉可避免模稜兩可的邊界點分錯而影響之後的重疊判斷，且物體也分的比較開。


:::success
Merge detector Rule
若確定可以converge(match的到), 表示點數夠多, 能夠當成正確的match, 則估出來的motion才會拿來計算是否為rigidMotion.
(converge & ~~**fitnessScore < thres**~~ 才能相信icp match結果, 拿來算motionDiff)
因此若要能夠被我分開, 須滿足：
MergeDetection內有**多個track的ICP都能夠match的到**
且
**至少有一組(pair)他們的motionDiff超過我的threshold**

則判定merge 要分開

```==
if ( overlapped_IOU > overlap_threshold && 
    ICP motionDiff > threshold)
    mergeDetection = true

if (mergeDetection == true)
    reClusterByGaussianShapeDis(Det)
    
def reClusterByGaussianShapeDis(Det):
    if (prob(pt|T) < outlier_threshold)
        T <- pt
    else
        outlier <- pt
```
:::


Check overlapping -> ICP match between (t-1) and t -> Converge => check difference  
-> Non-converge => final transform remain original prediction (initial guess)
-> Tend to have large transformation between prediction & detection => 容易分開

一般來說, fail converge會導致最後transformation和initial一樣, 變成去算prediction和上一個frame x_merge_的transformation
而因為KF的prediction通常都會慢一點點, 因此兩者間的motion difference會大一點點, 通常會傾向分開


**LOST ASSOCIATION ISSUE**
lost association的問題, 應該是因為一開始unstable時速度還沒上來, 一直追不上, 所以一直產生新的track
若把unstable的track hide起來, 只看已經stable的track, 就不會這麼亂了
但是否需要second initialize？
用second initial由兩個frame的瞬間差強制給值x_merge_ p_merge_, 說不定就追的上了？ （不確定kalman filter update的速度, 我猜可能比較慢, 因為考慮3個model的weighted average, 所以對於初速大的可能追不太上）

**WRONG ASSOCIATION FOR CLOSE OBJECT**
過交流道候的光復路 （200), 對向大群機車直行

目前看到速度會連錯的問題, 有些都不是在unstable發生, 而是stable後, 所以可能在stable時需要用當下的cov… 重新initialize?

*checking list*
- [x] 畫出covariance確認, 有些連錯有點遠
- [ ] second initialization的必要性
- [x] check covariance p_merge_ 會因為lose frame而增加
![](https://i.imgur.com/BOgHcd4.png)
> x,y 標準差, 單位:m
- [x] 即使lost, update時的值也是拿predict來算, 因此最終x_merge_/p_merge_還是會往前走
![](https://i.imgur.com/y7yFJi3.png)
 
> 在mainFrame時確認有lose, 且速度 > 8m/sec 的track (lose可能來與自己frame lost或是與其他顆lidar frame lost)
> 因此對於移動快的物體, 不會因為沒associate到x_merge_/p_merge_就不變, 還是會變, 只是相對慢一些（因為有rm, ctrv weight掉, 不會像cv那麼快）



![](https://i.imgur.com/QKi50dh.png)
這個應該是因為中間有幾個frame lose而被砍掉了, 把0.3s拉長就有了(1s 可以保留)



*Example*
1124/moving_motors_wrong_association_s200_0.5x: 38 sec (top)
1125/moving_motors_s200_0.5x_remove_unstable_trajectory: 36 sec (down)
可以看到moto亂連的情況發生在剛產生/unstable時

![](https://i.imgur.com/rDI935l.png)
> 兩個岔開的箭頭, 其後軌跡不同. 上面是所有軌跡, 下面是只show stable tracking的軌跡
撇開軌跡不談, 其實就是速度的問題, 軌跡的凌亂表示他在unstable時速度是亂的, 所以會刺出來

**Mask掉unstable的tracker後, 軌跡什麼的好很多, 所以大部份是在剛開始追時因為uncertainty大, 比較容易不穩, 會連錯**

#### lidar ghost/duplicate in single frame
Lidar distorsion from vehicle motion(linear & rotation)
對於在lidar y軸方向容易會有track不連續的問題, 尤其在相對速度高時
源自於lidar由velodyne coordinage y軸(azimuth = 0)開始轉, 因此在y軸方向, 若在0.1s(10hz)內一物體通過y軸, 或者因為lidar轉超過360度,則會造成同一個frame/timestamp 掃到同一個物體兩次.
=> 移動物體：機車會duplicate, 車子會加長

> Note: In VeloView, one rotation can be referred to as a single “frame” of data, **beginning and ending at approximately 0°
> azimuth**. The number of frames per second of data generated depends entirely on the RPM setting, e.g. 600 RPM / 60
> s/min = 10 frames per second.
[source : [vpl-32c manual 8.3](https://icave2.cse.buffalo.edu/resources/sensor-modeling/VLP32CManual.pdf)]


![](https://i.imgur.com/uffHpqa.png)
> 此例與機車相對速度大約為18m/sec, 車子本身移動大約9.5m/sec
> 機車和電線桿都有ghost的現象
> 電線桿和樹應該共只有兩隻, 背景有一些疊影





#### visulization rule (1125 update)
在unstable(< 4 frames)時, 只show出紅色箭頭, 並不紀錄軌跡
stable後show出所有marker, 看起來trajectory有好一點（在unstable時會比較亂, 因為uncertainty大, 鄰近機車容易亂連）

把unstable階段視為noise smoothing, 不輸出tracker -> 缺點, 以系統來講, 4 frames, 10m/s的車, online會有4m會看不到（尚在updata) , local smoother? second initialization?



### 1130 個meeting

keypoint
若不要做單個scan的tracking 
1.不要等一個scan 收到就做
2.做scan內的tracking,  若考慮每個點的時間戳, 去在scan內argue是否是同一個物體, 等於在scan內又tracking
argue在相對速度高的情況下, 以scan為單位的tracking會有object  duplicate的問題

old points
smoothing tracjectory（post-process)


[[GitHub: assign timestamp to each point in one scan](https://github.com/kaarta/velodyne/commit/c884af4b8d89d6d585bf354dcdfdb98053e95348#diff-5abe564ce2c4cba7c9ad177d6078dcb9dcc050ebb054a7dd65a1ca93b5fe762a)]

[source : [vpl-32c manual 9.3: data definition](https://icave2.cse.buffalo.edu/resources/sensor-modeling/VLP32CManual.pdf)]

目前看來, 少部份提到lidar distorsion的問題, 都是討論當ego有速度, 周圍環境靜止, 主要是在localization/mapping會產生的問題.
但對於我的問題而言, 比較著重在本車和移動物體間因為有相對速度，在經過boundary時會因為duplicate對tracking產生問題. 不太需要對整個frame做distorsion correction？

ref: 
1. LiDAR point clouds correction acquired from a moving car based on CAN-bus data
    supplement: [Runge-Kutta Localization](https://www.dis.uniroma1.it/~oriolo/amr/slides/Localization1_Slides.pdf)
3. [[https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9128372](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9128372)]

裡面提到當ego有angular/linear motion時, 在mapping/localization的時候會因為靜止物體的distorsion而降低localization的accuracy, 因此需要做correction

~~看不太懂他lidar在各個ray是怎麼估的, 用本車和轉的角度比例去估ray的motion(為何會與轉的角度有比例關係？）~~

=> 因為裡面所有delta表示的是displacement, 並非velocity!!!

根據估出來的ray的motion, 再進一步去求此motion對ray產生的translation&rotation, 就可以用這個把measurement轉回去, 但它看起來很不像是對360度的frame轉回去（∆xα, ∆θα 正比 α , 應該要 （1-α)吧？）



![](https://i.imgur.com/VTc4DP2.png)


不要以一個scan看lidar問題, 因為現在lidar都不是掃一圈的,所以若以這個角度看, 似乎在未來不是問題? 所以不需要像localization做校正的方式去做, 因為整個scan比例低, 未來又不會有

若以這個想法來看, 改善tracking的方式不用以一個scan為單位去update來解決目前的問題, 會比較通用


### Object duplicate
- [x] duplicate, 不用scan update, 分區塊update
> 若用一般lidar在靜態場景的補償方式去correct point cloud
> 1.去算相對速度, 還是需要知道每個點的timestamp, 且比較難補償（time gap難抓）
> 補償後,在複雜場景中很難判定到底是不是真的新物件或舊的物件, 貿然把補償後重疊的東西拿掉會有風險
> 2.因為物體本身也在移動, 因此這個現象也無法由slam端就先補償掉, 因為slam只能補償ego motion的distorsion, 沒有tracking資訊並不知道object速度
> =>看起來, 加快tracking的rate, 而不要用一個累積scan再做, 是比較合理的


### Issue : center-based tracking
**velocity來自於物體移動還是centroid改變?**
若用cluster center當作tracking state, 會因為看到視角不同, shape形狀改變, 而對object velocity會誤判

最常發生就是靜止物體因為ego靠近, 看到的形狀變化, 導致有一些微速度.

若用box-model去fit cluster, 問題也是一樣, 因為車體變長, box也會變長
若是能夠預先知道他的類別, 並套用相對應的大小的box model, 或許是可行的

- [ ] 找data paper 驗 比較

### Current consideration
* Algorithm:
在只有點的資訊, 很多unknown的情況下, 很難再對tracking的algorithm做處理. 
Pure clustering:
1. Object Completeness
    Easy to cause split/merge cases, especially in cluttered, urban area, which would influence tracking stability.
3. Object information
    Cannot definitely know if the object is of our interest. That is, we need **track ALL kinds of OBJECTs include NOISE/NOT-MATTERS** ones as many as we can to ensure security, making association situation chanllenged. 

若可以知道segmentation或detection資訊（類別）, 會改善很多.

* Data:
    目前幾乎沒有看到dataset是有很多機車的, 也沒什麼paper在討論點雲上的機車追蹤, 因此在驗證比較'機車追蹤'這塊不確定可行性, 若主打創新, 或許得有一些新的idea來專門處理機車追蹤.
    
    若用自己的data, 可能lay起來不好實行（多,且有些即使在cam也看不太出來）, 因為lidar擺放的關係, 在市區其實大部份車輛都處於盲區, 對於機車也就可能只看得到頭部幾個點, 若要在我們的data上用geometry去分析機車可能不太有利.

fit object bounding box: 對於小型機車/行人改善效果不顯著（小,可model成point tracker), 對於車輛, 因為本身看到的點雲會改變, 就算去fit polygon成box, 還是會有box center displacement的問題.


用SemanticKitti有point label的追追看, 把一些不要的類別拿掉, 然後做cluster-track
可以看看cluster和tracking對於較complete點雲的情況. 但相較在real-data這塊的觀點就比較薄弱.

觀察：
機車的追蹤, 感覺跟大多數追蹤問題一樣, 很仰賴detection/segmentation的情形.


**Delima: how to segment motor out base on partial and few point geometry, under the unknown/cluttered circustance.
As we want more motors to be seen in 30m+, more cluttered/surrounding object would emerge and track would be messed up**

Big covariance can cause wrong association:
1229 tracking
2:16 -> bag 139sec
confine covariance in tracker, not explode to param [prevent_explosion_thres_]


[rviz_cov_eigen_vector](https://answers.ros.org/question/11081/plot-a-gaussian-3d-representation-with-markers-in-rviz/)
[eigen](https://stackoverflow.com/questions/50458712/c-find-eigenvalues-and-eigenvectors-of-matrix)


## merge detector on SemanticKitti
還沒看到動靜物體merge case 因此都是因為車體車窗透射產生的小破碎  誤判為merge而錯誤分開

這種車體小破碎在icp match時都可收斂，但會發現有時match根本錯誤，因此需要再判定fitnessScore來決定此次收斂是對或錯

因此現在分開條件更嚴苛
1. 在物體icp都可以很好match（converge & **fitnessScore < thres**)
2. 判斷他們的motion差異大
才會分開

根據觀察 motionDiff > 0.15的他們的fitnessScore大部分都太大（有0.4+ 至少都0.1起跳）
match_score_threshold_ 可設安全值0.1濾掉因為錯誤match產生的錯誤motionDiff


 !!! 要確保, 真正要分開的機車和車, 他們都有滿足fitnessScore夠小才行 !!!

測試rigid_motion_threshold_ 0.15有點小 可以到0.2

## Issue: association due to object disappear
對於已經追蹤一陣子的物體, 行進時會因為object消失而連結到旁邊有在association範圍內的物體
產生一個不合理的shift association
常發生, 較遠的物體看不到, 連到近的物體, 產生一個不合理的速度

![](https://i.imgur.com/7fxmCjv.png)

![](https://i.imgur.com/Bvxfdva.png)


因為association object仍在0.99信賴區間範圍內, 因此會associate過去, 但就常理來說, 這麼大的速度不可能有一個這麼突然的轉向
若只用距離去associate會不足

但要確認
1. 轉彎時會不會fail
2. 因為用質心追會有些抖,怕這種會因為左右抖而不在fov內（確認光復路高架橋下那段對象來車
3. 速度小的不考慮association fov 因為轉角可以很大

用association fov加上限制（對速度較大的物體,較小的轉向比較沒限制）

1.用歷史velocity去smooth, 計算smooth_v的p, 進而推算smooth後的範圍smooth_S_
=> v算完的結果過於smooth, 因此smooth_S_範圍非常小, 若加上x_merge_p和measurement noise, 就完全被這兩項吃掉, smooth_S_幾乎沒貢獻
覺得算法有點過於coupling, 等於是拿kf濾過得東西再算一次, 幾乎是certain了
2.由角度著手, 去看state dyaw的變化
    發現因為dyaw在rm和cv都是0,只有ctrv會承襲上一個state, 所以幾乎都是呈現0（1e-3), 若smooth這個沒有太大意義
    
    
## 0222-邊邊雜點det限制thres觀察
**但過只是邊邊雜點, 加上map好像比較快？**
S cov初始為identity, association  region = 1 * 6 m(方圓)
最後region會收斂到3.5-4m左右（R measurement noise的std dev給定植0.5, 0.5*6=3）, 其中3m是r貢獻的固定值.

觀察旁邊分隔島或靜止物體, 容易因為association亂跳而有比較大的region
發現p_merge_ determinant世界小, 10(-2)等級, 但有時候S cov很小確有50(初始值?)
因此限制association/explosion應該看S比較準
S det收斂會在10(-2)~10(-1)左右, 初始會1(identity)
![](https://i.imgur.com/jMjRiyH.png)
![](https://i.imgur.com/kAY7qU6.png)
> cylinder為S,會顯示過去三個associate的S, 其上數值為相對應的S_det,右上邊欄長到6.67

## Covariance study
![](https://i.imgur.com/hWEiTNL.png)
> tracking_num and corresponding p_v

**tracker pv很小=> 很穩定一直往那個方向收斂 => 不代表這個方向associateion是正確的**

只要有持續associate到, tracker會持續收斂, p的位置或速度var都會變小, 因此不能單靠var來判斷這個track是不是有效, 有可能亂連得到很大的速度但var很小（一直associate到, confidence大）

以位置為例, 最後s_x, s_y會收斂到只有r的值（預設std = 0.5m), p_x, p_y極小


## 4D Panoptic seg
* 現在seg的效率會大大影響tracking的結果, 因此若只考慮單一frame去segment, tracking結果會很敏感, 是否可加入時間的考量, 做多個frame的累積?
* 一般tracking-by-detection paradime建立在比較穩定, 且不會有碎掉/occlusion的detection上, 因此在做object-based association問題是只單純考慮一對一的關係, 不會有seg產生的多對一的關係
* 在urban case, 很容易因為partial/fully occlusion的關係而
    * partial: 形狀改變/碎裂, 導致速度/associate估測不准
    * fully: 機車可能完全被遮擋, 遮擋後的track不穩associate到鄰近object, 速度戳

碎掉的case而言, 可以透過疊frame再seg的方式救回來
但形狀改變的部分, 雖然tracker associate是穩的, 但速度會有些微變化

(Point-to-track association) As in merge detector by (may not need) 
tracker accumulated GMM model on spatial and temporal aspect (tracking and detection are coupled) - not cleared, still need initial segmentation to build tracker Gaussian model

*透過tracking可得知下一個geometry model所在, 將過去看預測的model用time decay weight組成一個GMM(on geometry)的軌跡(spatial+temporal),　用這個軌跡去對多個frame clustering, 應該可以解決遮擋造成的split問題(split前是單個tracker, 碎塊應會分在同一個tracker), 但這個方法怎麼產生新的track?, 沒分到的是outlier or new track? 因為我們等於是把過去tracker當成binary的objectness map, 但過去沒追到的地方我們怎麼initial新的track?


seg的問題可分為
* 單個frame去做可能會受到sparsity.penetration的影響而有碎塊 -> sparsity可用疊frame救回來
* 因為occlusion而碎掉


## Lost tracker issue from cracks diturbance
檢查累積2禎的clustering時
1. **2020-09-11-17-31-33.bag** s=27sec
前方車輛因為碎掉而一直連不到, 一直掉
23-27
看原video不會掉阿
阿我改回groupTargets用update time或不累積frame做結果都是掉,待確認
推測, 碎塊間的距離太大(大於groupTargets()的0.5), 導致無法被close, 一直互相連而拖著長尾巴

1. **2020-09-11-17-31-33.bag** s=280sec
黑衣騎士在穿過前面兩輛車中間時merge未偵測到, 因此只分成兩輛車的track而非加上騎士的三個track
原本可以分粗乃的阿!! (cluster_min？outlier？)


## 0421 - 檢視現在merge detector

[link]( ####1124 )
針對很近的object，當segmentation無法正確分割出的情況下，可以透過以往的tracking救回來。
目前是考慮前一禎的結果去做判斷（還不確定如何多禎去決定）

分出來的東西：有motion差(motion-based)，且跟tracker做ICP可以match到的object(appearance based)
對於機車在穿梭車陣時有不錯的效果

** 盲點 **
發現對於速度快的object, 分的不太好, 原因應該在**icp那步沒有converge**, 導致不會啟動或分不出來，**比較常發生在機車,尤其是移動較快或較遠的機車**
icp: 把initial guess畫出來，會跟predict_polygon(&measurement)有落差，不確定是哪部份出問題，明明tracker的cloud和hull是用同樣的方式去轉得到pred的阿...

![](https://i.imgur.com/NpTa9lX.png)

三個點雲為initial guess, 紅色polygon和marker為pred_x_cv的結果。hull透過x_merge_和x_cv_轉回的結果跟meas很吻合，但對點雲一樣先轉回物件原點，在給initial guess的pred_x_cv時用一樣方式去轉得到的cloud有差距。（點雲應該要跟red polygon吻合，在polygon內）
（黃色polygon為重新分群結果，這個case因為三個object做icp都有收斂，所以分群有重分出來）

基本上雖然initial guess有些為差距，但看結果都會收斂且貼到measurement，只是有時候會歪歪的（？），然後機車發散的機率比較高。

example: 
bag：2020-09-11-17-42-38
[wierd_icp_initial_and_final_match.mp4](https://drive.google.com/file/d/1dOB31jfand6QngxvkREGDRoJxbQ_EvrY/view?usp=sharing)
較貼近object的紅藍綠等有色點雲，表示tracker對這個scan object做icp的結果。 落在後面的有色點雲表相對應給定的initial guess。
有收斂的話才有icp結果，因次大部份車子都有收斂。但機車容易不收斂，導致merge detector不啟動。

### 更動
這裡為debug過程，可略，結論在[這裡]( ###Bug fix for _cloud storage ) 。
:::success
發現把icp的initial guess用track的x_merge_直接去cv predict, 得到的initial guess超準！！！直接貼著measurement 即使是動的很快的機車也可以給到很準，上面機車lose的case也可以收斂，match的很好！！！（上面example現在可以完全分開）
看起來之前initial guess用IMMprediction後的x_cv_超不准，但不確定為什麼，因為我predict_polygon也是用x_cv_但很準
:::

![](https://i.imgur.com/KRA2tBc.png)
initial guess很好疊合在measurment，也使得後面ICP match結果都會收斂且對的很好，merge都能分開。
example_revised: 
bag：2020-09-11-17-42-38
[x_merge_pred_good_icp_initial.mp4](https://drive.google.com/file/d/10Iqwc_27IdKfyj7IrRSiv0p-s9grYtU5/view?usp=sharing)


！！重新檢視之前動的物體分不好的case, 並確定原本動靜分的好的不影響！！
解決2020-09-11-17-31-33_bug_fix_stdabs_pt10.mp4 18:40(s280)沒偵測到的case

**不確定為何採用cv model predict的x會不准，但用x_merge_直接去predict 0.1s超準**
:::spoiler debug close

好像不是x_merge_ predict比較準，而是若用0.1s而非任兩frame去predict會比較準。若用dt對x_merge_去predict，效果跟原本用IMMprediction得到的x_cv_同。

為何？即使收到不是top lidar, x_merge_應該也會一直update，是累積起來的誤差比較大？ 
猜測：

還是對tracker來說，當你每次update都不一定有associate的情況下（收到旁邊lidar時，其他tracker是沒有associate到的，形同lose），~~因此估出來的v並不是0.1s內真正的平均速度（走走停停的感覺，速度會因為沒有associate到時而被拉下來），因此用這個v去做很小的dt估測（不同lidar間收到的時間差小）會比較慢，幾乎不動？~~
但若直接在main frame時用0.1去估下一個main frame位置，可以很精準得到，所以速度好像也是夠的？
所以＝>感覺在side lidar的時候x_merge_幾乎沒有update，可能估成rm之類的，到top時才又回來cv
因為如果在lose時判成靜止model，則x_merge_經model加權後結果幾乎不會動，**但cv model速度還是維持正確的估測**，變成我merge若用dt去估就等於不會動（cv model速度對但前一個frame時update得到的x_merge_位置不準，等同於維持上個main frame的位置，但dt不是與上個main frame的距離差），必須用0.1去估（top lidar freq)，**當成在過程中x_merge_不動**
!!!本來以為IMMprediction也調成0.1s 得到的x_cv_應該就準，但結果還是跟原來用dt預測一樣不准阿 why!!!
:::



(add GIT COMMIT!!)
### Bug fix for _cloud storage 
:::success
結論：x_merge_去predict和x_cv_pred_基本上會一樣(對cv的車子而言，幾乎沒有差)
**這裡initial會不一樣的原因在於target的"cloud"儲存錯誤** 而非predict值的問題
原本我的cloud是直接接global frame下associate到的點雲，所以是global座標
但因為對於top lidar object, 只有0.1s的速率會associate到，但我們predciton和update model是frame來就做（<0.1s) (來自side lidar)
所以如果要維持cloud正確，應該每次也都要對cloud位置prediction，這樣到下個top lidar的cloud位置才會是正確的位置，要不然會是0.1s前的位置，而非上個frame的。
為了避免每次接到lidar時predict cloud都要對點雲shift到原點再predict這樣耗資源的動作，乾脆直接存cloud shift到原點的點雲，這樣只要確保model有prediction, cloud的預測位置就直接由predict的pose去轉就可以了。
這樣得到的cloud每次用x_cv_或x_merge_ predict當initial都會是準的（很好的貼到measurement)
:::

### parameter setting
因為原本一直拿錯的點雲來做icp, 做完的結果不那麼準確，因此參數設定方面可能需要重新設定。
1. overlapping_threshold_
   原0.25 -> 0.15
   主要因為現在疊2 frame去做clustering, 所以相鄰移動的object有可能associate一起，比如車子和機車，這樣的話他真正overlapping的IOU可能會不到0.25, 要調到0.15這個case才可以分開
   （原本會調這個thres是因為怕如果大車...等在上個frame因為碎掉還是什麼在下個frame救回來，則他的面積變化應該會很大（<overlapping_threshold_)，可以判定為occlusion的碎因此不會進入merge, 但現在疊frame去cluster就比較不會這樣了，應該可以放寬/調小)
2. rigid_motion_threshold_ 0.15m/0.1s = 1.5m/s = 5.4km/hr （約人行走速度）
    發現調成正確的cloud及準確的initial guess後，merge detector變得很敏感，不確定是不是因為現在看相鄰兩個frame的距離很小（可能0.03-0.05sec), 換算motion difference很小，icp算出來很容易超過的關係。
    靜止的東西或移動的車輛有碎片也會持續被我分開。icp變得沒什麼用了，應該要把rigid_motion_threshold_設大（1.8-2)，（但我覺得原本值很合理，1.5m/s是人步行速度，2m/s快走了）.
    
    ![](https://i.imgur.com/oHxjqlH.jpg)
> 右方待轉區停等機車一直被分開 


- [ ] 靜止物體initila guess(cv)是不是對的上的
- [ ] 靜止物體motion difference ds (換算成速度值看 ds/dt)

31 
s124 前方兩台機車有比以前容易分開，但還是會merge

## 
over-segment for from car: 目前看到討論segmentation的都是用比較dense的data, 看不太到會有這種前車分開的問題
InsClustering: Instantly Clustering LiDAR Range Measures for Autonomous Vehicle 
這跟我們的情況幾乎一樣, 是直接用vlp32c去做, 看他的fail case也跟我們一樣(大車碎片, 前車over-seg), 沒有解法.

occlusion:
直接去算occluded region: 用map去算free/occluded space(沒有太大的想法)


由association角度去看: 
避免不同類別object互連, 每次associate到跟tracker ICP算score, 把score也納入associate metric, 不只用motion gating region.

## merge detector
1. 若側邊和上面打到同一台車,當track間沒有associate成一個而是同時存在兩個時，會把這台車持續分開，因為看上方的重疊，會判斷為碎塊而把一台車切碎
**對於不同光達的merge, 難以分辨是打到同一個東西（不要分開）還是打到不同東西（要分開）**

若disable from different lidar，有一種想要的case是機車穿過我和路邊東西，若機車在側邊merge但在上面有獨立出來，那這種情況應該要透過不同光達間分開就會被關掉了（交大下光復42 s17-27原本分的好)


## 0701 LShape fitting
參考[An Efficient L-Shape Fitting Method for Vehicle Pose Detection with 2D LiDAR](https://ieeexplore.ieee.org/document/8665265)方法, 對Cluster進行LShpae fitting
會進行這個步驟主要考量:
1.比起用質心, 得到接近車體中心的box中心, 對於跟gt比對也會比較準確
2.再者，對於穿透車體產生的小碎塊，也可以用這個fit後把convex沒overlap但fitting後box有overlap的小物件拿掉(原本只拿掉overlap convex, 像巴士的碎塊)
    可以拿掉巴士碎塊或穿透車體的碎塊

![LShape fitting](https://i.imgur.com/nvWYaNU.png =450x)
> 空心框為參考paper的方法算出的box，實心框為修改其中vertices選法得到。paper的選法比較適用在L-Shape很明顯的車輛上，若選不好orientation會有點歪。修改後的方法較貼合車輛heading。


![cracks](https://i.imgur.com/4JYuCJ6.png =450x)
> 圈起來部分為lidar穿透車輛而在車輛另一側產生一小碎塊。

::: warning
最後box fitting方式採先用RANSAC對點雲(BEV, 2d)找線段, 當成一邊, 再用垂直線當另一邊, 這樣fit效果比上面兩者好, car和機車的orientation也不會歪掉
:::


問題:
    如何把邊緣點挑掉?這些東西屬於FP. FP會影響cluster甚至tracking(ex. 建築, 分隔島等靜態非欲追蹤物體)
    如何在不分動靜的情況下, 能夠把所有車機車行人保留.(希望可以像DL做到動靜都有, 而非只抓動的)

    想法
    1.由map著手(較耗時)
        semantic label建築物等東西的geomertic map, 在running的時候動態把這附近的拿掉(可能拿掉離建築很近的行人等)
        建置geometric map, 比對grid有無東西拿掉? (則這個map要乾淨, 不能有周圍想偵測的東西, 只能有靜態場景)
    2.由algo著手(不確定對於雜點的分類效果好不好)
        看能不能對偵測出來的東西分類, 把分為人,車,機車以外的東西拿掉(outlier)
        
        目前有看到針對人車機車分類, 是看axis # 還要再看看效果, 能不能判別出這些類別以外的東西.
        
        
## merge detector
發現更新頻率會影響tracker merge_x 位置
若是三顆lidar去predict/update, 則更新較快, 得到的merge_x位置較準(離measurement近), 但若只用一顆lidar去update, x_merge更新較慢, 可能會稍微偏掉, 就會影響merge detector重分群的效果
(nctu轉彎下來三台車)

## Geometry-cov
現在是直接用上個associate object的geometry, 可以試試看也放入KF用constant update?(像一般lwh放入KF去predict)
這樣可能不會因為det變化而有劇烈的geo改動, 且不會過分依賴上一個associate到的物體的object, 而有tracking smooth

問巧華怎麼將cylinder3D pre-train model inference在不同resolution的lidar (64 to 32 beam)

## 0920 ground filter
測試發現原本的Gaussian Process filter會把部份車身接近地面處當成ground, **(尤其是在occlusion較多, 地面點相對不足的市區)**, 過多的FP會導致ICP matching點不足而diverge.
改成PCL ransac fit更不好, 連地面都找不太出來.
後改成這篇方法，則在接縫處的segment好很多, 但因為是透過高度z選取initial seed點, 這個方法在坡度大的case容易fail, 但在urban效果蠻好.
([git](https://github.com/VincentCheungM/Run_based_segmentation/blob/master/nodes/ground_filter/groundplanfit.cpp))

因為segment出來的ground FP變少, 也就是非地面點變多, 因此更改cluster min_pt_num參數 5 -> 10, 避免noise.

## Running issue note
### IMM running issue

![](https://i.imgur.com/5n49tHg.png)

Solution: 
[[explanation](https://answers.ros.org/question/209452/exception-thrown-while-processing-service-call-time-is-out-of-dual-32-bit-range/)]
因為使用simulation time跑, /clock發之前ros::Time::now()都是0, 才會使的相減負數, 導致abort 
[[ros::Time, ros::Duration](https://blog.csdn.net/u013834525/article/details/83863992)]

**若只是要跑, 只要用try,catch 包起來, catch印個error讓程式可以繼續運行就好.**

### TF issue
While using bag data, stop but get following message, and rviz abort.
> Lookup would require extrapolation into the future. Requested time 1599817098.592198000 but the latest data is at time 1599817098.492717000, when looking up transform from frame [base_link] to frame [map]

會發生明明topic已經收到1599817098.5的msg, 但tf只有1599817098.4的資料, 這是因為[ROS tf的發布時間會比topic晚](https://blog.csdn.net/lemonxiaoxiao/article/details/108715176), 所以若要準確地接收到bag內的tf, 必須使用/clock的時間而非system時間, 所以要use_sim_time = true

等同當pause bag時, node內也一併暫停, 因此不能在while loop裡面做事情.


## 0218_Object local frame (Occupancy grid occlusioin)
object local frame of point cloud & polygon:
Local frame is located by inverse transforming global pose (map) **x_merge_** tracking result, NOT by Object measurement positioins. 
This two would differ because x_merge_ is filtering/smooth result and would respond little delay to measurement.

- [x] Pred_poly和cloud_在local frame也會match在一起


## Occlu
1. frame-by-frame occupancy comparison有時候會不容易抓出來(相較track mapping), 因為若經過occluder速度不夠快或track predict不夠, 在overlap那階段就會抓不出split的情況
> 但Predict Overlap得判斷不知道要用甚麼換, 甚至在image上也都是這box overlap來判斷. 會受到Predition的uncertainty 影響
2. 有時split不是因為occlu, 但會因為tracker多少會被遮擋而判定成要remerge, 但**用occlu_ratio又不準**(occlu_ratio多或少不代表遮擋over-seg的絕對)
- [ ]     可以看occlude grid in track是否沒有落在object(mea) grid來決定?
![](https://i.imgur.com/0ex9rpH.png)

有很多部分的split其實不是因為遮擋, 而遮擋是多少都會發生


Try:
Occupation prob model:
對每個grid的state做Gaussian blur

1.限點數下有點(為了避免單獨一個點的noise) => ptExist = 1 (原本GridState的occupied)
透過3x3 Gaussian kernel
將周圍ptExist值 {0,1}做convolve
convolve結果值([0, 1])就是這個center grid的p(O=1)

然後p > 0.5?? 決定最後GridState真正occupied   (所以有些free可能會變occupied, occupied變free, 會參考周圍grid的情況而定)

2. 訂一個floating point. 約為3x3大小的Gaussian kernel(在R和Theta的六倍標準差約為3x3 grid resolution大小, 因為六倍標準差內所得到的約為99%的資料點, 其CDF約為1) , 對kernel內**所有點**進行計算, 結果即為P(O=1)
會比較耗時, 但會以較容易體現grid內pt的distribution情況, 越邊緣點貢獻少


## evaluation
segmentation方面:
對於over- under-可以由precision/recall變化著手
tracking方面:
則是直接看最後mota值, ids程度(碎掉或Merge就會可能有ids)

Segmentation問題: 如何處理FP(非traffic particiant, building, pole, traffic sign...,ect.)

1. point-unit based
    DL-based
    以semantic labeling的基礎的話, 在意的是**每個點有沒有分對** 因此metrics會以point-unit based為主, 像是point-wise去比對IOU
   

2. object-based metric
    但以我的觀點以trackng為出發, 著重的是在object/instance-based角度, **分出的數目, over- under- seg的程度**, 以往的跟clustering相關的paper使用的evaluation metric:
    
a. 以下使用同一種metric(同1), 符合我想要的比法, 但這裡對於FP的定義我不太了解, 像是**buildings, bushes等不可數的stuff, 並不算在ground truth內**, 看起來演算法也會output各式各樣的cluster, 並沒有特別過濾, 但FP卻不高, precision也很高
* Real-Time and Accurate Segmentation of 3-D Point Clouds Based on Gaussian Process  Regression, IEEE Transactions on Intelligent Transportation Systems 2017. [[video](https://www.youtube.com/watch?v=6MMlw8uGlcI)]
![](https://i.imgur.com/gQuuRju.png)

* InsClustering: Instantly Clustering LiDAR Range Measures for Autonomous Vehicle, ITSC 2020.
![](https://i.imgur.com/mpUpqAc.png)



 b.有些**沒有提供任何quantative evaluation**:
* Fast Segmentation of 3D Point Clouds: A Paradigm on LiDAR Data for Autonomous Vehicle Applications, ICRA 2017.

 c.有些**不考慮FP, 只看TP rate(TP#/GT#)**, 這樣對於我這種seg方法來說比較吃香, 因為我這個方法在TP, FN都會表現得比較好, 但無法區分FP(classification)
* Fast Range Image-Based Segmentation
of Sparse 3D Laser Scans for Online Operation, IROS 2016.
semantically label各式各樣的東西, tree. bushes...,ect.
![](https://i.imgur.com/iZWC4x9.png)



## confidnece-based 
![](https://i.imgur.com/5TzKnyp.png)
[score refinement for confidence-based 3d multi-object tracking](https://arxiv.org/abs/2107.04327)


    
    
    

