代码之家  ›  专栏  ›  技术社区  ›  agenis

RPLIDAR A1在python中的采样速度不如预期

  •  0
  • agenis  · 技术社区  · 4 年前

    使用 A1激光雷达 RPLIDAR ,以及实现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实现激光雷达的全采样率吗? 我要么用覆盆子,要么用Windows。如果解决方案是100%python,那将是最好的。 谢谢,

    0 回复  |  直到 4 年前
        1
  •  1
  •   Mark H    4 年前

    看起来这个设备的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_scannes的生成频率 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()
    
        2
  •  1
  •   agenis    3 年前

    完整代码:

    #!/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()
    
        3
  •  1
  •   Philippe Boulanger    3 年前

    我最近在我的项目中遇到了和你一样的问题:我都试过了 Roboticia's fork 你使用的图书馆,以及 PyRPlidar .

    PyRPlidar在仅支持python的情况下提供了更多的读数,但仍不足以与slamtec/ROS包装器提供的C++示例相媲美。

    然而,我发现了这个 library 最快的Rplidar成功了。它本质上是一个围绕C++SDK构建的包装器,使用 SWIG 作者在一篇文章中谈到了这件事 blog post .

    对我来说,唯一的问题是它只为ARM(Raspberry Pi)编译,但我能够按照说明轻松地为Linux编译。您可以按照Raspberry pi的需求使用它,并为Windows编译它,以获得跨平台和类似C++的高性能解决方案。