我正在尝试为机器人编写一些嵌入式固件,这些机器人将以与光强度成比例的速度移向光源,这样当机器人接近光源时,它会以线性速率减速。
前面有一个光传感器,它将当前的光强度写入可变的current_light_intensity,范围为1(低光强,远处)到4095(高光强,近)。我正在寻找一种算法,将该值转换为变量motor_speed,在整数1到8的范围内,用于控制电机速度(1为最慢,8为最快)。
至关重要的是,我希望机器人随着距离线性减速(即,想象光强度距离光源8米处最低,我希望速度每米减少一个)。此刻我的光源与速度成正比。然而,光线与距离的平方成反比地增加,这意味着当前我的机器人在大部分距离内全速向光线移动,然后在关闭时非常突然地减速,因为强度会上升,这对我来说是一个问题。任何算法建议将不胜感激。语言是C.
答案 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)