如何解决RPLIDAR A1 的采样速度不如使用 python
使用来自 RPLIDAR 的 A1 激光雷达,以及实现 SDK 的 python3 库之一(在我的例子中是 rplidar 库),我无法获得激光雷达按照文档建议的速度对点进行采样,即它应该达到 8000 点/秒,而我的最大值为 1000 点/秒(5.5Hz*170),这对于我的使用来说真的不够(创建 3D 网格来自点云)
我用来检查速度的代码在这里: https://github.com/SkoltechRobotics/rplidar/blob/master/examples/measure_speed.py 获取每次扫描测量次数的代码是 readme 中的样本。
我得到了这个结果:
有谁知道如何通过 Python API 实现激光雷达的完整采样率? 我在树莓派或 Windows 上工作。如果解决方案可以是 100% python,那将是最好的。 谢谢,
解决方法
看起来此设备的 Python 库正在老化。
尝试最大限度地提高电机速度并使用快速(即压缩)模式。快速模式允许通过相同的 115200 波特率连接进行更多测量,并且扫描速率与电机速度直接相关(自动)。
- 要将电机速度设置为最大,请尝试在顶部添加
import rplidar
,在lidar.motor_speed = rplidar.MAX_MOTOR_PWM
之前添加lidar.iter_scans()
- 要使用快速/压缩模式,请像
iter_scans
一样调用iter_scans(scan_type='express')
。 - 您还可以尝试添加
min_len=100
以减少使用更多数据的 iter_scans 产生的频率,并添加max_buf_meas=False
以避免丢弃数据并接收“输入缓冲区中的字节过多”消息,这在您的屏幕截图。
(我还建议在循环内不使用 print 语句的情况下尝试它,除非您确实想实时监控它。)
完整代码:
#!/usr/bin/env python3
'''Measures sensor scanning speed'''
import rplidar
import time
PORT_NAME = '/dev/ttyUSB0'
def run():
'''Main function'''
lidar = rplidar.RPLidar(PORT_NAME)
old_t = None
data = []
try:
print('Press Ctrl+C to stop')
lidar.motor_speed = rplidar.MAX_MOTOR_PWM
for _ in lidar.iter_scans(scan_type='express',min_len=100,max_buf_meas=False):
now = time.time()
if old_t is None:
old_t = now
continue
delta = now - old_t
print('%.2f Hz,%.2f RPM' % (1/delta,60/delta))
data.append(delta)
old_t = now
except KeyboardInterrupt:
print('Stoping. Computing mean...')
lidar.stop()
lidar.disconnect()
delta = sum(data)/len(data)
print('Mean: %.2f Hz,60/delta))
if __name__ == '__main__':
run()
,
完整代码:
#!/usr/bin/env python3 '''Measures sensor scanning speed'''
import rplidar
import time
PORT_NAME = '/dev/ttyUSB0'
def run():
'''Main function'''
lidar = rplidar.RPLidar(PORT_NAME)
old_t = None
data = []
try:
print('Press Ctrl+C to stop')
lidar.motor_speed = rplidar.MAX_MOTOR_PWM
for _ in lidar.iter_scans(scan_type='express',60/delta))
if __name__ == "__main__":
run()
,
我最近在我的项目中遇到了与您相同的问题:我尝试了您使用的库的 Roboticia's fork 和 PyRPlidar。
事实证明,PyRPlidar 提供了更多的读数,而只是 Python,但仍不足以与 slamtec 提供的 C++ 示例/他们拥有的 ROS 包装器相媲美。
然而,我发现这个 library,最快的 Rplidar 成功了。它本质上是使用 SWIG 构建的 C++ SDK 的包装器。作者在 blog post 中谈到了它。
对我来说唯一的问题是它只针对 ARM(Raspberry Pi)编译,但我能够按照说明轻松地为 Linux 编译它。您可以按照 Raspberry pi 的需求使用它,并为 Windows 编译它以获得跨平台和类似 C++ 的高性能解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。