Raspberry-pi-tankおよびGPSナビゲーション

人工知能を試した後、 私の戦車 自動操縦装置は一歩後退し、古き良き衛星を操縦することを学ぶことにしました。



写真はステージングされており、ナビゲーターの制御下でGPSトランスポートが独立して加熱できることを示唆しています。







Raspberry Pi + GPS



最初に、シンプルなUSB GPSモジュールが購入されました。



Adafruktに関する記事を参考に 、実装を開始しました。



この記事は6年前に書かれたという事実にもかかわらず、旧式のナビゲーションの世界では大きな変化はありませんでした。



一部のニュアンスのみが一致しませんでした:





デバイス自体は、通常のUSBフラッシュドライブのように見えます。







そして、GPSが座標を認識しなかったため、長い間行き詰まりました。



デバイスは機能し、バージョン、製造元、その他の有用な情報を報告しましたが、それ以上のものはありませんでした。



最初は、彼はまだ欠陥があると思いました。 以前の実験から、GPSが機能するRaspbian 2017のSDカードがまだあります。



それから起動し、-見よ-GPSは生き返り、電球を点滅させ、ログ座標でシャワーを浴びました。

私は1週間脳を動かし、すべての設定を比較し、新しいバグのあるRaspbianで罪を犯し始め、GPSの問題に関するトピックの1つでRaspberryフォーラムで突然gpsdを再構築する準備をしていました(そしてそこに多くのデバイスがあります)天気の良い日には通りを歩き、最大30分かかることがある衛星を見つけます。



私はすでにそのような考えを持っていましたが、どうやら天気は十分に明確ではなかったようですが、その後すべてが一致し、デバイスは生き返りました。 もう少し掘り下げると、サテライトに関する必要な情報がデバイスのファームウェアにキャッシュされており、Raspbianで制御できないことがわかります。

アプリケーションで暦/天体暦/擬似距離データを取得するにはどうすればよいですか?



申し訳ありませんが、GPSDを介してこれらのことを行う簡単な方法はまだありません。 その理由は、GPS受信機にこの情報を報告させる一貫した方法がないからです。



多くはまったくそれを出荷しません。 その他(SiRFバイナリパケットを出荷するすべてではないが一部のデバイスを含む)は、時々SUBFRAME情報で出荷しますが、それを取得するためのSUBFRAMEフィールドとIS-GPS-200Eのドキュメント( -GPS衛星が使用する無線プロトコル)は非常に不明瞭です。 さらに他の報告は異なる アルマナック/エフェメリス/擬似距離データのサブセットを合理的に簡単な方法で、ただし個々の受信機タイプに非常に特有で、文書化が不十分または文書化されておらず、同様に具体的でさらに悪い制御シーケンスでアクティブ化する必要があるベンダー独自の文で文書化。
cなメカニズムは機能し、それを利用する時が来ました。

Pythonでgpsdからデータを読み取るためのスクリプトは非常に簡単です。



 import gps gs = gps.gps("localhost", "2947") gs.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE) for i in range(0,10): report = gs.next() print (report)
      
      





Google Maps API



私は電話からタンクを制御するため、Googleマップでの作業を勉強する必要がありました。

Googleは地図を使った作業を簡素化するために良い仕事をしたので、問題はありませんでした。

Android Studioは、マップを含む空のプロジェクトを作成できます。そこから、すべての重要な詳細をメインプロジェクトに慎重に転送する必要があります。



GoogleはMaps APIを使用するためにキー登録を必要としますが、これは無料で行われます(今のところ)。



タンクのRESTインターフェースを拡張して、座標を与え、座標をマップに転送し、タンクアイコンを描画すると、すべてがかなり適切に見えます。



次に、道を開く必要があります。



地図上のポイントがターゲットを選択し、 Directions APIでフィードします



ルートは、2つのポイントの座標を取得するWebサービスであり、応答として、住所、注目すべき名前、説明など、取得したルートに関する一連の情報をダンプします。 しかし、一連の手順のみが必要でした。 座標を選択して、地図上に描画します。



現在、視覚的な制御と管理に必要なものはすべて揃っています。







GPSナビゲーション



さらに電話から戦車まで、ルートの最初のポイントが送信されます。



タンクには小さな問題があります-最初は、その方向を知りません。

問題はコンパスで簡単に解決できますが、誰でもコンパスに対処できます...



最初の数秒間は戦車が単に前方を通過し、経路の始点と終点の座標を受け取り、そこから方向を計算するという事実から抜け出すことができました。 同じデータがGPSから直接取得できることは注目に値します。トラックフィールドがあり、これは角度から北極までの偏差を示します。



しかし、いずれにしても、これがいっぱいになるためには、移動が必要です。



方向の計算:



 def azimuth(pos1, pos2): lat1 = toRadians(pos1["lat"]) lon1 = toRadians(pos1["lon"]) lat2 = toRadians(pos2["lat"]) lon2 = toRadians(pos2["lon"]) dlat = lat2 - lat1 dlon = lon2 - lon1 x = math.sin(dlon) * math.cos(lat2) y = math.cos(lat1) * math.sin(lat2) - math.sin(lat1) * math.cos(lat2) * math.cos(dlon) return math.atan2(x, y)
      
      





GPSは常に正確に機能するとは限らないことに注意してください。テストパスの開始点と終了点の座標にエラーがあり、測定が意味をなさないことがわかります(前方に移動する場合でも、パスの終了点の座標が遅れている場合もあります)。



同時に、GPSはトラックを介して非常に確実に方向を示します。したがって、このフィールドはデフォルトで使用され、存在しない場合は座標の違いでナビゲートする必要がありました。



地形に合わせて、タンクは必要な場所でほぼ回転し(コンパスやジャイロスコープなしでは正確に方向を測定するのは難しいため)、数秒間動きます。 それから彼は再び座標を受け取り、方向をチェックし、向きを変え、乗ります。 目標が誤差範囲内になるまで続きます。



一般的に、最大の問題はGPSエラーです。これにより、戦車は方向を失い、さまざまな方向に突進し始めます。



すべては、コンパスなしでは生き残れないという事実に行き着きます。



参照資料



  1. Raspberry Pi用のGPSモジュールのセットアップに関する入門記事
  2. LinuxでGPSを使用するためのサービス
  3. 2点の座標によって距離と方向を計算するための数式を含む便利なサイト
  4. GPSタンクファームウェアのソースコード
  5. Android向けGoogleマップドキュメント



All Articles