準天頂衛星 アプリ コンテスト


2014年5月-7月に、準天頂衛星を含めた衛星測位サービスを利用したAndroidアプリのコンテストが開催されました。
みちびきはどこ! というアプリで応募しました。
その話を、2014年11月1日に開催された FOSS4G Tokyo で LT してきました。

参考
準天頂衛星アプリコンテスト2014
FOSS4G Tokyo 2014


みちびき トラッキング 方位角と仰角


20140606satellite_tracking_app20140606satellite_tracking_qz_radar

「みちびき」 がどこにいるのかを追跡する(トラッキング)アプリを作成しました。
みちびき トラッキング 緯度経度 に、現在地からの方位角と仰角を追加したものです。

QZ-Radar と比較すると、少しずれはあるが、実用的な範囲でしょう。
本アプリ: 方位角 181.1 度、仰角 5.5 度
QZ-Radar: 方位角 178.4 度、仰角 5.4 度

プログラムの簡単な説明
(1) 方位角と仰角の計算
CALSAT32のからくり の式を採用しました。
・衛星の座標位置の中心点を、地球の中心から、地球表面の現在地に、移動する
・現在地の緯度経度に合わせて、視点を回転する
・現在地からの衛星に対する方位角と仰角を計算する

プログラム
プログラムは、google code で公開しています。
ビルドするのは、下記のライブラリが必要です。
sgp4
vecmath

課題
CALSAT32の経度の回転の式は、座標回転公式のZ軸回りの回転の式と同じである。

xx =   x * cos + y * sin
yy = - x * sin + y * cos
zz = z

しかし、CALSAT32 の緯度の回転の式は、座標回転公式 のY軸回りの回転の式とは、違いがある。
この違いがどうしてなのかは、理解できていない。
このアプリでは、CALSAT32 の方が QZ-Radar に近いようなので、そちらを採用した。

CALSAT32

xx = x * sin - z * cos;
yy = y;
zz = x * cos + z * sin;

座標回転公式

xx = x * cos - z * sin;
yy = y;
zz = x * sin + z * cos;

参考
衛星の方位と仰角 – CALSAT32のからくり
座標回転公式と球面三角法 – FNの高校物理


みちびき トラッキング 緯度経度


20140602_satellite_tracking_app 20140602_satellite_tracking_web

「みちびき」 がどこにいるのかを追跡する(トラッキング)アプリを作成しました。

「みちびき」は、23時間56分の周期で地球を周回しています。
しかし、一日のうち約8時間しか、日本上空にいません。
しかも、毎日4分づつずれるので、いつ日本上空にいるのか、分かりません。
そこで、このアプリを作成しました。

公開されているWEBアプリ JavaScriptで人工衛星の位置を表示する と比較すると、
少しずれはあるが、実用的な範囲でしょう。
本アプリ: 北緯 21.2 度、東経 136.4 度
WEBアプリ: 北緯 22.3 度、東経 136.3 度

プログラムの簡単な説明
(1) 衛星の軌道要素
衛星の軌道要素は、2行軌道要素形式 (Two Line Elements) が使われています。
CelesTrak から NORAD のものが公開されています。
通常のGPS衛星は GPS Operational に入っています。
みちびきは Satellite-Based Augmentation System に入っています。
今回のプログラムでは、みちびきの軌道要素のみを assets フォルダーに置いています。

(2) 衛星の軌道計算
衛星の軌道計算には、SGP4 というアルゴリズムを使用します。
CelesTrak から JAVA のライブラリ が公開されています。
さらに、このライブラリでは、vecmath を使用しています。

(3) 衛星軌道から緯度経度へ
衛星軌道から緯度経度に変換するのは、3つのステップを踏みます。

(3-1) xyz軸を緯度経度に変換する。
直交座標と球座標の単純な変換です。

(3-2) 自転の補正をする。
地球の自転周期は約24時間です。
1時間後の衛星の位置は、地球から見たときには、15度 (360/24) ずれています。

(3-3) 公転の補正をする。
地球の公転周期は約365日です。
公転と自転の周期には違いがあるため、どこに太陽があるのか示すものを、恒星時といいます。
恒星時の計算には、WikiPedia星空横丁 の式を採用しました。

プログラム
プログラムは、google code で公開しています。
ビルドするのは、下記のライブラリが必要です。
sgp4
vecmath

課題
恒星時の計算で、違いが出ています。
恒星時の元となるユリウス日で約1日の違いがあり、これは緯度経度の精度に繋がっているようです。

国立天文台 ( ユリウス日グリニジ恒星時 ) の計算結果と比較したもの。
2014年6月1日時点の数値

ユリウス日
本アプリ  2456810.255
国立天文台 2456809.50000

恒星時
本アプリ  16h40m34.8s
国立天文台 16h37m36.2s


みちびき 軌道シミュレーター


20140523satellite_orbit_app20140523Satellite_orbit_qz

「みちびき」 の軌道は、地表で8の字を描きます。
これが直感的に分からなかったので、シミュレーターを作ってみました。
軌道傾斜角 (inclination) と 軌道離心率 (orbital eccentricity) を変更できます。

ソースは google code で公開しています。

静止衛星 (stationary satellite) は、軌道傾斜角が 0度、軌道離心率が 0.0です。
赤道上を円軌道で周回しています。
地表からは、同じ場所に留まって見えます。

準天頂衛星 (quasi-zenith satellite) みちびき は、軌道傾斜角が 45度、軌道離心率が 0.099 です。
赤道に対して45度傾いた軌道を、北に伸びる楕円軌道で周回しています。
地表では、8の字を描きます。

そういうことは、確かめられましたが。
8の字を描く理由は、直感的には、謎のままです。(^^;

参考
準天頂軌道とは – JAXA


みちびきの軌道周期 と 地球の自転周期


「みちびき」 の軌道周期は、23時間56分です。
これは地球の自転周期らしい。
1日は24時間だから、4分短いと、そのうち昼夜反転するのでは、という疑問が浮かぶ。

yahoo 知恵袋に解説がありました。
地球の自転にかかる時間は23時間56分4秒なのに一日24時間計算だと狂ったりしないん…

20140519michibiki


GpsStatus.Listener からGSP衛星を取得する一連の処理


GpsStatus.Listener にて、「みちびき」とGPS衛星1番の区別がつかなくなる件について、Android フレームワークを調べてみました。

結論からいうと、ハードウエアのドライバーの段階で、そうなっているようです。

GPS には libgps.so というドライバーを使っています。
これのソースは見つかりませんでしたが、ヘッダファイル gps.h は見つかりました。
gps.h にて、GpsSvInfo という構造体が定義されています。
ここの prn が、GpsSatellite の PRN になっているようです。
libgps.so からは、次のような流れで、GpsSatellite が取得されるようです。

libgps.so ( gps.h GpsSvInfo )
IGpsStatusListener#onSvStatusChanged
LocationManager#getGpsStatus (公開API)
GpsStatus#getSatellites (公開API)
GpsSatellite

参考
[ANDROID] Final Vogue Kaiser GPS Support
 libgps.so を使う話
codetastrophe SatInfo
 IGpsStatusListener#onSvStatusChanged をリフレクションで使う例


みちびき Nexus7 GpsStatus.NmeaListener


20140519nmea_listener_n720140519nmea_listener_qz_radar

Nexus7 (2012年モデル) と、GpsStatus.NmeaListener を使用して、
「みちびき」 の位置が取得できるか確認しました。
「みちびき」とGPS衛星1番の両方が捕捉できました。

ソースコードは Google Code に置いています。

簡単な説明
Nexus7 で取得できる nmea は、下記のデータです。
一般的なもの
– $GPGSA 捕捉された衛星の番号
– $GPGSV 衛星の位置情報
– $GPGGA 測位された現在地
– $GPRMC 測位された現在地(推奨)
Nexus7 特有のもの
– $QZGSA 準天頂の捕捉された衛星の番号
– $QZGSV 準天頂の衛星の位置情報
– $GNGSA Glonass の捕捉された衛星の番号
– $PGLOR 製造情報らしい

$GPGSA と $GNGSA は全く同じようです。
$QZGSA は準天頂固有のものです。「みちびき」は衛星番号1番です。

参考
NMEA sentences – PGLOR, GNGSA and QZGSA


みちびき Nexus7 GpsStatus.Listener


20140513gps_status_listener20140513gps_status_listener_qz_radar

Nexus7 (2012年モデル) と、GpsStatus.Listener を使用して、
「みちびき」 の位置が取得できるか確認しました。

結論からいうと、ダメですね。
「みちびき」のGPS衛星番号は 193番らしいのですが、Android API では 1番に化けます。
「みちびき」が捕捉できて、1番のGPS衛星が捕捉できないときは、「みちびき」を表示します。
「みちびき」と1番のGPS衛星の両方が捕捉できたときは、どちらを表示するかは、運次第です。

参考
Nexus7のGPS機能と準天頂衛星「みちびき(QZSS)」対応についての検証


みちびき QZ-Radar


20140513qz_radar

QZ-radar は、ある場所、ある時刻において、準天頂衛星「みちびき」とGPS衛星群が上空のどの方角に何機見えるかをシミュレートするアプリケーションです。

「みちびき」は、23時間56分の周期で地球を周回しています。
しかし、一日のうち約8時間しか、日本上空にいません。
しかも、毎日4分づつずれるので、いつ日本上空にいるのか、分かりません。
そんなときには、QZ-radar で探します。
残念ながら、Windows版しかなく、MACな人には使えない (^^;