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に騙された….
コメントを残す