47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
|
|
import numpy as np
|
|||
|
|
from scipy.optimize import curve_fit
|
|||
|
|
import matplotlib.pyplot as plt
|
|||
|
|
|
|||
|
|
# Linhas zero-based (1–18 -> 0–17)
|
|||
|
|
linhas = np.arange(18)
|
|||
|
|
distancias_m = np.array([63,68,73,78,85,91,99,107,117,126,140,155,172,192,217,246,276,327]) / 100.0
|
|||
|
|
|
|||
|
|
grid_h = 20
|
|||
|
|
altura_otim = 0.74
|
|||
|
|
#fov_v_graus = 47.04
|
|||
|
|
|
|||
|
|
def modelo_distancia(linha, fov_v_graus, angulo_inclinacao_graus, altura_camera_m):
|
|||
|
|
fov_v_rad = np.radians(fov_v_graus)
|
|||
|
|
theta = np.radians(angulo_inclinacao_graus)
|
|||
|
|
alpha_v = ((linha + 0.5) / grid_h - 0.5) * fov_v_rad
|
|||
|
|
gamma = theta + alpha_v
|
|||
|
|
d = altura_camera_m / np.tan(gamma)
|
|||
|
|
d[gamma <= 0.01] = np.nan
|
|||
|
|
return d
|
|||
|
|
|
|||
|
|
def modelo_fit(linha, fov_v_graus, angulo_inclinacao_graus):
|
|||
|
|
return modelo_distancia(linha, fov_v_graus, angulo_inclinacao_graus, altura_otim)
|
|||
|
|
|
|||
|
|
# Chute inicial (valores aproximados)
|
|||
|
|
p0 = [47.02, 26.29]
|
|||
|
|
|
|||
|
|
# Ajuste FOV e Inclinação ao mesmo tempo:
|
|||
|
|
params_otimizados, _ = curve_fit(modelo_fit, linhas, distancias_m, p0=p0, maxfev=10000)
|
|||
|
|
fov_otim, inclinacao_otim = params_otimizados
|
|||
|
|
|
|||
|
|
print(f"FOV_V ajustado: {fov_otim:.2f}°")
|
|||
|
|
print(f"Inclinação ajustada: {inclinacao_otim:.2f}°")
|
|||
|
|
#print(f"Altura ajustada: {altura_otim:.3f}m")
|
|||
|
|
|
|||
|
|
def dist_grid_calibrado(grid_h, i, fov, incl, altura):
|
|||
|
|
#fov = 47.02 # graus
|
|||
|
|
#incl = 23.29 # graus
|
|||
|
|
#altura = 0.73
|
|||
|
|
alpha_v = ((i + 0.5) / grid_h - 0.5) * np.radians(fov)
|
|||
|
|
gamma = np.radians(incl) + alpha_v
|
|||
|
|
d = altura / np.tan(gamma)
|
|||
|
|
return d
|
|||
|
|
|
|||
|
|
grid_h = 20
|
|||
|
|
dists = np.array([dist_grid_calibrado(grid_h, i, fov_otim, inclinacao_otim, altura_otim) for i in range(grid_h)])
|
|||
|
|
print(np.round(dists,2))
|