2017-05-25 80 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

原來是超聲波傳感器。他們花很多時間閱讀距離。我把它們放在不同的線程上,現在它們讀取的距離較小,但沒有任何變化。