---
# System prepended metadata

title: TPW1 ROS Server Protocol
tags: [TPW1]

---

---
tags: TPW1
---

# TPW1 ROS Server Protocol

[TOC]

## 通訊方式
以ZeroMQ函式庫進行通訊
https://zeromq.org/languages/python/

使用Sub模式接收ROS訊息，位址預設為tcp://ROS ip:7777
使用Push模式發送訊息給ROS，位址預設為tcp://ROS ip:7778

因避免通訊壅塞而採用的第二個接收通道，專門用來傳送地圖資料
使用Sub模式接收ROS訊息，位址預設為tcp://ROS ip:7779

## 通訊格式
使用byte array進行通訊

前7個byte為命令的Header，第7個byte之後的為命令的內容。
| 位元 | 長度 | 用途描述 |
| --- | -------- |  -------- |
| 0 | 1 | 命令編號(ID)     |
| 1 | 1 | 傳送序號，ROS收到命令後，會以該序號進行回傳，用以區別回應哪一個命令 |
| 2 | 1 | 錯誤碼 |
| 3-6 | 4 | 命令所附帶資料的長度，以little endian編碼的int |
### Sequence Diagram
#### 一般命令
```mermaid
    sequenceDiagram
    Client->>Car: Command with sn:(ex:1)
    Car->>Client: Ack with sn:(ex:1)
```
#### 長時間操作命令
* ID: 13 Move to position
* ID: 26 Init patrol
* ID: 27 Deinit patrol

以兩段式回覆
第一階段，確認資料已經送到ros端(由機器人回報ack)
第二階樣，確認是否機器人已經到達目的地(由機器人回報完成)
```mermaid
sequenceDiagram
    participant Client
    participant Car
    Client->>Car: ID:13 Command
    alt ack
        Car->>Client: ID:14 Command
        alt complete
            Car->>Client: ID:15 Command
        else error
            Car->>Client: Command with error code
        end
    else reject error
        Car->>Client: Command with error code
    end
```
## 命令種類
### (ID: 9) Pos
由ROS端主動發出，以20hz傳出Husky位置
| 位元 | 長度 | 用途描述 |
| --- | -------- | -------- |
| 7-14 | 8 | 磁力車位置 (x)，以little endian編碼的double|
| 15-22 | 8 | 磁力車位置 (y)，以little endian編碼的double |
| 23-30 | 8 | 磁力車位置 (z)，以little endian編碼的double |
| 31-38 | 8 | 磁力車姿態 (roll)，以little endian編碼的double|
| 39-46 | 8 | 磁力車姿態 (pitch)，以little endian編碼的double |
| 47-54 | 8 | 磁力車姿態 (yaw)，以little endian編碼的double |

### (ID: 11) Occupancy Grid
由ROS端主動發出，磁力車傳出SLAM演算法所建立的地圖資訊
| 位元 | 長度 | 用途描述 |
| --- | -------- | -------- |
| 7-14 | 8 | 地圖偏移 (x)，以little endian編碼的double|
| 15-22 | 8 | 地圖偏移 (y)，以little endian編碼的double |
| 23-30 | 8 | 地圖偏移 (z)，以little endian編碼的double |
| 31-34 | 4 | 地圖解析度 (resolution)，以little endian編碼的float |
| 35-38 | 4 | 地圖寬 (w)，以little endian編碼的int |
| 39-42 | 4 | 地圖高 (h)，以little endian編碼的int |
| 43-(43+w*h-1) | w*h | The map data, in row-major order, starting with (0,0). <br> Occupancy probabilities are in the range [0,100].<br>  Unknown is -1. |

### (ID: 12) Move Control
由Client端發出，用來遙控Husky
| 位元 | 長度 | 用途描述 |
| --- | -------- | -------- |
| 7-10 | 4 | 以little endian編碼的float，前進與後退方向的值 (-1~1)|
| 11-14 | 4 | 以little endian編碼的float，旋轉方向的值 (-1~1) | 

### (ID: 13) Move To Position
由Client端發出，設定移動Husky至固定位置
| 位元 | 長度 | 用途描述 |
| --- | -------- | -------- |
| 7-10 | 4 | 以little endian編碼的float，位置x |
| 11-14 | 4 | 以little endian編碼的float，位置y |
| 15-18 | 4 | 以little endian編碼的float，方向yaw |

此命令分成兩個階段
第一階段，確認資料已經送到ros端(由機器人回報ack: MoveToPositionACK)
第二階樣，確認是否機器人已經到達目的地(由機器人回報: MoveToPositionFinish)

### (ID: 14) Move To Position ACK
ROS收到Client的命令後回傳

### (ID: 15) Move To Position FINISH
移動到固定點之後回傳

### (ID: 16) Move To Position ABORT
由Client端發出，中止移動到固定點的命令

### (ID: 17) PathOccupancy Grid <span style="color:red">調整中，可能改變成僅由Server發出</span>
由Client端發出，請求回傳可行走地圖
- Request command: No data
- Response command:

| 位元          | 長度 | 用途描述                                                                                                                          |
| ------------- | ---- | --------------------------------------------------------------------------------------------------------------------------------- |
| 7-14          | 8    | 地圖偏移 (x)，以little endian編碼的double                                                                                         |
| 15-22         | 8    | 地圖偏移 (y)，以little endian編碼的double                                                                                         |
| 23-30         | 8    | 地圖偏移 (z)，以little endian編碼的double                                                                                         |
| 31-34         | 4    | 地圖解析度 (resolution)，以little endian編碼的float                                                                               |
| 35-38         | 4    | 地圖寬 (w)，以little endian編碼的int                                                                                              |
| 39-42         | 4    | 地圖高 (h)，以little endian編碼的int                                                                                              |
| 43-(43+w*h-1) | w*h  | The map data, in row-major order, starting with (0,0). <br> Occupancy probabilities are in the range [0,100].<br>  Unknown is -1. |

### (ID: 18) Reset All Map
由Client端發出，重置所有地圖

### (ID: 19) Reset Path Map
由Client端發出，重置可行走路徑地圖

### (ID: 20) Start Record Path
由Client端發出，開始記錄可行走路徑

### (ID: 21) Stop Record Path
由Client端發出，停止記錄可行走路徑

~~### (ID: 22) Go Home
由Client端發出，通知Husky回到充電小屋~~

### (ID: 23) Enable Path Map Stream
由Client端發出，通知Server streaming的內容由原本的Map改為PathMap
- Request command:

| 位元 | 長度 | 用途描述 |
| --- | -------- | -------- |
| 7 | 1 | 1: enable 0: disable |

- Response command: No data

### (ID: 24) Set Garage point 
由Client端發出，以目前所在點，設定為garage點

### (ID: 25) Set Home point
由Client端發出，以目前所在點，設定為鄰近garage的home點

### (ID: 26) Init Patrol
由Client端發出，啟動排程前置作業，目前是從garage前往home點 
此命令分成兩個階段
第一階段，確認資料已經送到ros端(由機器人回報ack: InitPatrol)
第二階樣，確認是否機器人已經到達目的地(由機器人回報: MoveToPositionFinish)

### (ID: 27) Deinit Patrol
由Client端發出，結束排程收尾作業，從目前點前往home點，再前往garage點 
此命令分成兩個階段
第一階段，確認資料已經送到ros端(由機器人回報ack: DeinitPatrol)
第二階樣，確認是否機器人已經到達目的地(由機器人回報: MoveToPositionFinish)

### (ID: 28) Init Patrol Abort
由Client端發出，中止Init Patrol命令

### (ID: 29) Deinit Patrol Abort
由Client端發出，中止Deinit Patrol命令

### (ID: 40) ROS Status Notification
由ROS端主動發出，頻率為1秒一次，通知Client目前狀態
| 位元 | 長度 | 用途描述 |
| --- | -------- | -------- |
| 7-(7+n-1) | n | 狀態字串，目前狀態有init與online |


### (ID: 99) Keep Alive Signal
由ROS端主動發出，讓Client端確定ROS處於運作狀態，頻率為在無傳送資料時每3秒一次





