39.自動追従距離測定器-2 ツインソナー (2021.11.11)

29.自動追従測定器」では、サーボモーターと超音波センサー(ソナー)の組み合わせによってレーダーのように振る舞い、近接する物体の検知を行いました。この超音波ソナーは、センサー自体が回転して空間スキャンを行うため、前方だけで無く広い角度での検知を可能にします。しかし、センサー自体を回転することで1スキャンに時間がかかると言う弱点がありました。それを補うために製作したのがツインソナーです。センサーを2個使用することで各々に半分の角度を担当させて、トータルのスキャン時間を短縮します。無駄な時間を極力減らすことで、スキャン角度も-90~+90度の180度としました。具体的な方法ですが、センサーとサーボモーターを1組として、ツインソナーではAの組とBの組を用意します。まずAのサーボモーターに回転指示を出し、続いてBのサーボモーターに回転指示を出します。その後にAのセンサーによって距離を測り、続いてBのセンサーで距離を測ります。そうすれば、センサー読み取りの間に自然な時間待ちが入るため、本来必要なWAITを小さくすることができます。

ツインスキャンをもう少し詳しく説明しましょう。スキャンの角度については、初期状態でAが-90度でBを0度とします。次はAが-80度でBが10度と、常に90度ずれた位置で回転を続けます。そしてAが0度でBが90度になったら、再び初期状態に戻します。これが1サイクルです。つまり、それぞれのサーボモーターは1/2の角度を分担すれば良く、戻すための時間も1/2で済みます。角度を60度から90度に広げましたが、読み取りの効率化で全体としても1/2程度の時間に収められそうです。1スキャンが1秒程度で実行できれば、実用度はかなり高まると思います。

再度確認のため、ハードウェアのピンアサインを記します。センサー電源はRasPiから給電、サーボモーターの電源には外部の+5Vを使います。(GNDはRasPiと接続して共通化)
<Aの組>
●サーボA
 制御: GPIO18(12ピン)
●センサーA
 トリガー: GPIO23(16ピン)
 エコー: GPIO24(18ピン)
<Bの組>
●サーボB
 制御: GPIO19(35ピン)
●センサーB
 トリガー: GPIO25(22ピン)
 エコー: GPIO26(37ピン)
以前に掲載したハードウェア移動体検知プログラムを拡張して、2組のセンサーで距離測定を行うようにします。複数の物体を検知したとしても、最終的に得られるのは最も近い位置の物体のみです。データとしては他の物体も捉えられるので、それをどのように利用するかはソフトウェア次第です。
ツインソナー-移動体検知プログラム

実行するとセンサーの動きはこのようになります。


ツインソナーによる高速スキャン

超音波の場合は、物体からの反射波をうまく受信できるかが鍵となります。硬い平面状の物体を超音波に対して垂直に受けるのが最も良く、布のような柔らかい物や斜めの面で受けると、検出不能になるケースが出てきます。本装置では未検出になると、距離データでは無く-1を返すようにしているため、カメラマウンタを接続した場合は角度0度に戻す操作をしたわけです。ツインソナー化によって時間短縮することには成功しましたが、10度間隔で位置を把握するために、特に距離が遠くなると誤差が大きいものとなります。もっと正確に位置を特定できないでしょうか。

次なるアイデアとして、どちらかのセンサーが物体を検知した時、双方のセンサーが強調して追従を行うようにしてみます。現在Aの組は向かって左側に設置し、-90~0度を担当しています。一方、Bの組は向かって右側に配置し、0度~90度の担当です。センサー後方から見れば、Aが右でBが左です。ここからはセンサー目線で説明を続けましょう。例えばBのセンサーが物体を検知した場合(例えば+30度とか)、Aのセンサーも同じ角度(基準位置が違うため、実際には物体の位置よりやや-側の角度になる)に回転させます。同時にBのセンサーの角度を+に少し振って、センサーから見て物体の左側を検知するように誘導します。振り過ぎて検知不能になったら戻して、常にギリギリ物体の左位置を捉えるように制御するのです。同様にBのセンサーを最初は物体を捉えるために+側に振って、検知したら逆に-側に振ることで、常にギリギリ物体の右側を捉えるように制御します。こうすることでAとBによる三点測量の状態にするわけです。

しかし、このツインソナーの配置だと、角度が+または-の大きな値になると、相手のセンサーが邪魔になって正しく物体を検知できません。干渉を避けるために、三点測量の状態は-60~+60度の間に制限しようと思います。端の方よりも前方中央の方が重要度は圧倒的に高いので、この方針に従ってアイデアを進めます。センサーとの距離が近いほど設置位置のズレによって誤差が大きくなるものの、距離が離れる程正確な角度で捉えることができます。そして、物体捕捉中は細かくサーボモーターを制御することで、より精密な測量を実現します。ただし、捕捉中に反射波がうまく受信できないと、制御不能に陥る可能性があります。そこで、一定の条件の下では一端元の検出シーケンスに戻してやり直すようにします。