第 13.4 節
UDP通信
0瀏覽次數0訪問次數--跳出率--平均停留
Linux UDP 通信
UDP 通信是 Linux 網絡編程中非常常見的一種通信方式。
相比 TCP,UDP 不需要提前建立連接,發送方可以直接向指定 IP 和端口發送數據。它的特點是簡單、延遲低、開銷小,但不保證數據一定送達,也不保證順序。
在機器人項目中,UDP 常用於高頻、實時、允許少量丟包的數據傳輸場景。
在實際項目中,UDP 通信常見於:
- 激光雷達數據傳輸
- 網絡相機或傳感器數據流
- 機器人狀態廣播
- 局域網設備發現
- 遙控器或手柄數據傳輸
- 多機器人之間的簡單通信
- 高頻狀態上報
- 對實時性要求高、但允許少量丟包的場景
UDP 的核心特點是快,但不可靠。因此它更適合“持續發送的數據流”,而不是“必須保證每條消息都送達”的場景。
UDP 通信是什麼
UDP,全稱 User Datagram Protocol,是一種無連接的傳輸協議。
和 TCP 不同,UDP 通信不需要建立連接。只要知道目標 IP 和端口,就可以直接發送數據。
典型結構如下:
UDP Sender
↓
UDP Receiver
也可以是雙向通信:
程序 A ←UDP→ 程序 B
常見概念包括:
| 概念 | 說明 |
|---|---|
| IP 地址 | 用來定位網絡中的設備 |
| 端口號 | 用來區分不同程序 |
| Datagram | UDP 數據報,一次發送對應一個數據報 |
| 廣播 | 向局域網內多個設備發送數據 |
| 組播 | 向加入同一組播組的設備發送數據 |
| 丟包 | UDP 不保證數據一定送達 |
| 亂序 | UDP 不保證數據按順序到達 |
UDP 和 TCP 最大的區別是:TCP 是可靠字節流,UDP 是不可靠數據報。
Linux 下常見 UDP 庫
Linux 下進行 UDP 通信有多種方案,常見的包括:
| 方案 | 類型 | 特點 | 適合場景 |
|---|---|---|---|
| Linux socket API | Linux 原生接口 | 最底層、依賴少、通用性強 | 想深入理解網絡通信機制 |
| boost::asio | 通用 C++ 網絡庫 | 支持同步/異步 UDP,適合工程封裝 | 推薦用於 C++ 項目 |
| Qt Network | Qt 網絡模塊 | 和 Qt 界面程序結合方便 | Qt 上位機 |
| Python socket | Python 標準庫 | 簡單方便,適合測試 | Python 調試腳本 |
| ROS 2 topic | ROS 2 通信機制 | ROS 2 內部通信方便 | ROS 2 系統內部數據傳輸 |
這些方案本質上都是爲了完成 UDP 數據報的發送和接收,只是封裝方式不同。
各方案對比
| 方案 | 優點 | 缺點 |
|---|---|---|
| Linux socket API | 原生、穩定、依賴少、通用性強 | 代碼相對繁瑣,異步處理麻煩 |
| boost::asio | C++ 工程友好,異步 UDP 方便,適合封裝 driver | 需要理解 io_context、endpoint、socket 等概念 |
| Qt Network | 和 Qt 程序結合自然,適合上位機 | 不適合脫離 Qt 的底層 driver |
| Python socket | 上手快,適合測試 UDP 包 | 不適合作爲 C++ 底層主線 |
| ROS 2 topic | ROS 2 內部通信方便 | 不適合替代通用 UDP 學習 |
本教程建議選擇
本教程建議優先選擇:
boost::asio
原因是:
- 適合 C++ 工程開發
- 和 TCP、串口、定時器可以使用同一套 Boost.Asio 編程模型
- 支持同步和異步 UDP 收發
- 不依賴 ROS 2,方便在普通 C++、OpenCV、Qt、嵌入式 Linux 項目中複用
- 適合封裝網絡傳感器、遠程遙控、狀態廣播等功能
推薦的工程結構是:
上层项目:ROS 2 / OpenCV / Qt / 普通 C++ 程序
↓
自己封装的 UdpSender / UdpReceiver 类
↓
boost::asio
↓
UDP socket
↓
雷达 / 网络设备 / 远程控制端
TCP 和 UDP 怎麼選
TCP 和 UDP 都很常用,但適合的場景不同。
| 對比項 | TCP | UDP |
|---|---|---|
| 是否連接 | 需要建立連接 | 不需要建立連接 |
| 可靠性 | 可靠傳輸 | 不保證送達 |
| 順序 | 保證順序 | 不保證順序 |
| 延遲 | 相對更高 | 相對更低 |
| 適合數據 | 命令、配置、文件、日誌 | 高頻數據、廣播、實時狀態 |
| 典型場景 | 遠程控制、服務器通信、參數配置 | 雷達數據、遙控數據、狀態廣播 |
簡單理解:
TCP:我要确保这条消息送到
UDP:我要快速持续发送,偶尔丢一包也能接受
與 ROS 2 的關係
學習 UDP,並不代表要用 UDP 替代 ROS 2 的 topic。
在 ROS 2 系統內部,節點之間通信通常優先使用 ROS 2 自己的通信機制。而 UDP 更適合用來連接 ROS 2 系統之外的網絡設備,或者實現輕量級的遠程通信。
例如:
激光雷达
↓
UDP 数据包
↓
自己封装的 UdpReceiver
↓
ROS 2 节点发布点云 / LaserScan
也可以用於:
远程遥控端
↓
UDP
↓
机器人主控程序
本章學習目標
學習完本章後,應該能夠掌握:
- UDP 通信的基本概念
- UDP 和 TCP 的主要區別
- IP 地址、端口號、endpoint 的含義
- 使用 C++ 發送和接收 UDP 數據
- 理解 UDP 丟包、亂序、廣播等特性
- 使用 Boost.Asio 封裝 UDP 通信類
- 爲後續雷達數據接收、遠程遙控、狀態廣播打基礎