PC上のAndroidエミュレータから疑似NMEAを送り、Drogger Tabletの実際のBluetooth/NMEA/測位処理を
通してナビゲーション機能を確認するための手順書。
現行版(Issue #66、Track #68): PCシミュレータのWeb UIとAndroid Emulatorを別ウインドウで
同時表示し、PC地図で現在地・経路・測位/通信状態を操作する。PC側の主操作はpc-tool simulator-ui、
自動化・障害切り分け用の補助操作はpc-tool simulator CLIで行い、どちらもadb forward経由の
debug専用TCP(127.0.0.1:47650)でDrogger Tabletへ送る。旧版(Track #65、
dev.drogger.simulatorという別APK・別ランチャーの「Droggerシミュレータ」アプリ)は、同一Emulator内で
アプリを行き来する必要があり操作画面と結果画面を同時に見られない問題があったため主経路から外した
(詳細はPC走行シミュレータ+Android Emulator仕様、
Issue #66本文参照)。TCP通信実証が完了するまで旧APK・AIDLは削除していないため、末尾の
「旧版について」に手短かな参照だけ残す。現行版は利用者検収済みで、試験運用可能とする。試験中に
見つかった改善点は、製品機能と同じ完成度を先回りして求めず、再現手順を記録して個別に直す。
疑似GGA/RMCをNmeaLinkFactory境界から流し、BluetoothNmeaController、NMEA parser、
FixRepository、ViewModel、WorkDock、地図表示まで製品コードと同じ経路を通す点はTrack #64から
変わっていない。
現行版は次の3要素で構成される。
dev.drogger.tablet、debug build): 受理済み経路・内部の走行進捗・実行状態をSimulatorTcpServiceがloopback127.0.0.1:47650だけでlistenし、pc-tool simulator-ui、既定http://127.0.0.1:47651/): オフライン地図、筆選択、pc-tool simulator、apps/android-tablet/pc-tool): protocol version確認・最終地点照会・現行版で確認できることは次のとおり。
set_current_position、経路送信とは独立した操作)。設定した地点はsubmit-appendの起点(--expected-lat/--expected-lon)として使える現行版には次の制約がある。
set_current_position等が成功してもTablet画面の現在地には反映されない/api/statusから復元される既にSDK・AVD・権限を準備済みなら、PC再起動後は次の順で復旧できる。詳細や失敗時は0〜9節を参照する。
Android Emulatorを起動し、adb devices -lでserialを確認する。
Drogger Tablet debug版を起動する。必要なら同じcommitからdebug APKをビルド・再インストールする。
Drogger Tabletの「Bluetooth接続先」で「NMEA走行シミュレータ / SIMULATOR」を選ぶ。
対象serialを明示してforwardする。
/home/akira/android-sdk/platform-tools/adb -s emulator-5554 forward tcp:47650 tcp:47650
PCツールをビルドしてWeb UIを起動する。
cd apps/android-tablet
JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :pc-tool:installDist
./pc-tool/build/install/pc-tool/bin/pc-tool simulator-ui --no-browser --http-port=47651
ブラウザでhttp://127.0.0.1:47651/を開き、「接続済み」「Tablet=1 / このUI=1」を確認する。
パスはこの開発機の例であり、他環境では0節で確認したSDK/JDKへ読み替える。サーバーをフォアグラウンドで
起動した場合は、そのターミナルを開いたままにする。
以降の手順は、環境ごとに異なる絶対パスを前提にしない。まず現在の状態を確認し、このターミナルだけで
使うタスク固有の環境変数(DROGGER_接頭辞。HOME等の一般的な変数を上書きしない)へ格納する。
test -f STARTUP_CONTEXT.md -a -d apps/android-tablet \
&& echo "リポジトリ確認OK" \
|| echo "droggerリポジトリ直下(STARTUP_CONTEXT.mdとapps/android-tabletがある場所)へ移動してください"
「リポジトリ確認OK」が出るディレクトリを、以降の手順の基準ディレクトリとする(コマンド例のcdは
すべてこの場所からの相対パス)。
次の優先順位で確認し、見つかった場所をDROGGER_ANDROID_SDKへ設定する。
if [ -n "$ANDROID_SDK_ROOT" ]; then
DROGGER_ANDROID_SDK="$ANDROID_SDK_ROOT"
elif [ -n "$ANDROID_HOME" ]; then
DROGGER_ANDROID_SDK="$ANDROID_HOME"
elif [ -f apps/android-tablet/local.properties ]; then
DROGGER_ANDROID_SDK=$(grep '^sdk.dir=' apps/android-tablet/local.properties | cut -d'=' -f2-)
fi
echo "DROGGER_ANDROID_SDK=${DROGGER_ANDROID_SDK:-未検出}"
いずれでも見つからない場合、Android Studioの「Settings → Languages & Frameworks → Android SDK」で
表示される「Android SDK Location」を確認し、DROGGER_ANDROID_SDK=<その場所>を手動で設定する。
apps/android-tablet/local.propertiesは署名情報等の秘密情報も含むファイルのため、catで全体を
表示せず、上記のようにsdk.dir行だけを抽出すること。
見つかった場所にadb・emulatorが実在することを確認する。
test -x "${DROGGER_ANDROID_SDK:?}/platform-tools/adb" && echo "adb OK" || echo "adbが見つかりません"
test -x "${DROGGER_ANDROID_SDK:?}/emulator/emulator" && echo "emulator OK" || echo "emulatorが見つかりません"
どちらかが見つからない場合、Android StudioのSDK Managerで「Android SDK Platform-Tools」
「Android Emulator」がインストール済みか確認する。
java -version
openjdk version "21...のように21系が既定であれば、以降DROGGER_JAVA_HOMEの指定は不要(空のままでよい)。
21系でない場合(新しすぎる/古すぎるJDKの場合、:simulator-ipcのAIDLコンパイルがAGPのjlink変換で
失敗することがある)、インストール済みのJDK 21を探す。
# Linux(Debian/Ubuntu系の例。パッケージマネージャ・配置は環境により異なる)
ls -d /usr/lib/jvm/*21* 2>/dev/null
# update-alternativesがある環境
update-alternatives --list java 2>/dev/null | grep 21
# macOSの例
/usr/libexec/java_home -V 2>&1 | grep 21
見つかったJDK 21のホームディレクトリ(bin/javaがある1つ上の階層)をDROGGER_JAVA_HOMEへ設定する。
DROGGER_JAVA_HOME=<見つかったパス>
"${DROGGER_JAVA_HOME}/bin/java" -version # 21系であることを確認
見つからない場合は、Android Studioにバンドルされた21系JDK(JBR)を使う、またはOSのパッケージ管理から
JDK 21を導入してから同じ確認を行う。
以降の手順(4節・9節)のビルドコマンドは、次のどちらかを状況に応じて使う。
java -versionが21系だった場合: JAVA_HOMEを指定せず、既定JDKのまま実行する。
./gradlew :app:assembleDebug
21系でなく、上記でDROGGER_JAVA_HOMEを設定した場合: JAVA_HOMEにそれを明示する。
JAVA_HOME="${DROGGER_JAVA_HOME:?}" ./gradlew :app:assembleDebug
(${DROGGER_JAVA_HOME:?}は未設定のまま実行してしまうこと自体を防ぐ。値が空でも実行できてしまう
${DROGGER_JAVA_HOME}は使わない。)
Androidエミュレータの実行には/dev/kvmへのアクセスが必要。ターミナルで次を実行する。
id
groups=...にkvmがあれば次へ進む。ユーザーをKVMグループへ追加した直後など、kvmが無い場合は
次を実行する。
newgrp kvm
id
test -r /dev/kvm -a -w /dev/kvm && echo "KVM利用可能" || echo "KVM利用不可"
groups=...kvm...とKVM利用可能が表示されればよい。newgrp kvmはKVM権限を反映した新しいshellを
開始するため、以降のエミュレータ起動も同じターミナルから行う。
KVM利用不可の場合は作業を止め、idとls -l /dev/kvmの結果を確認する。
同じターミナルで、作成済みAVDの一覧を確認する。
"${DROGGER_ANDROID_SDK:?}/emulator/emulator" -list-avds
この検証用に作られたAVD(例: drogger_stage2_testという名前)を選び、DROGGER_AVDへ設定してから
起動する。一覧に候補が無い、またはどれを使うべきか分からない場合は、作業を止めて確認する
(新規AVD作成はこの手順の対象外)。
DROGGER_AVD=drogger_stage2_test # 実際に一覧へ表示された名前へ読み替える
"${DROGGER_ANDROID_SDK:?}/emulator/emulator" @"${DROGGER_AVD}"
「Emulator Running in Nested Virtualization」という警告が出た場合はOKを押す。WSL2内での実行が
遅くなる可能性を知らせる警告で、起動失敗ではない。灰色の画面からAndroidのホーム画面になるまで待つ。
初回は数分かかることがある。
次のエラーで終了した場合は「1. KVM権限を確認する」へ戻る。
This user doesn't have permissions to use KVM
x86_64 emulation currently requires hardware acceleration
エミュレータを実行しているターミナルはそのまま残し、以降の操作用に別のターミナルを開く
(PCシミュレータ用の操作端末とAndroid Emulatorの表示ウインドウを2つ並べておくと、次項以降の結果を
同時に確認できる)。
新しいターミナルで、手順0.2のDROGGER_ANDROID_SDKを再設定した上で(別ターミナルのため変数は
引き継がれない)次を実行する。
"${DROGGER_ANDROID_SDK:?}/platform-tools/adb" devices -l
正常例:
List of devices attached
80b254207d94 device product:flare_global model:24075RP89G device:flare ...
emulator-5554 device product:sdk_gphone64_x86_64 model:sdk_gphone64_x86_64 ...
emulator-で始まる行のdevice(offlineではない)がこの手順で起動したエミュレータであることを
確認し、そのserial(例のemulator-5554。数字部分は環境により異なる)をDROGGER_EMULATOR_SERIALへ
設定する。以降のすべてのadbコマンドはこの変数を使い、-sを省略しない
(実機が同時に一覧へ表示されていても誤ってインストール・接続しないため)。
DROGGER_EMULATOR_SERIAL=emulator-5554 # 実際に確認したserialへ読み替える
以降、このターミナルでは対象を毎回書かずに済むよう、次のシェル関数を定義してから使う(Android SDKの
パスに空白が含まれる場合でも壊れないよう、パスとserialをそれぞれ引用符で囲んで渡す。文字列を
組み立ててからword splittingで実行する形は使わない)。
adb_emulator() {
"${DROGGER_ANDROID_SDK:?}/platform-tools/adb" \
-s "${DROGGER_EMULATOR_SERIAL:?}" "$@"
}
adb_emulatorは今回対象と決めたEmulatorへの操作だけに使う。adbサーバ全体に対するkill-server/
start-serverはserial指定の対象外のため、adb_emulatorを経由せず直接実行する。
一覧が空ならAndroidのホーム画面まで起動したことを確認して再実行する。offlineならエミュレータを
終了し、手順2から起動し直す。cannot bind listener等の接続エラーが出る場合は次を試してから
再実行する(WSL2環境でadbサーバが不整合な状態になり再起動で解消することがある)。
"${DROGGER_ANDROID_SDK:?}/platform-tools/adb" kill-server
"${DROGGER_ANDROID_SDK:?}/platform-tools/adb" start-server
Gradle wrapperはリポジトリ直下ではなくapps/android-tabletにある(手順0.1で確認した基準ディレクトリ
からの相対パス)。手順0.3の結果に応じて次のどちらかを実行する。
cd apps/android-tablet
# 既定JDKが21系だった場合
./gradlew :app:assembleDebug
# 21系でなく、DROGGER_JAVA_HOMEを設定した場合
JAVA_HOME="${DROGGER_JAVA_HOME:?}" ./gradlew :app:assembleDebug
最後にBUILD SUCCESSFULと表示されればよい(旧版の「Droggerシミュレータ」APKは現行版の手順では
ビルド不要)。
同じターミナル、同じディレクトリ(apps/android-tablet)で、手順3で定義したadb_emulatorを使う。
adb_emulator install -r app/build/outputs/apk/debug/app-debug.apk
次のように表示されればよい。
Performing Streamed Install
Success
device 'xxx' not foundなら、手順3で実際のエミュレータのserialを確認してDROGGER_EMULATOR_SERIALを
設定し直す。APKが無い場合は手順4のビルド結果と現在のディレクトリを確認する。
Allow)。adb_emulator shell pm grant dev.drogger.tablet android.permission.BLUETOOTH_CONNECT
adb_emulator shell pm grant dev.drogger.tablet android.permission.ACCESS_FINE_LOCATION
adb_emulator shell am force-stop dev.drogger.tablet
adb_emulator shell am start -n dev.drogger.tablet/dev.drogger.tablet.MainActivity
(adb_emulatorは手順3で定義したシェル関数。以降の手順でも、新しいターミナルを開くたびに手順3と
同様に定義し直して使う。)
TCP操作(現在地設定・経路送信・走行制御)はDrogger Tablet内部のRegisteredRouteEngineを直接操作するが、
疑似NMEAの生成自体は既存のBluetooth接続先設定に依存する(Track #64から変更していない仕組み)。
この手順を飛ばすと、CLIの操作はすべて成功応答を返すのに製品画面の現在地・測位品質は変化しない。
権限を許可した直後は一覧が「ペアリング済み機器がありません」のままのことがある。手順6のとおり
Drogger Tabletを再起動すると一覧に反映される。前回セッションで既に選択済みの場合、アプリ再起動時に
自動再接続するためこの手順は不要(「選択中」表示で確認できる)。
この警告はNTRIP補正用であり、NMEA走行シミュレータの利用にはWireGuardは不要。「再接続」を押さず、
警告を無視して操作を続けてよい。
新しいターミナル(PC CLI操作用)で、手順0.2・手順3と同様にDROGGER_ANDROID_SDK・
DROGGER_EMULATOR_SERIAL、およびadb_emulator関数を再定義した上で(別ターミナルのため
引き継がれない)、Drogger Tablet debug側がlistenするport 47650をPCのloopbackへforwardする。
実機への誤接続を避けるため必ず対象serialを指定する。
DROGGER_ANDROID_SDK=<手順0.2で確認した場所>
DROGGER_EMULATOR_SERIAL=<手順3で確認したserial>
adb_emulator() {
"${DROGGER_ANDROID_SDK:?}/platform-tools/adb" \
-s "${DROGGER_EMULATOR_SERIAL:?}" "$@"
}
adb_emulator forward tcp:47650 tcp:47650
成功すると47650とだけ出力される。確認は次で行える。
adb_emulator forward --list
emulator-5554 tcp:47650 tcp:47650
(表示されるemulator-5554の部分はDROGGER_EMULATOR_SERIALに設定した実際の値になる。)
リポジトリ直下からapps/android-tabletディレクトリへ移動して実行する(手順4のAPKビルドと同じ
使い分け)。
cd apps/android-tablet
# 既定JDKが21系だった場合
./gradlew :pc-tool:installDist
# 21系でなく、DROGGER_JAVA_HOMEを設定した場合
JAVA_HOME="${DROGGER_JAVA_HOME:?}" ./gradlew :pc-tool:installDist
BUILD SUCCESSFUL後、実行ファイルは次にできる。
./pc-tool/build/install/pc-tool/bin/pc-tool simulator --help
全operationの一覧と引数形式が表示されればよい。以降のコマンド例はすべて
apps/android-tabletディレクトリを起点とする。
./pc-tool/build/install/pc-tool/bin/pc-tool simulator-ui --no-browser --http-port=47651
ブラウザでhttp://127.0.0.1:47651/を開く。--no-browserを省略すると既定ブラウザを開こうとする。
画面上部が「接続済み」にならない場合は手順6〜8と14節を確認する。PCサーバーはloopbackだけで待ち受け、
地図資産も配布物へ同梱されるためインターネット接続は不要である。
| 表示 | 意味 |
|---|---|
| オレンジ枠 | 選択中の筆polygon |
| 緑のpin | 未送信ドラフトの開始点 |
| マゼンタ円 | Tabletに登録済みの最終地点。走行中の現在位置ではない |
| マゼンタ外周+緑中心 | ドラフト開始点とTablet登録済み地点が同じ位置 |
| 青線 | 未送信ドラフト。表示と送信waypointは同じ展開点列から作る |
| 灰色破線 | このブラウザからTabletへ登録した走行対象経路。ページ再読み込み前の形状は復元しない |
| Tabletの青丸 | 製品側が受信した現在位置 |
| Tabletのピンク線 | 製品側が記録した実績軌跡。予定経路ではない |
ツールは排他的である。「筆を選択」は筆選択、「経路を入力」は地点・直線・曲線入力、「経路を編集」は
点移動・曲線ハンドル編集、「現在地を変更」は登録済み地点と異なる場所へ明示的に移す場合だけ使う。
Space押下中は一時pan、Ctrl+Z/Ctrl+Shift+Zはundo/redo、Escは仕掛かり操作の取消または筆選択へ戻る。
中間座標は生成しない。Tabletが記録中なら、直前の測位点と新地点を結ぶ直線がピンクの実績軌跡に
現れることがある。位置変更とTabletの記録区切りは別操作である。
「この経路で走行を開始」はset_speed→経路登録/追加→start_or_resumeを一連で行う。途中で開始だけが
失敗した場合は、経路を二重送信せず開始だけを再試行する。
将来変更後は、少なくとも「現在地設定 → 直線+曲線の走行 → pause/resume/reset → 5品質 → stale停止/
再開 → Running中の疑似通信断」を順に確認する。PCのマゼンタ地点、Tabletの青丸、ピンク実績軌跡を
混同せず見る。この一連が通れば、日常の試験利用を開始できる。
この節以降のCLIは、自動試験、Web UIが起動しない場合の切り分け、protocol単体確認向けである。通常の
手操作は9.1節を使う。CLIの経路登録と走行開始は別コマンドだが、Web UIでは一操作にまとめている。
./pc-tool/build/install/pc-tool/bin/pc-tool simulator ping
接続成功: Drogger Tablet protocol version=1 (このCLI=1)
エラー: Drogger Tabletへ接続できません(127.0.0.1:47650)。...と表示される場合は手順14を参照。
./pc-tool/build/install/pc-tool/bin/pc-tool simulator endpoint
初回は登録済み経路はまだありませんと表示される。
実筆データがある例の座標(緯度33.2106099、経度133.10263325付近)を使う。
./pc-tool/build/install/pc-tool/bin/pc-tool simulator set-position --lat=33.2106099 --lon=133.10263325
現在地を設定しました: lat=33.2106099, lon=133.10263325
手順7を済ませていれば、Drogger Tablet画面の測位品質バッジが「測位無効」から「固定解 ...」等へ変わり、
現在地マーカー(青丸)がその地点へ表示される。記録中(既定)であれば、その地点が実績軌跡の1点として
記録される。
submit-appendは「続きの点」だけを--points/--points-fileに指定する(先頭に現在の最終地点を
自動で補う)。--expected-lat/--expected-lonは直前のendpointまたはset-positionの応答と
一致させる。
./pc-tool/build/install/pc-tool/bin/pc-tool simulator submit-append \
--expected-lat=33.2106099 --expected-lon=133.10263325 \
--points="33.2086099,133.10263325;33.2066099,133.10263325"
経路を受理しました。新しい最終地点: lat=33.2066099, lon=133.10263325
登録経路が全く無い状態から経路を作りたい場合(現在地設定を経ない初回経路)はsubmit-initialを使う。
./pc-tool/build/install/pc-tool/bin/pc-tool simulator submit-initial \
--points="33.2106099,133.10263325;33.2086099,133.10263325"
複数点を毎回コマンドライン引数で書くのが煩雑な場合は--points-file=<path>で次の形式のJSONを渡せる。
{"waypoints": [
{"lat": 33.2106099, "lon": 133.10263325, "interpolation": "STRAIGHT"},
{"lat": 33.2086099, "lon": 133.10263325, "interpolation": "STRAIGHT"}
]}
送信しただけでは走行は始まらない。次項の「走行開始/再開」を送るまでDrogger Tablet側の現在地は
動かない(初回送信直後・経路完走(Finished)後の続き送信直後のいずれも同じ)。
# 走行を開始/再開する(Drogger Tablet内部の実行状態がNotStarted/Pausedのどちらでも同じコマンドでよい)
./pc-tool/build/install/pc-tool/bin/pc-tool simulator start-or-resume
# 現在位置を保ったまま一時停止する
./pc-tool/build/install/pc-tool/bin/pc-tool simulator pause
# 進捗を経路の先頭へ戻す(登録済み経路・記録済み軌跡は削除しない。下記12節参照)
./pc-tool/build/install/pc-tool/bin/pc-tool simulator reset
# 疑似走行速度を変更する(m/s)
./pc-tool/build/install/pc-tool/bin/pc-tool simulator set-speed --speed-mps=3.0
# 測位品質を変更する(FIX/FLOAT/DGNSS/SINGLE/NONE)
./pc-tool/build/install/pc-tool/bin/pc-tool simulator set-fix-quality --quality=FLOAT
# NMEA送出を止める(5秒後にTablet側がstale表示になる。無害なheartbeatを送り続けるため
# watchdogによる自動再接続は発生せず、通信接続は維持したままstale-offまで解除されない)
./pc-tool/build/install/pc-tool/bin/pc-tool simulator stale-on
# NMEA送出を再開する
./pc-tool/build/install/pc-tool/bin/pc-tool simulator stale-off
# 疑似通信断を1回発生させる(製品のCOMMUNICATION_LOSS経路へ入り、debug側だけ約3秒後に再接続する。
# Running中は経過時間×速度だけ進捗をcatch-upし、中間NMEAは送らない)
./pc-tool/build/install/pc-tool/bin/pc-tool simulator communication-break
stale-on/communication-breakはDrogger Tablet側のBluetooth接続先がまだ「NMEA走行シミュレータ」に
なっていない場合、操作自体は無害だが実際には何も起きない旨をCLIが表示する(手順7を確認する)。
Drogger Tablet側で結果を見るには、Androidの履歴ボタンまたはホーム画面のアプリ一覧から
Drogger Tabletへ戻る(通常画面のままなら操作不要)。通常画面の「現在地」を押すと疑似現在地へ
追従する。
pc-tool simulator reset(reset_progress): Drogger Tablet内部の走行進捗を登録済み経路のRegisteredRouteEngineが持つ経路点列)、Drogger Tabletの実績軌跡.dtrk記録)のどちらも変更しない。両者を同じ「Reset」として扱わないこと。切り分けの確認例:
./pc-tool/build/install/pc-tool/bin/pc-tool simulator endpoint # 例: lat=33.2066099, lon=...
./pc-tool/build/install/pc-tool/bin/pc-tool simulator reset
./pc-tool/build/install/pc-tool/bin/pc-tool simulator endpoint # resetの前後で最終地点は変わらない
Drogger Tablet画面では、reset直後に現在地マーカーが経路の先頭へ戻る一方、それまで記録していた
ピンクの軌跡線は消えないことを確認できる。
pc-tool simulator <operation>は1回の実行につきTCP接続を1つ開いて処理し、応答を受け取ったら閉じる。
CLIプロセスを終了しても(Ctrl+Cやターミナルを閉じる等)、Drogger Tablet側のSimulatorTcpService・
受理済み経路・走行進捗は一切影響を受けない。次に別のターミナルから同じコマンドを実行すれば、
それまでの状態を引き継いで操作できる。
# 1回目: 現在地を設定してターミナルを閉じる
./pc-tool/build/install/pc-tool/bin/pc-tool simulator set-position --lat=33.21 --lon=133.10
# (ターミナルを再起動、または全く別のシェルから)最終地点は保持されている
./pc-tool/build/install/pc-tool/bin/pc-tool simulator endpoint
adb forward自体はadbサーバが生きている限り維持される。PC再起動、adb server再起動、Emulator作り直し後は
手順8をやり直す。Drogger Tabletのforce-stop/アプリプロセス再起動では登録済み経路・進捗が消えるが、
同じEmulator/adb serverならforwardは通常残る。迷った場合はadb_emulator forward --listで確認してから
同じforwardコマンドを再実行する。
| 症状 | 原因 | 対処 |
|---|---|---|
エラー: Drogger Tabletへ接続できません(127.0.0.1:47650)。... Connection refused |
adb forwardが未設定、またはDrogger Tabletが未起動 | 手順8のadb forward、手順6の起動を確認する |
adb: error: cannot bind listener: cannot bind to 127.0.0.1:47650 |
adbサーバが不整合な状態(WSL2環境で発生することがある)、または他プロセスがport 47650を使用中 | "${DROGGER_ANDROID_SDK:?}/platform-tools/adb" kill-server && "${DROGGER_ANDROID_SDK:?}/platform-tools/adb" start-server(serial指定不要、adbサーバ全体の再起動)の後、手順8をやり直す |
| CLIは成功と表示するのにDrogger Tablet画面の現在地・品質が変わらない | Bluetooth接続先が「NMEA走行シミュレータ」になっていない | 手順7を確認する。set-position/endpointはTCPだけで完結するため成功するが、疑似NMEA自体はBluetooth接続経由でしか流れない |
拒否されました: 既に登録済みの経路があります(初回送信ではなくsubmit-appendを使ってください) |
登録経路が既にある状態、または現在地設定済みの状態でsubmit-initialを送った |
endpointで最終地点を確認し、submit-appendで続きを送る |
拒否されました: --expected-lat/--expected-lonが現在の登録済み最終地点と一致しません(現在の最終地点: ...) |
--expected-lat/lonが古い、または他の操作で最終地点が変わった後だった |
メッセージ中の現在の最終地点を使ってsubmit-appendをやり直す |
エラー: protocol versionが一致しません(このCLI=.., Drogger Tablet=..) |
pc-toolとDrogger Tabletのビルドが古い/新しい組み合わせ |
双方を同じcommitからビルドし直す |
| Drogger Tabletを実機と間違えてインストール・接続しそうになる | DROGGER_EMULATOR_SERIAL(手順3)を設定し忘れた、またはadb_emulator関数を経由せず素のadbを直接使った |
本手順のコマンドは必ずadb_emulator(手順3で定義した、DROGGER_EMULATOR_SERIALを-sで指定するシェル関数)経由で実行する。adb devices -lで対象を再確認する |
DROGGER_ANDROID_SDK: parameter null or not set等、変数未設定のエラー |
別のターミナルを開いた、またはシェルを再起動して変数が失われた | 手順0.2(SDK)・手順3(serial)・手順0.3(JDK、必要な場合)をそのターミナルで再実行し、変数を設定し直す |
Web UIがFailed to fetch、確認中のままになる |
PC HTTP server停止、古いページ、またはadb forward/TCP Service不通 | http://127.0.0.1:47651/を再読み込みし、PC serverプロセス、手順8、Drogger Tablet起動を順に確認する |
| 地図は見えるが速度欄がない | ドラフトが0点または1点 | 「経路を入力」で行き先をクリックし、2点以上にする。登録済み地点がある場合は自動採用済みなので1回のクリックで2点になる |
| staleを押しても「情報が古い」にならない | 最後の有効測位がまだ無い、約5秒未経過、または「NMEA走行シミュレータ」未選択 | まずFIXで現在地を設定/走行し、Tabletに有効測位を出してから停止する。5秒以上待ち、手順7も確認する |
| ページ再読み込み後に灰色破線が消えた | 経路全形状はTablet status APIから復元しない既知制約 | 登録済み最終地点・走行状態は右欄/走行制御で確認できる。形状が必要なら新しい経路を作るか、改修時は保守ガイドの既知制約を参照する |
Issue #66でPCシミュレータ+Android Emulator構成へ移行する前は、dev.drogger.simulatorという
別APK・別ランチャーの「Droggerシミュレータ」アプリを同一Emulator内で操作していた。TCP通信実証
(Track #67)が完了するまで、このAPK・AIDL(:simulator-app/:simulator-ipc)は削除していないが、
現行の検証手順としては上記の手順を使うこと。旧版の地図編集UI・操作方法の詳細は
Droggerシミュレータ 地図経路編集UI仕様を参照
(現行の実装規範ではなく、旧構成を説明する履歴資料として扱う)。
シミュレータ関連コードは:appのsrc/debugだけに存在し、release variantには一切含まれない。
SimulatorTcpService、Issue #66 Stage A): loopback:47650でlistenするandroid.app.Service(exported=false)。RtkForegroundServiceからdev.drogger.tablet.service.SimulatorTcpServiceLifecycle.kt(debug/releaseそれぞれが同名関数をdev.drogger.tablet.simulationSimulatorIpcService・SimulationRuntime、Track #65): :appのsrc/debugだけに存在し、debugImplementationで:simulator-ipcへ依存する。src/releaseのcreateNmeaLinkFactoryはAndroidNmeaLinkFactoryだけを返す。release APKのdexへdev.drogger.tablet.simulation配下・dev.drogger.simulator.*・SimulatorTcp関連
クラスが含まれないことをTrack #65(dexdump)・Track #67(app-release.apkのclasses*.dexを展開し
stringsで検索)双方で確認済み。release向けmerged manifestにSimulatorTcpService/SimulatorIpcService
の<service>宣言が無いことも確認済み(Track #67)。「Droggerシミュレータ」(dev.drogger.simulator)は
別applicationIdの独立APKであり、Drogger Tabletのreleaseビルド・配布パイプラインからは常に無関係。