virt_flyのブログ -50ページ目

virt_flyのブログ

フライトシミュレーターソフトのFlightGearで仮想飛行を楽しむブログです。

風をとらえ大空に舞い上がる

 

忙しくしていて気付かなかったのですが、暦と実際の休日が違っていてびっくりしました。日曜でも疲れがとれず翌日19日も休みの日で良かったと思っていたら、なんと平日だそうでかわりに4連休ができたんだと。

 

十分休息できるのであればそれにこしたことはないわけで、思えば5月の連休前から休み無し状態でしたから、この際大いに休み、久しぶりにFlightGearでも楽しんでリフレッシュすることにしました。

 

 
↑FlightGear2020.4.0のAdvanced Graphics Options画面  
 
↑FlightGear2020.4.0のFlight Recorder control画面  

FlightGearのUnstable nightly buildはバージョンが2020.4.0で、従来のALS(Atmosphenic Light Scattering)とRembrandtの区別はまったくなくなり、rendering modeの選択は低スペックパソコンへの対応が選べるようになりました。

 

ちなみに、FlightGearにはInstant Replayというその場でただちにそれまでのフライトを再現する機能があり、それを Flight Recorder Tapeというファイルに保存し、再生することができるのですが、これまでバーの「File」からただちにsaveとloadが実行できたのにかわり、「Flight Recorder Control」というダイアログボックス上からとなっています。今回録画しようとして少々慌ててしまいました。まだ確かめていませんが、どうやらいろいろな機能が付加されているようです。

 

さて、録画しようとしていたのは、ソアリングです。フライトシミュレーターであっても、グライダーに乗り風をとらえ、大空に舞い上がっていくのは、なんて素敵なことでしょう。一度経験したらもう虜になってしまうもの。ぜひ、動画に残したいと以前より思っていましたので、この機会に挑戦してみました。

 

できた動画は、悔しいことにソアリングの素晴らしさをお伝えするのにふさわしい出来とはならず残念です。しかし、FlightGearなら、山肌にぶつかり駆け上っていく風ridge liftを再現し、長時間にわたって吹き続ける風に乗ってゆるゆると飛行が可能なridge soaringを、簡単に実現してくれることはわかってもらえるのではないでしょうか。次の動画をぜひごらんください。

 

 

空港はNötschim Gailtal(ネッチュ・イム・ガイルタール)という私用空港を指定(ICAO空港コード:LOKN)、EnvironmentからWeather Conditionを開き、Basic Troposphere Weather Conditionsで風向きは180°、風力は20ktsに設定。

 

機体は、バリオメーターの音もけたたましく、まるで吸い寄せられるかのように山肌に沿ってぐんぐん上昇していきます。吹き付ける強い風の力で機体が山肌に叩きつけられないよう、山肌には近づきすぎず、かつ上昇を示すバリオの音が鳴る範囲内に留まるよう山から離れすぎないようにも注意して機体をコントロールします。山の高さを超えるところまで上昇したら、山の稜線を超えて上昇気流から外れることのないよう気をつければ、風向きもかわりませんからずうっと飛び続けることができ、心ゆくまで空の散歩が楽しめます。

 

 

↑パソコンの手前が、クリップ付き心拍センサー、右がHATのついたRaspberry Pi Zeroとリチウム電池、左は心拍数をモニターするスマホ。パソコンにはCSV出力されたデータが映っている。

定期実行に使えなかったcron

GROVE心拍センサー

 

以前より、心拍計をつくってみたいと、一度はIchigoJamにてこしらえてみた(こちら)こともありましたが、今回は耳や指をはさむクリップ式の心拍センサーを使った本格的なものに挑戦したいと思います。

 

とは言っても、Raspberry Pi Zeroにセンサーをくっつけるだけで、借りてきたプログラムを走らせればほぼほぼ完成。表示用のディスプレイがあればそれにこしたことはないという、簡単なものです。

 

ただし、測定データをCSVファイルに書き出せるようにしたいと、考えます。

 

使用したのは、Seeed社製のGROVEシリーズの心拍センサー。プログラムは、ヨシケンさんが書かれたRaspberry Pi用をもとに加工することにしましました。

 

時刻表示とCSV出力

 

ヨシケンさんのheart.pyをRaspberry Piで実行すると、最初20秒ほど計測ができるか確かめた後に、ターミナルにHeatRateとIntervalの2つの数値が表示されようになります。

 

心拍数は順次更新されて表示されていきますので、現瞬間での心拍数(拍/分)を確認できますが、このままでは記録は残りません。他のデータ(例えば歩行率など)と比較したりする上では、CSVファイルに出力できないと不便ですし、測定された時刻、分、秒が記録されることが望ましいのは言うまでもありません。

 

さて、そのようにプログラムを改変、実行して如実にわかるのですが、データは毎秒ではなく、同じ秒数台で2回計測されている場合が頻回です。そりゃそうです。実際に手で脈をとりながら確認しましたが、脈打つ毎にRaspberry Piは脈拍として計測し、表示が更新されていました。アスリートでもなければ、通常でも脈拍は60〜70と1秒以下ですから、同じ秒台で2回脈拍が計測されておかしくはありません。

 

cronにかわる方法は

 

先に述べたように、他のデータと比較したいとなると、計測間隔が同じでないと較べにくいのは明らかです。それなら前回覚えたcronで定期計測、と思ったのですが、よく考えれば心拍計のプログラムは、計測開始時20秒ほどの間は計測できるかを確かめていて、計測データを表示しないようになっています。

 

すなわち、cronで1秒毎に定期計測を試みても、その都度20秒間の待機のために、いつまで経っても計測がはじまらないという事態が予想されます。

 

cronに変わる方法を考えなくてはなりません。Pythonのscheduleが定期計測に使えそうです。でも、悲しいかな、Pythonプログラミングのまったくの初心者である私には、まだ上手く使えません。

 

致し方なく、乱暴ですが同じ秒台にあるデータは書き出さない、つまり一つ前のデータの計測時刻と秒数が同じなら条件分岐で新規のデータはCSVファイルに書き出さないように、プログラムを改めました。まあ、プログラムで対応しなくても、後で生データをエクセルで処理しても良いでしょうが。

 

測定心拍数が高め!

 

一難去ってまた一難。作成した心拍計の心拍数が4〜5%高めに出ているように思われるのです。手元にある心拍数を表示してくれるウォッチタイプの活動量計2つと比較しても、3〜4拍ほど高いようです。

 

高額なものは別にして、測定したデータを記録し後にパソコンで処理ができるような心拍計が、他に見当たらないので、実用にならないとなると頭をかかえてしまいます。

 

しかし、心電図のRR値にあたるInterval値に間違いがなさそうなことは、手で脈を測った際に確認できてますから、無理やりデータを定時記録などせず、生データを利用したほうが良さそうです。

 

そう思って、あらためて測定データを見ていて、プログラムに誤りがあることを直感しました。

 

うっかり「=」を入れて、平均値の計算を誤った

 

心拍数は、1分間の拍動の数。60秒をIntervalで除した値です。プログラムでは、過去20回の拍動の間隔を合計して、その平均値で60秒を除すつもりで、実際には19回のIntervalの平均値をだすのに20回で除しています(正確には、Intervalを除すかわりに60秒を20倍しています)。

 

参考にさせていただいたサイトにあるスクリーンショットのデータで計算してもわかることですが、「−1」の表示が18回続いた後に初めてでてきた心拍数の59.6339580634という値も、まさに20で除したことがわかる数字で、正しくは19で除した56.6522601603でなければなりません。心拍数が高くでるわけです。

 

Rspberry Piで心拍センサーを使いたくてPythonプログラムをさわりはじめたばかりの初心者が、まだ良く理解もできていないのに言うのは恐縮ですが、おそらく条件分岐で len(self.detected_times) >= self.MAX_DETECTED_TIMES_COUNT):と「=」をうっかりいれてしまったミスと思われます。

 

これで安心して、次にすすめるというものです。          

 

 

追記)

pycolorやdecimal

 

ターミナル上でモニターしやすいように、pycolorで心拍計らしく赤色のハートマークを表示させ、decimalで鬱陶しい少数点以下の表示を制限するなど、覚えたてのPythonを楽しんでいます。

 

 

<参考>

Raspberry Piで心拍センサーが使えたのは、この記事のおかげでした。

↑10秒おきの湿度、気温が記録されたCSVファイルをUbuntuパソコンからリモート操作で開いたRASPberry Pi Zero

 

cronでPython実行

appendモード

 

前回のブログで宿題となっていた一つが、CSV出力がファイルの新規作成となり、それまでのデータを上書きしてしまう問題です。

 

毎回実行するたびに書き換えも別に悪くはないのですが、保存をし忘れていたり、書き換えられて困る場合のことも考えておいて損はありません。

 

CSVファイルに追加していく場合はappendモードでと言われますが、Pythonではどうすればよいのでしょう。調べたところ、open関数の最後のところで"w"としていたものを"a"とすれば、追加になりました。

 

  f = open("data.csv","w")
        ↓
  f = open("data.csv","a")

 

cron

 

問題は、もうひとつのほうの定期実行です。

 

やはり、ここはcronじゃないでしょうか。「ラズパイで二酸化炭素濃度を測定」のときに学んだものです。その時にはシェルスクリプトを使いましたが、今回は下記のように直接Pythonスクリプトを指定しました。

 

 * * * * * python /home/username/SI7021.py

 

なお、今回のSI7021.pyは、データ出力のための繰り返しの記述はあらため1回きりにしたのは言うまでもありません。

 

冒頭のスクリーンショットは、10秒おきの湿度、気温が記録されたCSVファイルをUbuntuパソコンからリモート操作で開いたRASPberry Pi Zeroの画面です。