Raspberry pi 伺服和超声波传感器抖动

Raspberry pi servo and ultrasonic sensors jitter

我想知道是否其他人在 Raspberry Pi(我拥有 3B)上使用伺服电机和超声波传感器时遇到了同样的问题。

本质上,我安装了两个超声波传感器(HC-SR04) with 180° apart from each other on top of a servo motor (HS-422)作为雷达。

这是示例代码。 Servo 和 Sonic 类 是我做的。它们功能齐全,并且使用 Joan 的 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次)时,一切正常。当我实例化我的超声波传感器 以及 伺服器和 return 它们的 distance() 时,一切都开始滞后,伺服器移动得非常慢。

我试着打印距离看是不是舵机抖动的问题,结果证实了我的怀疑:都是滞后的。

好像树莓派太慢了。

有时,我会获得大约 20° 的“正常”速度,然后再次减速。这向我证实,这不是 gpio 库问题,也不是传感器问题。

有办法解决这个问题吗? RPi 真的很落后吗?

When I instance my ultrasonic sensors along with the servo and return their distance(), everything starts to lag and the servo moves really slow.

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

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

一个超声波脉冲往返1.7m远的障碍物需要10毫秒。

如果您的传感器和库能够测量最远 10 米的距离(往返 20 米),它必须等待大约 60 毫秒才能在附近没有任何东西的情况下return获取结果。

至少,我会计算 sensor.distance() 在广泛的 physical/environmental 情况下 return 结果需要多长时间。

当然,由于您的 "Sonic" 库未显示,我们无法判断软件和硬件施加的限制或您的参数 echo = 3 的含义。

请注意,Raspberry Pi Q&A 有一个姊妹网站,可能更适合回答此类问题。

感谢您的回复。

我相信传感器需要大约 10 毫秒到 return 距离的唯一事实意味着整个 180°,大约需要:

180 * (0.010 + 0.010) = +/- 3.60 sec

由于我的循环,我又添加了 0.01。问题是,做一个 180° 需要超过 15 秒,这没有任何意义。我也试着把手放在传感器周围,以缩短收集数据的时间,但没有用。

通过大量 googlin,我发现 python 不适合这种类型的使用(实时?),尽管 pigpio 是基于硬件的,但似乎有一些计算与此同时,事情并不如你所愿。作为参考,这里是 distance() 代码:

 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的时候,自己计算Servo的占空比肯定会抖动。当我选择pigpio的舵机功能时,一切都很顺利!

  • 用 pigpio 的 set_servo_pulsewidth() 控制超声波传感器会有什么不同吗?

我将尝试这两种解决方案并在此处报告它们。