概要

rosserialを用いてArduinoでROSトピックをSubscribeしようとした時に、Lost sync with device, restarting... と表示されて接続が切れてしまう時に確認すべき事項をまとめました。

rosserialのインストール方法・使い方については下記記事を参考にしてください。

 

ROSを使って実機でロボット台車を動作させたい時に、Arduinoでシリアル通信経由でROSトピックを受信して、ロボット台車を動作させる方法を説明します。/cmd_velは、平行移動の速度と回転速度が定義されたgeometry_msgs/Twistという型を用いた、ロボットの動作を指示するトピックです。ROSがインストールされたマシン(Jetson Nano等)とモータに繋がったArduinoをシリアルケーブルで繋いで、ROSの/cmd_velトピックをArduinoで受信する方法を解説します。

 

デバッグ方法

ロギング方法は下記を参考にしましょう。

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が用意しているロギングツールを使うと良いと思います。
ArduinoRosRosserial

Related Posts

Arduinoでサーボモータを動かす【簡易版】
Arduinoでサーボモータを動かす【簡易版】
概要 Arduinoでサーボモータを動かす方法について解説します。複数個を同時に制御する場合はPCA9685など追加モジュールを導入してi2cで制御することもできますが、今回はシンプルに1つのサーボモータを動かすサンプルを紹介します。...
Read More
roslibjsを使ってJavaScriptでROSトピックのやり取りをする
roslibjsを使ってJavaScriptでROSトピックのやり取りをする
概要 roslibjsというJavaScriptのライブラリを使うことでWebアプリケーションからROSに繋いでトピックのやりとりをする方法を解説します。 公式サイト:https://wiki.ros.org/roslibjs ...
Read More
L293Dモータシールドを用いて4つのDCモータを1つの基盤で制御
L293Dモータシールドを用いて4つのDCモータを1つの基盤で制御
概要 DCモータを制御する際にモータコントローラを使用すると思いますが、複数のモータを制御する際は配線が複雑になってしまいがちです。   RoboStation https://rb-station.com/blogs/arti...
Read More