ページ

2017年9月28日木曜日

Ubuntu 16.04.3 LTSでROBOTIS Dynamixel SDKが通信に失敗する

3行まとめ

  • Ubuntu 16.04.3を再インストールすると、Kernel 4.10が使用されます
  • Linux Kernel 4.10からFTDI USBシリアルドライバのデフォルトレイテンシタイマが1msから16msに変更されました
  • ROBOTIS Dynamixel SDKではシリアルドライバの設定値によらず、タイムアウトが固定値(1.x系では5ms)になっているので、通信に失敗します
--

Project C.G.S.というチーム名で、毎年自律移動ロボットコンテストつくばチャレンジに参加しています。

我々のチームでは環境の3次元マップを取得するためにTopURGというレーザーセンサを前後に振っているのですが、3年ほど前からそこの機構にRobotis Dynamixel MX-28というサーボを利用しています。

Capybara J.V. (つくばチャレンジ '16)

ところが先日、機体で使用しているUbuntuを再インストールしたところ、突然このMX-28が動かなくなるという問題が発生しました。

--

Dynamixel SDK からは

Dynamixel communication error : There is no status packet!

のようなエラーが返ってきており、どうもこれはタイムアウトが発生した際に返るエラーのようです。サーボや電気系統に問題はなく、またWindowsのツールからは正常に通信できていたので、Ubuntu側に何らかの問題があると判断しました。

このタイムアウトの値はDynamixel SDKのここで設定されており、3.x系のSDKではLATENCY_TIMER定数値をもとに設定されているようです。

USBシリアルのLatencyTimer設定値を疑い、setserialコマンドを使って

setserial /dev/ttyUSB0 low_latency

としたところ、通信エラーがなくなり、無事サーボが動くようになりました。

--

少し調べてみると、どうやらLinux Kernel 4.10で、FTDIのUSBシリアルドライバftdi_sioに、low latencyフラグを外すパッチが取り込まれていることがわかりました。

これにより、デフォルトのUSBシリアルのポーリングレートが1msから16msに変更されます。

Ubuntu 16.04.3からはLinux Kernel 4.10が使用されるので、この変更によりタイムアウトが発生するようになってしまった可能性が高そうです。

ROBOTISのgithubでもこの問題について言及されていて、udevルールに

ACTION=="add", SUBSYSTEM=="usb-serial", DRIVER=="ftdi_sio", ATTR{latency_timer}="1"

を、追加する対応が提案されています。

--

ロボット系ではUSBシリアルを使ってセンサ/アクチュエータと通信することが多いので、特にROSユーザーで心当たりのある方はudevルールへの追記を考えたほうが良いかもしれません…

--

追記 20170929

どうも、ROBOTIS Dynamixel SDKにLatency Timer関係でUbuntu 16.04.2の時も修正が入っているようですね…
我々は1.x系の古いSDKを使っていたので、こちらの方に引っかかっていたのかもしれません。いずれにせよudevルールの修正で解決できると思います。



0 件のコメント:

コメントを投稿