クロックポジションのススメ

個人的な好みになるが、ロボットの向きや移動方向の表現に、正面を0時とするクロックポジションをススメてみる。

ロボットを制御するマイコン三角関数などがバリバリ使えるのであれば、0〜359度で表現すれば良いが、非力なマイコンを使うTJ3Bや、プログラミングに制限の強いC-Style上では向きの計算が簡単になるため使いやすいと思う。デメリットは30度刻みの大雑把な制御になることが挙げられるが、TJ3Bを使う場面や、プログラムのしやすさを考えると些細なことだと思う。



ロボット真正面を基準に左右に15度の範囲内を0時とし、あとは時計回りに30度ごとに1時、2時、と進める。

図では15度の範囲内としたが、プログラム上で−15〜15度とすると31度分の幅があるので、ここでは−15度〜14度の範囲を0時方向とする。同様に1時方向=15〜44度、2時方向=45〜74度、3時方向=75〜104度、と続く)

HMC6352デジタルコンパスを使う例。

(Whileの中の説明)

  • M=M-D でMがマイナス値(例:Dir(HMC)=10、D=350の場合など)にならないよう、今の向きを測った際には360を足しておく。
  • クロックポジション0時方向は−15度〜14度としたが、−15度は345度と同じ。Mに15足せば、0時方向の範囲は0〜29度となる。
  • Mが360度を超えないよう(例:Dir(HMC)=350、D=10の場合など M=350+360-10+15=715)、360で割った余りに変換(715 % 360 = 355)する。この時Mの値は0〜359のどこかになる。
  • Mを30で割れば0〜11のクロックポジションになる。(C-Styleでの割り算は少数以下を切り捨てる)


実際にMが意図する値になっているかはTeraTermで確認する。

  • 無条件ループ中の途中までのプログラムの動きを確認する場合には、continueを入れるとよい。それ以後のプログラムは無視して、Whileに戻る。以後のプログラムが無いときはWendがくる。
  • 砂時計は、プログラムをゆっくり動かすために入れたもので、なくても良い。TeraTermで確認しやすいように調整する。