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

标签 c algorithm math physics light

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

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

至关重要的是,我希望机器人随着距离线性减速(即,假设光强度在距光源 8 米处最低,我希望速度每降低一米)。目前我的光源与速度成正比。然而,光线的增加与距离的平方成反比,这意味着目前我的机器人在大部分距离内全速朝着光线移动,然后在接近时突然减速,因为强度猛增,这对我来说是问题。任何算法建议将不胜感激。语言是 C。

最佳答案

如果 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);

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

关于c - 如何使用平方反比定律将光强度转换为线性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22801067/

相关文章:

c - 跟踪重新分配的 n 个结构体数组中指向结构体 i 的指针?

c++ - 如何检测磁盘已满错误并让程序在获得可用磁盘空间后恢复

c - Linux USB 设备驱动的误解

python - 快速供电/连续平方算法移动速度太慢,数字量较大

java - 随机爬山法

math - 如何从一对立体图像对 3D 点进行三角测量?

java - 余弦定理JAVA

c++ - 在 AIR Native Extension 中包含库会导致错误,所有方法都为 "The extension context does not have a method with the name..."

在固定大小的桶中对齐不同大小的元素的算法

android - 自动调整 SeekBars Android