如何使用平方反比定律将光强度转换为线性值

时间:2014-04-02 03:35:19

标签: c algorithm math physics light

我正在尝试为机器人编写一些嵌入式固件,这些机器人将以与光强度成比例的速度移向光源,这样当机器人接近光源时,它会以线性速率减速。

前面有一个光传感器,它将当前的光强度写入可变的current_light_intensity,范围为1(低光强,远处)到4095(高光强,近)。我正在寻找一种算法,将该值转换为变量motor_speed,在整数1到8的范围内,用于控制电机速度(1为最慢,8为最快)。

至关重要的是,我希望机器人随着距离线性减速(即,想象光强度距离光源8米处最低,我希望速度每米减少一个)。此刻我的光源与速度成正比。然而,光线与距离的平方成反比地增加,这意味着当前我的机器人在大部分距离内全速向光线移动,然后在关闭时非常突然地减速,因为强度会上升,这对我来说是一个问题。任何算法建议将不胜感激。语言是C.

2 个答案:

答案 0 :(得分:2)

如果 current_light_intensity确实与当前光照强度成正比,那么您可以执行以下操作:

distance = 1.0/sqrt(current_light_intensity); /* range is 1/sqrt(4095) to 1 */
distance = (distance-1.0/sqrt(4095.0))/(1.0 - 1.0/sqrt(4095.0)); /* scaled to [0,1] */
motor_speed = ceil(8.0 * distance);

如果通常情况下,系统中存在许多非线性(例如光电传感器饱和度),则可能需要手动调整速度(强度)函数,这不是很困难。只需构造一个阈值强度数组,用作查找表。然后使用原型进行一些实验,并调整数组中的值,直到行为看起来正确。

答案 1 :(得分:0)

你想要

Velocity = Distance  V = D
Intencity I = C / D^2  where C is some constant

D = Sqrt(C/I)
for D = 8 I = 1 => C=64

所以

V=D=Sqrt(64 / I)