跳到正文

Wiki

UDP通訊

約 4 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

1.Linux UDP 通訊

UDP 通訊是 Linux 網路程式設計中非常常見的一種通訊方式。

相比 TCP,UDP 不需要提前建立連線,傳送方可以直接向指定 IP 和埠傳送資料。它的特點是簡單、延遲低、開銷小,但不保證資料一定送達,也不保證順序。

在機器人專案中,UDP 常用於高頻、即時、允許少量丟包的資料傳輸場景。

在實際專案中,UDP 通訊常見於:

  • 雷射雷達資料傳輸
  • 網路相機或感測器資料流
  • 機器人狀態廣播
  • 區域網裝置發現
  • 遙控器或手柄資料傳輸
  • 多機器人之間的簡單通訊
  • 高頻狀態上報
  • 對即時性要求高、但允許少量丟包的場景

UDP 的核心特點是快,但不可靠。因此它更適合“持續傳送的資料流”,而不是“必須保證每條訊息都送達”的場景。

1.1.UDP 通訊是什麼

UDP,全稱 User Datagram Protocol,是一種無連線的傳輸協議。

和 TCP 不同,UDP 通訊不需要建立連線。只要知道目標 IP 和埠,就可以直接傳送資料。

典型結構如下:

UDP Sender

UDP Receiver

也可以是雙向通訊:

程序 A  ←UDP→  程序 B

常見概念包括:

概念 說明
IP 地址 用來定位網路中的裝置
埠號 用來區分不同程式
Datagram UDP 資料包,一次傳送對應一個數據報
廣播 向區域網內多個裝置傳送資料
組播 向加入同一組播組的裝置傳送資料
丟包 UDP 不保證資料一定送達
亂序 UDP 不保證資料按順序到達

UDP 和 TCP 最大的區別是:TCP 是可靠位元組流,UDP 是不可靠資料包。

1.2.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 資料包的傳送和接收,只是封裝方式不同。

1.3.各方案對比

方案 優點 缺點
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 學習

1.4.本教程建議選擇

本教程建議優先選擇:

boost::asio

原因是:

  • 適合 C++ 工程開發
  • 和 TCP、序列埠、定時器可以使用同一套 Boost.Asio 程式設計模型
  • 支援同步和非同步 UDP 收發
  • 不依賴 ROS 2,方便在普通 C++、OpenCV、Qt、嵌入式 Linux 專案中複用
  • 適合封裝網路感測器、遠端遙控、狀態廣播等功能

推薦的工程結構是:

上层项目:ROS 2 / OpenCV / Qt / 普通 C++ 程序

自己封装的 UdpSender / UdpReceiver 类

boost::asio

UDP socket

雷达 / 网络设备 / 远程控制端

1.5.TCP 和 UDP 怎麼選

TCP 和 UDP 都很常用,但適合的場景不同。

對比項 TCP UDP
是否連線 需要建立連線 不需要建立連線
可靠性 可靠傳輸 不保證送達
順序 保證順序 不保證順序
延遲 相對更高 相對更低
適合資料 命令、配置、檔案、日誌 高頻資料、廣播、即時狀態
典型場景 遠端控制、伺服器通訊、引數配置 雷達資料、遙控資料、狀態廣播

簡單理解:

TCP:我要确保这条消息送到
UDP:我要快速持续发送,偶尔丢一包也能接受

1.6.與 ROS 2 的關係

學習 UDP,並不代表要用 UDP 替代 ROS 2 的 topic。

在 ROS 2 系統內部,節點之間通訊通常優先使用 ROS 2 自己的通訊機制。而 UDP 更適合用來連線 ROS 2 系統之外的網路裝置,或者實現輕量級的遠端通訊。

例如:

激光雷达

UDP 数据包

自己封装的 UdpReceiver

ROS 2 节点发布点云 / LaserScan

也可以用於:

远程遥控端

UDP

机器人主控程序

1.7.本章學習目標

學習完本章後,應該能夠掌握:

  • UDP 通訊的基本概念
  • UDP 和 TCP 的主要區別
  • IP 地址、埠號、endpoint 的含義
  • 使用 C++ 傳送和接收 UDP 資料
  • 理解 UDP 丟包、亂序、廣播等特性
  • 使用 Boost.Asio 封裝 UDP 通訊類
  • 為後續雷達資料接收、遠端遙控、狀態廣播打基礎