mirror of https://github.com/LooseEthics/pm
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.6 KiB
91 lines
2.6 KiB
from math import *
|
|
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
|
|
# alpha is half of vertical fov
|
|
# sigma is angle between laser plane and camera center vector
|
|
# phi is angle between camera center vector and target pixel vector
|
|
# d is distance between laser plane and camera
|
|
# h is vertical pixel count
|
|
alpha = pi/180*21.5
|
|
sigma = pi/180*51
|
|
r = 0.05
|
|
d = r*tan(sigma)*.65
|
|
#d = r
|
|
h = 3120
|
|
phi_r = atan(d/r)-sigma
|
|
|
|
def get_phi(y, h, alpha):
|
|
# get phi of pixel row y
|
|
return atan(tan(alpha)*(2*y/h - 1))
|
|
|
|
def crunch(alpha, sigma, phi, d, h):
|
|
# depth delta approximation
|
|
da = 2*d*tan(alpha)*cos(phi)/(h*sin(sigma+phi)**2)
|
|
# te is tan(epsilon)
|
|
# epsilon is angle increment in phi across one pixel
|
|
te = (2*tan(alpha)*cos(phi)**2/(h + 2*tan(alpha)*sin(phi)*cos(phi)))
|
|
# exact depth delta
|
|
#de = d/sin(sigma+phi)*te/(sin(sigma+phi) + te*sin(sigma+phi))
|
|
de = 2*d*tan(alpha)*cos(phi)*(cos(phi) - sin(phi)*te)/(h*sin(sigma+phi)*(sin(sigma+phi) + cos(sigma+phi)*te))
|
|
return {'da':da, 'te':te, 'de':de, 'ea':de-da, 'er':(de-da)/de}
|
|
|
|
def nprint(phi_text, phi):
|
|
nums = crunch(alpha, sigma, phi, d, h)
|
|
print(phi_text)
|
|
print(f"Phi: {phi}")
|
|
print(f"Delta approx.: {nums['da']}")
|
|
print(f"Tan(eps): {nums['te']}")
|
|
print(f"Delta exact: {nums['de']}")
|
|
print(f"Error (absolute): {nums['ea']}")
|
|
print(f"Error (relative): {nums['er']}")
|
|
print(f"Height: {d/tan(sigma+phi)}")
|
|
print("")
|
|
|
|
print(f"alpha is {alpha} ({alpha/pi} pi)")
|
|
print(f"sigma is {sigma} ({sigma/pi} pi)")
|
|
print(f"d at r={r} is {d}")
|
|
|
|
nprint('Maximal phi', alpha)
|
|
nprint('Zero phi', 0)
|
|
nprint('phi_r', phi_r)
|
|
nprint('Minimal phi', -alpha)
|
|
nprint('y=h/2', get_phi(h/2, h, alpha))
|
|
|
|
#for i in range(0,10):
|
|
# nprint(f'phi = {i}/10*alpha', i/10*alpha)
|
|
|
|
print(f"phi at y = 50 is {get_phi(50, h, alpha)}")
|
|
|
|
# make data
|
|
xpoints = []
|
|
dapoints = []
|
|
depoints = []
|
|
epoints = []
|
|
aspan = 0
|
|
espan = 0
|
|
tspan = d*(1/tan(sigma-alpha) - 1/tan(sigma+alpha))
|
|
for y in range(h):
|
|
xpoints.append(y)
|
|
cronch = crunch(alpha, sigma, get_phi(y, h, alpha), d, h)
|
|
dapoints.append(cronch['da'])
|
|
aspan += cronch['da']
|
|
depoints.append(cronch['de'])
|
|
espan += cronch['de']
|
|
epoints.append(cronch['er'])
|
|
|
|
print('approximate segment sum', aspan)
|
|
print('exact segment sum', espan)
|
|
print('expected sum', tspan)
|
|
|
|
xpoints = np.array(xpoints)
|
|
dapoints = np.array(dapoints)
|
|
depoints = np.array(depoints)
|
|
plt.plot(xpoints, dapoints, label = 'approx')
|
|
plt.plot(xpoints, depoints, label = 'exact')
|
|
plt.legend()
|
|
plt.show()
|
|
plt.plot(xpoints, epoints, label = 'error')
|
|
plt.legend()
|
|
plt.show()
|