以前から、近藤科学の汎用(?)サーボモータのラインアップであるB3Mシリーズについて、ROSメッセージで動かせるようなパッケージを作って公開していました。
ktd-prototype.hatenablog.com
github.com
これについて、少々アップデートをしようと久々に動かしてみた所、なぜかまともに動かなくなってしまったので、その対処方法をメモします。
何が起こったのか
上記記事でも触れたように、launchファイルで気軽に位置制御、速度制御、トルク制御をジョイスティックで試せるようにしてありますが、こちらを起動すると以下のようなエラーが出てしまい、PC⇔近藤科学デバイス群の通信ができない事象が発生しました。
File "/home/USER_NAME/catkin_ws/src/kondo_b3mservo_rosdriver/scripts/position_control.py", line 12, in <module> import drive_function as Drive File "/home/USER_NAME/catkin_ws/src/kondo_b3mservo_rosdriver/scripts/drive_function.py", line 13, in <module> ser = serial.Serial('/dev/Kondo_USB-RS485_converter', 1500000) File "/usr/lib/python2.7/dist-packages/serial/serialutil.py", line 180, in __init__ self.open() File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 298, in open self._reconfigure_port(force_update=True) File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 330, in _reconfigure_port raise SerialException("Could not configure port: %s" % msg) serial.serialutil.SerialException: Could not configure port: (25, 'Inappropriate ioctl for device')
とりあえず調べてみたこと
大抵このようなエラーが出た時は、一番下から順にエラーの根本部分だったりすると思うので、今回もエラーメッセージをGoogle検索してみたりしたのですが、どうも要領を得ない。
とりあえず、lsusb のコマンドで調べてみると、デバイス自体は間違いなく正しく認識しているようです。
上記ブログでも軽く触れていますが、pythonのコード中でシリアル通信を開始する際、そのポートを /dev/ttyUSB0 のように指定するわけですが、それだと挿し直すたびにデバイス名が変わってしまうため、シンボリックリンクを貼って、このデバイスが接続された時は常にKondo_USB-RS485_converter というラベルが貼られるようにしているのですが、それも有効になっています。
(ls /dev/K* と入力したらちゃんと出てきたので)
デバイスのUSBケーブルをPCから抜けば、それらの認識はされなくなりますし、launchファイルを起動した際のメッセージも、そのようなデバイスは存在しません、というような内容に正しく変化します。
新たに気づいたこと
そういえば、デバイスにアクセスする権限が無いというエラーもあったなと思い、改めて以下のサイト等を参考にしながら権限を付与し直しました。
qiita.com
結果的には、権限は元々正しく付与されていたのですが、その権限付与状況を再確認した際に、ちょっと原因(の一端)がわかりました。
$ ls -l /dev/K* lrwxrwxrwx 1 root root 15 12月 24 23:32 /dev/Kondo_USB-RS485_converter -> bus/usb/001/024
と、シンボリックリンクが貼られているデバイス名が、大抵は/dev/ttyUSB0とかなのに、bus/usb/001/024という怪しいものに変わっていました。
これが原因だろうとあたりがつきました。
解決策
デバイス名の違いが何を意味するのか、調べてもいまいちピンと来ませんでした。
どうやら本質的には同じで、/dev/USB* という名前の方が、複雑な諸々を抽象的にラッピングされたものらしいのですが・・・
なんとなく、スマホをPCにつなぐと「充電のみ」と「充電と通信」の2種類の接続モードがあるような感じで、今回は前者になってしまったのではと勝手に予想していました。
これをなんとかする方法は、どうやって調べれば良いのか、何を検索キーワードにすれば良いのか検討もつかなかったのですが・・・
「ttyUSB 認識しない」みたいな漠然としたキーワードで検索し、検索結果画面を漠然と眺めていた所、奇跡的に近藤科学のwebサイトで、Ubuntuにいきなりデバイスを繋いでも上手く行かず、デバイスとして認識させる操作が必要みたいなことが書いてあったのを思い出しました。
kondo-robot.com
このページの「FTDIのカーネルと弊社USBアダプタを関連付ける」の部分の操作をもう一度実施してみた所、今度は正しく認識され、ROSパッケージも正常に動きました!