概要
rosserialを用いてArduinoでROSトピックをSubscribeしようとした時に、Lost sync with device, restarting... と表示されて接続が切れてしまう時に確認すべき事項をまとめました。
rosserialのインストール方法・使い方については下記記事を参考にしてください。
https://rb-station.com/blogs/article/rosserial-arduino-cmd_vel
デバッグ方法
ロギング方法は下記を参考にしましょう。
nh.logdebug("Debug Statement"); nh.loginfo("Program info"); nh.logwarn("Warnings."); nh.logerror("Errors.."); nh.logfatal("Fatalities!");
このようにログレベルごとにロギングができますので、Arduinoのコード内にロギングを加えておきましょう。WARNやFATALの場合など色が変わりますので、適切なログレベルを使い分けましょう。
尚、数値を表示させたい時は下記のようにsprintfでフォーマットしてからロギングしましょう。
int x = 100; char buf[100]; sprintf(buf, "x = %d", x); nh.loginfo(buf);
確認チェックリスト
ケーブルが繋がっているか確認
初歩的なミスですが、ケーブルが抜けている・認識されていない可能性があります。ケーブルを抜き差しして認識されるかを確認しましょう。
認識されない場合はケーブルを買い替えてしまうのも手です。
USBのデバイス名が合っているか確認
rosserialを実行する際に、/dev/ACM0、/dev/USB0など接続されたデバイスを指定すると思いますが、これが合っているかを確認しましょう。
ls /dev/tty*
などで、rosserialを実行する際に指定しているデバイスが存在するかを確認します。
nh.spinOnce()が実行されているか確認
void loop(){ nh.spinOnce(); delay(1); }
上記のようにloopの中で一定期間ごとにnh.spinOnce()が実行されているかを確認します。delayの時間が長すぎると、タイムアウトしてしまい接続切れとみなされてしまうので、短めの時間にしておいた方が良いかと思います。
コードの確認
何らかの重い処理をしていたり、他の動作をブロックするような処理をしていて、nh.spinOnce()が実行されない時も接続が切れてしまうことがあります。
一度コードを精査し、他の処理をブロックするような処理がないかを確認しましょう。
その他
- Arduinoのsetupのタイミング、rosserialの実行タイミングの前後は関係ありません。正常な状態であれば、どちらからスタートさせても繋がります。
- シリアルモニタと併用はできないので、デバッグをする際は、nh.loginfo等のrosserialが用意しているロギングツールを使うと良いと思います。