Lerobot SO-101のリーダー/フォロワーアームなど、Ubuntuで同一IDのUSBデバイスを複数接続する場合には、USB IDでポートを固定するルールファイルが使えません。
そこで、USBの物理ポートそのものに一意なポート名を設定する方法を紹介します。
背反としてデバイスを接続する物理ポート位置は固定化されることになるので、脱着が発生する場合は接続位置を間違えないようにするなどの注意が必要です。
1. 物理ポート番号の確認
例の通り、Lerobotに使用されるSeeed バスサーボドライバボードを2台接続した状態(デバイス名はそれぞれ/dev/ttyUSB0と/dev/ttyUSB1)で、下記のようにコマンドを実行します。
$ udevadm info --name=/dev/ttyUSB0 | grep DEVPATH
E: DEVPATH=/device/platform/361000.xhci/usb1/1-2/1-2.3/1-2.3:1.0/ttyUSB0/tty/ttyUSB0
$ udevadm info --name=/dev/ttyUSB1 | grep DEVPATH
E: DEVPATH=/device/platform/361000.xhci/usb1/1-2/1-2.4/1-2.4:1.0/ttyUSB1/tty/ttyUSB1
この場合、DEVPATHから、/dev/ttyUSB0は1-2.3、/dev/ttyUSB1は1-2.4がそれぞれの物理ポート番号であることがわかります。
2.udevルールの作成
ルールファイルを作成して、各物理ポート番号に一意のポート名をシンボリックリンクとして割り当てます。
# USBポート 1-2.3 に接続されたデバイス
SUBSYSTEM=="tty", KERNELS=="1-2.3", SYMLINK+="ttyUSB_port3", MODE="0666"
# USBポート 1-2.4 に接続されたデバイス
SUBSYSTEM=="tty", KERNELS=="1-2.4", SYMLINK+="ttyUSB_port4", MODE="0666"
3. ルールの適用と確認
作成したルールを適用します。
sudo udevadm control --reload-rules
sudo udevadm trigger
確認するには、デバイスを一度抜き差しして下記のコマンドを実行します。
ls -l /dev/ttyUSB_port*
正常に動作していれば、以下のような出力が得られます
lrwxrwxrwx 1 root root 7 Dec 9 10:00 /dev/ttyUSB_port3 -> ttyUSB0
lrwxrwxrwx 1 root root 7 Dec 9 10:00 /dev/ttyUSB_port4 -> ttyUSB1
4. まとめ
これで、Ubuntuを再起動する毎にポート名が変更になり、コマンドを修正しなければならない手間から解放されます。