dynamicsoar's log

主に研究関係のメモ

mac (w/ Python 3 & PyQt5) で ocXgag

Introduction

鳥人間な制御屋さんが公開してくれた ocXgag という翼型の調整ソフトがちょっと面白そうだった:

が、Windows にしか対応してないとのことだったので mac で使えないかとやってみた。ただ mac 固有の問題というよりは PyQt のバージョン違いの問題なのかも。Qt に触れるのが初めてなのでよくわからない。いずれにせよ、結論としては、コードを少しいじって Xfoil をインストールしたら動くようになった。

なお起動方法は単純に、コマンドライン(自分は iTerm 2)でスクリプトのあるディレクトリまで移動し、

$ python ocXgag.py

とするだけ。

検証環境

Methods & Results

スクリプトの書き換え

PyQt のバージョンがスクリプトに書かれている 4 でなく 5 であることが原因で、書き換えが必要になった。したがって、ocXgag.py をエディタで開いて、以下のことをした。

  • 冒頭付近、from PyQt4 import QtGui, QtCore を from PyQt5 import QtGui, QtCore, QtWidgets に差し替え
  • backend_qt4agg を backend_qt5agg へ置換
  • QtGui.QFont() 以外の QtGui という文字列を全て QtWidgets という文字列へ置換
  • GetFoilName の self.foilname = というところを、self.foilname, _ = に差し替え。これを調べるのにだいぶ時間がかかった*1参考

以上で、アプリの起動および翼型データの読み込みまではできるようになった。

Xfoil のインストールと PATH の設定

このあとは Xfoil が必要になるので、Xfoil4Mac をインストールした。このとき XQuartz が必要と言われたので、それも入れた。あとはコマンドラインから xfoil を開けるように、パスを通す。具体的には、

$ PATH=$PATH:/Applications/Xfoil.app/Contents/Resources/

とした。確認は

$ echo $PATH

で。以上で使えるようになった。

*1:当初、Open Foil ボタンを押しても無反応だったので print() デバッグをしたところ、 GetFoilName の self.foilname に翼型ファイルのパスだけでなく、拡張子指定用のフィルタ部分もなぜかくっついてきていた。試しに GetFoilChordfromFile の foilchord = numpy.loadtxt(self.foilname,skiprows=1) の self.foilname というところに、翼型ファイルの絶対パスを直接書き込むと load はできた。しかし原因はわかっても解決策がわからず、しばらくの間ググりまくった。

1password extension for Chrome (on Mac) で 1password (for Mac) が見つからないやつ → プロキシが怪しい

もうちょっと具体的に言うと、ブラウザエクステンションをインストールしたあとで初めて Chrome 右上の 1password アイコンをクリックした時の話。すでに 1password for Mac をインストールしてあるのに、「見つかりません」とか言われる。説明文のバージョンが4だったり怪しい上に何度やっても Try again とか言われてイライラする。

これ、これまでは Chrome extension を何度か uninstall --> install してれば直った。あとはまれに mini の立ち上げ忘れということもあった。が、今回はなんどインストールしても直らない。そこで色々検索していたところ、次のページを発見した:

Configuring a firewall or proxy on your Mac - 1Password Support

確かに、これまでと変わった点として「大学の研究室からプロキシ経由でアクセスしている」ということがあった。で、結果としてはこの 127.0.0.1 を bypass のとこに追加したら worked like a charm だった。

意外と同じところでハマってる人がいそうなので…というか、自分でも忘れそうっていうか一度見つけたのにすぐ忘れてしまっていたので、メモしておく。

ちょっとわからないのが、Safari だとなぜかプロキシの設定をする前でもブラウザエクステンションが使えたこと。理由は不明。あと、Windows でプロキシ使ってる場合にどうかはわからない。

【論文読み】翅が摩耗して短くなったマルハナバチは機動性(加速度)が少し低下する。これにより死亡率が増加するのかもしれない

基本情報

Mountcastle, A. M., Alexander, T. M., Switzer, C. M. & Combes, S. A. 2016 Wing wear reduces bumblebee flight performance in a dynamic obstacle course. Biol. Lett. 12, 20160294. (doi:10.1098/rsbl.2016.0294)

を読んだのでメモ、コメントなど。

まとめ

手法

次の3グループのマルハナバチを用意した(個体数は ESM より):

  1. 無傷 (INT: intact) 48 匹
  2. 両翼端を切り落とし (SYM: symmetric) 53 匹
  3. 右翼端のみ切り落とし (ASYM: asymmetric) 44 匹

それぞれを一匹ずつ、トンネル内で飛行させ、2台の高速度カメラでステレオ撮影して、「水平面内の加速度」と「柱への衝突頻度」を調べた。ここでトンネルは、巣と野外をつなぐように置かれ、内部には柱が林立し、振動するプラットフォームが置かれた。つまり、ハチは外へ行くためにはこの「動く柱群」の間を縫って飛んでいかねばならない。下記の動画参照。

動画

真上から
www.youtube.com

鉛直から30度傾けた後方から
www.youtube.com

結果

  • ピーク加速度(=機動性と解釈)は、SYM(両翼カット)がINT(無傷)よりも9%低下したが、ASYM(右翼カット)はINT(無傷)と有意差がなかった
  • 衝突頻度はいずれも有意差がなかった。ただし、
    • ASYM(右翼カット)は右側での衝突が増えた
    • 衝突頻度は翅には関係なかったが、体長と正の相関があった

気になったところ

僕なら査読でこのへんを言うなぁ…というやつ。日本語で書いても著者らには届かないので無駄なんだけど、まぁ自分用メモですね。

Major points

  1. 並進しかみてない。筆者らは水平加速度のみを機動性の指標としている。これが一番気になる。3次元的な…つまり鉛直方向については本文でも一行、ESM にも多少言及がある(査読で突っ込まれたのかも)。しかし、角速度や角加速度はどうなのか?せめて言及してほしかった。また、場所が狭いので、旋回率や旋回半径は計測しづらい(できない)のはわかるが、被食・捕食を考えるときにはこれらも無視できないのではないのか?つまり、そもそもこの実験系が目的に対して適切と言って良いのか?
  2. 柱群のプラットフォームの形状・振動パタンおよびその大きさをどのように決めたか(あるいは変えたか)が書いていない。とてもよくない。なんでこのまま査読を通るのかとても不思議。

Minor points

  • 翼端をカットしても衝突頻度が増えなかった理由として「柱の間隔に比べて翼幅が短くなったからかも」と言ってるけど、それなら柱の間隔を翼幅で割った値が一定になるように、3種類のプラットフォームを使うこともできたのではないか。
  • 円柱を振動させることによる空気の乱れの影響はどう考えればいいのか?3ケースとも同じだからよいのだ、と言うだろうが、円柱が右へ動いている時に衝突するか左に動いている時に衝突するか、といった考慮は要らないのか?(要は、空力的な影響はないよと言って欲しい)
  • 明るさや周囲の模様などの視覚的影響は考慮したのか?(これはブーメランですが…)
  • 翼運動:ハチの羽ばたき周波数は 100-200 Hz なので、500 fps では一周期につきよくても5フレーム、おそらく2, 3フレームしかないので、翼運動の取得が難しいのはわかるが、SA3は1000 Hzでも最大解像度を使えるのだし、そこまで広範囲を撮影しているわけでもないので、頑張れば羽ばたき振幅くらいはとれたのではないだろうか。少なくとも言及はして欲しかった。
  • 個体数が多いし、ランダムにサンプルしてるから大丈夫だろ、ということだろうけど、質量くらいは計測した方がよかったのでは。というか、質量すら計測してないのに centre of body mass とはいかに。せめて体積中心ではないのか。ある1個体を解剖して…みたいにやってそうだけど、それならそう書くべき。

ツイートへの言及

twitter でいくつか関連ツイートを見かけたので、それに言及する形でコメントを挟んでいってみます。なにかあれば @dynamicsoar までどうぞ。

1


manoeuvrability は操縦性ではなく機動性と呼ぶのが一般的だと思います。それから実際には実験的には摩耗させたのではなく、翼端近くを切り落としており、これによって摩耗をシミュレートしています。

2


切り落としたのは正確には翼面積の 22% です。「両方の合計なのかそれぞれ2割ずつなのかは不明」というのは意図がちょっとわからないのですが(同じことでは?)、「それぞれ」で理解すればよいでしょう。

「まずそんなんでよく飛べるな」について。前述のように翼運動は計測していないのですが、おそらく翼端を切り落とした個体では、羽ばたき振幅を増やして補償していると思われます。他の可能性としては翅の長軸まわりの回転、いわゆる迎え角も変えているかもしれません。あと羽ばたき周波数は、筋肉が非同期型間接飛翔筋なので大きくは変えられないのでは、と思いますが専門外なのでわかりません。アクチュエータ(筋肉)側が同じでも負荷が減ったら多少は周波数増やせるのかな…?

「昆虫の翅は飛行機の翼に比べて損傷に対する補償能力が高いよね」について。もちろん、翼に燃料や兵器を積んでいて、引火性の観点からは飛行機の方がロバスト性は低いのですが、単純に翼面積の減少に対してどうか、というと… 軍事航空ファンには有名な話で、イスラエルF-15 が片翼をほとんどもぎ取られた状態で帰還した例があるので、まぁ、一概には言えないかなとは思います。
www.youtube.com
それから、結構前から、一部の動翼が動かなくなったりした状態でも、残った動翼だけで制御則を切り替えて飛行を継続しよう、という試みは reconfigurable flight control とか intelligent flight control system (IFCS) とかいう名前でやられているようです。

3


まず前半ですが、ちょっと違います。おそらくアブスト

wing wear did not increase collision rate, possibly because shorter wingspans allow more room for bees to manoeuvre

の部分だと思います。まずこの論文では機動性 = 並進加速度ということにしています。その上で、ここで言ってるのはこういうことです:「翼端を両方切り落とすと、加速度 = 機動性自体は低下した。しかし、衝突の頻度は変わらなかった。これは柱と柱の間の距離に比べて翼幅が短くなったから、ぶつかりにくくなったためかもしれない」

一方、後半ですが、翼が短いほどローリングの慣性モーメントは小さくなるので、その意味ではロール回転(横転)しやすいのはその通り。しかし空気力が作り出すトルクという意味では、空気力の作用点までの距離つまりモーメントアームはむしろ長い方がよいため、一概には言えません。ショウジョウバエの機動性と翼平面形については、以前のエントリを参照:

とはいえ、もっと大きなスケールで比較した場合、つまり…


これはおそらくその通りです。…が、ちゃんとオーダ比較してスケーリングをしてみないと正確なことは言えないかな…ええと…これは宿題ということで…

4


前半部分はアブストの最後の文

If escape from aerial predation is constrained by acceleration capacity, then our results offer a potential explanation for the observed increase in bumblebee mortality with wing wear.

の前半部分についてだと思いますが、既に述べたようにこの論文では水平加速度=機動性ということにしているので、誤読かと思います。この文は概ね、「もし空中捕食者(鳥とか)からの逃避[の成功率]が加速性能(=機動性)によって決まるなら、今回の論文の結論(=翼端落とすと機動性低下)は、翼端が摩耗したマルハナバチの死亡率が高いことの説明になりうる」くらいです。

おまけ:円柱の Re

ところで、ついでに円柱の Reynolds 数を見積もってみる。

(6.4 mm diameter, 6.35 cm spacing) mounted on an orbital shaker, which was oscillated at 2 Hz frequency and 2.5 cm amplitude.

とある。したがって、円柱の平均速度 U, 円柱の直径 D, 空気の動粘性係数 { \displaystyle \nu } とすると、
{ \displaystyle
U = 0.2 \quad \mathrm{(m/s)}
\\
D = 6.4 \times 10^{-3} \quad \mathrm{(m)}
\\
\nu = 1.5 \times 10^{-5} \quad \mathrm{(m^2/s)}
}
であり、Reynolds 数 Re は
{ \displaystyle
\mathrm{Re} = \frac{ U L }{ \nu } = \frac{ 0.2 \times (6.4 \times 10^{-3})  }{ 1.5 \times 10^{-5}  } \simeq 85
}
となる。とても小さい。非定常だから微妙だけど、定常ならギリギリ双子渦か(振動は始まってるか)?だから影響がないと言えるわけじゃないかもしれないが、飛行速度や翼端速度の Re(千から数千のオーダ)よりはずっと小さいことはわかる。…U の計算(単振動の平均速度)だけちょっと怪しいけどたぶんあってるはず…

【論文読み】ショウジョウバエの翼平面形は機動性に最適化されてはいない

論文内容まとめ

対象

手法と結果のまとめ

  1. 単一の遺伝子をノックアウトすることで、ショウジョウバエ (fruit fly, D. melanogaster) の翅の平面形をわずかに変更した。コントロール(野生型*1に近い形状)の他に3種類の変異群をつくった。
    • ⇒ 基本形状に比べて、細長く(アスペクト比が大きく)、かつ先細な(テーパ比の大きな)形状が3種類。翼面積は、いずれも減少。とくに変異が大きな方の2群では7%程度と大きめの減少。
  2. 2m x 2m x 2m くらいの部屋で、それぞれのグループのショウジョウバエを自由に飛行させ、2台の高速度カメラでステレオ撮影しトラッキング。位置・速度・加速度・旋回半径・旋回率などを算出した。Motivational state としては、エサ無し・捕食者なしの voluntary.
    • ⇒ 変異群3種類のうち、コントロールに近い(変異の穏やかな)2種類では、直線飛行速度が低下すること無く旋回半径が減少・旋回率が増加した。一方、最大の変異の群では直線飛行速度が低下、進路変更の加速度も減少し、旋回性能はコントロールと変わらなかった。
  3. 小さめのボックスに閉じ込めたショウジョウバエを1台の高速度カメラで撮影し、羽ばたき周波数を計測した。これを質量の(1/3)乗で正規化した。
    • ⇒ 有意差なし。なお体重(質量)自体は変異群で僅かに増加しているが有意ではない。
  4. それぞれのグループの平面形を元に、翅の付け根(ヒンジ)周りの慣性モーメントの計算を行った。また、慣性パワー・空気力・空力トルク・空力パワーの計算を行い、これらにより機械効率を求めた*2。空気力学計算は翼素理論による。羽ばたき運動は今回計測していないので、文献値のホバリング状態のものを用いている。
    • ⇒ 機械効率は変異の度合いが大きいほど低下。翅の慣性モーメントも同様に低下(テーパ増大に伴う)。また、空気力の鉛直上向き成分*3は、変異の大きな方の2群で低下している。

考察のまとめ

  • 野生状態の翼平面形が変異群よりも機械効率が高い、すなわち燃費が良い。一方、捕食者からの回避行動に重要であろう機動性は、ごく僅かな(遺伝子1つの)変異で向上が可能であるのに、これはなされていない。そのようなバランスのもとで平面形状が選択されているということ。
  • 変異が最大でない2群で旋回性能が向上したのはなぜか?
    • ⇒ テーパ比の増大、つまりより先細な翅になることで、慣性モーメントが減少したためと考えられる。なお、ホバリングに関する計算では風圧中心位置までのモーメントアームに変化はなかった(空力トルクには変化がないことを示唆)。
  • 変異を増やすと機械効率が低下したのはなぜか?また、最大の変異でなぜ飛行性能が低下したのか?
    • ⇒ 筋骨格系をそのままに翅だけを変更したことが主要因ではないか。既にコントロール群の翼平面形に最適化されたモータ(筋肉)であったため、変異を増やすごとに機械効率が低下した。しかし、変異が穏やかな2群では、上記の理由(テーパ比増大による慣性モーメント減)によって機動性は向上していた。変異が最大の群では、モータの最適から外れすぎたために機動性にも悪影響が及んだのではないか。
  • 羽ばたき運動について
    • ⇒ 変異の大きな方の2群では、翼面積が減少しているのに、さらにおなじ羽ばたき運動ではいわゆる揚力がたりない。したがって、羽ばたき運動の変更がとくに必要と考えられる。しかし、(ノーマライズした)羽ばたき周波数が変わっていない*4ことから、羽ばたき振幅 and/or 長軸まわりの回転(迎え角変動)が変化していると考えられる。

補足・感想

なぜ遺伝子のノックアウトをしたか

まず、なぜ遺伝子のノックアウトという手法を用いたかについて補足。これは自分の意見というよりイントロにあったお話。他の方法としては、これまでにスズメガの翼端をクリップする(裁ち落とす)*5とか、ハチドリの羽根をカットする*6とか、あと文献すぐ出てこないけど鳥の羽根を抜くとかはけっこうやられていたが、いずれも侵襲的であることは問題視されていた。また、鳥の場合は換羽といって羽根が生え変わることがあるのでそのタイミングで実験することもあるが、運任せの面が大きくなってあまり好まれない、というか例が少ない。そういえば、ズグロムシクイという鳥の飛行実験準備中に(ストレスで?)尾羽根が全部抜けてしまったが、そのまま実験してみたら、尾羽根ありの個体とほとんど差がなかった、なんていう報告もある*7

なぜ羽ばたき運動を同時計測しなかったのか?

これはもしできていたら慣性・空力計算のところが「文献値によるホバリング」でなくて実測値に基づいた値になり、よりストレートなストーリ・説得力の強いストーリにできたはずで、たぶん Science あたりに出ていただろう。なぜしなかったのか。書いてあるわけではないので推測だが、おそらく、ショウジョウバエが小さすぎることが問題。体重が 1 mg (グラムでなくミリグラム)程度、翅一枚の長さは 2 mm くらいしかない。したがって、カメラを昆虫を追尾するように動かす(そんなことしたらそれ自体が別の論文になるだろう…)か、台数を増やすしかないだろうが、高速度カメラは安くても一台100万円ではきかない程度には高価なので、難しい。羽ばたき周波数が高いことが次の問題だが、これは照明を強力にすれば概ね解決する。一方で、種をもっと大きなものに変更する*8というのはより現実的な解としてあり得ると思うが、その場合はおそらく遺伝子操作の方になにか課題があるのではないだろうか。そちら方面に詳しくはないが、ショウジョウバエは遺伝子関係では最もよく使われているモデル生物の一種だろうから。

環境の影響?

これは別に今回の結果に疑義を呈するものではないが、一般性というかどこまで演繹できるのかという点には関係してくるかも。たとえば、motivational state がエサ無し・捕食者なしの voluntary である点は議論の余地があるかもしれない。これについてはたとえば Tobalske のとこ *9 や Combes のとこ *10 などでちょいちょいやられていて、バイオメカニクスエコロジーの界面として興味深いところでもある。が、実際に全部試したりコントロールして比較するとかかなり大変…。まぁその前に視覚情報からか…。一般的に、空気力学や翼運動がメインの論文だとあまり環境は気にされてない。Flight dynamics(飛行力学)になるとやっぱりちょっと気にするか、みたいになり、神経や行動になっていくとむしろメインになる場合すら多い、という印象。

他にもいくつかマイナな疑問点があるので、気が向いたら書きます。

*1:= Oregon R?

*2:具体的には、理論的な最小の誘導パワーを、現実のパワー(空力パワー+慣性パワー)で割った値を効率と定義している。

*3:羽ばたき面が水平なので、この場合はいわゆる「揚力」と呼んでもよかろう。論文でも lift となっている。

*4:間接飛翔筋タイプであるから大きくは変えようがない?

*5:Fernández, M. J., Springthorpe, D. & Hedrick, T. L. 2012 Neuromuscular and biomechanical compensation for wing asymmetry in insect hovering flight. J. Exp. Biol. 215, 3631–3638. (doi:10.1242/jeb.073627).

*6:Chai, P. 1997 Hummingbird hovering energetics during moult of primary flight feathers. J. Exp. Biol. 200, 1527–1536.

*7:Johansson, L. C. & Hedenström, A. 2009 The vortex wake of blackcaps (Sylvia atricapilla L.) measured using high-speed digital particle image velocimetry (DPIV). J. Exp. Biol. 212, 3365–3376. (doi:10.1242/jeb.034454).

*8:たとえばハナアブは実績がある:Walker, S. M., Thomas, A. L. R. & Taylor, G. K. 2010 Deformable wing kinematics in free-flying hoverflies. J. R. Soc. Interface 7, 131–142. (doi:10.1098/rsif.2009.0120).

*9:Provini, P., Tobalske, B. W., Crandell, K. E. & Abourachid, A. 2012 Transition from leg to wing forces during take-off in birds. J. Exp. Biol. 215, 4115–4124. (doi:10.1242/jeb.074484).

*10:Combes, S. A., Rundle, D. E., Iwasaki, J. M. & Crall, J. D. 2012 Linking biomechanics and ecology through predator-prey interactions: flight performance of dragonflies and their prey. J. Exp. Biol. 215, 903–913. (doi:10.1242/jeb.059394).

fortran でよく使うコンパイラオプションのメモ

自分用。あとで書き足す

gfortran

牛島先生本で紹介されていたのがキッカケで使い始めた g95 がわりと好きだったんだけど、だいぶ前から開発が止まってる(というか終わってる?)ので、最近は gfortran を使うことが多い(本気の計算だけ ifort)。

$ gfortran foo.f90 -Wall -O1 -fbounds-check -fbacktrace -fcheck=all -ffpe-trap=invalid,zero,overflow,underflow

あたりから適当に選んで。

  • -Wall に含まれる -Wuninitialized はデフォルトの -O0*1では作動しないので、-O1 が無難か。
  • -finit-local-zero が便利だけど多用は危険か。というか基本的には使わないでちゃんと自分で初期化したほうが良さげ。

ifort (version 2021.5.0)

$ ifort foo.f90 -xHost -ipo -mcmodel=medium -shared-intel -qopenmp
  • no-prec-div や -fp-model=fast=2 は本番計算で自ら付けるべきものではないような気が今はする。

*1:たぶん。ifortでは-O2がデフォルトだが。

FieldView(可視化ソフト)のライセンスマネージャ (flexlm) が落ちた時の対応 (Linux)

前のブログにも書いたんだけど、さっきまた遭遇したので、再掲しとく。

環境

x86_64 (64 bit) の CentOS. 他の場合は変わるかも。FV のバージョンはライセンスサーバごとに複数ある。

やること

コマンドを2つ叩くだけ。セキュリティの設定次第かもしれないが、自分の場合は root になる必要はなかった。

  1. LM_LICENSE_FILE という環境変数にライセンスファイルの位置を教える(どこかにある license.dat を探す)
  2. どこかにある lmgrd というやつを実行する

例 (FV14)

具体的には、自分の version 14 のサーバの場合は以下のとおりだった:

$ export LM_LICENSE_FILE=/usr/fieldview/V14/fv/data/license.dat
$ /usr/fieldview/V14/fv/flexlm/linux_amd64/lmgrd

他のバージョン

他の計算機を見たところ、バージョンが違う場合は /fieldview/V14 の部分*1が変わる模様。具体的には、FV12 だと /usr/FV/FV12.2.1 となっていた。

*1:と、もちろん 32 bit システムなら linux_amd64 のところもだろうが。