# OpenDrive For Carla
- 本篇是做道路編輯器時的OpenDrive紀錄
- Reference: https://www.asam.net/index.php?eID=dumpFile&t=f&f=4422&token=e590561f3c39aa2260e5442e29e93f6693d1cccd
## 座標系
OpenDRIVE有三個座標系,分別是慣性(Inertial)座標、參考線(Reference line)座標和本地(Local)座標
- **Inertial Coordinate System**
- 道路在世界中的位置與幾何定義

- **Reference Line Coordinate System**
- 對於物件等放置在道路上,需要與道路有相對關係的座標
- 參考線可以當作道路的中心線
- S的方向就是沿著道路參考線的方向,T值1為道路寬度(車道寬度加總)
- 編輯物件位置即是調整其S與T座標


- **Local Coordinate System**
- 物件在山參考線座標中定義後,需要再定義該物件在道路上的朝向
- u對應到s,v對應到t

- 總結

## Header
- <header>第一個宣告,並且只能宣告一個
- 屬性對Carla似乎沒影響,固定使用:
```xml!
<header revMajor="1" revMinor="4" name="" version="1" date="2022-02-21T12:11:06" north="1000" south="-1000" east="1000" west="-1000" vendor="" />
```
## 道路表示
每條道路以<road>表示,包含以下屬性 :
- **id** : 唯一ID,在該檔案中不可重複
- **junction** : 如果此道路是屬於路口的道路(連接路),此值為該路口的ID,如果不是就為-1
- **length** : 在xy平面上的道路總長度,即忽略高度上的長度
- **name** : 道路名稱,任意設置即可
- **rule** : RHT(右駕)或LHT(左駕),預設為RHT
每條道路的連接關係以<link>表示,包括<predecessor>與<successor>, 包含以下屬性 :
- **elementType** : 該連接的類型是road或是junction
- **contactPoint** : 該連接與此道路的接觸點相對於該連接是終點或是起點
- **elementType** : 該連接路或是路口的ID
每條道路的位置以<planview>中的<geometry>定義,包含以下屬性 :
- **s** : 起始的s值
- **x** : 起始點在Inertial座標中的x位置
- **y** : 起始點在Inertial座標中的y位置
- **hdg** : 起始點的朝向,以radian值表示(X軸朝向為0)
- **length** : 道路的總長
道路幾何的定義分為以下幾種 :
- **<line>** : 直線
- **<spiral>** : 螺旋,定義起點曲率與終點曲率
- **<arc>** : 曲線,定義固定曲率
- **<paramPoly3>** : 貝茲曲線,定義u、v參數式的a、b、c、d係數值
- 直線、螺旋與曲線可以自由組合

## 車道描述
在OpenDRIVE中,車道被參考線區分為兩側,以參考線ID為0起始,右側車道ID從-1開始遞減,左側車道從1開始遞增

左右側車道群以<left>和<right>表示,各自包含數條車道,每條車道包含以下屬性 :
- **id** : 車道ID,以上述的方式遞增或遞減
- **type** : 車道種類,例如driving、sidewalk、shoulder等等
車道的連接以<link>表示,包括<predecessor>與<successor>,包含以下屬性 :
- **id** : 連接車道的ID
車道寬度以<width>表示,包含以下屬性 :
- **sOffet** : 表示該寬度定義在s上的哪個位置
- **a、b、c、d** : 該位置參數式的係數,通常只設a值(常數項係數),其餘為0
## 路口描述
OpenDRIVE的路口以多條連接道路組成,每條連接道路定義哪些車道能通往哪些車道,一個路口以<junction>表示,包含以下屬性 :
- **name** : 路口的名稱,可以任意設置
- **id** : 路口的ID,在該檔案不可重複
路口的連接以<connection>表示,包含以下屬性 :
- **id** : 連接關係的ID,在該路口不可重複
- **incomingRoad** : 要被連接的道路ID
- **connectingRoad** : 連接路的ID
- **contactPoint** : 該連接路與被連接路的接觸點是在連接路的起始或終點
車道連接以<laneLink>表示,包含以下屬性 :
- **from** : 被連接的車道ID
- **to** : 連接車道的ID

## 物件與交通號誌描述
物件是對交通無影響的物體,雖然本人沒有使用到物件,這邊還是紀錄一下
物件以<objects>中的<object>表示,包含以下屬性 :
- **name** : 物件名稱,如果使用與Carla物件相符的名稱可使Carla使用該物件
- **id** : 物件ID,在此檔案不可重複
- **s** : 參考線座標下的s位置
- **t** : 參考線座標下的t位置
- **zOffset** : 物體高度的offset,不確定Carla中是否有影響
- **hdg** : 物體相對於s方向朝向,以radian值表示
- **roll** : 物體在本地標roll角度,以radian值表示,不確定Carla中是否有影響
- **pitch** : 物體在本地座標的pitch角度,以radian值表示,不確定Carla中是否有影響
- **orientation** : 物體的朝向是否相反
- **height** : 物體高度,不確定Carla中是否有影響
- **width** : 物體寬度,不確定Carla中是否有影響
- **length** : 物體長度,不確定Carla中是否有影響
交通號誌是對交通有影響的物體,例如紅綠燈等等,號誌的位置與朝向決定影響的範圍,以<signals>中的<signal>表示,包含以下屬性 :
- **name** : 號誌名稱,如果使用與Carla號誌相符的名稱可使Carla使用該號誌
- **id** : 號誌ID,在此檔案不可重複
- **s** : 參考線座標下的s位置
- **t** : 參考線座標下的t位置
- **zOffset** : 號誌高度的offset,不確定Carla中是否有影響
- **hdg** : 號誌相對於s方向朝向,以radian值表示
- **roll** : 號誌在本地座標的roll角度,以radian值表示,不確定Carla中是否有影響
- **pitch** : 號誌在本地座標的pitch角度,以radian值表示,不確定Carla中是否有影響
- **orientation** : 號誌的朝向是否相反
- **dynamic** : 號誌是否會變換
- **value** : 號誌的值,例如速限等等
- **height** : 號誌高度,不確定Carla中是否有影響
- **width** : 號誌寬度,不確定Carla中是否有影響