GPS座標から方向と速度を計算でき、境界線にいるかどうかを計算できるPython用の無料ライブラリを探しています。
あなたが知っていて、うまくいったライブラリはありますか?
Linux マシンで Python を使用し、gpsd からデータを取得しています。したがって、デバイスと通信するためだけの特別なライブラリが必要ないことを願っています。私が探しているのは、データを使っていくつかの基本的な計算を行う Python コードです。最後の位置を比較し、速度と方向を計算するなど。
どうやら、gpsd に付属している python モジュールは、私たちにとって最適なモジュールです。
gpsd に付属の gps モジュールには、非常に便利な機能がいくつかあります。1 つ目は、gpsd からデータを取得し、それらのデータを使用可能なデータ構造に変換することです。次に、モジュールを使用すると、速度と北に対する現在の進行方向にアクセスできます。また、地球の球状の性質を考慮して、地球上の 2 つの座標間の距離を計算する機能も含まれています。
特殊なケースで欠落している関数は次のとおりです。
ポイント間の見出しを計算します。私が北を向いているポイントにいることを意味します。ナビゲートしたいポイントに面するためにどの程度回転する必要がありますか。
最初の関数のデータと現在の方向を取得して、目的のポイントに面するために必要な角度の回転を計算します (ほとんどが減算であるため、大したことではありません)。
このライブラリを操作する際の最大の問題は、ほとんどが gpsd のラッパーであるため、別の OS でプログラミングしている場合、gpscode は Windows や MacOS のように動作するはずであり、コードを実行したり、モジュールをインストールしたりできないことです。 .
あなたの正確な要件を理解しているかどうかはわかりませんが、デバイスによっては、次のような多くの候補があるようです。
あなたが言いたいのは、すでに GPS のユニット出力を取得しており、それを解析する必要があるということである場合、上記の例の 1 つまたは複数 (残念ながら私は試していません) には、そのための適切に分離されたモジュールが含まれていると思います。ライセンス条件に応じて、再利用できるタスク。この SO の質問は、それがあなたがしていることでもある場合に役立ちます。
本「Beginning Python Visualization」には、まさにそのような例が含まれています - GPS データを解析し、そこから速度と位置を推測します。そのソース コードは、 http://www.apress.com/ からオンラインで入手できます。
GPS デバイスから受信した GPS センテンスは非常に簡単に解読でき、これは楽しいプロジェクトのようです。gspd から何が得られるかはわかりませんが、これらの文である場合、実際には数週間前に学校で次のようなことをしなければなりませんでした (ただし、LabView で):
$GPGGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx
hhmmss.ss = UTC of position
llll.ll = latitude of position
a = N or S
yyyyy.yy = Longitude of position
a = E or W
x = GPS Quality indicator (0=no fix, 1=GPS fix, 2=Dif. GPS fix)
xx = number of satellites in use
x.x = horizontal dilution of precision
x.x = Antenna altitude above mean-sea-level
M = units of antenna altitude, meters
x.x = Geoidal separation
M = units of geoidal separation, meters
x.x = Age of Differential GPS data (seconds)
xxxx = Differential reference station ID
したがって、 gpsstring.split(',') を実行するだけで、解析できるすべての要素の配列を取得できます。これらの文の詳細を確認するには (速度と方向については他にもあると思います)、ここをクリックしてください。
たとえば、2 点間のおおよその距離を取得するには、Haversine Formulaを使用できます。
distance=R*2*asin(sqrt((sin((lat1-lat2)/2))**2
+cos(lat1)*cos(lat2)*(sin((long1-long2)/2))**2))
ここで、R は、結果を取得する測定単位で表した地球の半径です (たとえば、R=6372km)。その実際の行は、私が横たわっていたLabViewプログラムから取られていますが、構文はPythonのものとかなり似ています(除算演算子を確認してください。「将来のインポート除算から」を実行する必要があるかもしれません.
また、lat1、lat2、long1、long2 はラジアンで表す必要があります。あなたがそれらを取得している形式はかなり奇妙です(hhmm.ff、ffは分の分数であるため、0から59(秒)ではなく0から99になります)。
そのために使用したコードは次のとおりです。
h=floor(x/100);
m=floor(x-(h*100));
s=(x-floor(x))*60;
deg=sgn*(h+(m/60)+(s/3600));
rad=deg*pi/180;
ここで、符号は北と東が 1、南と東が -1 です。繰り返しますが、分割に注意してください。
境界のチェックは、最も簡単な部分だと思います。すでにラジアンまたは度で位置を取得している場合は、緯度が 2 つの緯度境界の間にあるかどうかを確認し、経度についても同じことを行うことができます。
すべてのラッパーを作成すると、GPS ライブラリが完成します :)
gpsd-py3 ライブラリは、あなたが説明したタスクに非常に役立つことがわかりました。