前回の記事
をXにポストしたところ、多くの方々からアドバイスをいただきました。ありがとうございます。
おかげさまで目的地に近づくと直線距離表示がバグるのはArduinoの計算桁数が不足しているために値が丸められてしまっているのが原因っぽいということが分かりました。たしかに目的地までの距離が近くなるとacos(x)のxの値が限りなく1に近づくので相当な小数点以下の桁数が必要になります。double型にしておけば良いというわけでもないんですね。(Arduinoの場合、double型にしても計算精度はfloatと変わらないそうです)
ハードウェアを計算能力の高いラズパイpicoWに
さて、じゃあどうする?ということでラズパイpico Wを入手。これなら計算能力は充分ある上、Arduino IDEでスケッチをそのまま書き込んで使えるらしい。
初期設定を済ませ、早速書き込み!さあどうだ!?
・・・
・・・・・・
・・・・・・・・・
待てど暮らせどOLEDには一向に距離表示が出てこない。いったんGPSはおいといてOLED単独で動作確認 → 問題なし。GPS単独で通信確認 → 衛星から情報を受信しているものの、一部しか受信(復調?)できておらず、NMEAセンテンスとして成り立っていない。。。シリアル通信は一応できているし、モジュールの受信状態を示すLEDも点滅しているのになんでじゃー
Arduinoに戻る
いったんは心が折れかけたものの、どうしても諦めきれずに調べていると、地球上の2点間の距離を計算する方法が他にもいくつか見つかりました。
1)ハーバーサインの公式
計算式だけでなくC言語のコード例もあったので実装してみましたがうまく動作せず。自分には勉強不足で理解できないところも多々あったので断念。
2)geographicLibというC言語のライブラリ
ナノメートルオーダーという凄まじい計算精度を持つらしい。これがライブラリにあるなんてありがたい!と実装しようとしたのですが、コンパイルが上手くいかず断念。
3)Hubenyの公式
三角関数(sin、cosのみ)を用いた公式なのでやりやすい。式を見る限り、日本国内の緯度経度なら桁数が少なくても計算が破綻するようなことはなさそう。そしてこの手法は無線家にはお馴染み、あの カシミール3D でも使われている手法らしい。ということでコレを実装してみました。
Hubenyの公式を実装
指数の計算等、慣れていないところでミスらないよう回りくどい書き方をしているので非常にダサいと思いますが、以下のように書いてみました。
double Rx = 6378.137; // km
double Ry = 6356.752314; // km
double x1 = gps.location.lng() * (M_PI/180); // 現在地の経度
double y1 = gps.location.lat() * (M_PI/180); // 現在地の緯度
double x2 = 135.00000 * (M_PI/180); // 目的地の経度
double y2 = 35.00000 * (M_PI/180); // 目的地の緯度
double E = sqrt(((Rx * Rx)-(Ry * Ry))/(Rx * Rx));
double Dx = x1 - x2;
double Dy = y1 - y2;
double P = (y1 + y2)/2;
double W = sqrt(1-((E * E)*sin(P*(M_PI/180)) * sin(P*(M_PI/180))));
double N = Rx / W;
double M = Rx * ((1 - (E * E)) / (pow(W,3)));
double kyori = sqrt(((Dy*M)*(Dy*M))+(Dx*N*cos(P*(M_PI/180)))*(Dx*N*cos(P*(M_PI/180)))); // 目的地までの直線距離
さて結果は如何に?
おぉぉぉぉ!距離が近くても破綻せずちゃんと表示してる!
試しに近所に目的地を設定してクルマで走ってみると、ちゃんと近づいていく様子が分かる。最後、 数メートル単位まで減っていった ときはシビれました。
よっしゃこれで完成!・・・と思ったのですが、目的地を日本各地に設定してみると場所によっては18%もの誤差。これはいくらなんでも大きすぎる。
目的地までの距離と誤差をプロットしてみるとこんな感じ。この他にも緯度・経度と誤差とか、現在地の座標に対し目的地がプラス側なのかマイナス側なのかとか、いろんな見方をしてみましたが規則性は見出せませんでした。この誤差も桁数まるめの影響なのかなぁ。
三平方の定理
ダメもとで三平方の定理も試してみることにしました。本来は地球の曲率も考慮した距離にしないといけないのですが無視します。地球内部を突っ切って最短で2点間を結ぶ直線の距離になります。地表をなぞった場合と地中を突っ切った場合とで誤差は出ますが、前述のHubenyの公式で発生した 18%の誤差よりはマシ なんじゃないだろうかということで。
三平方の定理を使うにはもう一つ課題があります。それは 緯度経度が直交座標ではない ということ。地球は球体(正確には楕円体)なので、経度1度あたりの距離が北にいくほど短くなります。例えば北海道(北緯45度)では経度1度あたりの距離はおよそ79km、沖縄(北緯24度)ではおよそ102kmです。これを直交座標として扱ってしまうと誤差がかなり大きくなります。
そこで、赤道直下(北緯0度)における経度1度あたりの距離:111.321kmに cos(緯度)を掛けることで緯度に応じた距離を算出する補正 をしてみました。赤道直下ならcos(0°)=1なので111.321km、北極点ならcos(90°)=1なので0kmという具合です。
double x1 = gps.location.lng(); // 現在地の経度
double y1 = gps.location.lat(); // 現在地の緯度
double x2 = 135.00000; // 目的地の経度
double y2 = 35.00000; // 目的地の緯度
double Dx = x1 - x2; //経度の差分(度)
double Dxkyori = Dx * 110; //経度の差分(km)
double Dy = y1 - y2; //緯度の差分(度)
double Dykyori = Dy * cos(((y1 + y2) / 2) * M_PI / 180) * 111.321; //緯度の差分(km)
double kyori = sqrt((Dxkyori * Dxkyori) + (Dykyori * Dykyori)); //目的地までの距離
Dykyoriの項で補正を行なっています。目的地と現在地の2地点の緯度の平均値を用いて補正しているので、2点の距離が離れるほど誤差は大きくなります。
さあどうだ!?
Hubenyより誤差が大きい。。。
こちらも誤差の大小に規則性は見出せませんでした。シンプルな計算なので桁数少なくてもなんとかなるかと思ったのですが。
暫定仕様
とりあえず ” 目的地に近づくと表示がバグる ” という最大の欠点は解消できたので一応は使えそうです。誤差が残っているのが気持ち悪いですが、そもそもルートの残距離ではなく直線距離を表示という時点で実用性は無い遊びアイテムなので、暫定仕様としてあちこち遠出するときに使ってみようと思います。気が向いたら誤差改善やラズパイのリベンジをしたいと思います。
ゴールデンウィークに初めて作ってみてバグが発覚してから1ヶ月以上。だいぶ苦しみましたが、おかげでほんの少しだけスキルが上がったように思います。アドバイスをいただいた皆さん、ありがとうございました!
5/3-5/4はライセンスフリー無線の一斉移動運用イベント、GW一斉オンエアデー。毎年、ローカル各局と浜松市天竜区の竜頭山に移動するのが恒例になっています。そしてこちらも毎年恒例になりつつあるヒョウゴTF246もふすけ、シズオカRT219よっしーも合流し、総勢6局の賑やかな移動となりました。
運用ポイントはスマホの電波もカスカス、キャリアによっては圏外になるほどの山奥。狭い林道を延々と進んでいくのですが、目印もあまりなく似たような景色が続くため、いつも「 着いたか!?・・・あ、違ったか 」を何度も繰り返しています。そこで、最近マイブームのArduinoを使って、GPSの電波を受信し、 現在地から目的地までの直線距離を表示 するアイテムを作ってみました。表示器にはOLED(有機ELディスプレイ)を用いています。せっかくGPSの情報を使うので、現在地の標高と受信している衛星の数も表示するようにしてみました。
集合場所での表示。上段が目的地までの直線距離(km)、中段が標高(m)、下段が衛星数(数字とバーグラフ表示)
途中まで順調に動作していたのですが、運用ポイントまでの直線距離があと3kmになったころ、3.114kmと2.022km、0.000kmの3つの数値をランダムに表示するようになってしまいました。標高と衛星数の表示は問題なかったので、おそらく距離計算の桁数まるめの影響ではないかと思います。 一番肝心なときに役立たず (笑。要改善ですね。
運用ポイントは標高約1100m。100m上がるごとに気温は0.6℃下がると言われているので、計算上は 平地より6.6℃低い ことになります。昼間は涼しくて非常に快適です。今回は風もほぼ無風でした。そのためこんなアイテムを使ってみました。
長さ5.4mと3.8mのロッドアンテナ です。以前購入したものの、あまりの長さに少しでも風があると撓ってしまい立てられないのでなかなか使う機会がありませんでした。さすがに5.4mは長すぎて不安なので3.8mの方をクルマの基台に立てて14、21、28MHzあたりで運用してみました。当然、モビホとは比べ物にならないぶっ飛び具合でした。
Nano VNAで5−50MHzのVSWRを計測してみるとこんな感じでした。ボトムは20.300MHzなので21MHzが良好なのはもちろんですが、14,28MHzでもそこそこ低いのでチューナーで十分実用になります。残念ながら電離層のコンディションが悪く、ほとんど隣国しか聞こえませんでした。21MHzでYJ0(バヌアツ)が聞こえましたが交信には至らず。
さて、メインの市民ラジオですが、合同運用各局が次々にJR6移動のイワテB73局と交信成功し、Es炸裂か!?と思われましたがその後は不発。グランドウェーブも例年に比べると静かでした。そうなると(そうでなくとも)合同運用の本領発揮!?宴会モード突入です。無線以外にもクルマなどの共通の趣味があるメンバーなので雑談が尽きることがありません。
気温は7℃ まで下がりました。前日から急に冷え込んだので夜を乗り切れるか心配でしたが、幸い風がなかったので問題なしでした。何年か前には強風で寒さに耐えきれず、泊まりをやめて急遽下山したこともあったっけなぁ。
翌朝。クルマから出るといきなり耳に飛び込んできたのはなんと 六甲山の運用局 の声!しかも 信じられないくらい明瞭に 聞こえています。慌ててリグを取り出し無事に交信成功。普通にラグチューできるほどの強さに驚きました。早朝のノイズが少ない時間帯だからこそでしょうね。その後もノイズレスな環境の中、東西各地に移動されている各局さんとの交信が楽しめました。
六甲山-竜頭山の直線距離は241km。鈴鹿山脈のちょうど谷間をうまいこと抜けるルートになっています。
日差しがかなりキツくなった昼過ぎに撤収しました。
ここ数年、無線のアクティビティがかなり低下してしまいほとんど運用していなかったのですが、久しぶりにたくさん交信ができてやっぱ楽しいな〜と実感したオンエアデーでした。各局さん、交信ありがとうございました!
<交信ログ> ※間違い等ありましたらお知らせください
2024.05.03 浜松市天竜区竜頭山(標高約1100m)
市民ラジオ リグ:SR-01
1435 イワテB73局 54/54 JR6
1443 ギフKT869局 54/53 長野県下伊那郡平谷村長者峰
1503 シズオカIRL154局 51/55 静岡県熱海市滝知山
1727 アイチJE37局 41/51 愛知県名古屋市
2119 ナガノAA601局 41/51 山梨県南都留郡鳴沢村
2122 セタガヤR28局 51/51 奈良県吉野郡十津川村護摩壇山
2125 コウベSL39局 56/54 愛知県田原市蔵王山
2128 ギフAA365局 51/51 山梨県南都留郡鳴沢村
アマチュア無線 リグ:TS-480 アンテナ:3.8mロッドアンテナ
1638 B4*** 21MHzSSB
1829 BG0*** 21MHzSSB
1839 B1*** 14MHzSSB
2024.05.04 浜松市天竜区竜頭山(標高約1100m)
市民ラジオ リグ:SR-01
0634 カワサキRJ21局 53/54 兵庫県神戸市六甲山
0639 キョウトLV206局 52/53 京都府相楽郡和束町鷲峰山
0641 ワカヤマRB27局 57/59 奈良県吉野郡天川村八経ヶ岳
0644 ヒコネA130局 57/56 三重県いなべ市石榑峠
0646 シガAS703局 56/57 三重県いなべ市石榑峠
0649 トウキョウTM140局 55/55 静岡県熱海市滝知山
0652 カナガワCB124局 56/54 静岡県田方郡西伊豆町仁科峠
0657 コウベSL39局 55/53 愛知県田原市蔵王山
0953 ギフAC102局 51/51 岐阜県岐阜市百々ヶ峰
0955 ギフRY927局 54/56 岐阜県不破郡関ヶ原町明神の森
0958 シガSR137局 55/53 岐阜県不破郡関ヶ原町伊吹山
1000 シズオカHA320局 57/57 静岡県浜松市浜名区富幕山
1002 ヒガシオオサカAA247局 57/58 三重県伊勢市朝熊山
1005 ミエAC129局 54/55 三重県四日市市四日市港
1007 ヒコネA130局 56/56 三重県いなべ市石榑峠
1050 シズオカAB634局 54/53 静岡県田方郡函南町玄岳
特定小電力無線 リグ:DJ-P221L
0911 コウベSL39局 M5/M5 愛知県田原市蔵王山
1019 アイチTR168局 M5/M5 愛知県田原市蔵王山
7月の最終土日はライセンスフリー無線の一斉移動イベント、SV!このイベントは例年山岳移動すると自分の中で決めている。Eスポ真っ盛りの時期ではあるが、やはり苦労して山に登った者同士の超高所間QSOは他に変え難い喜びがある。
日帰りだとせわしないので久しぶりにテン泊で行きたいが、体力も2017年の雲取山で壊した膝も心配。ハードすぎない手頃な山はないものかと探した末、八ヶ岳の最南端に位置する編笠山に決定。ここならテン場から30分ほどで山頂だし、反対方向には権現岳も聳えているので2ピーク制覇もできる。
金曜夜、新東名を経由して中部横断道を北上。ここが開通してから山梨・長野方面へのアクセスがかなり楽になった。ほぼ1車線のみの対面通行だが、交通量が少ないので快適そのもの。浜松だとコンディションによってはフェージングがきつかったり弱かったりであまり安定して聴けないAFNがこのへんだと普通に車で聴けるんだなーなんて思いながら観音平の登山口駐車場へ。
登山者の朝は早い。3:30頃には外が騒がしくなってきたが自分は明るくなるまで二度寝。のんびり朝メシを済ませて6:00登山開始!
笹地帯を抜けると”雲海”ポイントへ。雲海の向こうに富士山のシルエットが綺麗に浮かんでいた。
テント泊ということで ザックの総重量は17kg 。持ち上げたときは「ウソだろ!?」とその重さにぶっ飛んだが、背負って歩き始めると恐れていたほどキツくはない。いや、キツいんだけどなんとか頑張れるくらい。北岳のときのように両足太ももが攣ってしまわないよう慎重に歩を進める。
3時間ほど登ったところで山頂へのルートと巻き道の分岐が現れる。テン場のある青年小屋はピークの向こう側。山頂アタックは明日早朝に行うので迷わず巻き道を選択。ところがこれがキツかった。たしかに等高線通り高低差は大したことないがデカい岩がゴロゴロしておりむちゃくちゃ歩きづらい。おまけに前日の雨の影響でぬかるんでいる場所が多く岩に乗ると滑るので余計に気を遣う。
大きな岩に大股でよっこいしょと登ったり下りたりを繰り返すのはかなり足にくる。しかも狭くてそこかしこに枝が張り出しているので中腰でくぐらなくてはならずさらに足に負荷がかかる。ここまで3時間以上歩いてきた疲労も加わり一気にペースダウン。やっとの思いで小屋に着いたのは3時間40分。標準CTを少し超えてしまった。17kgの重量恐るべし。
小屋で受付をしてくれたお兄さんは奇遇にも浜松の人で、2ヶ月だけアルバイトで来ているとのこと。
まだ10:00前とあってテント場には数張しかなく、超フラットで石がない極上の場所をゲットできた。
涼しいかと思っていたけど日差しがかなり暑い。日陰に移動してカレーヌードルを食べる。山の上で食べるよりも美味いカップラーメンの食べ方をオレは知らない。
テントに荷物を置いて身軽になったら権現岳へと思っていたが、腹が膨れ、持ってきた座椅子に寄りかかったら完全に根が生えてしまいそのままダラダラと過ごしてしまった。携帯も圏外だし、何もすることがない。山頂アタックする人の列を眺めたり、ホバリングしているアブと戯れたり。デカいアブには足を食われまくった。払っても払ってもキリがない。オニヤンマ君や虫除けスプレーで対処している人もいたけど全然効いていないようだった。アキアカネも大量に飛んでたけどまるで気にしていない様子。ここのアブ強すぎる。
インスタのアイコンみたいな模様の蝶も遊びにきた。何度もタイツに止まっては蜜を吸おうと口を伸ばしていた。すまんな、それは花じゃないのだ。これだけ色んな色があっても必ず白を狙っていたのが興味深い。
13:00ごろ、テン場から少し離れたところに移動してちょっとだけCQCQ。山梨県南都留郡鳴沢村移動のながのAA601局、やまなしFK909局から応答いただいた。鬼の御殿場口から富士山頂を目指しているであろうとうきょうSS44局ともつながるかと思ったが応答なし。後から知ったのだが、このころSS44局は超重量級ザックと蟻地獄のような砂、そして体調不良により登頂を諦め下山されていたとのこと。SS44局の化け物級の体力を以てしても断念とは恐るべし御殿場口。
自分も過去に登ったが、まずその果てしなく遠い景色に心を折られる。 富士山どこ? ってくらい遠い。そして1歩進むと半歩ズリ下がる砂の足場。山小屋泊だったので荷物は軽いし2日に分けての挑戦なので山頂まで辿りつけたけど、それでも過酷だった記憶しかない。なにしろ他の3ヶ所の登山口が標高2400m付近からスタートなのに対し御殿場口は1440mから。5合目とは名ばかりで実質2合目ですから。
イベントデーなのでもっと運用局いるかと思いきや意外と静か。場所が悪いのか?夜に備えてまだみんな準備中なのか?早々にテン場へ戻り再びダラダラタイム。テン場からサンダル移動で運用できるような場所があるといいな。ここは15分くらい岩渡りをするか山頂まで上がらないと見通しが悪い。無線運用的には場所の選定はちょっと失敗でした。
午後になるとだいぶテントが増えてきた
翌朝、明るくなると同時に行動開始。5:00頃に山頂へ。500kmを超える彼方、石鎚山で運用されているフクオカAB182局の電波を捉えるべくロッドアンテナを伸ばす。全チャンネルを注意深くワッチするも誰も聞こえてこない。状況が分からないのでひとまずCQを出してみると早速ナガノAA601局からコールバック。DXチャレンジは4chで行われているということ、サイタマKM117局が呼んでいるということを教えていただいた。とうきょうSS44局からも呼んでいただき、昨日下山してフジリン移動隊に合流されたことを知る。
4chで耳をすますが残念ながらAB182局の声は聞こえてこない。サイタマKM117局にお声がけするとかなりしんどそうな声。どうやら高山病にやられている様子。それでも山頂まで上がって無線運用しているのだから恐れ入る。
SS44局といいKM117局といい、大ベテランのお二方がここまで苦しむとは。。。この日の富士山には 魔物が棲んでいた としか思えない。
山梨県笛吹市移動のヤマナシAB38局、熱海市滝知山移動のカナガワCB124局から応答いただきCQは一巡した模様。この時間だからまだ運用局少ないのかな。平地運用局が増えてくる9:00ごろまで運用しようかと思っていたけど、 ジルイ兄さん達 と交信できたし、特小でも各局さんと交信できたので、交信数は少ないものの満足して下山することに。
山を見ろ!と言わんばかりの見渡す限りの雲海。 富士山〜南ア〜中ア〜御嶽山〜北アまで一望 のすごい景色。
山頂からテン場へ戻る途中、おそらくテントを撤収したフル装備で山頂に向かう人としばし雑談。自分と同じく昨日巻き道から来たとのこと。巻き道ってもっと楽なもんじゃないのか!?あんなの聞いてないよね!と盛り上がった。
山頂直下から青年小屋と権現岳を望む
テントをたたみ、2時間10分で下山完了。最後の30分ほどで恐れていた膝痛が出てしまった。たぶん飛ばしすぎでドスン着地になっちゃってるんだろうな。ゆっくり下りる自制心と、そろーりそろーり歩きにも耐えられる筋肉をつけないといかんなぁ。
今回、食料も水分も防寒装備も過不足無くドンピシャだった。これが意味することは、 17kgからもう削る余地が無い ということである。マジかよ。けどまたしばらくするとテン泊したくなるんだろうな。
<ログ>
7月29日 編笠山山頂直下
市民ラジオ
1304 ナガノAA601局 54/55 山梨県南都留郡鳴沢村富士林道
1309 ヤマナシFK909局 55/56 山梨県南都留郡鳴沢村富士林道
7月30日 編笠山山頂
市民ラジオ
0515 ナガノAA601局 55/56 山梨県南都留郡鳴沢村富士林道
0520 とうきょうSS44局 54/55 山梨県南都留郡鳴沢村富士林道
0523 ヤマナシAB38局 53/58 山梨県笛吹市
0534 カナガワCB124局 51/41 静岡県熱海市滝知山
特定小電力無線
0559 ナガノAA601局 M5/M5 山梨県南都留郡鳴沢村富士林道
0603 とうきょうSS44局 M5/M5 山梨県南都留郡鳴沢村富士林道
0607 やまなし FK909 局 M5/M5 山梨県南都留郡鳴沢村富士林道