1週間に1回くらいDDS通信ができなくなる対策のめも

目次

DHCPリース干渉とROS2通信障害への対処

今回も今回とてclaude 4.6に調査させて書かせております

どーやらDHCPってのが悪さしてるらしかったので、メモっておきます


1. 問題の概要

前日や朝は通信できていたのに、あるとき突然ROS2のDDS(Data Distribution Service)通信が突然切断される現象が頻発した。通信自体は高速で問題なく動作しているにもかかわらず、謎のタイミングで通信不能になるという症状だった。

調査の結果、原因はDHCPリース更新によるIPアドレスの変化であることが判明した。


2. 原因:DHCPリース干渉

2-1. DHCPとは

DHCP(Dynamic Host Configuration Protocol)とは、ネットワークに接続した機器に対してルータが自動でIPアドレスを割り当てる仕組みである。割り当てられたIPアドレスには有効期限(リース期限)があり、期限が切れると再割り当てが行われる。

2-2. 干渉が起こるメカニズム

FastDDS(ROS2が使用するDDSの実装の一つ)は、ノード起動時にそのマシンのIPアドレスをバインド(紐付け)する。DHCPリース更新によってIPアドレスが変化すると、このバインドが無効になり通信が切断される。

具体的には以下の順序で問題が発生する。

  1. ロボットPCまたはコントローラ(Android端末)がルータからIPアドレスを自動取得する
  2. ROS2ノードが起動し、その時点のIPアドレスでDDS通信をバインドする
  3. DHCPリース期限が到来し、ルータが同じまたは別のIPアドレスを再割り当てする
  4. IPアドレスが変わった場合、既存のDDSバインドが無効になり通信断が発生する

3. 対策:手動IPアドレス割り当て

3-1. 対策方針

ルータのDHCP予約機能を使い、各機器のMACアドレスに対して固定のIPアドレスを割り当てる。これにより、リース期限の概念がなくなり(リース期限表示が --:--:-- となる)、IPアドレスが変化しなくなる。

3-2. 設定手順

  1. ブラウザでルータ管理画面(192.168.11.1)にアクセスする
  2. 左メニューの「LAN」→「DHCPリース」を開く
  3. 既に接続済みの機器は「手動割当に変更」ボタンを押す
  4. 新規登録の場合は「リース情報の追加」ボタンからMACアドレスとIPアドレスを手動入力する
  5. リース期限が --:--:--、状態が「手動割当」になれば設定完了

3-3. MACアドレスの確認方法

各Linuxマシンでは以下のコマンドで確認できる。

ip link show

表示される link/ether xx:xx:xx:xx:xx:xx がMACアドレスである。Android端末の場合は「設定」→「端末情報」→「Wi-Fi MACアドレス」から確認できる。


4. 注意事項

  • 機器を追加・交換した際は必ず本ドキュメントを更新し、ルータの設定も追加すること
  • ルータを交換・初期化した場合はすべての手動割り当て設定が消えるため、再設定が必要である
  • 会場のネットワークを使用する場合はDHCP予約が設定できないため、OS側で静的IPを設定するか、ROS_LOCALHOST_ONLY=1 による同一マシン内通信に限定する方法を検討すること
  • 同一ネットワーク内でIPアドレスが重複しないよう注意すること