2009年6月18日木曜日

Solvreの演習

HP200LXの日本語マニュアルPDFがHPのサイトで公開されており、その中に、地表の2点間の緯度、経度を与えて、その2点間の距離を概算する式が出ています。

* 変数の割り当て

地点1の緯度、経度をLT1, LG1
地点2の緯度、経度をLT2, LG2
2点間の距離をDIST

* 計算式

DIST = 111.11973148*ACOS(SIN(LT1)*SIN(LT2)+COS(LT1)*COS(LT2)*COS(LG1-LG2))

※ マニュアルにある式は「法定マイル」という単位で計算する式で、式中の定数が異なります。こちらの式はキロメートルで結果を出します。

HP50gで計算させてみましょう。

東京タワーの位置は、35.658611 N, 139.745556 Eの辺りだと言います。もう片方の場所は、北鮮のムスダンリにでもしておきましょうか。ムスダンリの位置は、およそ40.855938 N, 129.665676 Eのようです。
この計算式では、東経と南緯は負数で与える必要があります。また、上記では十進度で角度を与えていますが、度分秒で与えるには、「HMS->」などの関数を用いて十進度に変換する必要があります。それに注意して計算すると、つぎのようになりました。

DIST = 1051.10059907 [km]

ここでは、HP50gのSolvreで計算させてみましたが、HP35Sでも同様に計算できます。但し、35Sの場合には変数が1文字という制限があります。

では、なぜ「概算」なのでしょうか。

実はこの式、地球が真球に近い前提で計算を行っているのです。実際の地球は偏平になっているので、細かいことをいうと色々と面倒なことになりそうです。

ちなみに、上記式の導出はHP50gで簡単に行えます(筆算でも余り難しいものではありません)。2地点の経度、緯度を与えてやれば、その2点の方向を示す単位ベクトルが定まります。すると、ベクトルの内積を用いれば、2点間の角度のcosineが求まります。後はarc-cosineを計算、更に単位角度あたりの地表面上の距離を計算する定数を掛ければ、おしまい。

この手続きを実際に計算すると、こんな具合です。
地点1、2の単位ベクトルをスタックに置きます。計算の簡便化のため、LG1-LG2 を D とおきました。

[ 'COS(LT1)' 0 'SIN(LT1)' ]
[ 'COS(LT2)*COS(D)' 'COS(LT2)*SIN(D)' 'SIN(LT2)' ]

そして、ベクトル内積を計算する「DOT」を実行します。これだけ。TIのDerive電卓でも簡単に計算できると思いますから、お持ちの方はおためしを。


追加 on 2015/04/19
200LXのマニュアルのあるページへのリンクを入れました。

6 件のコメント:

akira さんのコメント...

こんばんは。

これは電卓に入れておくと便利そうな式ですね。以前、PalmデバイスとGPSをCOMポートで接続して、2点間の距離を求めたかったのですが、方法が分からずじまいでした。 何となくの計算をしても、それらしい値が出なかったものでして。

8年ぐらい前までは、印刷物の地図もハンディGPSも、測地系はTOKYOだったのですが、クリントン前大統領がGPSの強制精度劣化を解除したお陰で、精度が一桁以上良くなりました。それから普及が進み、地図もGPSも測地系がWGS84楕円体に統一されつつあるので、近似値はこれを使えば良いのかなと思います。

P.S)先日2GBのリテール品SDカードを入手したのですが、hp50gに使用できず、某所で愚痴を書いてます。お目汚し失礼しました。

akatuki さんのコメント...

Akira様、こんばんは。遅れてスマソ。

> これは電卓に入れておくと便利そうな式ですね。
そうでしょ ? こうした式をしこたま載せて電卓を活用したいなぁ、と考えていたので、このエントリを書いたのです。

> 以前、PalmデバイスとGPSをCOMポートで接続して、2点間の距離を求めたかったのですが、方法が分からずじまいでした。 何となくの計算をしても、それらしい値が出なかったものでして。
実は、このHP200LXマニュアルの式なんですが、以前から気になっていたものを先日、再び見直していたらベクトル内積で簡単に判る、と気付きまして。余りにウレシイので書いてしまったのでした。

> 先日2GBのリテール品SDカードを入手したのですが、hp50gに使用できず、某所で愚痴を書いてます。
はるまき様のBSSでしょうか。当方もお邪魔して居ります。

そういや、かなり前の話ですが、Akira様blogのTwitterに、AVRマイコンをお仕事で使うことになった、とありましたね。当方、AVRマイコンはWinAVRがあるので、かじってみようかと考えた事があるのですが、それよりはPICの方が入門書が多そうで、色々と調べて居る所です(まずはハードのお勉強)。お仕事で使うとなるとWinAVRとかを使うこともないのでしょうが、どんなものなのでしょうか。

akira さんのコメント...

こんばんは。

 PICマイクロコントローラは、2000年から使っています。当時は後発であるAVRもラインナップが今ひとつでした。ところが、ATMegaシリーズが登場してから、強力な8bitMCUシリーズになりました。

PICには12bit、14bit、そして16bitシリーズ、DSPのdsPICシリーズと4種類あり、それぞれCPUアーキテクチャが異なりますし、C言語では16bitシリーズ以上が良いかもしれません。それ以下はアセンブラで十分です。プログラム容量もパフォーマンスも。

 一方のAVRは、ローエンドのtinyからハイエンドのmegaまで、どのチップも同じCPUコアです。しかもレジスタ群や命令がCコンパイラを意識しており、GCCプロジェクトも放って起きませんでした。-> WinAVR

#某所ではPICは変態アーキテクチャと言われていて、その変態さにGCCプロジェクトは見向きもしません。ですから有料なCコンパイラしか使えず、残念です。

 PICが流行っているのは、秋月電子と後閑さんと、マイクロチップの日本法人の功績が大きいと思います。AVR+WinAVRを知ってしまうと、PICを使う理由が見つかりません。
AVRで不自由ならば、SH-2やARMなどの32bitMCUを使った方が良いと感じます。

akatuki さんのコメント...

akira様、早速のお返事有り難うございます。

> PIC には12bit、14bit、そして16bitシリーズ、DSPのdsPICシリーズと4種類あり、それぞれCPUアーキテクチャが異なりますし、
やはり、別々に憶えないとなりませんかね。とはいえ、当方は未だ、12bitのアセンブラを憶え始めた程度なので高望みはしておりません。それ以前にハードのお勉強をしないとならないクチなのでした。

> それ以下はアセンブラで十分です。プログラム容量もパフォーマンスも。
アセンブラの勉強も兼ねて、という感じで調べているのですが、最近はなかなか憶えられませんよ、ニモニックも。年取りすぎたか(泣)。

> 一方のAVRは、ローエンドのtinyからハイエンドのmegaまで、どのチップも同じCPUコアです。
どうりで、一緒くたみたいに扱っていると思った。

> しかもレジスタ群や命令がCコンパイラを意識しており、GCCプロジェクトも放って起きませんでした。-> WinAVR
それでAVRではC言語が標準という雰囲気なのですね。

> #某所ではPICは変態アーキテクチャと言われていて、
いわゆる「宗教戦争」ですね :-)

> PICが流行っているのは、秋月電子と後閑さんと、マイクロチップの日本法人の功績が大きいと思います。
確かに。ある意味、当方みたいにずぶの素人がこうしたものを始めてみようか、と思ってしまったのは、この辺りの人々に踊らされてしまったのかも。

> AVR+WinAVRを知ってしまうと、PICを使う理由が見つかりません。
秋月ではAVRのTinyが100円くらいで、PICよりも安く買えるのにビックリしました。しかも使いやすい(らしい)。それに当方ヘタレなので、Cで使えれば結構楽か、と易きに流れてしまいそうな ... 。(もちろん、組み込み向けですから、アセンブラの知識も重要なのは判りますが)

> AVRで不自由ならば、SH-2やARMなどの32bitMCUを使った方が良いと感じます。
ウーム、ここまで行ってしまうとやはりプロフェッショナルの世界でしょうか。

大変興味深いお話で、有難う御座いました。やはりAVRも良さそうですが、その前に基礎を、と思っている段階なので、その内にでもAVRを使ってみたく思います。

akira さんのコメント...

こんばんは。

>この辺りの人々に踊らされてしまったのかも。
 書籍が豊富であるのはPICの良いところだと思います。私もPICの本が本棚一杯になってます。
アルゴリズムや回路などは、どのMCUにも使えるテクですので、損な知識にはならないのですが。

>Cで使えれば結構楽か、と易きに流れてしまいそうな ...
 WinAVRは、コンパイルするとアセンブラのリストを出力してくれます。これを眺めると、結構アセンブラの勉強になります。Global変数の割り当てや、スタックへの待避・復旧など。

>>ARMなどの32bitMCUを使った方が
>ウーム、ここまで行ってしまうと
 そこでhpgccですね!!!


最近のPICのトレンドは、18Fシリーズ(16bit)をC言語で開発することのようです。PICは、チップは良くできていると思いますし、本家にApplicationNotesが豊富にあるので、読んでみると面白い応用例が載っていたりしました。

akatuki さんのコメント...

Akira様、こんばんは。

>> この辺りの人々に踊らされてしまったのかも。
> 書籍が豊富であるのはPICの良いところだと思います。私もPICの本が本棚一杯になってます。
> アルゴリズムや回路などは、どのMCUにも使えるテクですので、損な知識にはならないのですが。
当方の場合、電子工作をやってみたい、という程度の動機ですので、むしろ、こうした楽しみを教えてくれた、この辺りの人々には感謝している次第です。

> そこでhpgccですね!!!
ウーム、そう来ましたか ... 。当方の場合、HP-GCCのネタを書いておきながら、最近は余り活用していないので、耳の痛い話ではあります。

> PICは、チップは良くできていると思いますし、本家にApplicationNotesが豊富にあるので、読んでみると面白い応用例が載っていたりしました。
当方の場合ハードの方は素人ですし、PICとAVR、どちらが良いと評価できる段階にはないので、色々な石の勉強をポツポツ進めて行こうかと思っております。

当方、取り敢えずはPICから勉強している所ですが、こうしたお話は勉強の励みになります。色々とお知らせ戴き、有り難うございます。