我正在阅读红外线Sharp传感器:
http://www.robofun.ro/senzori/infrarosu/senzor_sharp_%20GP2D120XJ00F
通过阅读,我命令伺服机器人将机器人引向墙壁,这是一个非常简单的地图和编写代码。
我遇到的问题是传感器读数偏离了,没有表现出liniar ......我知道其他人使用这些传感器就好了,我知道他们接线很好。
我的问题是如何消除发送到伺服系统的任何振荡?当机器人静止离墙一定距离时,我得到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);
}
请注意,双重映射是必要的,否则变化会更糟糕。
感谢任何愿意花时间回答并帮助我的人......
LE:我已经考虑过迟滞,但我想要一些不会因不必要的读数和计算而浪费时间的东西。
答案 0 :(得分:4)
这是一个典型的控制问题。我建议调查PID控制器。
编辑:抱歉,误读了这个问题。我以为你有一个理想的方向,并使用红外距离传感器来读取你当前的方向。我将把上面的内容作为背景,但不,它不适用于此。新答案:
传感器波动完全正常。你必须考虑他们。在这种情况下,我会使用一个简单的移动平均滤波器。 (您在任何时间与墙壁的距离是您上次X传感器读数的平均值)。使x太大会导致延迟,太小而且你会有相同的噪音输出。
回应你的LE说明: 在处理嘈杂的输入时,我认为你不能避免某种形式的滞后现象。您是否确实存在性能问题但是您不想浪费时间进行计算?不要预先优化。
编辑2:以上将平滑您的输入信号(当前距离)。如何将其转换为输出信号(伺服设定值)以达到所需距离(假设您希望与墙壁保持固定距离)?这是PID控制器可以提供帮助的地方。