2017-05-25 79 views
0

我想知道,如果别人遇到了同样的问题,他们的伺服电机上的树莓派(我拥有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真的滞后吗?

回答

1

当我如我与伺服沿着超声波传感器,并返回其距离(),一切都开始滞后和伺服动作很慢。

那不是工程师通常是由词的意思是“jitter”你在标题中使用。

在我看来,那sensor.distance()可能需要比预期更长的时间。也许超声波传感器需要时间来获得稳定的读数,特别是在附近没有障碍物的情况下。与10毫秒sleep相比,声音传播可能很重要。这会显着减慢for循环。

往返1.7米外的障碍物的往返行程需要10毫秒的超声波脉冲。

如果传感器和图书馆能够测量距离可达说10M(往返20米),它会没事的时候就在附近返回结果之前要等待60ms的。

最起码,我想时间sensor.distance()要花多长时间在大范围的物理/环境的情况下返回结果。

当然,由于您的“Sonic”库没有显示,我们无法确定软件和硬件施加了什么限制,或者参数echo = 3是什么意思。

注意,有一个妹妹网站Raspberry Pi Q&A这可能是这类问题的一个更好的地方。

0

谢谢您的回复。

我相信仅凭这些传感器需要大约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()来控制超声波传感器有什么区别吗?

我会尝试这两种解决方案并将其报告回来。

0

原来是超声波传感器。他们花很多时间阅读距离。我把它们放在不同的线程上,现在它们读取的距离较小,但没有任何变化。