树莓派伺服和超声波传感器抖动
我想知道,如果别人遇到了同样的问题,他们的伺服电机上的树莓派(我拥有3 B型)超声波传感器相结合。树莓派伺服和超声波传感器抖动
从本质上讲,我已经安装两个超声波传感器(HC-SR04)与彼此分开180°上的伺服电动机的顶部(HS-422)作为一个雷达。
下面是一个示例代码。伺服和声波类是由我制作的。他们完全有功能,他们使用琼的pigpio。
import pigpio, time
from Files.servo import Servo
from Files.sonic import Sonic
pi = pigpio.pi()
servoMotor = Servo(name = 'Test', gpio_list = [14], pi)
sensor = Sonic(name = 'Test2', trig = 2, echo = 3, pi)
servoMotor.rotate(0)
time.sleep(1)
try:
while True:
for i in range(181):
servoMotor.rotate(angleR = i)
time.sleep(0.01)
print(i, sensor.distance())
for i in range(181):
servoMtor.rotate(angleR = 180 - i)
time.sleep(0.01)
print((180 - i), sensor.distance())
except KeyboardInterrupt:
pi.stop()
问题:当我通过角度(180倍)使伺服旋转角度时,一切正常。当我将我的超声波传感器与伺服一起使用并返回它们的距离()时,所有事情都开始滞后,伺服器移动速度非常慢。我试图打印距离来查看它是否是伺服抖动问题,但我的怀疑得到证实:这一切都是滞后的。就好像RPi太慢一样。有时候,我会在20°时得到“正常”的速度,然后再次减速。这就是确认我不是gpio库问题,也不是传感器问题。
有没有办法呢? RPi真的滞后吗?
当我如我与伺服沿着超声波传感器,并返回其距离(),一切都开始滞后和伺服动作很慢。
那不是工程师通常是由词的意思是“jitter”你在标题中使用。
在我看来,那sensor.distance()
可能需要比预期更长的时间。也许超声波传感器需要时间来获得稳定的读数,特别是在附近没有障碍物的情况下。与10毫秒sleep
相比,声音传播可能很重要。这会显着减慢for
循环。
往返1.7米外的障碍物的往返行程需要10毫秒的超声波脉冲。
如果传感器和图书馆能够测量距离可达说10M(往返20米),它会没事的时候就在附近返回结果之前要等待60ms的。
最起码,我想时间sensor.distance()
要花多长时间在大范围的物理/环境的情况下返回结果。
当然,由于您的“Sonic”库没有显示,我们无法确定软件和硬件施加了什么限制,或者参数echo = 3
是什么意思。
注意,有一个妹妹网站Raspberry Pi Q&A这可能是这类问题的一个更好的地方。
谢谢您的回复。
我相信仅凭这些传感器需要大约10毫秒返回的距离意味着整整180°,这将需要大约:
180 * (0.010 + 0.010) = +/- 3.60 sec
我又增加了0.01,因为我的循环。事情是,需要超过15秒才能做180°,这是没有任何意义的。我还尝试将手放在传感器上,以缩短收集数据的时间,但不起作用。
有了很多googlin',我发现python不适合这种类型的使用(实时?),虽然pigpio是基于硬件的,但似乎如果有一些计算并行,不要走你的路。作为参考,这里的距离()代码:
def distance(self):
self.pi.write(self.trig, 1)
time.sleep(0.00001)
self.pi.write(self.trig, 0)
while self.pi.read(self.echo) == 0:
pass
start = time.time()
while self.pi.read(self.echo) == 1:
pass
stop = time.time()
return ((stop - start) * 17000)
- 将多线程帮助?
当我第一次尝试pigpio时,自己计算伺服器的占空比肯定会使其抖动。当我选择pigpio的伺服功能时,它一切顺利!
- 用pigpio的set_servo_pulsewidth()来控制超声波传感器有什么区别吗?
我会尝试这两种解决方案并将其报告回来。
原来是超声波传感器。他们花很多时间阅读距离。我把它们放在不同的线程上,现在它们读取的距离较小,但没有任何变化。