C++ 稳定红外距离传感器输出值

C++ 稳定红外距离传感器输出值,c++,filter,arduino,infrared,numerical-stability,C++,Filter,Arduino,Infrared,Numerical Stability,我在读红外锐利距离传感器: 通过阅读,我命令一个伺服系统引导机器人沿着墙走,一张非常简单的地图,并编写代码 我遇到的问题是,传感器读数偏离太远,无法正常工作。。。我知道其他人使用这些传感器很好,我知道它们的接线也很好 我的问题是如何消除发送到伺服的任何振荡?我得到了1到3度的振动,机器人站在离墙壁固定距离的地方 下面是我的代码: #include <Servo.h> Servo myservo; int val; int val1; int IRpin = A7; // an

我在读红外锐利距离传感器:

通过阅读,我命令一个伺服系统引导机器人沿着墙走,一张非常简单的地图,并编写代码

我遇到的问题是,传感器读数偏离太远,无法正常工作。。。我知道其他人使用这些传感器很好,我知道它们的接线也很好

我的问题是如何消除发送到伺服的任何振荡?我得到了1到3度的振动,机器人站在离墙壁固定距离的地方

下面是我的代码:

#include <Servo.h>

Servo myservo;
int val; 
int val1;

int IRpin = A7;
 // analog pin for reading the IR sensor
void setup() {
 myservo.attach(3);

 Serial.begin(9600); // start the serial port
}
void loop() {
 float volts = analogRead(IRpin);

delay(100); 
val1 = map(volts, 230,500, 0 ,100);
 val = map(val1, 0, 100, 100, 80);
 myservo.write(val);
 Serial.println(val);
 }
请注意,双重映射是必要的,因为否则,变化会更糟糕

感谢所有愿意花时间回答这个问题并帮助我的人


乐:我已经考虑过滞后,但我想要的东西不会因为不必要的读数和计算而浪费时间。

这是一个典型的控制问题。我建议研究PID控制器

编辑:对不起,误读了问题。我以为你有一个理想的方向,正在使用红外距离传感器读取你当前的方向。我将把以上内容作为背景,但不,它不适用于此

新答案:

传感器波动完全正常。你必须对他们作出解释。在这种情况下,我将使用一个简单的移动平均值过滤器。您在任何时间离墙壁的距离都是您最后一次X传感器读数的平均值。使x太大会引入延迟,太小会产生相同的噪声输出

针对您的LE注释: 我认为在处理嘈杂的输入时,无法避免某种形式的滞后。您是否真的存在性能问题,不想在计算上浪费时间?不要预先优化


编辑2:以上将平滑您的输入信号当前距离。假设您希望与墙壁保持固定距离,如何将其转换为输出信号伺服设定点,以达到所需的距离?这是PID控制器可能会有所帮助的地方。

这是一个典型的控制问题。我建议研究PID控制器

编辑:对不起,误读了问题。我以为你有一个理想的方向,正在使用红外距离传感器读取你当前的方向。我将把以上内容作为背景,但不,它不适用于此

新答案:

传感器波动完全正常。你必须对他们作出解释。在这种情况下,我将使用一个简单的移动平均值过滤器。您在任何时间离墙壁的距离都是您最后一次X传感器读数的平均值。使x太大会引入延迟,太小会产生相同的噪声输出

针对您的LE注释: 我认为在处理嘈杂的输入时,无法避免某种形式的滞后。您是否真的存在性能问题,不想在计算上浪费时间?不要预先优化


编辑2:以上将平滑您的输入信号当前距离。假设您希望与墙壁保持固定距离,如何将其转换为输出信号伺服设定点,以达到所需的距离?这是PID控制器可能会有所帮助的地方。

性能存在问题,因为这是为了比赛,机器人必须一次读取多个相当多的传感器并处理数据。我将尝试5次读数,然后取平均值。非常感谢您的回答:D@Eugen我很怀疑你会发现一个微控制器有足够的输入管脚来容纳这么多的传感器,从而导致性能问题当我意识到你可能还想平滑你的伺服输出信号时,我对我的回答进行了一点扩展。说过滤不是我的专业领域是一种轻描淡写的说法,但与PID控制中的D类似,你可以做一个更复杂的过滤器,它会查看过去值的差异以及平均值,如果真实值是运动,可能会在样本范围内发生显著变化。这样,您可以尝试捕捉真正的变化并消除一些滞后。然而,如果你没有正确选择权重变量,你也会超出一些范围,并可能得到剧烈的波动。但如果你移动了一小部分,比如说,5个传感器读数,那么就按照泰森的答案去做吧!性能方面存在问题,因为这是为了比赛,机器人必须一次读取多个相当多的传感器并处理数据。我将尝试5次读数,然后取平均值。非常感谢您的回答:D@Eugen我很怀疑你会发现一个微控制器有足够的输入管脚来容纳这么多的传感器,从而导致性能问题当我意识到你可能还想平滑你的伺服输出信号时,我对我的答案进行了一点扩展。说过滤不是我的专业领域是一种轻描淡写的说法,但与PID控制中的D类似,你可以做一个更复杂的过滤器,它可以查看过去值的差异以及平均值,如果
由于移动,实际值可能在采样范围内发生显著变化。这样,您可以尝试捕捉真正的变化并消除一些滞后。然而,如果你没有正确选择权重变量,你也会超出一些范围,并可能得到剧烈的波动。但如果你移动了一小部分,比如说,5个传感器读数,那么就按照泰森的答案去做吧!我在Arduino操场上偶然发现了这个。它给了我迄今为止最好的结果。更多的Arduino用户应该知道这一点。值得注意的是,尖锐的红外传感器不应该有线性响应。我在Arduino操场上偶然发现了这一点。它给了我迄今为止最好的结果。更多的Arduino用户应该知道这一点。值得注意的是,尖锐的红外传感器不应该具有线性响应。