You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RPLidar在PC运行正常,树莓派3B+上报错求助

问题:RPLidar在树莓派3B+上扫描时抛出"Incorrect descriptor starting bytes"错误

我使用RPLidar将激光雷达扫描数据写入CSV文件,通过USB连接PC时运行完全正常,但连接树莓派3B+后,尽管健康状态显示正常,却抛出多个错误。

Python代码

from rplidar import RPLidar
from math import sin, cos, radians
import multiprocessing as mp
import csv

lidar = RPLidar("/dev/ttyUSB0")


def scan():
    try:
        for scan in enumerate(lidar.iter_scans(max_buf_meas=False)):
            list_version_data = list(scan)
            for data in list_version_data:
                if isinstance(data, list):
                    for indiv_data_points in data:
                        if isinstance(indiv_data_points, tuple):
                            list_indiv_data_points = list(indiv_data_points)
                            list_indiv_data_points.pop(0)
                            # Angle is first, distance is second
                            # Angle is in degrees, distance is in mm
                            angle = list_indiv_data_points[0]
                            distance = list_indiv_data_points[1]
                            length = distance
                            angle = radians(angle)
                            x, y = (length * cos(angle)), (length * sin(angle))
                            print(str(x), str(y))
                            with open("lidar03.csv", "a") as f:
                                writer = csv.writer(f)
                                writer.writerow([x, y])
                elif isinstance(data, int):
                    print("int")
        if KeyboardInterrupt:
            lidar.stop()
            lidar.stop_motor()
            lidar.disconnect()
            scan()
    except Exception as e:
        lidar.stop()
        lidar.stop_motor()
        lidar.disconnect()
        lidar.reset()
        print("error")
        print(e)
        pass


if __name__ == "__main__":
    print(lidar.get_health())
    print(lidar.get_info())
    print(lidar.reset())
    scan()

报错回溯

('Good', 0)
{'model': 24, 'firmware': (1, 29), 'hardware': 7, 'serialnumber': '95BD99F6C9E59AD4C5E59CF7696F3414'}
None
Traceback (most recent call last):
  File "/home/garb/robot/TESTING/lidar_testing/live_write_csv.py", line 11, in scan
    for scan in enumerate(lidar.iter_scans(max_buf_meas=False)):
  File "/home/garb/.local/lib/python3.9/site-packages/rplidar.py", line 357, in iter_scans
    for new_scan, quality, angle, distance in iterator:
  File "/home/garb/.local/lib/python3.9/site-packages/rplidar.py", line 300, in iter_measurments
    status, error_code = self.get_health()
  File "/home/garb/.local/lib/python3.9/site-packages/rplidar.py", line 245, in get_health
    dsize, is_single, dtype = self._read_descriptor()
  File "/home/garb/.local/lib/python3.9/site-packages/rplidar.py", line 189, in _read_descriptor
    raise RPLidarException('Incorrect descriptor starting bytes')
rplidar.RPLidarException: Incorrect descriptor starting bytes

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/garb/robot/TESTING/lidar_testing/live_write_csv.py", line 53, in <module>
    scan()
  File "/home/garb/robot/TESTING/lidar_testing/live_write_csv.py", line 43, in scan
    lidar.reset()
  File "/home/garb/.local/lib/python3.9/site-packages/rplidar.py", line 273, in reset
    self._send_cmd(RESET_BYTE)
  File "/home/garb/.local/lib/python3.9/site-packages/rplidar.py", line 179, in _send_cmd
    self._serial_port.write(req)
  File "/home/garb/.local/lib/python3.9/site-packages/serial/serialposix.py", line 615, in write
    raise PortNotOpenError()
serial.serialutil.PortNotOpenError: Attempting to use a port that is not open

解决方法

1. 修复串口权限与波特率配置

  • 树莓派默认USB串口权限不足,执行以下命令添加用户到串口权限组,重启生效:
    sudo usermod -a -G dialout $USER
    
  • RPLidar默认波特率为115200,PC可能自动适配,但树莓派需明确指定,修改初始化代码:
    lidar = RPLidar("/dev/ttyUSB0", baudrate=115200)
    

2. 修正异常处理逻辑

报错中第二个错误是因为先执行了disconnect()关闭串口,再调用reset()需要写入串口导致的。调整异常处理流程,确保操作串口时端口处于打开状态:

except Exception as e:
    try:
        lidar.stop()
        lidar.stop_motor()
        lidar.reset()
    except Exception:
        pass
    lidar.disconnect()
    print("error")
    print(e)

3. 优化数据处理与IO效率

树莓派性能弱于PC,原代码存在两处效率问题:

  • 每次循环都打开/关闭CSV文件,引发IO瓶颈,将文件打开移到循环外部;
  • 冗余的数据类型判断与转换增加计算负担,直接解构iter_scans返回的结构即可。

优化后的scan函数:

def scan():
    try:
        with open("lidar03.csv", "a") as f:
            writer = csv.writer(f)
            # 直接解构iter_scans的返回值,无需enumerate后层层判断
            for scan_idx, scan_data in lidar.iter_scans(max_buf_meas=500):
                for quality, angle, distance in scan_data:
                    length = distance
                    angle_rad = radians(angle)
                    x = length * cos(angle_rad)
                    y = length * sin(angle_rad)
                    print(x, y)
                    writer.writerow([x, y])
    except KeyboardInterrupt:
        print("手动停止扫描")
    except Exception as e:
        print("error")
        print(e)
    finally:
        # 确保无论是否异常,都正确关闭设备
        try:
            lidar.stop()
            lidar.stop_motor()
        except Exception:
            pass
        lidar.disconnect()

4. 调整串口缓冲区参数

原代码max_buf_meas=False会关闭缓冲区,树莓派串口速率有限,易导致数据溢出。建议设置合理的缓冲区大小,比如max_buf_meas=500,让库自动处理数据缓存。

内容的提问来源于stack exchange,提问作者Garberchov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:17:54