📖 写在前面

RPLIDAR A1 是思岚科技推出的低成本360度激光扫描测距雷达,广泛应用于机器人SLAM建图、避障导航、教学实验等领域。它通过UART串口与外部系统通信,配合USB适配器可以方便地连接PC进行数据采集与可视化。

参考博客:
【RPLIDAR A1使用教程:从开箱到实时点云可视化】
【基于单线激光雷达 RPLidar 的 DWA 避碰实践(Python 全流程 + 公式推导)】

硬件购买:
思岚激光雷达RPLIDAR A1 C1 SLAMTEC正品DTOF测距导航赠送ROS资料
在这里插入图片描述

【下单链接】https://s.click.taobao.com/A3MInMj

本文将从硬件连接开始,一步步带你完成RPLIDAR A1的驱动安装、环境配置、数据读取和实时极坐标绘图,最终实现如下的扫描效果:

在这里插入图片描述

本文适合人群:机器人爱好者、ROS初学者、嵌入式开发者、需要快速验证雷达功能的工程师。

开发环境:Windows 10/11 + Python 3.8+ + RPLIDAR A1

一、硬件准备

1.1 开箱清单

购买RPLIDAR A1开发套件时,包装内通常包含以下组件:

组件说明
RPLIDAR A1M8 雷达本体核心测距模块,内含激光发射/接收单元和旋转电机
7-pin 连接线用于连接雷达本体与USB适配器
USB适配器将雷达的UART串口转换为USB接口,同时为电机供电
Micro USB线连接适配器与PC

1.2 接口定义

RPLIDAR A1M8 本体提供 7-pin 1.25mm 间距 接口:

引脚信号名类型描述
PIN 1GND供电核心地线
PIN 2RX输入测距核心串口输入(5V TTL)
PIN 3TX输出测距核心串口输出(5V TTL)
PIN 4VCC_5供电测距核心供电(5V)
PIN 5GND供电电机地线
PIN 6MOTOCTL输入电机使能/PWM控制信号(高电平有效)
PIN 7VMOTO供电扫描电机供电(5V~9V)

注意:A1M8的RX输入信号为电流控制型,实际控制节点电压不能低于1.6V。

1.3 硬件连接步骤

方式一:使用官方USB适配器(推荐)

  1. 将7-pin连接线一端插入雷达本体,另一端插入USB适配器
  2. 用Micro USB线将适配器连接到PC
  3. 连接成功后,适配器上的LED指示灯会亮起

方式二:自制TTL转接板

如果你手头没有官方适配器,也可以使用CP2102或CH340模块自行搭建:

  • 将雷达的TX接转接板RX,RX接转接板TX
  • GND对GND,VCC_5和VMOTO都接5V
  • MOTOCTL接5V(使能电机)或接MCU的PWM引脚(调速)

提示:USB适配器的MOTOCTL信号固定为高电平,因此A1使用官方适配器时电机始终以最高转速运转。

在这里插入图片描述

二、驱动安装(Windows)

2.1 确认设备是否被识别

连接雷达后,打开 设备管理器 → 端口 (COM 和 LPT) ,查看是否出现新的COM端口。正常情况下应看到类似 Silicon Labs CP210x USB to UART Bridge (COMx) 的设备。

如果出现黄色感叹号,说明驱动未正确安装。

2.2 安装CP210x驱动

http://www.silabs.com/products/interface/usb-bridges/Pages/usb-bridges.aspx
在RPLIDAR SDK的 tools\cp2102_driver 目录下可以找到驱动压缩文件,解压后根据操作系统选择安装程序:

  • 64位系统:运行 CP210xVCPInstaller_x64.exe
  • 32位系统:运行 CP210xVCPInstaller_x86.exe

2.3 确认端口号

驱动安装成功后,设备管理器中会显示一个COM端口号(如COM3、COM23等)。记下这个端口号,后续代码中会用到。

在这里插入图片描述
采用官方的配置软件读取数据
下载地址:https://github.com/Slamtec/rplidar_sdk/releases
在这里插入图片描述
打开串口显示当前围栏障碍数据
在这里插入图片描述

三、Python环境配置

3.1 安装必要库

推荐使用 adafruit-circuitpython-rplidar 库,它在Windows上无需额外处理DTR引脚,可以开箱即用。

pip install adafruit-circuitpython-rplidar -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pyserial numpy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

说明adafruit-circuitpython-rplidar 支持在标准Python(CPython)环境中运行,不限于CircuitPython硬件。

3.2 快速验证:读取设备信息

在正式绘图之前,先用以下代码快速验证雷达是否正常工作:

from adafruit_rplidar import RPLidar

PORT_NAME = 'COM23'  # 请改为你的端口号

lidar = RPLidar(None, PORT_NAME, baudrate=115200, timeout=3)


# 读取一圈扫描数据
for scan in lidar.iter_scans():
    print(f"本圈共 {len(scan)} 个点")
    for quality, angle, distance in scan[:5]:  # 只打印前5个点
        print(f"  角度: {angle:.2f}°, 距离: {distance:.0f}mm, 质量: {quality}")
    break

lidar.stop()
lidar.disconnect()

预期输出

本圈共 168 个点
  角度: 63.41°, 距离: 766mm, 质量: 15
  角度: 64.75°, 距离: 796mm, 质量: 15
  角度: 66.12°, 距离: 832mm, 质量: 15
  角度: 67.31°, 距离: 868mm, 质量: 15
  角度: 68.64°, 距离: 912mm, 质量: 15

如果能看到类似输出,说明雷达通信正常,可以进入可视化阶段。

3.3 iter_scans() 参数说明

iter_scans() 返回一个生成器,每次产生一圈完整的扫描数据。每个数据点是一个三元组 (quality, angle, distance)

  • quality:信号质量(0~255)
  • angle:角度(单位:度,0~360°)
  • distance:距离(单位:毫米)

常用参数:

参数默认值说明
max_buf_meas500缓冲区最大测量点数,超过时会丢弃数据
min_len5一圈最少包含的点数,低于此值不输出

提示:如果运行时报 too many measurements in the input buffer 错误,说明缓冲区溢出,可以尝试设置 max_buf_meas=200 或减小 min_len

四、实时极坐标可视化

以下代码使用 matplotlib 的极坐标投影,实时绘制RPLIDAR A1的扫描点云:

# -*- coding: utf-8 -*-
import time
import threading
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from adafruit_rplidar import RPLidar

# ========== 配置参数 ==========
PORT_NAME = 'COM23'          # 请改为你的端口号
BAUDRATE = 115200
MAX_RANGE_MM = 12000          # A1最大量程约12米
# =============================

# 全局数据锁和存储
scan_data = [(0, 0)]  # (角度, 距离mm)
data_lock = threading.Lock()

# 初始化雷达
lidar = RPLidar(None, PORT_NAME, baudrate=BAUDRATE, timeout=3)
print("[INFO] 雷达已连接")
print("[INFO] 设备信息:", lidar.get_info())
print("[INFO] 健康状态:", lidar.get_health())

# 后台线程:持续读取扫描数据
def read_lidar():
    global scan_data
    try:
        for scan in lidar.iter_scans(max_buf_meas=200):
            with data_lock:
                scan_data = [(angle, dist) for _, angle, dist in scan if dist > 0]
    except Exception as e:
        print(f"[ERROR] 读取线程异常: {e}")

thread = threading.Thread(target=read_lidar, daemon=True)
thread.start()

# 前台:Matplotlib 极坐标实时绘图
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, projection='polar')
ax.set_theta_zero_location('N')   # 0度朝上
ax.set_theta_direction(-1)        # 顺时针方向
ax.set_rmax(MAX_RANGE_MM)
ax.grid(True, alpha=0.4)
ax.set_title("RPLIDAR A1 扫描 - 等待数据 ...")

scatter = ax.scatter([], [], s=5, c='r', alpha=0.7)

def update(_frame):
    with data_lock:
        current_data = list(scan_data)

    if not current_data:
        return scatter,

    # 角度转弧度:matplotlib极坐标使用弧度
    angles_rad = np.radians([pt[0] for pt in current_data])
    dists_mm = [pt[1] for pt in current_data]

    scatter.set_offsets(np.column_stack([angles_rad, dists_mm]))
    ax.set_title(f"RPLIDAR A1 - {len(current_data)} 个点")
    return scatter,

ani = FuncAnimation(fig, update, interval=100, blit=False, cache_frame_data=False)

try:
    plt.show()
finally:
    print("[INFO] 正在停止...")
    lidar.stop()
    lidar.disconnect()
    print("[INFO] 已断开连接")

运行效果

运行后应看到:

  1. 雷达电机持续旋转
  2. 极坐标图上实时刷新红色扫描点
  3. 标题显示当前圈的点数(A1典型值200~400点)

在这里插入图片描述

五、进阶优化

5.1 使用Express模式提升采样率

标准SCAN模式下,A1的采样率约为2000点/秒。如果使用Express压缩模式,采样率可以提升到4000点/秒:

for scan in lidar.iter_scans(scan_type='express', min_len=100, max_buf_meas=False):
    # 处理扫描数据...

5.2 提高电机转速

A1的扫描频率与电机转速直接相关,可以通过设置电机PWM来提升转速:

import rplidar
lidar.motor_speed = rplidar.MAX_MOTOR_PWM

注意:此方式仅适用于未使用官方USB适配器的场景(适配器将MOTOCTL固定为高电平)。

5.3 数据持久化

如果需要保存扫描数据用于离线分析,可以将点云导出为CSV:

import csv

with open('scan_data.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['angle_deg', 'distance_mm'])
    with data_lock:
        for angle, dist in scan_data:
            writer.writerow([f'{angle:.2f}', dist])

六、常见问题与解决方案

Q1:设备管理器中看不到COM端口

原因:驱动未正确安装。
解决:参考第二章重新安装CP210x驱动,或使用Zadig工具替换驱动。

Q2:能打开串口但读不到数据

排查步骤

  1. 检查波特率是否为115200(A1M8的标准波特率)
  2. 确认没有其他程序(串口助手、ROS节点等)占用同一COM口
  3. 检查7-pin连接线是否接触良好,可以拔插一次
  4. 检查供电是否充足,A1需要5V/1.5A以上的供电

Q3:报错 too many measurements in the input buffer

原因:数据读取速度跟不上雷达输出速度,缓冲区溢出。
解决:减小 max_buf_meas 参数,或在 iter_scans() 中设置 max_buf_meas=200

Q4:点云图只显示一小部分点或呈圆形

原因:可能混淆了角度单位和弧度单位。
解决:matplotlib的极坐标投影使用弧度,而RPLIDAR返回的角度是度,必须用 np.radians() 转换。

Q5:串口被占用

原因:Windows下同一串口不能被两个程序同时打开。
解决:关闭所有可能占用COM口的程序(串口助手、其他Python脚本、ROS节点等),然后重新运行。

Q6:A1每次上电后点云质量不稳定

排查方向

  • 检查供电电压是否稳定(5.2V~9V之间)
  • 避免数据线过长导致信号衰减
  • iter_scans() 中增加 min_len 参数过滤不完整扫描

七、总结

本文从硬件连接、驱动安装、环境配置到实时可视化,完整覆盖了RPLIDAR A1的上手流程。核心要点:

  1. 驱动是第一步:CP210x驱动安装失败是Windows用户最常见的卡点,推荐使用Zadig工具
  2. Adafruit库开箱即用:无需手动处理DTR引脚,iter_scans() 一行代码获取扫描数据
  3. 极坐标可视化:matplotlib的polar投影是展示激光雷达数据的最佳方式
  4. 角度单位要注意:RPLIDAR返回度,matplotlib需要弧度

如果本文对你有帮助,欢迎点赞收藏。下一篇文章将介绍如何将RPLIDAR A1数据接入ROS进行SLAM建图,敬请期待。


参考链接

  • RPLIDAR A1官方SDK:https://github.com/Slamtec/rplidar_sdk
  • Adafruit RPLIDAR库文档:https://docs.circuitpython.org/projects/rplidar/en/stable/
  • 思岚官方Wiki:https://wiki.slamtec.com
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐