VBで正確な待ち時間の計測方法
さてさて、とりあえず公開できたExcel Walkerですが、次の段階を目指しています。
まず、一番に気になっているのは制御周期。
すでにお気づきの方もいらっしゃると思いますが。Excel Walkerの制御周期は5Hzです。
200msに一回しかポーズを送信していません。
サーボ側に角速度を計算させて帳尻を合わせています。
やはり制御周期を一定にかつ、ある程度リアルタイム性を確保したい。
現在、毎ループの待ちはSleep関数を用いているが処理を含まない待ち時間の指定のため、マシンスペックによる実行時間が一定ではありません。
なので200msのウェイトに180なんて数字を推奨しているのはこのためです。
まず、処理を含んだ待ち時間を設定するために下記のようにプログラムを変更します。
HSPだと”await”というとても便利な”待ち関数”があるのですが、VBにはそんなものはないので自分で作ります。
こちら(Visual Basic – Wait関数を作る)を参考にしました。
Declare Function timeGetTime Lib "winmm.dll" Alias "timeGetTime" () As Long Private Sub Main() Dim starttime As Long Dim waittime As Long waittime = 10 '毎ループ10ms待つ設定 'ループスタート直前の時間を記録 starttime = timeGetTime() Do '////////////////////////////// ' ここにメインの処理を書く '////////////////////////////// '待ち Do While timeGetTime() - starttime < waittime DoEvents Loop '待ち終わった時点の時間を記録 starttime = timeGetTime() ' ---- この位置でロボットに命令送信!---- Loop End Sub
これで、テストしてみました。
(〇で囲んだ部分は実行開始からの計算回数を示します)
手動で計測しているので計測にも誤差がありますが、ほぼ正確に10msecで待てています。
良い感じですね。
あとは制御周期の最適化。
まず、ジョイスティックの読み取り。
現状で、1回のスキャンにかかる時間は5.1msec(実測)
これは意外と速くてびっくりしました。
ロボットとの通信に関しては、115200bit/s(14400Byte/s)で設定しています。
1回の通信が20サーボ分、ロングパケットで110Byte
単純に110Byteで割ると、1秒間に130回ポーズを送信できる計算になる。
ただ、シリアル通信に関しては深いところまで理解していないので、単純にこんな計算でいいのかな?
オーバーヘッドとか考慮しないとイケナイ'何か'はないのだろうか…。
詳しい人教えてくださいm(__)m
というわけで、そこはよくわからないので余裕を見て制御周期を100Hzにしようと思う。
たまたまテストした10msの設定で行けるので採用!
しかし、Windowsはタイマが駄目とか、リアルタイムの制御には向いていないとか言われていますが、現状サーボの通信速度的にまだその境地に達していません。
どこまで行くとその壁にぶち当たるんだろう・・・。
こんなところで、今日はこの辺にしておこう。
コメントを残す