この男と同様に、私は Pixhawk から Raspberry Pi コンパニオン コンピューターに GPS 時間を取得しようとしています。
このアプローチを試す前@vehicle.on_message('SYSTEM_TIME')
に、ワイルドカードを使用してすべてのメッセージをキャッチし、結果をファイルにダンプしました。ファイルを調べたところ、GPS から取得しているメッセージのタイプはGPS_RAW_INTだけであることがわかりました。最も重要なことは、ドキュメントによると、GPS から UTC 時間を取得するSYSTEM_TIME_UTCメッセージを取得していないことです。
今、@vehicle.on_message('SYSTEM_TIME')
作品をうまく使って、何かを得ています。しかし、それは何ですか?ドキュメントはそれが次のように主張しています:
システム時刻は、マスター クロックの時刻であり、通常はメインのオンボード コンピューターのコンピューター クロックです。
OK、「メインのオンボード コンピューター」は Pixhawk だと思います。しかし、それを含む GPS メッセージがない場合、どのようにして時刻を取得するのでしょうか。GPS_RAW_INTには時間情報は含まれません。
さらに調査して、次のハンドラーを作成しました。
@vehicle.on_message('SYSTEM_TIME')
def listener(self, name, message):
rpi_time = time.time()
mavlink_time = float(message.time_unix_usec)/1000000
print( str(rpi_time) + " - " + str(mavlink_time) + " = " + str(rpi_time-mavlink_time) )
rpi_timeは Raspberry Pi から取得され、起動時に NTP によって設定されるため正確です。mavlink_time (GPS ベースの時間である必要があると推測) がかなり近いことを確認したかったのです。私は間違っていた。
これを何度も実行すると、最初は GPS の時刻が常に約 2 秒進んでいることに気付きました。時間が経つにつれて、それは遅れます。出力例:
1483754011.89 - 1483754014.72 = -2.83385300636
1483754012.16 - 1483754014.96 = -2.79546308517
1483754012.44 - 1483754015.2 = -2.75652289391
...
1483754154.69 - 1483754044.5 = 110.186414957
1483754173.72 - 1483754044.76 = 128.95413518
1483754184.04 - 1483754045.02 = 139.016195059
この場合、rpi_time (これは正しい) は 172 秒経過したと言っていますが、mavlink_time は 30 秒しか要求していません。
だから、私の質問は次のとおりです。
- SYSTEM_TIMEメッセージは何に基づいていますか? 現実的には GPS しかあり得ません (Pixhawk が利用できる唯一の時間データです) が、その場合は...
- なぜそんなに不正確なのですか? また、なぜSYSTEM_TIME_UTCメッセージも表示されないのですか?