robotino.pyとrobview(ros.rvw2)の同期方法について

何か動きがおかしくなってきたので,ちゃんと仕様をまとめ,それに従っているか確認.

まず,ros.rvw2は,
wait:
 INT_0 カウンター値をそのままINT_0で送信.
 INT_1 戻り値(return)に1を足した値をINT_1で送信.
 INT_1の値をmodeに代入.また,INT_1からINT_4までのどれかの値が0以外になったら次に進む.
サブルーチン:
 INT_0 カウンター値をそのままINT_0で送信.
 INT_1 値を0してINT_1で送信.
 作業を終えたら次に進む.
RESP:
 INT_0 カウンター値をそのままINT_0で送信.
 INT_1 戻り値(return)に1を足した値をINT_1で送信.
 INT_1の値をmodeに代入し,また,INT_1からINT_4までのどれかの値が0以外になったら次に進む.

INT_0は,+1の方が良い気がする.
—-
次に,robotino.py というか,udpcomm.pyは,
 # INT_1にモードの値を入れる(引数があるときは,INT_2からINT_4も利用).
 INT_1に0を入れて送信.
  getResponse(0): INT_1が0以外になるまで待つ.
 INT_1にモード番号の値を入れて送信.
  getResponse(1): INT_1が0になるまで待つ.
 INT_1に0を入れて送信.
  getResponse(0): INT_1が0以外になるまで待つ.
—-
もう一度仕様を見直そうかなぁ….
robotino.py の話がベースになるので,
送受信とも,INT_1を使ってやり取り.
 → その前にrobotino.py 側としては,INT_0の値が同じになっていることを確認すべきですね.でないと,こちらの情報を送る前の状態かもしれません.
—-
プロトコルの話.
[start]
robviewは,wait.
 受信INT_1がモード番号.0だったら待つ.
 送信INT_0は,受信INT_0に1加算する.
 送信INT_1は,戻り値に1足した値を入れている.何もなければ「1」になっている.
robotino.pyで何らかのモードに対応した作業をする.その時,getResponseを呼び出す.
 INT_1に0を入れて送信.
 → robviewはwaitにおいて,モード番号0が来るので無視して待つ.waitのまま.
   送信INT_1は「1」になっている.
 INT_1にモード番号を入れて送信.
 → robviewはモード番号が入るので,番号に対応したサブプログラムを実行する.
   setOdometryの場合,受信INT_1が0になるのを待つ.
   送信INT_1には,オドメトリーの値×10が返る ← 仕様に反していますねぇ.ここだ.古いままになっていた.
   送信INT_1に0を入れて,送信INT_2から4にオドメトリーの値×10を返す.
うまく動いたけど,かなり遅いなぁ….
—-

def packetProcess():
    updateUDP()
    udp.receiver()
    udp.sender()
    # rate.sleep()

sleepを取ったら速くなりました.
rateが1/10秒だっため,UDPのパケットが処理しきれずにバッファーに貯まってしまっている状態だった模様.
UDP なんだから,取りこぼしてくれれば良いのに….
適切にバッファに入れてくれていたんですね.UDPに騙された….

コメントを残す

メールアドレスが公開されることはありません。

*