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() 控制超声波传感器会有什么不同吗?
我将尝试这两种解决方案并在此处报告它们。
我想知道是否其他人在 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() 控制超声波传感器会有什么不同吗?
我将尝试这两种解决方案并在此处报告它们。