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)) |