2023年06月25日

魚眼レンズで日当たりチェック

 うちの庭は、狭いスペースに植木・畑・花壇が混在していて、一日中日が当たっているスペースというのがありません。太陽の動きを解析して日当たりチェックをできないものかな、といろいろ調べていると、こんな論文に出会いました:「魚眼レンズを用いた局所的な日照時間推定に関する検討 (PDF)」(星野佑輔ほか、釧路高専紀要 2017, 50, 72-75)。なるほど、魚眼レンズってこんな使い方があるんだ。

 さっそくスマホ用の魚眼レンズを取り寄せてみました。100均でも売ってるらしいんですが、あんまりちゃちいのもどうかなと思って、それなりの値段のものを選びました。

(クリックすると Amazon の商品ページに飛びます)

 画面で確認しながら撮影したいので、インカメラに取り付けます。スマホは Zenfone 5 で、問題なく取り付けできます。三脚は使いませんが、スマホホルダーを取り付けておくと、クリップとスマホホルダーで本体がほぼ水平に置けます。水平を出すのは大事なので、水準器を貼り付けたベニヤ板の上に置きます。

20230625-1.jpg

 写っている範囲を特定するため、校正をやりました。LEDライトを点灯する回路を組み立てて(久しぶりにブレッドボードを持ち出した)、三脚の上に固定し、下のような配置にして撮影します。三脚の位置を動かしてスマホとLEDの水平距離を変えれば、スマホから見た仰角を変えながら写真撮影ができます。

20230625-2.jpg

 写真を適当な倍率で PowerPoint ファイルに貼り付け、丸い画像の輪郭に合わせて円を書きます。その円の半径と、中心から LED の像までの距離を測ると、下のようになりました。

20230625-3.jpg

 仰角を3点設定して同じように距離を測り、校正曲線を書きました。周辺に近づくほど圧縮されているので、正射影方式に近いようです(参考:「魚眼レンズ、実は人眼レンズ?」Optical Learning Blog, 2022/5/24)。式のθは、天頂角(90°-仰角)です。

20230625-4.jpg

 校正曲線は Python/Jupyter Notebook で作成。Python を使うのにもだいぶ慣れてきました。

from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt
import math
x_obs = np.array([0, 17.4, 45.0, 58.4])
y_obs = np.array([0, 1.84, 4.33, 5.16])
def func(x, a):
    y = np.zeros_like(x)
    for i in range(x.shape[0]):
        xi = x[i]
        y[i] = a * math.sin(xi / 180.0 * math.pi)
    return y
popt, pcov = curve_fit(func, x_obs, y_obs, p0=[0.5])
print(popt)
fig, ax = plt.subplots()
x_cal = np.linspace(0, 90)
y_cal = func(x_cal, popt[0])
ax.plot(x_obs, y_obs, "o:")
ax.plot(x_cal, y_cal)

 次に、太陽の通り道を描画します。中学理科の内容だけど、忘れてる! いろいろ調べながら考えました。

20230625-5.jpg

 これも描画は Python でやりました。

import numpy as np
import matplotlib.pyplot as plt
import math
th = np.linspace(-90, 90)
L = 35.0   #  観測地点の緯度
f = 6.09
def func(th, a):
    x = []
    y = []
    z = []
    Lr = L * math.pi / 180.0
    ar = a * math.pi / 180.0
    for i in range(th.shape[0]):
        ti = th[i] * math.pi / 180.0
        xi = math.cos(ar) * math.cos(ti) * math.sin(Lr) - math.sin(ar) * math.cos(Lr)
        yi = -math.cos(ar) * math.sin(ti)
        zi = math.cos(ar) * math.cos(ti) * math.cos(Lr) + math.sin(ar) * math.sin(Lr)
        azimuth = math.atan2(yi, xi)
        altitude = math.asin(zi)
        if altitude >= 0.0:
            xj = f * math.sin(math.pi * 0.5 - altitude) * math.cos(azimuth)
            yj = f * math.sin(math.pi * 0.5 - altitude) * math.sin(azimuth)
            x.append(xj)
            y.append(yj)
    return np.array(x), np.array(y)
x1, y1 = func(th, -23.4)
x2, y2 = func(th, 0)
x3, y3 = func(th, 23.4)

s = np.linspace(-math.pi, math.pi)
x = [5.65 * math.cos(_) for _ in s]
y = [5.65 * math.sin(_) for _ in s]

fig, ax = plt.subplots(figsize=(4,4))
ax.set_xlim([-7, 7])
ax.set_ylim([-7, 7])
ax.plot(x1, y1)
ax.plot(x2, y2)
ax.plot(x3, y3)
ax.plot(x, y)
plt.gca().axis('off')
plt.savefig("output.pdf", transparent="True")

 スマホを真北に向けて、ナツミカンの前の畑の地面で写真をとり、太陽軌道を重ねてみました。右上の木はウメ、右下の木はナツミカンです。夏至の日はまあまあ長く日が当たるけど、春分・秋分の頃にはナツミカンの影に入ってしまうことがわかります。畑の上にかぶさるように枝が伸びてるもんなあ。今後の剪定プランはこれを見ながら検討しましょう。

20230625-6.jpg

Posted at 2023年06月25日 18:35:18
email.png