---
# System prepended metadata

title: TPW1 Streaming Protocol
tags: [TPW1]

---

---
tags: TPW1
---
[toc]
# TPW1 Streaming Protocol

## RGB camera
rtsp://admin:admin@[Camera ip]:7070/

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

使用Sub模式接收訊息，位址預設為tcp://[WIN_PC Server ip]:17781

### 通訊格式
使用byte array進行通訊，如遇到byte轉位元，皆以little endian編碼

| 陣列位置 | 長度 | 用途描述 |
| --- | -------- |  -------- |
| 0 | 2 | 圖片width : 2bytes short     |
| 2 | 2 | 圖片height : 2bytes short     |
| 4 | 1 | 圖片pixel位元數 (暫時只支援32bits) |
| 5 | 4 | 圖片資料長度，會相等於width * height * 4 |
| 9 | 圖片資料長度 | 圖片內容，每個pixel 4bytes，可以<a href="#附注1">附注1</a>算式還原
| 9+圖片資料長度 | 1 | 測量點資料長度 |
| 9+圖片資料長度+1 | 測量點資料長度 | 每點長度為12bytes<br>x : 2bytes short<br>y : 2bytes short<br> temp : 8bytes double
| 9+圖片資料長度+1+測量點資料長度 | 1 | 測量框資料長度 |
| 9+圖片資料長度+1+測量點資料長度+1| 測量框資料長度 | 每點長度為16bytes<br>x : 2bytes short<br>y : 2bytes short<br>width: 2bytes short<br>height : 2byte short<br>temp : 8bytes double

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

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

前7個byte為命令的Header，第7個byte之後的為命令的內容。
| 陣列位置 | 長度 | 用途描述 |
| --- | -------- |  -------- |
| 0 | 1 | 命令編號(ID)     |
| 1 | 1 | 傳送序號，ROS收到命令後，會以該序號進行回傳，用以區別回應哪一個命令 |
| 2 | 1 | 錯誤碼 |
| 3-6 | 4 | 命令所附帶資料的長度，以little endian編碼的int |

### 命令種類
#### (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. |

## 附注1
```java
int value = buf[0] & 0xff 
            | (buf[1] & 0xff ) << 8
            | (buf[2] & 0xff ) << 16
            | (buf[3] & 0xff ) << 24
```