GPS・QZSS ロボットカーコンテスト 2016


10月23日に 東京海洋大学 で開催された GPS・QZSS ロボットカーコンテスト 2016 を見学しました。

会場は、明治丸の隣の芝のあるグランドです。
会場に着くと 明治丸 がお出迎えしてくれます。
20161022_gis_photo1 20161023_gps_meijimaru

コンテストの内容は、GPS測位による自動運転です。
競技は2種類あり、ダブルパイロンレースと アプリコンテストです。

ダブルパイロンレース
2箇所に置かれたパイロン(位置座標)を8の字に回ります。
14チームが参加しました。
結果は、大きく2つの傾向に分かれました。
なんとか1周できるか・できないかと、何周も安定して周回できるです。
GPS測位はもっと簡単なのかと思いしたが、自分とパイロンの相対位置をうまく判定できない感じです。
GPS測位だけだと点の情報なので、車体がどっち向きになっているかで、操縦の仕方が変わります。
その辺を、コンパスやジャイロを組合せて判定するのですが、これが難しいみたいでした。
20161023_gps_car_1 20161023_gps_car_2 20161023_gps_car_3
20161023_gps_car_4 20161023_gps_car_5

多くの機種は、コントローラとしてマイコンに自作のプログラムを搭載したものを使用していましたが、1つだけドローン用のコントローラ APM 2.6 を使用したものがありました。
これは、コントローラ自身に位置を覚える機能があり、位置を何点か指定すると、自動で周回するそうです。
20161023_gps_aps_1

当日はライブ配信も行われた。
視聴者からの質問に参加者が答えるコーナーが設けられ、現地にいる私もいろいろ参考になりました。
GPSは10mくらいの誤差がありますが、海洋大学にあるGPS基準点を利用して補正しているそうです。
RTK測位というらしい。
目標はピンポイントで与えられるが、その周りに3箇所くらいの地点を設定して、近くにいったら次の地点に移動するというようなコース取りをしているそうです。

アプリコンテスト
今回初めての企画です。
車体は、主催者側が用意したものを使います。
参加者は、車体をBluetooth経由で制御するアンドロイド・スマホのアプリを作成します。
7x7のマス目(位置座標)が用意され、当日指定された場所を巡回します。
参加は2チームでした。
結果は、散々なものでした。
1チームは車体が全く動かず、1チームは走り回るだけで目標には到達できなかった。
その理由は、通信の間隔は1秒毎と遅いためです。
通信の間隔に対して、車体の走行速度が速いため、指示が届いた時点では違う場所に居るらしい。
来年もやるそうなので、ぜひ成功するチームが出て欲しいですね。
完走できなかった理由として、通信が10秒間隔なので、位置情報を受信した時には、その位置にいないということがあるらしい。
20161023_gps_app_1 20161023_gps_app_2

最後にお土産として、茄子を頂きました。
20161023_gps_eggplant
当日の様子は、YouTube で公開されています。
3時間あるので、心して見てください。w
なお、最初の25分くらいまで、画面が映らず、音声だけです。

参考
2016年大会 競技結果
自作GPS・QZSSロボットカーが集結、衛星航法による自律走行技を競うー趣味のインターネット地図ウォッチ
電子基準点を利用した新しいデータ配信サービスについて
GPSとRTKって違うんですか


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


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

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


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


「みちびき」 の軌道周期は、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な人には使えない (^^;


GPS衛星の位置 GpsStatus.NmeaListener


2014-0506nmea_listener20140506nmea_listener_nmea

GpsStatus.NmeaListener を使って、GPS衛星の位置情報を取得します。

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

プログラムの簡単な説明
(1) LocationManager#addNmeaListener で GpsStatus.NmeaListener を登録します。
(2) GpsStatus.NmeaListener#onNmeaReceived で、nmea 形式のデータを取得できます。
(3) nmea は、NMEA (National Marine Electronics Association) で規定されたGPS情報のデータ形式です。
GPS – NMEA sentence information に、データ形式の説明が載っています。
(4) GalaxyNesus で取得できるのは、下記のデータです。
– $GPGSA 捕捉された衛星の番号
– $GPGGA 測位された現在地
– $GPRMC 測位された現在地(推奨)
– $GPGSV 衛星の位置情報
GPGSV は、1行で4つの衛星の位置情報が記述されています。
4つ以上の衛星があるときは、複数の行で記述されます。

参考
Android で GPS 衛星からの情報を NMEA 形式で取得する方法
GPS – NMEA sentence information
GPSのNMEAフォーマット


GPS衛星の位置情報 GpsStatus.Listener


20140505GpsStatus_Listener

GpsStatus.Listener を使って、GPS衛星の位置情報を取得します。
この種のアプリでは、GPS Test が有名みたいです。

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

プログラムの簡単な説明
(1) LocationManager#addGpsStatusListener で GpsStatus.Listener を登録します。
(2) 衛星の情報は、GpsStatus.Listener#onGpsStatusChanged の中で、GpsStatus#getSatellites() を使って取得できます。
戻り値は Iterable の形式です。
(3) GpsSatellite には、下記の値が含まれています
PRN (pseudo-random number) 衛星の番号
Azimuth 衛星の位置を示す方位角
Elevation 衛星の位置を示す仰角
Snr 信号のSN比

留意点が2つあります。
(1) requestLocationUpdates を設定しないと、
onGpsStatusChanged がコールバックされません。
(2) onGpsStatusChanged の中で、LocationManager#getGpsStatus を実行しないと、
GpsStatus が更新されません。

public void onGpsStatusChanged( int event ) {
	Iterable<GpsSatellite> satellites = mGpsStatus.getSatellites();
	… 何か処理する … 
	mGpsStatus = mLocationManager.getGpsStatus( mGpsStatus ); 
}