ロボット研究者の戯言

シリアル通信でセンサの値が遅れる時の対処法

      2017/07/03

現象

私の場合,以下のような条件で遅延が生じていました.

接続方法:USBやRS232による有線接続
センサの周期:100[Hz],もしくは10[Hz]
プログラム内の読み込み周期:5~10[Hz]

このような条件ではなぜかデータが遅れてやってくるのです.

周期もそんなに速くなく,データ量も多くないのになぜなるのか.有線接続かつUDPなので通信そのものは遅れていないはずです.

いろいろと原因を探ってみた結果…解決できました↓↓

スポンサーリンク



原因と対処法

原因はバッファに前のデータが溜まっていただけでした.シリアル通信にはデータを一時的にバッファがあり,FIFO(先入れ先出し)です.プログラムのループ周期が早いとバッファは常に最新のデータが格納されていますが,ループ周期が遅くなるとバッファに押し込むデータがバッファから引き出すデータより多くなってしまい,前のデータがどんどん蓄積されて遅延が発生するようです.

ということで,以下のような読み込みバッファをクリアするようなコードを追加したら遅延は無くなりました.(fdはファイルディスクリプタです)

これはC言語(C++)の場合ですが,他の言語でも似たようなのたぶんありますよね?

根本的な解決法としてはセンサ側の周期を遅らせるべきですが,何らかの原因で他の処理が遅れて周期が遅くなってしまった時の保険にもなりそう.もしシリアル通信の遅延で悩んでいる人がいれば試してみてはいかがでしょうか.

 - C(C++)