Android GNSS Loggerで受信したデータをGNSS Analysisで表示する
測位に関して素人な私は「位置情報の取得?GPSを使うんでしょ?」ぐらいの知識しかありませんでした。測位について学んでいくと、GPSはアメリカが打ち上げた衛星のことを指していて、実際には他にも色々あることを知りました。総合してGNSS(Global Navigation Satellite System(全球測位衛星システム))と呼ばれています。GPS以外には次のようなものがあります。
- GALILEO...欧州
- GLONASS...ロシア
- BeiDou...中国
- NavIC...インド
- みちびき(QZSS)...日本!
QZSSはQuasi-Zenith Satellite Systemの略です。quasi-zenith orbitが「準天頂軌道」を意味して、日本に色々とメリットのある軌道なのだとか。
「GNSSの生データってどんなものなんだろう~みてみたいな」と思ったら今の時代、すぐ手に入るんですね。スマホのAndroidアプリで簡単に取得できました。
GNSS Logger
GNSS LoggerはGoogleが提供しているアプリです。
とてもわかりやすいUIで補足しているGNSSの情報をみれます。
Home(設定画面)
どんな情報を取得するか選択する画面です。GNSS Loggerが出力するファイルは観測データの共通フォーマットであるRINEXではありませんが、Log RINEXを選ぶことで、同時にRINEXファイルも出力してくれます。
Plot
時系列の受信状況がみれます。
Status
捕捉している衛星が確認できます。
Skyplot
衛星の位置を確認できます。
Log
以下の画面で「Start Log」を押すとログの取得を開始します。終了は「Stop & Send」です。終了するとログを共有する方法(GmailやDriveなどのメニュー一覧)が表示されます。
実際に取得したファイルは次のようなものです。gnss_log_2025_08_28_14_46_45.txtと年月日時分秒がついたテキストファイルとして出力されます。
#
# Header Description:
#
# Version: v3.1.0.8 Platform: 15 Manufacturer: Google Model: Pixel 7 GNSS Hardware Model Name: Broadcom, BCM4776, GLL ver. 154.20.24 616640
#
# Raw,utcTimeMillis,TimeNanos,LeapSecond,TimeUncertaintyNanos,FullBiasNanos,BiasNanos,BiasUncertaintyNanos,DriftNanosPerSecond,DriftUncertaintyNanosPerSecond,HardwareClockDiscontinuityCount,Svid,TimeOffsetNanos,State,ReceivedSvTimeNanos,ReceivedSvTimeUncertaintyNanos,Cn0DbHz,PseudorangeRateMetersPerSecond,PseudorangeRateUncertaintyMetersPerSecond,AccumulatedDeltaRangeState,AccumulatedDeltaRangeMeters,AccumulatedDeltaRangeUncertaintyMeters,CarrierFrequencyHz,CarrierCycles,CarrierPhase,CarrierPhaseUncertainty,MultipathIndicator,SnrInDb,ConstellationType,AgcDb,BasebandCn0DbHz,FullInterSignalBiasNanos,FullInterSignalBiasUncertaintyNanos,SatelliteInterSignalBiasNanos,SatelliteInterSignalBiasUncertaintyNanos,CodeType,ChipsetElapsedRealtimeNanos,IsFullTracking,SvPositionEcefXMeters,SvPositionEcefYMeters,SvPositionEcefZMeters,SvVelocityEcefXMetersPerSecond,SvVelocityEcefYMetersPerSecond,SvVelocityEcefZMetersPerSecond,SvClockBiasMeters,SvClockDriftMetersPerSecond,KlobucharAlpha0,KlobucharAlpha1,KlobucharAlpha2,KlobucharAlpha3,KlobucharBeta0,KlobucharBeta1,KlobucharBeta2,KlobucharBeta3
#
# UncalAccel,utcTimeMillis,elapsedRealtimeNanos,UncalAccelXMps2,UncalAccelYMps2,UncalAccelZMps2,BiasXMps2,BiasYMps2,BiasZMps2
#
# Accel,utcTimeMillis,elapsedRealtimeNanos,AccelXMps2,AccelYMps2,AccelZMps2
#
# UncalGyro,utcTimeMillis,elapsedRealtimeNanos,UncalGyroXRadPerSec,UncalGyroYRadPerSec,UncalGyroZRadPerSec,DriftXRadPerSec,DriftYRadPerSec,DriftZRadPerSec
#
# Gyro,utcTimeMillis,elapsedRealtimeNanos,GyroXRadPerSec,GyroYRadPerSec,GyroZRadPerSec
#
# UncalMag,utcTimeMillis,elapsedRealtimeNanos,UncalMagXMicroT,UncalMagYMicroT,UncalMagZMicroT,BiasXMicroT,BiasYMicroT,BiasZMicroT
#
# Mag,utcTimeMillis,elapsedRealtimeNanos,MagXMicroT,MagYMicroT,MagZMicroT
#
# Pressure,utcTimeMillis,elapsedRealtimeNanos,PressureHpa
#
# OrientationDeg,utcTimeMillis,elapsedRealtimeNanos,yawDeg,rollDeg,pitchDeg
#
# Fix,Provider,LatitudeDegrees,LongitudeDegrees,AltitudeMeters,SpeedMps,AccuracyMeters,BearingDegrees,UnixTimeMillis,SpeedAccuracyMps,BearingAccuracyDegrees,elapsedRealtimeNanos,VerticalAccuracyMeters,MockLocation,NumberOfUsedSignals,VerticalSpeedAccuracyMps,SolutionType
#
# Nav,Svid,Type,Status,MessageId,Sub-messageId,Data(Bytes)
#
# Status,UnixTimeMillis,SignalCount,SignalIndex,ConstellationType,Svid,CarrierFrequencyHz,Cn0DbHz,AzimuthDegrees,ElevationDegrees,UsedInFix,HasAlmanacData,HasEphemerisData,BasebandCn0DbHz
#
# Agc,utcTimeMillis,TimeNanos,LeapSecond,TimeUncertaintyNanos,FullBiasNanos,BiasNanos,BiasUncertaintyNanos,DriftNanosPerSecond,DriftUncertaintyNanosPerSecond,HardwareClockDiscontinuityCount,AgcDb,CarrierFrequencyHz,ConstellationType
#
UncalGyro,1756360005244,7595383134924,-0.06001751,0.09728029,0.0012217305,0.0005809451,-0.00028273478,-0.00059705804
UncalMag,1756360005248,7595387044816,-127.5754,21.2158,-82.4964,-96.323135,48.03869,-3.2782698
UncalAccel,1756360005248,7595387325415,-0.5461618,8.192427,5.154738,0.023109367,-0.03632758,0.057774
UncalGyro,1756360005252,7595391526618,-0.08689558,0.02321288,0.01786781,0.0005809451,-0.00028273478,-0.00059705804
UncalAccel,1756360005256,7595395722896,-0.49830532,8.14457,5.1499524,0.023109367,-0.03632758,0.057774
UncalMag,1756360005258,7595397057430,-127.880394,21.301199,-82.472,-96.323135,48.03869,-3.2782698
UncalGyro,1756360005260,7595399938523,-0.095753126,-0.043218717,0.03573562,0.0005809451,-0.00028273478,-0.00059705804
UncalAccel,1756360005265,7595404131404,-0.44506502,8.087741,5.2552366,0.023109367,-0.03632758,0.057774
UncalMag,1756360005268,7595407057510,-127.4656,21.301199,-82.728195,-96.323135,48.03869,-3.2782698
UncalGyro,1756360005269,7595408342168,-0.08659015,-0.09193522,0.049938235,0.0005809451,-0.00028273478,-0.00059705804
OrientationDeg,1756360005256,7595395722896,35.0,4.0,-55.0
OrientationDeg,1756360005265,7595404131404,35.0,4.0,-55.0
UncalAccel,1756360005273,7595412538517,-0.39601216,8.04467,5.384449,0.023109367,-0.03632758,0.057774
OrientationDeg,1756360005273,7595412538517,35.0,4.0,-55.0
UncalGyro,1756360005277,7595416745996,-0.06414085,-0.11957687,0.0571159,0.0005809451,-0.00028273478,-0.00059705804
UncalMag,1756360005278,7595417044611,-127.6608,21.6306,-83.1308,-96.323135,48.03869,-3.2782698
UncalAccel,1756360005281,7595420953984,-0.37627137,7.9830546,5.499305,0.023109367,-0.03632758,0.057774
OrientationDeg,1756360005281,7595420953984,35.0,3.0,-55.0
Pressure,1756360005284,7595423548639,1006.9951
UncalGyro,1756360005286,7595425141484,-0.035888333,-0.13439035,0.053145275,0.0005809451,-0.00028273478,-0.00059705804
UncalMag,1756360005288,7595427057346,-128.6002,21.6062,-83.1064,-96.323135,48.03869,-3.2782698
UncalAccel,1756360005290,7595429341342,-0.32303107,7.954939,5.561518,0.023109367,-0.03632758,0.057774
OrientationDeg,1756360005290,7595429341342,35.0,3.0,-55.0
UncalGyro,1756360005294,7595433536614,-0.012370021,-0.1414153,0.043218717,0.0005809451,-0.00028273478,-0.00059705804
UncalMag,1756360005298,7595437057589,-129.1248,21.5208,-82.9966,-96.323135,48.03869,-3.2782698
UncalAccel,1756360005298,7595437729749,-0.2745764,7.945368,5.6183476,0.023109367,-0.03632758,0.057774
OrientationDeg,1756360005298,7595437729749,35.0,3.0,-55.0
UncalGyro,1756360005302,7595441944836,0.0050396384,-0.13041973,0.032223143,0.0005809451,-0.00028273478,-0.00059705804
UncalAccel,1756360005307,7595446144483,-0.21655045,7.911868,5.709275,0.023109367,-0.03632758,0.057774
OrientationDeg,1756360005307,7595446144483,35.0,3.0,-55.0
UncalMag,1756360005308,7595447044608,-128.7954,21.716,-82.472,-96.323135,48.03869,-3.2782698
Pressure,1756360005309,7595448615084,1007.0409
UncalGyro,1756360005311,7595450349795,0.014966198,-0.096516706,0.021380283,0.0005809451,-0.00028273478,-0.00059705804
なぜRINEXじゃないんだろ?と疑問だったのですが、こちらの資料によると
Why didn’t Android use RINEX in the first place?
Because there are many raw measurement attributes that are very important to
phones but not present in RINEX:
と書いてあって、RINEXで表現できないスマホにとっても大事なデータも生データには含まれるから、とのこと。
ちなみにRINEX形式のファイルはこんな感じです。
4.01 OBSERVATION DATA M RINEX VERSION / TYPE
GnssLogger Google 15 20250828 054725 UTC PGM / RUN BY / DATE
Google GnssLogger MARKER NAME
Unknown MARKER NUMBER
Unknown Unknown OBSERVER / AGENCY
Unknown GnssLogger v3.1.0.8 REC # / TYPE / VERS
Unknown Unknown ANT # / TYPE
0.0000 0.0000 0.0000 ANTENNA: DELTA H/E/N
G 8 C1C L1C D1C S1C C5Q L5Q D5Q S5Q SYS / # / OBS TYPES
R 4 C1C L1C D1C S1C SYS / # / OBS TYPES
J 8 C1C L1C D1C S1C C5Q L5Q D5Q S5Q SYS / # / OBS TYPES
C 8 C2I L2I D2I S2I C5P L5P D5P S5P SYS / # / OBS TYPES
E 8 C1C L1C D1C S1C C5Q L5Q D5Q S5Q SYS / # / OBS TYPES
2025 08 28 05 47 25.0000000 GPS TIME OF FIRST OBS
5 R01 1 R02 -4 R03 5 R12 -1 R13 -2 GLONASS SLOT / FRQ #
Google Pixel 7 (Android 15) HW Year: 2020 HW Model: COMMENT
Broadcom, BCM4776, GLL ver. 154.20.24 616640 COMMENT
END OF HEADER
> 2025 08 28 05 47 25.9199821 0 1
G10 22411354.54205 -55600.57805 2368.07305 29.85005
> 2025 08 28 05 47 26.9235693 0 1
G10 23486316.46105 -57968.84405 2367.94205 29.93305
> 2025 08 28 05 47 27.9235687 0 10
G10 23485684.79904 -60336.85504 2368.17204 28.82204 23485708.78213 -50396.07013 1768.01413 17.99513
G12 22802692.52423 -50428.00723 2363.76323 22.82623
G18 23255364.44623 105161.64323 -3476.00923 19.41423
R13 20645601.24823 -33341.51023 2506.35823 22.93523
R03 22407565.16524 -29681.42724 2142.14624 24.08824
J02 37310952.76522 3221.13322 -487.17722 16.81122
J03 37171226.99523 11949.98923 -1230.38323 19.58223
J07 37292369.83023 6600.85723 -862.82923 18.10323
C16 37991794.32823 4241.38823 -400.06123 20.72323
C26 24799822.34024 -22193.86224 2302.69924 27.55024
> 2025 08 28 05 47 28.9235682 0 10
G10 23485078.31904 -62704.94704 2367.54504 27.75904 23485110.09722 -52168.81622 1766.53122 15.81322
G12 22802091.74023 -52792.42523 2360.84023 22.78923
G18 23255807.24023 108635.65323 -3473.87423 21.04623
R13 20644984.27523 -35851.79323 2503.57123 23.10323
R03 22407020.14323 -31825.70523 2139.98223 22.28323
J02 37310892.20722 3707.88722 -489.32822 17.47222
J03 37171306.74022 13180.01522 -1233.60022 14.25022
J07 37292375.82523 7462.01423 -864.39223 17.95823
C16 37991727.47423 4643.21123 -402.95023 20.38623
C26 24799234.74724 -24497.34624 2302.48724 27.82824
GNSS Analysis
GNSS Loggerで取得したデータはGNSS Analysisを使って細かく分析できます。
私の環境はWindows 11 ProなのでZipを落としてGnssAnalysisWindowsV4.6.0.1\for_redistribution\MyAppInstaller_web.exeを実行しました。するとMatLab?のランタイムのインストールなどが行われて、うまくいくと以下のような画面が起動します。
「Find Log File」ボタンを押して、GNSS Loggerで取得したTXTファイルを指定すると「Analyze and Plot」ボタンが有効になるので押しましょう。GNSS Loggerで取得したログが小さすぎるとエラーになったので、ある程度長い時間取得したファイルを指定するのがよさそうです。
読み込みが正常に終わると、衛星の情報などが表示されます。
各種グラフも自動起動しました。Skyplotなど一部データが表示されなかった原因はわからなかったのですが。。
Androidのスマホされあれば気軽に測位の世界に入門できるんだなぁとちょっと感動しました。
Discussion