跳到正文

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 通信類
  • 為後續雷達數據接收、遠程遙控、狀態廣播打基礎