使用python时,RPLIDAR A1的采样速度没有预期的快

2024-06-16 11:57:13 发布

您现在位置:Python中文网/ 问答频道 /正文

使用RPLIDAR中的A1激光雷达,以及实现SDK的python3库之一(在我的例子中是RPLIDAR库),我无法让激光雷达像文档建议的那样快速采样点,即它应该达到8000点/秒,而我的最大采样点是1000点/秒(5.5Hz*170),对于我的使用来说,这还不够(从点云创建3D网格)

我用来检查速度的代码如下: https://github.com/SkoltechRobotics/rplidar/blob/master/examples/measure_speed.py 获取每次扫描的测量次数的代码是readme中的样本

我得到了这样的结果:

enter image description here

有人知道如何从Python API实现激光雷达的全采样率吗? 我要么在树莓上工作,要么在窗户上工作。如果解决方案可以是100%python,那将是最好的。 谢谢


Tags: 代码文档httpsgithubcom网格a1sdk
3条回答

对于该设备,python库似乎正在老化

尝试最大化您的电机速度,并使用快速(即压缩)模式。快速模式允许通过相同的115200波特率连接进行更多测量,扫描速率与电机速度直接相关(自动)

  • 要将电机速度设置为最大,请尝试在顶部添加import rplidar,在lidar.iter_scans()之前添加lidar.motor_speed = rplidar.MAX_MOTOR_PWM
  • 要使用快速/压缩模式,请像iter_scans(scan_type='express')一样调用iter_scans
  • 您还可以尝试添加min_len=100以减少iter_扫描产生更多数据的频率,并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, %.2f RPM' % (1/delta, 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', 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, %.2f RPM' % (1/delta, 60/delta))

if __name__ == "__main__":
    run()

我最近在我的项目中遇到了与您相同的问题:我尝试了您使用的库的Roboticia's forkPyRPlidar

PyPrIDAR在Python中只提供了更多的读数,但仍然不足以与SLAMTEC/ROS包装器提供的C++实例相竞争。p>

然而,我发现了这个library最快的Rplidar实现了这一目的。它基本上是用SWIG构建的C++ SDK的包装器。作者在一篇文章中谈到了这一点

对我来说唯一的问题是它只为ARM(Raspberry Pi)编译,但我能够按照说明轻松地为Linux编译它。您可以使用它,就像您的树莓PI需求一样,并且为Windows编译它具有跨平台和C++类似的性能解决方案。p>

相关问题 更多 >