0

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

本质上,我在伺服电机 ( HS-422 ) 的顶部安装了两个相距 180° 的超声波传感器 ( HC-SR04 )以充当雷达。

这是一个示例代码。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次)时,一切正常。当我将我的超声波传感器伺服器一起实例化并返回它们distance()时,一切都开始滞后,伺服器移动非常缓慢。

我试图打印距离,看看是否是伺服抖动问题,但我的怀疑得到了证实:一切都滞后了。

好像 RPi 太慢了。

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

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

4

2 回答 2

2

当我将超声波传感器与伺服器一起实例化并返回它们的距离()时,一切都开始滞后,伺服器移动非常缓慢。

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

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

超声波脉冲往返于 1.7m 外的障碍物需要 10ms。

如果您的传感器和库能够测量到 10m(往返 20m)的距离,那么当附近没有任何东西时,它必须等待大约 60ms 才能返回结果。

至少,我会sensor.distance()计算在各种物理/环境情况下返回结果需要多长时间。

当然,由于没有显示您的“Sonic”库,我们无法判断软件和硬件施加了哪些限制,或者您的参数(如echo = 3.

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

于 2017-05-25T13:02:14.360 回答
0

感谢你的回复。

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

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

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

通过大量的谷歌搜索,我发现 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 时,自己为伺服计算占空比肯定会使其抖动。当我选择 pigpio 的伺服功能时,一切顺利!

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

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

于 2017-05-25T16:59:15.327 回答