第 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 地址用來定位網絡中的設備
端口號用來區分不同程序
DatagramUDP 數據報,一次發送對應一個數據報
廣播向局域網內多個設備發送數據
組播向加入同一組播組的設備發送數據
丟包UDP 不保證數據一定送達
亂序UDP 不保證數據按順序到達

UDP 和 TCP 最大的區別是:TCP 是可靠字節流,UDP 是不可靠數據報。

Linux 下常見 UDP 庫

Linux 下進行 UDP 通信有多種方案,常見的包括:

方案類型特點適合場景
Linux socket APILinux 原生接口最底層、依賴少、通用性強想深入理解網絡通信機制
boost::asio通用 C++ 網絡庫支持同步/異步 UDP,適合工程封裝推薦用於 C++ 項目
Qt NetworkQt 網絡模塊和 Qt 界面程序結合方便Qt 上位機
Python socketPython 標準庫簡單方便,適合測試Python 調試腳本
ROS 2 topicROS 2 通信機制ROS 2 內部通信方便ROS 2 系統內部數據傳輸

這些方案本質上都是為了完成 UDP 數據報的發送和接收,只是封裝方式不同。

各方案對比

方案優點缺點
Linux socket API原生、穩定、依賴少、通用性強代碼相對繁瑣,異步處理麻煩
boost::asioC++ 工程友好,異步 UDP 方便,適合封裝 driver需要理解 io_context、endpoint、socket 等概念
Qt Network和 Qt 程序結合自然,適合上位機不適合脫離 Qt 的底層 driver
Python socket上手快,適合測試 UDP 包不適合作為 C++ 底層主線
ROS 2 topicROS 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 都很常用,但適合的場景不同。

對比項TCPUDP
是否連接需要建立連接不需要建立連接
可靠性可靠傳輸不保證送達
順序保證順序不保證順序
延遲相對更高相對更低
適合數據命令、配置、文件、日誌高頻數據、廣播、實時狀態
典型場景遠程控制、服務器通信、參數配置雷達數據、遙控數據、狀態廣播

簡單理解:

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