DDS 與 RTI Connext DDS 教材:Raspberry Pi 5 與 Pico W2 實作

本教材以 RTI Connext DDS 的免費取得方案為基礎,說明 DDS 的核心概念、在 Raspberry Pi 5 上建立 DDS 節點的方法,以及在 Pico W2 上建立 DDS 應用程式時的可行架構。

實作安排以 Python 為主;若微控制器端沒有可直接使用的 Python / MicroPython DDS Framework,則補充 C 語言與 Connext Micro 的實作方向。

DDS RTI Connext DDS Raspberry Pi 5 Pico W2 Python

一、學習目標

  • 理解 DDS 與 MQTT 在架構思維上的差異
  • 理解 Topic、Domain、Publisher、Subscriber、QoS 的基本角色
  • 能在 Raspberry Pi 5 上安裝 RTI Connext DDS 並執行 Python 範例
  • 能規劃 Pico W2 與 DDS 系統整合的方法
  • 知道何時適合用 Python,何時必須改用 C / C++

二、先講結論

  • Raspberry Pi 5:可直接執行 RTI Connext DDS Professional,並使用官方 Python API。
  • Pico W2:若要做真正的原生 DDS 端點,較合理的方向是 C / C++ 搭配 Connext Micro,而不是 MicroPython。
  • 建議實作路線:Pi 5 作為 DDS 主節點,Pico W2 作為感測/控制端;可先採橋接式架構,再評估是否進一步做原生微控制器 DDS。
目前 RTI 官方文件與公開頁面未提供 Raspberry Pi Pico W / Pico 2 W 的現成 MicroPython DDS Framework,因此較務實的做法是優先採用「Pi 5 原生 DDS + Pico W2 橋接」模式。

三、什麼是 DDS?

DDS(Data Distribution Service)是一種資料導向、即時、去中心化的通訊架構。它很常用在機器人、自駕車、工業控制、分散式感測系統與需要低延遲協作的系統中。

觀念 說明
Domain一個邏輯通訊空間,不同 Domain 彼此隔離。
Topic資料主題,例如 TemperatureMotorCommand
Publisher / DataWriter負責送出資料。
Subscriber / DataReader負責接收資料。
QoS控制可靠性、歷史深度、deadline、durability 等行為。
DiscoveryDDS 節點可自動發現彼此,不一定需要集中式 Broker。
和 MQTT 不同,DDS 常常直接讓節點彼此交換資料,並把通訊品質與時效要求做成可設定的 QoS。

四、DDS 與 MQTT 的差異

比較項目 DDS MQTT
核心架構去中心化資料匯流排以 Broker 為中心
即時性高,適合控制與協作中等,適合 IoT 遙測
QoS 粒度細緻且完整相對簡化
自動發現通常由 Broker 管理
資源需求較高較低
適用場景機器人、車載、工控、數位分身IoT 遙測、雲端上傳、輕量訊息
若需求偏向控制迴路、多節點協作與低延遲資料同步,DDS 通常更合適;若需求偏向感測值上傳、簡單遙控與輕量訊息,MQTT 會更容易上手。

五、為什麼選用 RTI Connext DDS

依 RTI 官方開發者文件,Debian / Ubuntu 類系統可用 apt 安裝 Connext,再用 pip install rti.connext 安裝 Python API,這與 Raspberry Pi OS 的實作流程相容。

六、建議架構

方案 A:橋接式架構,入門成本較低

Pico W2 感測器 / 控制器
   │
   ├─(UART / HTTP / MQTT / UDP)
   │
Raspberry Pi 5 橋接程式(Python)
   │
   └─ RTI Connext DDS Domain
         ├─ Python Subscriber
         ├─ Python Publisher
         └─ 其他 DDS 節點

方案 B:進階主題,做原生微控制器 DDS

Pico W2(C / C++) + 網路堆疊
   │
   └─ RTI Connext Micro / 類似 DDS for MCU 架構
         │
         └─ DDS Domain with Raspberry Pi 5

七、在 Raspberry Pi 5 上安裝 RTI Connext DDS

1. 系統前提

2. 安裝 RTI 官方 apt repository

sudo curl -sSL -o /usr/share/keyrings/rti-official-archive.gpg \
  https://packages.rti.com/deb/official/repo.key

printf -- "deb [arch=%s, signed-by=%s] %s %s main\n" \
  $(dpkg --print-architecture) \
  /usr/share/keyrings/rti-official-archive.gpg \
  https://packages.rti.com/deb/official \
  $(. /etc/os-release && echo ${VERSION_CODENAME}) | \
  sudo tee /etc/apt/sources.list.d/rti-official.list >/dev/null

sudo apt update

3. 安裝 Connext DDS

sudo apt install rti-connext-dds-7.7.0

4. 取得免費授權檔

  1. 到 RTI 的 Get Connext Free 頁面申請。
  2. 下載授權檔 rti_license.dat
  3. 把授權檔放到例如 ~/rti/rti_license.dat

5. 載入 RTI 環境

eval $(rtienv -l ~/rti/rti_license.dat)
echo $NDDSHOME
依 RTI Python API 的 Building and Installing 文件,建置 connextdds-py 前需要先能正確取得 NDDSHOME;若使用 Ubuntu / Debian 類系統,也建議明確使用 python3pip3

6. 建立 Python 虛擬環境與 Linux 建置工具

python3 -m venv ~/venvs/connext
source ~/venvs/connext/bin/activate
pip3 install --upgrade pip
pip3 install setuptools wheel cmake patchelf-wrapper

7. 依 RTI Python API 文件建置並安裝 connextdds-py

cd ~/dds-lab
git clone --recurse-submodules https://github.com/rticommunity/connextdds-py.git
cd connextdds-py
python3 configure.py --nddshome "$NDDSHOME" <platform>
pip3 install .
其中 <platform> 是 RTI Connext DDS 的目標平台字串,需與目前安裝的 Connext 平台一致;configure.py 也支援 --jobs--tcp--monitoring--secure--debug 等選項。

8. 若要預先打包 wheel 或做升級

# 建立 wheel
pip3 wheel .

# 若要升級前先移除舊版
pip3 uninstall rti -y
RTI 6.0.1 的 Python API 文件把 pip install .pip wheel . 與開發安裝流程分開說明;在 Raspberry Pi 5 課堂環境中,先完成 simple installation 再跑 DDS 範例,通常較容易驗證。

八、在 Raspberry Pi 5 上建立第一個 DDS Python 範例

1. 建立 IDL

先在新資料夾建立 HelloWorld.idl

struct HelloWorld
{
    int32 value;
};

2. 產生 Python 範例

mkdir -p ~/dds-lab/hello
cd ~/dds-lab/hello
cat > HelloWorld.idl <<'EOF'
struct HelloWorld
{
    int32 value;
};
EOF

rtiddsgen -language python -example universal HelloWorld.idl

3. 執行 Subscriber

source ~/venvs/connext/bin/activate
cd ~/dds-lab/hello
eval $(rtienv -l ~/rti/rti_license.dat)
python HelloWorld_subscriber.py

4. 執行 Publisher

source ~/venvs/connext/bin/activate
cd ~/dds-lab/hello
eval $(rtienv -l ~/rti/rti_license.dat)
python HelloWorld_publisher.py

5. 預期結果

九、用 Python 改成感測資料範例

可把 HelloWorld 換成溫度、濕度、光照等資料結構,例如:

struct SensorReading
{
    string device_id;
    float temperature;
    float humidity;
    int64 timestamp_ms;
};

之後讓 Pi 5 端的 Python Publisher 寫入這些資料,而另一個 Subscriber 顯示或存入資料庫。

若要快速整合既有課程,可把 DDS 的 Subscriber 接到 Flask、Django、MariaDB 或 Node-RED 延伸頁面,做成「即時資料匯流排 + 視覺化」示範。

十、Pico W2 可以直接跑 Python DDS 嗎?

就目前查到的 RTI 官方公開文件與頁面來看:

因此若板端是 Pico W2,不能預設它可以像 Raspberry Pi 5 一樣直接 pip install rti.connext 後跑 Python DDS。

十一、Pico W2 的兩種設置路線

路線 1:橋接模式,Pico W2 不直接跑 DDS

這條路最符合「儘量以 Python 為主」的需求,因為 Python 會集中在 Pi 5 端,整合成本也較低。

路線 2:進階,Pico W2 原生 DDS 應用程式

這不是可直接套用的入門範例,較適合進階實作、專題延伸或研究用途。

十二、Pico W2 橋接式 DDS 實作建議

1. Pico W2 端工作

2. Pi 5 端工作

3. 架構優點

實務上可把 rticonnextdds-examples 的 Python publisher 視為「模擬感測器」;等學生看懂範例後,再把 publisher 換成 Pico W2 → Pi 5 bridge。

十三、若一定要在 Pico W2 上做原生 DDS,C 語言方向怎麼規劃?

  1. 先建立 Pico SDK 的 C / C++ 專案。
  2. 確認 Wi-Fi / 網路通訊堆疊可正常工作。
  3. 評估是否以 RTI Connext Micro 作為 DDS middleware。
  4. 定義最小型的 Topic 資料型別,例如溫度、按鈕狀態、LED 命令。
  5. 把 MCU 記憶體配置壓到最小,避免一開始就做太多 QoS 與大型型別。

最小可行題目

若要延伸成完整專案,可分成兩個階段:先完成橋接式 DDS,再進一步挑戰原生 MCU DDS。

十四、建議的 Python 教學順序(參考 rticonnextdds-examples)

  1. 先做 Hello World 與 IDL:先用 rtiddsgen 產生 Python 範例,讓學生熟悉 Topic 型別、Publisher / Subscriber 與 Domain ID。
  2. 再做 QoS Profiles:從 examples/connext_dds/using_qos_profiles/py 執行官方範例,學會用 dds.QosProvider("my_custom_qos_profiles.xml") 載入 XML QoS,並比較 transient_localvolatile 的差異。
  3. 接著做 Partitions:從 examples/connext_dds/partitions/py 執行範例,理解「同一個 Topic 也能用 partition 做邏輯分群」,很適合拿來模擬不同小組、不同教室或不同設備群。
  4. 第四步做 Content-Filtered Topic:從 examples/connext_dds/content_filtered_topic/py 執行 publisher / subscriber,觀察 subscriber 端如何只接收符合條件的資料,並在程式中動態修改 topic.filter_parameters
  5. 第五步做 WaitSet / QueryCondition:從 examples/connext_dds/waitset_query_cond/py 執行範例,理解事件驅動式等待與條件篩選,適合銜接即時監控、告警條件與邊緣分析。
  6. 第六步做 Request-Reply:從 examples/connext_dds/request_reply/py 執行 primes_replier.pyprimes_requester.py 100,理解 DDS 不只可做資料發布,也能做服務式互動。
  7. 最後才接 Pico W2 Bridge:把前面範例的 publisher 角色換成 Pico W2 → Pi 5 bridge,讓學生先穩定掌握 DDS,再進入 IoT 整合。

推薦的課堂執行指令

git clone --depth 1 https://github.com/rticommunity/rticonnextdds-examples.git
cd rticonnextdds-examples/examples/connext_dds/using_qos_profiles/py
python3 profiles_program.py --pub
python3 profiles_program.py --sub

cd ../../partitions/py
python3 partitions_program.py -p
python3 partitions_program.py -s

cd ../../content_filtered_topic/py
python3 cft_publisher.py
python3 cft_subscriber.py

cd ../../waitset_query_cond/py
python3 waitset_query_cond_publisher.py
python3 waitset_query_cond_subscriber.py

cd ../../request_reply/py
python3 primes_replier.py
python3 primes_requester.py 100
官方 Python 範例常搭配目前目錄中的 USER_QOS_PROFILES.xml 或自訂 XML 檔;因此上課時要提醒學生「必須在範例自己的目錄中執行」,否則 QoS 設定可能不會被正確載入。

十五、常見問題

1. DDS 一定要有 Broker 嗎?

不一定。DDS 常見的是節點自動發現彼此,不是像 MQTT 那樣預設依賴 Broker。

2. Pi 5 為什麼適合當 DDS 主節點?

因為它有完整 Linux、較多記憶體、可直接安裝 RTI 工具與 Python API,也更容易除錯。

3. Pico W2 為什麼不建議一開始就直接跑 DDS?

因為微控制器的開發與除錯成本較高,且目前沒有查到 RTI 官方提供給 Pico W2 的現成 MicroPython DDS 框架。

4. 要選 DDS 還是 MQTT?

若目標是理解即時分散式系統,可選 DDS;若目標是快速完成 IoT 實驗,MQTT 仍然是較低門檻的起點。

十六、資料來源與補充說明

本頁面採用「Pi 5 先完成 DDS、Pico W2 再延伸整合」的編排方式,以兼顧可操作性與技術深度。