« ポータブル電源+車載空気ポンプも鬼門だった | トップページ | 黙らせる力 »

2023年11月30日 (木)

楽ナビの登録地点のフォーマット

下の記事に関連して「楽ナビの登録地点を編集するツール」をこちらに公開しました。

背景
パイオニアのカーナビには「登録地点」と言う機能があり、ユーザーが設定した任意の地点をカーナビに登録しておき、経路検索の際に目的地や経由地として簡単に参照できるようになっている。しかしこの「登録地点」を登録する際には、ユーザーがナビ画面上の地図で場所を探したり、名前をつけるならナビ画面上のキーボードで一文字ずつ入力したりと手間がかかる。パソコンやスマフォ、タブレットなどと違い、カーナビの動作はいちいち遅く、タッチパネルの反応も不安定であり、画面が車に固定されているので楽な姿勢で操作できないのも使い勝手を悪くしている。
こういった問題に対してパイオニアは、登録地点をパソコン上で編集するソフトを公開しているが、MS-Windows用しか用意しておらず、しかも最新版のWindowsでないと編集できるナビ側のバージョンが大幅に制限されるなど、「やってますよ」とアリバイを作る以上のことをしていない。(上記ソフトの出来も首を傾げる内容だし)
パイオニアが自分で開発できないなら技術的な情報を公開してユーザーに任せる道もあるだろうに、そういうこともしていない。
私としては、車の機能が統合されていなければこんなナビなど使わないのだが、車の一部機能との連携のためにしょうがなく選択せざるを得ない。

目的
文句を言っていてもしょうがないので、自分で登録地点を編集する方法を探ることにした。今回は登録地点のファイルフォーマットについてわかったことをメモしておく。

登録地点をどうやって編集するか
パイオニアのカーナビには登録地点をSDカードに書き出し/読み込みする機能がある。元々は、カーナビを機種変更した時に旧機種から新機種へユーザーの登録地点を引き継ぐための機能らしい。
このSDカード上のファイルを何らかの方法で書き換えれば、書き換え後の登録地点をナビに読み込ませることができる。この書き換えのために必要なファイルのフォーマットを以下で解説する。

前提条件
対象カーナビ : 楽ナビ AVIC-RZ711
おそらく、以下の機種でもファイルフォーマットは同じ。
AVIC-RQ911/RL911/RW911/RZ911/RL811-D/RW811-D/RZ811-D/RL711/RW711/RZ711/RQ911-E/RL711-E/RW711-E/RZ711-E
また、パイオニアの他の楽ナビ、サイバーナビでも、似たようなフォーマットをしているだろうから、以下の情報は参考になるだろう。

書き換え対象のファイル
登録地点データ書き込み後のSDカードにある次のファイル。
/NAVIDATA/POINT/POINTREC.D05

ファイルフォーマット
○全体構成



ファイルの先頭にはヘッダ(32バイト固定長)があり、その後に登録地点の数だけレコードが続く。レコードは一応可変長だが、888バイトであることが圧倒的に多い。

○ヘッダ内部の構成

オフセット 長さ 内容
0 2 0x0000固定
2 2 CRC
4 8 文字列”PNTR4.00”
0x0C 8 タイムスタンプ
0x14 8 不明
0x1C 4 ファイルに含まれるレコード数


上記表に出てくる数値(CRCやレコード数)のバイトオーダーはすべてリトルエンディアンである。
以下、各項目の詳細。
・CRC
CRCは、ファイル先頭オフセット4バイト目からファイル末尾までを計算して求める。
CRCの種類はCRC16/CCITT-X.25であり、パラメータで表すと次の通りである。
Poly=0x1021、Init=0xFFFF、RefIn=True、RefOut=True、XorOut=0xFFFF

・タイムスタンプ
8バイトのBCD表記で、例えば次の例は2022/05/16 14:29:07 を表している。
0x1605 2220 FF07 2914
ここで0xFFは埋め草であり、0x00の場合もある。
また2022年が0x2220になっているのは、パイオニアのカーナビがリトルエンディアンだからだ。

○レコード内部の構成

オフセット 長さ 内容
0 2 レコードの長さ
0x1C 0x100 地点名の読み(カナ)
0x11C 0x108 地点名(漢字混じり)
0x224 4 東経
0x228 4 北緯
0x22C 0x1C 電話番号
0x250 4 不明(固定値?)
0x254 4 レコードID
0x258 4 グループID
0x25C 4 アイコンID
0x260 4 不明(固定値?)
0x264 8 作成タイムスタンプ
0x26C 8 更新タイムスタンプ
0x274 8 参照タイムスタンプ
0x27C 4 バージョン番号
0x280   以下、不明


上記表に出てくる数字(レコード長や統計、北緯など)のバイトオーダーはすべてリトルエンディアンである。
レコードの内部は不明な部分が多く、上記表では不明な部分を飛ばしている。編集するときはその部分をいじらないのがよさそうだ。特に、登録地点のうち「自宅」は他の登録地点と違う特別な地点だが、レコードのどこで表現しているか分からないので、目的外のところは触らない方が良い。
以下、各項目の詳細。

・レコードの長さ
0x378(=0d888)バイト長であることが圧倒的に多いが、たまに違うことがあるので決めうちにしないこと。

・地点名
Shift-JISコードで書かれた文字列。

・地点名の読み
半角カナまたは、Shift-JISの全角カナである。レコードごとに半角、全角が違っていても動作に問題はないようである。

・東経、北緯
レコード中の上記4バイトをリトルエンディアン32bit整数として読み込んで、(読み込んだ整数/3600/256) した値が日本測地系Bessel座標を表している。例えばレコード中で0x00 B0 A2 07であったなら0x07A2B000=128102400であり、128102400/256/3600=139.00度 を表している。
座標は日本測地系なので、GoogleマップやAppleマップなどの表示する世界測地系座標とは同じ値でも数百mのずれがある。日本測地系と世界測地系の間での座標変換は、国土地理院やMapFanのWebサイトでできる。

・電話番号
目的地の店舗などの連絡先を記録しておくもので、レコード中ではASCIIコードで表された数字文字列である。

・レコードID
ファイルの中でレコードごとにユニークな値を持っているのでレコードの識別子と思われるが、ナビに読み込むと付け替えられることも多いので、ほぼ意味はない。同一地点か別地点かの区別には、後述の「作成タイムスタンプ」の方が支配的な影響力を持っているようだ。

・グループID
ナビの持つ登録地点のグループ化機能で、レコードの地点がどのグループに属するかを示している。

・アイコンID
登録地点をナビの地図上に表示するときに使うアイコンの種別を示している。

・作成タイムスタンプ、更新タイムスタンプ、参照タイムスタンプ
それぞれのタイムスタンプは、地点をナビに登録した時、登録済み地点の内容を編集した時、登録地点を経路検索などで利用した時、を表している。形式はヘッダのところで説明したものと同じ。
これらのタイムスタンプはナビの動作に大きく影響し、例えば参照タイムスタンプが新しいものは登録地点のリスト表示で上位に表示されるし、SDカードでナビに登録地点を読み込ませる時、ナビの中に同一地点が残っていれば2つのうち、更新タイムスタンプが新しい方で上書きされる。
また、SDカードの中の地点とナビの中の地点が同一か別かの判断は、地点名や座標ではなく、作成タイムスタンプで行なっているようである。そのおかげで地点名や座標を編集しても同一地点と判断されて、似たような地点がいくつも登録されることを防げる。

・バージョン番号
登録地点を(ナビ上で)編集するたびにインクリメントされるのでその地点の登録内容のバージョンを表すと思われるが、SDカードでの読み込時に新旧の判断をする基準は前述の通り更新タイムスタンプなので、ナビの動作にどういう意味を持つのか不明。

以上、ファイルのフォーマットは上記の通りである。
登録地点の内容を書き換えたければ、(1)ナビからSDカードへ一旦書き出し、(2)バイナリエディタなどで必要な箇所を編集し、(3)編集したレコードの更新タイムスタンプも新しくし、(4)ヘッダのCRCを計算して更新し、(5)SDカードからナビに読み込ませる、という手順を踏む。(3)のタイムスタンプの更新をしないと、ナビは新しいデータと思わずに書き換えてくれない。ここで作成タイムスタンプを更新すると、新規の地点として登録されるし、参照タイムスタンプを更新したらリスト表示した時に最上位に表示される。
なお、上記動作はナビの機種によって違う可能性もある。

« ポータブル電源+車載空気ポンプも鬼門だった | トップページ | 黙らせる力 »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« ポータブル電源+車載空気ポンプも鬼門だった | トップページ | 黙らせる力 »