Ubuntu 20.04 下思岚 RPLIDAR 驱动安装与使用全记录搞机器人的朋友应该都有体会激光雷达这东西一旦玩起来就再也回不去了。测距准、不受光照影响、能直接给地图匹配提供高质量输入尤其是二维雷达对于做小车导航、建图、避障这些任务来说几乎是标配传感器。思岚的 RPLIDAR 系列A1、A2、A3、S1 等因为性价比高、资料齐全在高校实验室和创客圈子里用得非常多。这篇文章我以 Ubuntu 20.04 为系统环境从零开始把思岚 RPLIDAR 的驱动安装、环境配置、数据读取到结果可视化完整走一遍。无论你是刚入门的本科生还是已经调过一阵子机器人但没碰过雷达的开发者按照这篇文章的步骤操作基本都能让雷达转起来并在终端里看到距离数据。1. 准备工作与整体思路1.1 你手里需要有哪些东西先说硬件思岚 RPLIDAR 系列型号不同接口和协议略有差异但整体框架是统一的。我这里以最常见的 A1 和 A2 为例说明这两款也是网上问得最多的。你需要确认以下几点雷达本体最好带原装 USB 转接板或者配套的串口模块。A1 出厂一般是 3.5mm 音频座接口需要配合官方转接板才能接到电脑 USB 口A2 大多直接带 PWM 调速接口和串口引脚同样需要 USB 转接。Ubuntu 20.04 系统的电脑或者虚拟机都可以。虚拟机需要注意 USB 直通设置实测 VMware 和 VirtualBox 都能用但有时候会有延迟最好还是物理机。如果是自己用杜邦线连接需要确保雷达的供电达到 5V 且电流足够。RPLIDAR A1 的峰值电流在 500mA 左右普通的电脑 USB 口能带动但劣质 HUB 不行。软件方面官方 SDK 在 GitHub 上开源仓库名是rplidar_sdk里面的代码不依赖 ROS 也能直接跑。如果你只想快速看到数据可以直接编译 SDK如果要在 ROS 里使用就需要编译 ROS 驱动包。这篇文章两种方式都会讲清楚。1.2 安装方式的选择逻辑SDK 还是 ROS 驱动很多初学者一上来就直接搜 ROS 驱动结果编译报错心态直接崩了。我的建议是先装 SDK 验证硬件再装 ROS 驱动做集成。为什么这样安排第一SDK 是底层的东西它直接通过串口和雷达通信不依赖 ROS 那一大堆依赖关系。如果 SDK 能读到数据说明雷达硬件和 USB 转串口都是好的问题定位范围一下子就缩小了。第二ROS 驱动的本质是封装了 SDK然后把数据以sensor_msgs/LaserScan的消息格式发到 ROS 网络里。如果底层不通装好 ROS 驱动也白搭底层通了ROS 驱动基本是水到渠成的事。第三从排查问题的角度讲分层验证可以避免“ROS 版本不对”“依赖缺失”“串口权限不足”“雷达本身坏了”这几种问题混在一起。我见过太多人把时间浪费在没有意义的报错日志里其实硬件就没连好。所以这篇文章的整体路线是环境准备 - 串口权限与硬件检测 - SDK 编译与测试 - ROS 驱动安装 - 数据可视化 - 常见问题排查。每一步都有明确的验证手段跟着走就不会迷路。2. 核心原理与驱动选型搞清楚 RPLIDAR 在干什么2.1 RPLIDAR 的测距原理简述思岚 RPLIDAR 是典型的三角测距法激光雷达。它的核心结构包括一个激光发射器、一个接收 CMOS 传感器以及一套旋转机构。发射器打出一束红外激光照射到障碍物表面后发生漫反射一部分反射光被接收端传感器捕获。由于发射器和接收器之间存在固定的基线距离当障碍物距离不同时反射光在 CMOS 上成像的位置也不同。通过标定好的三角几何关系就可以计算得到障碍物的距离值。这种方案相比 ToF飞行时间法在近距离和中距离比如 0.15m 到 12m范围内精度不错而且成本低所以非常适合室内机器人和教育场景。A1 的扫描频率可以通过指令在 1Hz 到 10Hz 之间调节默认通常在 10Hz 左右也就是一秒钟转 10 圈每一圈输出 360 度范围内的距离点。A2 的测距范围更大采样率也更高但驱动协议基本一脉相承所以这篇文章的所有操作步骤对 A1/A2/S1 这些型号基本通用。2.2 驱动栈的组成串口、SDK、ROS 三者的关系从软件层面看RPLIDAR 的驱动栈分三层底层是 USB 转串口设备通常是 CP2102 或者 CH340 芯片系统通过/dev/ttyUSB0这样的设备文件访问它。中间层是思岚官方 SDK它负责向雷达发送控制指令启动扫描、停止扫描、设置转速等并解析雷达返回的二进制数据帧。应用层是 ROS 驱动节点它把 SDK 解析出来的极坐标数据转换成 ROS 的 LaserScan 消息供后续的建图、导航功能包使用。理解这三层之后你就能明白为什么串口权限那么重要了。因为如果当前用户没有/dev/ttyUSB0的读写权限SDK 连打开串口都做不到后续一切无从谈起。2.3 为什么推荐官方 SDK 而不是网上各种魔改库GitHub 上除了官方rplidar_sdk还有不少第三方封装库比如rplidar_ros、rplidar_ros2以及各种语言的绑定。我的建议是第一优先使用官方仓库ROS 相关的包也用官方维护的那份。原因很简单官方 SDK 的协议解析最完整对各个型号的兼容性最全而且从 2015 年到现在持续在更新。第三方库虽然有时候封装得更简洁但很可能只是针对作者自己手头的那台雷达调试过换一个型号或者固件版本就可能出现解析错位、数据跳变的情况。说到底雷达驱动这种底层的活儿稳定性比花哨的封装重要得多。后面在实际操作中我也只会用官方仓库的原生代码连补丁都不打就是为了减少变量。3. 环境准备与串口权限配置3.1 升级系统并安装基础工具打开终端先把系统包索引和基础编译工具装好。这一步在任何安装开始前做能减少很多后续编译时缺少依赖的幺蛾子。执行sudo apt update sudo apt upgrade -y sudo apt install -y git build-essential cmake python3 python3-pip如果你是 Ubuntu 20.04 全新系统这些包可能已经带了一部分但 build-essential包含 gcc、g、make和 cmake 必须确保存在。这俩是编译 SDK 和 ROS 驱动的基础。3.2 解决串口权限把用户加入 dialout 组把雷达接上电脑的 USB 口然后用lsusb看看系统能不能识别到设备。不同的转接板芯片显示的名称不一样。CP2102 芯片会显示Silicon Labs CP210x UART BridgeCH340 芯片会显示QinHeng Electronics CH340 serial converter。如果lsusb看不到任何新设备那你得先检查 USB 线、转接板、还有电脑的 USB 口这属于硬件层面问题。lsusb能看到设备了再检查串口设备文件ls -l /dev/ttyUSB*正常情况下会有一个/dev/ttyUSB0如果你是第一次插上它默认的属主是 root所属组是 dialout权限通常为crw-rw----。也就是说只有 root 用户和 dialout 组内的用户能读写。你当前登录用户大概率不在 dialout 组里所以要先加进去sudo usermod -a -G dialout $USER改完之后注销重新登录或者重启电脑让组权限生效。不重启也可以直接用newgrp dialout切换当前终端的组身份但重新登录最彻底。验证方式很简单执行id命令看看输出里有没有dialout字样。如果没有说明没生效检查一下是不是漏了注销这一步骤。注意串口权限问题是最多人踩的坑。很多人编译完 SDK 运行时报failed to open serial port十有八九就是这个原因。不要急着去改代码先检查权限。3.3 检查串口是否被 ModemManager 占用有个比较隐蔽的问题是 Ubuntu 桌面版自带的 ModemManager 服务可能会自动占用串口设备导致 SDK 打不开串口。这个在嵌入式开发里遇到得很多GPS 模块、Arduino 板子、雷达都中过招。如果运行时提示设备被占用可以通过下面命令查看sudo lsof /dev/ttyUSB0发现有进程名带ModemManager的直接禁用它sudo systemctl stop ModemManager sudo systemctl disable ModemManager注意禁用服务之后如果你以后还要用 4G 上网卡之类的设备可能会有影响所以这一步要权衡实际情况。我的建议是优先停掉跑完雷达再恢复。4. 官方 SDK 的编译与直接测试4.1 克隆官方 SDK 仓库思岚的 SDK 仓库不带 ROS 依赖非常干净。我们用 git 直接拉下来cd ~ git clone https://github.com/Slamtec/rplidar_sdk.git cd rplidar_sdk仓库里目录结构大概是这样的sdk/放核心源码app/放示例程序doc/有协议文档makefile和CMakeLists.txt是构建入口。4.2 编译两条路径任选官方推荐用 makefile 直接编译这样简单直接cd ~/rplidar_sdk make编译产物在output/Linux/Release/下面你会看到几个可执行文件其中ultra_simple是最简测试程序rplidar_sdk_test是完整自测程序。如果用 CMake 也没问题官方同样支持cd ~/rplidar_sdk mkdir build cd build cmake .. makeCMake 生成的编译产物也在类似路径下。两个方式选一个就行核心源码是同一套。如果编译报错大概率是 cmake 版本过低或者缺少 g。用我前面给的apt install build-essential cmake命令重新补一下依赖基本能解决。4.3 运行 ultra_simple 验证设备编译完成以后接上雷达运行cd ~/rplidar_sdk/output/Linux/Release ./ultra_simple如果一切正常你会看到终端里持续刷出类似这样的数据Theta: 0.000000 Dist: 0.456000 Quality: 59 Theta: 0.180000 Dist: 0.452000 Quality: 60 Theta: 0.360000 Dist: 0.455000 Quality: 59角度Theta单位是度距离Dist单位是米。Quality 表示信号质量数值越高代表回波越可靠。你把雷达对着墙壁、对着人、对着空旷区域距离值会相应地变化。这个输出其实就是雷达扫描一个完整 360 度得到的点集。程序默认会持续输出按 CtrlC 可以中断。看到这个说明你的雷达硬件、USB 转串口、串口权限、SDK 编译全链路都已经通了。这个ultra_simple程序很有意思它只用了 SDK 的极简接口createDriver()创建实例connect()建立连接startMotor()启动电机grabScanDataHq()获取数据。想要自己写上位机程序的话从这个最小例程改起最合适。4.4 SDK 常用 API 与协议层面的说明简单提一下 SDK 的核心接口方便你之后要做二次开发时快速上手。接口都在sdk/include/sl_lidar_driver.h文件里常用的是这几组SL_LidarDriver::createDriver()和disposeDriver()创建和销毁驱动实例类似 C 的对象生命周期管理。connect(Channel*, lidar_baudrate)和disconnect()建立和断开连接。这里面的 Channel 抽象了串口、网络等不同物理通道官方默认提供了串口通道实现。startMotor()和stopMotor()控制雷达电机。不启动电机扫描数据就出不来插上雷达后电机默认是不转的必须由软件启动。grabScanDataHq()获取一帧高质量扫描点云包含角度、距离、信号质量。新版本 SDK 推荐用Hq结尾的高精度接口老接口grabScanData()是兼容旧设备用的功能和新接口基本对应。setMotorSpeed()设置电机转速对应的就是扫描频率。低转速时的功耗更小但单圈点数变少高转速响应快适合运动中的机器人建图。这套协议是所有思岚雷达通用的区别主要体现在串口波特率上。A1 的波特率是 115200A2 是 256000。SDK 在connect()的时候需要指定波特率官方 example 里一般用getDefaultBaudrate()自动匹配所以换型号不用改代码。5. ROS 驱动安装在 Ubuntu 20.04 中集成到 ROS Noetic5.1 安装 ROS Noetic 基础环境如果你是从零开始配的 Ubuntu 20.04还没有安装 ROS那先用下面这套命令装好 ROS NoeticUbuntu 20.04 对应的 ROS 1 版本。不要试图在 20.04 上装更老的 Kinetic 或 Melodic那差不多是自找麻烦。sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list sudo apt install -y curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update sudo apt install -y ros-noetic-desktop-fullros-noetic-desktop-full包含 rviz、gazebo 等一系列常用工具既然你要做雷达数据可视化装这个最省事。如果磁盘空间紧张可以只装ros-noetic-ros-base加上 rviz但这里建议直接装完整版。安装完成后配置环境变量echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc注意ROS Noetic 默认使用 Python3所以后面如果要用脚本直接把解释器指向python3就行。这和之前版本用 Python2 有很大区别新手尤其要注意。5.2 创建工作区并克隆 rplidar_rosROS 的工作区catkin workspace是组织功能包的标准方式。我们创建一个叫catkin_ws的工作区并把思岚官方 ROS 驱动包放进去。mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/Slamtec/rplidar_ros.git这个rplidar_ros仓库包含两个驱动包rplidar_ros是 ROS 1 的驱动rplidar_ros2是 ROS 2 的驱动。我们关注前者。5.3 编译并确认驱动节点生成编译整个工作区cd ~/catkin_ws catkin_make如果你用的是 catkin_tools 习惯用catkin build也是可以的二选一。编译完成后需要设置环境变量让 shell 能识别这个工作区echo source ~/catkin_ws/devel/setup.bash ~/.bashrc source ~/.bashrc验证驱动节点是否生成rosnode list这时候你还没启动节点所以列表是空的但至少说明 ROS 环境没问题。检查一下有没有生成rplidarNode这个可执行文件find ~/catkin_ws -name rplidarNode能找到就说明编译成功。找不到的话大概率是工作区没编译成功回到上一步看看日志报了什么错。5.4 配置 launch 文件和串口参数rplidar_ros包的launch/目录下有几个 launch 文件最常用的是rplidar.launch。打开看一下默认参数launch node namerplidarNode pkgrplidar_ros typerplidarNode outputscreen param nameserial_port typestring value/dev/ttyUSB0/ param nameserial_baudrate typeint value115200/ param nameframe_id typestring valuelaser/ param nameinverted typebool valuefalse/ param nameangle_compensate typebool valuetrue/ /node /launch这里面有几个参数需要解释一下serial_port雷达对应的串口设备文件大多数情况是/dev/ttyUSB0。如果系统里插了多个串口设备可能需要改成/dev/ttyUSB1可以用ls /dev/ttyUSB*确认。serial_baudrateA1 是 115200A2 是 256000。如果你用的是 A2记得把这里改成 256000否则 SDK 会连不上。A2 也可以自动匹配波特率但 launch 文件里是写死参数的所以要手动改。frame_id激光数据所在的坐标系名称后续做建图和导航时这个 frame_id 必须和 TF 树中雷达的实际位置对应。inverted雷达是否倒装。如果雷达上下颠倒安装这里改成 trueSDK 会把角度翻转过来输出正确的坐标系数据。新手容易忽略这个参数倒装之后地图全花了。angle_compensate是否开启角度补偿。开启之后会将一圈扫描数据插值到更大的点数上建图时角度分辨率更高。5.5 启动雷达节点并查看话题数据启动前先把雷达接上然后用 roslaunch 启动节点source ~/.bashrc roslaunch rplidar_ros rplidar.launch看到类似下面的日志说明节点正常启动了[ INFO] [1621768345.123456789]: RPLIDAR running on /dev/ttyUSB0 [ INFO] [1621768345.876543210]: RPLIDAR has been connected然后打开新终端查看话题列表source ~/.bashrc rostopic list确认有/scan话题后可以用rostopic echo看原始数据rostopic echo /scan不想看刷屏的话可以用rostopic hz检查发布频率rostopic hz /scan正常情况会显示频率在 10Hz 左右也就是每秒 10 帧完整的扫描数据同时能看到每帧包含约 1000 个点angle_compensate 开启时或者几百个点。如果 hz 显示是 0说明没有数据进来如果显示的帧率很高但数据全是零那大概率是波特率参数不对把雷达当成 A1 在跑了典型表现为能连接但没有任何点数。5.6 Rviz 中实时显示激光点云拿到话题之后最期待的一步来了——在 Rviz 里查看雷达数据。新开一个终端rviz打开 Rviz 之后按下面的方法配置左下角Add按钮选择By topic选项卡找到/scan话题添加LaserScan显示。在Global Options里把Fixed Frame改成laser。调整Size和Color参数Distance 模式下颜色会随着距离变化很直观。添加完之后你应该能在 Rviz 中央看到一个彩色的环形点云。靠近雷达的墙面、障碍物显示为近距离的暖色调远处的物体是冷色调。旋转雷达周围的物体点云会实时跟着变化。这一步能成功说明编译没问题、话题通信没问题、坐标帧设置也没问题。之后你就可以把雷达数据接到gmapping、cartographer或者hector_slam做建图了。6. 常见问题与排查技巧实录6.1 速查表驱动安装和运行中最常见的故障我把这些年在论坛上被问到最多的、以及自己实际遇到过的典型问题整理成一个表格方便你对着排查。现象可能原因解决办法lsusb看不到设备USB线损坏、转接板故障、USB口供电不足换线换口用质量好的USB线不要用机箱前置口/dev/ttyUSB0不存在驱动未加载、设备未枚举成功dmesgSDK 报failed to open serial port权限不足、串口被ModemManager占用用户加入dialout组禁用ModemManager能连接但没有任何数据波特率不对、电机未启动、雷达故障确认A1用115200A2用256000检查startMotor()调用数据有大量跳变或稀疏供电不足、USB线干扰、USB HUB质量差使用USB 3.0口直连或使用有源HUBROS节点启动后无话题输出launch文件参数错、工作区未编译成功检查serial_port和serial_baudrate参数重新catkin_makeRviz显示点云但位置偏移frame_id没对齐TF树把Fixed Frame改为laser检查TF树结构雷达转但一卡一卡的USB polling interval过大、虚拟机穿透性能差设置 udev 规则降低延迟优先用物理机6.2 详解dmesg 日志帮你定位设备问题不管出现什么问题第一件事永远是看内核日志那里有最原始的设备状态。接上雷达后执行dmesg | tail -30如果设备正常枚举你会看到 USB 插入、usb-serial 驱动绑定、ttyUSB 设备创建的全过程。如果看到usb 1-1: device descriptor read/64, error -110或者cannot enqueue URB这样的报错基本上是 USB 信号质量问题。dmesg里还能看到串口芯片的具体型号。比如 CP2102 会出现cp210x converter now attached to ttyUSB0CH340 会出现ch341-uart converter now attached to ttyUSB0。这个信息能帮你确认系统到底是把设备识别成了什么对排查很有帮助。6.3 详解udev 规则与固定串口名多 USB 设备频繁插拔时/dev/ttyUSB0的名称可能会漂移比如变成ttyUSB1。如果你的机器上还挂了 GPS、IMU 等设备这会造成驱动节点连错设备。解决方法是写 udev 规则根据设备的唯一序列号固定串口名。先用下面命令查看设备的序列号信息udevadm info -a -n /dev/ttyUSB0 | grep serial然后新建 udev 规则文件sudo nano /etc/udev/rules.d/99-rplidar.rules内容如下KERNELttyUSB*, ATTRS{serial}0001, MODE0666, SYMLINKrplidar保存后重新加载规则sudo udevadm control --reload-rules sudo udevadm trigger这样以后雷达对应的设备名就固定为/dev/rplidar了launch 文件里直接填这个路径不会因为多插一个模块导致设备名漂移。6.4 详解虚拟机使用雷达的注意事项如果你的 Ubuntu 跑在虚拟机里需要额外确认几个设置。VMware 里要在虚拟机设置中启用 USB 控制器并且把 USB 兼容性调到 USB 3.1 或更高VirtualBox 则需要在“设置 - USB设备”中添加 CP210x 或 CH340 的过滤规则。虚拟机方案最怕的是 USB 传输延迟导致扫描数据掉帧。我在 VMware 里实测过雷达可以正常工作但扫描频率偶尔会降到 8Hz 左右运动建图时会有轻微影响。如果是做精度要求高的 SLAM强烈建议在物理机上跑只是简单测试驱动和数据可视化虚拟机完全够用。6.5 详解雷达供电不足的判断与处理供电不足是雷达数据异常的隐形杀手。一个典型的现象是雷达看起来在转但数据里总有几个角度范围内的距离值反复跳动或者点数明显少于正常值。这是因为电机在旋转过程中耗电是波动的供电不够时激光二极管功率不足回波信号弱信号质量变差。判断方法很简单把雷达单独插到电脑后置 USB 口上不要经过排线、延长线和 USB HUB。如果数据恢复正常那基本可以确定是供电问题。A1 需要 5V/500mA 以上的持续电流A2 更高。条件允许的话用带外部电源的有源 USB HUB 给雷达供电能省掉很多奇怪的故障。7. 从驱动到应用拿到 /scan 数据之后能做什么雷达驱动装好只是第一步真正的价值在于把/scan数据接入到上层算法。这里简单说一下方向方便你理解自己走到哪一步了。如果你要做二维 SLAM 建图最经典的方案是把/scan话题直接交给gmapping功能包。只需要发布 /scan 的同时用里程计或者轮式编码器发布 TF 变换gmapping 就能实时输出栅格地图。思岚官方也提供了和cartographer的结合教程效果更好但配置麻烦一些。如果要做避障和导航move_base需要/scan输入做局部代价地图和全局代价地图的更新同时通过激光点云进行实时障碍物检测。很多小车项目就是用 A1 树莓派 ROS 实现了室内自动巡航。如果你不需要 ROS只想在自研程序里用雷达数据SDK 自带高效 C 接口解析出来的数据是极坐标的角度 距离很容易转成直角坐标点云。官方还提供了sl_lidar的 C/Python 绑定示例不过没有 ROS 驱动那么开箱即用。每种方案的具体实验数据差异很大但基础都是这篇文章讲的驱动这一层。底层通了上层随便玩。8. 一些实在的使用心得RGB 最初几次跑不顺大概率不是程序问题而是系统环境问题——权限没配好、串口被占、波特率写错。所以遇到报错别慌按日志一层层排查别急着改代码。我自己的习惯是新拿到一块雷达第一件事就直接编译官方 SDK 跑ultra_simple不经过 ROS先把硬件链路验证通。这比一上来就在 ROS 里折腾要快得多而且能积累对设备原生的认识。很多在群里问“为什么 rostopic 没数据”的朋友最后发现其实 ROS 装好了但串口权限没生效而 SDK 层都没测过问题被层层包裹住了。再分享一个小技巧调试的时候可以用screen或者minicom直接查看串口输出的原始二进制数据虽然看起来是一堆乱码但至少能确认雷达在持续发送数据。遇到 ROS 层解析很奇怪但底层数据在流的情况基本就是波特率或者 SDK 版本不对。当然正常情况下看 SDK 的输出就够了这招适合做疑难杂症的终极排查。另外雷达长时间运行会发热这是正常的。A1 的表壳温热不是故障但如果热到烫手那就要检查环境温度或者散热条件了长期高温会缩短激光管寿命。这篇文章覆盖的流程是我从零开始摸雷达驱动的完整路径。照着走一遍你手里的 RPLIDAR 就能在 Ubuntu 20.04 里跑起来了。至于后面的建图、导航、扫描匹配那是一个更深也更有意思的世界。雷达已经在转了剩下的就交给你了。