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
相关产品推荐
相关产品推荐

