概要
ArduinoでROSのトピックを受信して動作をさせたいときに、使うのがrosserialです。
このrosserial_arduinoを用いてArduinoと繋げてROSトピックを投げた際に下記のようなエラーが出る時があります。
Unable to sync with device; possible link problem or link software version mismatch such as hydro rosserial_python with groovy Arduino
このエラーに関する対処法について解説をします。
チェックリスト
原因はいくつかあるようですので原因ごとに対処法を記載しておきます。
ボーレートは合っているか
メイン端末側
rosrun rosserial_python serial_node.py _port:=/dev/ttyACM0 _baud:=9600
rosserial_pythonを起動する際に、baudというパラメータを設定することができます。これはシリアル通信を行う際のボーレートで、Arduino側でも同じボーレートを指定する必要があります。
Arduino側
ros::NodeHandle nh; nh.getHardware()->setBaud(9600); nh.initNode();
NodeHandleを作った後、setBaudで、メイン端末側と同じボーレートを指定しましょう。
ボーレートは遅くする
ボーレートを遅くすると解決することがありますので、9600など、遅いボーレートで試してみると良いでしょう。
nh.spinOnceの周期を遅くする
特にコードを変更していない場合は、これが原因の可能性が高いです。
void loop() { nh.spinOnce(); delay(30); }
Arduinoのloopでnh.spinOnce()をした後にdelayをしているかと思いますが、ここの値を増やすと解決することがあります。