我有一对固定位置传感器(红外线),可以将信号从反射器反射到固定接收器(所有3个设备都在单个PCB上,[发射器,接收器,发射器])。该设备的API给我的数据是从每个传感器到反射器的范围(手,桌子,任何东西)。
我的问题是:使用上述数据,我如何确定反射器的相对X位置。我很确定这是一个微不足道的问题,但我的大脑正在画一个空白。
每个传感器的数据范围为0到240。
var pos = 120 + (ranges.left - ranges.right);
pos = 100/240 * pos;
pos = Math.round(pos);
这是我最初的尝试,这个想法是它给了我一个从0到100的x位置。这种作品,以一种跳跃的方式 - 但我想要一个更精致的方法。
虽然这里有很多关于找到已知点之间距离的问题,但我没有找到一个反向的(这就是我想做的)。
编辑:
两个黑圈是发射器,灯圈是接收器。正方形是反射器。这条线是X轴,我想知道沿着那条线的正方形的位置。但请注意,在任何给定点,线可能离传感器更近或更远。
答案 0 :(得分:1)
我认为这可以通过观察三角形来实现......
使用图表...
S是两个发射器的分离,R是目标的距离,A,B是设备测量的距离,'x'是我们想要找到的距离。
毕达哥拉斯:(这里A ^ 2表示A平方)
A^2 = R^2 + x^2 or A^2 - x^2 = R^2
和
B^2 = R^2 + (S+x)^2 or B^2 - (S+x)^2 = R^2
将其重新排列为
A^2 - x^2 = B^2 - (S+x)^2
A^2 - x^2 = B^2 - S^2 - 2Sx - x^2 expand (S+x)^2
A^2 = B^2 - S^2 - 2Sx lose x^2 from both sides
A^2 - B^2 +S^2 = -2Sx rearrange
最后:
A^2 - B^2 + S^2
_______________ = x
-2S
ta da!
我在纸上做了快速检查,我认为这是正确的。另一个快速检查是A是否与B相同,在这种情况下,它归结为:
-S^2 / 2S == -S/2 == 1/2 way between the transmitters, which is right.
编辑:以下评论......
请注意,最终公式仅涉及A,B和S.我们需要S(发射器之间的距离),因为这样就完成了三角形A / B / S,因此缩放了输出值。您可以为此使用固定值,但输出不会直接与A或B值的比例相关。但是,您可以使用s = 100给...
A^2 - B^2 + 10000
x = _________________
-200
或者,在javascript中:
var pos= ((ranges.left*ranges.left)-(ranges.right*ranges.right)+10000)/200;
对于直接位于两个传感器之间的对象,这将给出介于0..100之间的值,例如如果两个传感器值都是42,我们得到:
pos =(42 * 42 - 42 * 42 + 10000)/ 200; //答案= 50
如果物体直接位于传感器A的前面,我们可以有值:
pos =(100 * 100 - 140 * 140 + 10000)/ 200; // answer = 2
或直接在B:
前面pos =(140 * 140 - 100 * 100 + 10000)/ 200; // answer = 98
进一步沿着'x'轴显然会在一个方向上获得更大的值,然后在另一个方向上获得更大的值。 我希望这更清楚。