ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RPLIDAR激光雷达在Ubuntu 20.04 ROS Noetic下的驱动安装与调试实战

RPLIDAR激光雷达在Ubuntu 20.04 ROS Noetic下的驱动安装与调试实战 1. 先搞清楚 RPLIDAR 为什么不能“插上就用”1.1 RPLIDAR 系列型号差异决定了你的启动方式很多第一次接触二维激光雷达的人都会下意识地把它当成 USB 摄像头插上电脑系统认出一个设备打开软件就能看到画面。但 RPLIDAR 这类雷达走的不是免驱 USB 协议它内部是通过 UART 串口把扫描数据传输出来的。我们日常买到手的评估套件里通常会附带一块 USB 转串口的小板子真正被 Ubuntu 识别成/dev/ttyUSB0的其实是这块转换板而不是雷达本体。所以“驱动安装”这件事实际上拆成两半一半是让系统正确识别 USB 转串口芯片并分配端口权限另一半是让 ROS 里的驱动节点能从这个串口读到雷达数据。这两步哪一步出了问题都会让你误以为雷达坏了。另外要注意思岚 RPLIDAR 目前常见的有 A1、A2、A3、S1 这几个系列。它们的通信协议虽然是同一套体系但波特率、扫描频率、测距范围并不一样。我在实际使用中见过不少人把 A2 的雷达接到 A1 的 launch 文件里结果数据乱码或者完全没反应。所以拿到雷达的第一件事是看外壳丝印确认具体型号然后选择对应的 launch 文件。型号测距原理典型测距范围采样频率常见场景A1三角测距0.15m - 8m4000 次/秒入门学习、室内小车A2三角测距升级版0.15m - 16m4000 次/秒室内服务机器人A3TOF0.05m - 25m16000 次/秒大型环境、户外弱光S1TOF0.15m - 12m9200 次/秒轻量级改造、嵌入式项目上面这个表是我凭使用经验整理的具体参数以思岚官方规格书为准。但有一点可以确定不同型号的波特率和电机控制逻辑有差异不要拿一个 launch 文件通吃所有雷达。1.2 Ubuntu 20.04 与 ROS 版本的关系这篇文章的数据环境是 Ubuntu 20.04。Ubuntu 20.04 对应的 ROS 正式发行版是 Noetic它是 ROS 1 最后一个长期支持版本官方支持到 2025 年。如果你之前看的是 Ubuntu 18.04 ROS Melodic 的旧教程很多命令虽然类似但包源、依赖版本、Python 环境都有区别直接照搬很可能在编译阶段报错。这里有个很重要的认知rplidar_ros 是 ROS 包不是独立应用程序。也就是说你想通过 ROS 话题拿到雷达数据前提是先有一份能正常工作的 ROS 环境。如果你只是想快速验证雷达硬件有没有坏不打算碰 ROS那可以直接用思岚官方的 rplidar_sdk它能在纯命令行下输出原始扫描数据。我会在第 4 章里把 SDK 这种“无 ROS 验证方式”也讲一下因为排查问题时它非常好用。如果你确定要跑 SLAM 或者后续接导航栈那就老老实实装 ROS Noetic。装好之后雷达驱动只是整个系统里一个非常小的节点它的工作就是周期性地把串口数据转换成sensor_msgs/LaserScan话题发出去。2. 硬件连接、串口识别与权限配置2.1 供电和接线是第一个隐形坑RPLIDAR 的供电和通信是分开的。以 A1 评估套件为例雷达底部有一个 6 针或者 8 针的接口其中包含电机供电、电机 PWM 控制、通信地、RX、TX 这几路信号。配套的 USB 转接板会把通信接口转成 USB同时从 USB 口取 5V 给雷达电机供电。听起来挺方便但实际使用时有个容易踩的坑笔记本的 USB 口供电能力差异很大。有的 USB 口标称 5V 500mARPLIDAR A1 电机启动瞬间电流可能接近这个上限一旦电压被拉低雷达的表现就是指示灯亮但电机不转或者转几圈就停数据完全出不来。我遇到过好几次这种情况换到另一个 USB 口或者用带外部供电的 USB Hub 就正常了。所以我的建议是优先使用笔记本的 USB 3.0 口或者台式机后置 USB 口。如果雷达频繁掉线用一个带独立电源的 USB Hub 供电。线材尽量用套件附带的原装线杜邦线太长或者接触不良会导致扫描数据随机跳变这个问题后面排查时很容易误判成驱动 bug。2.2 怎么确认系统识别到了串口设备把雷达通过 USB 接到电脑然后在终端执行lsusb正常情况下你会看到一个 USB 转串口芯片的厂商 ID。思岚早期评估套件里常用的是 Silicon Labs CP2102也就是10c4:ea60也有部分批次用的是 CH340厂商 ID 是1a86:7523。看到这些 ID说明 USB 转换芯片已经被系统识别驱动也没问题。然后查看系统分配的设备节点ls -l /dev/ttyUSB*如果看到/dev/ttyUSB0或者/dev/ttyUSB1说明串口节点已经生成。这里有个细节如果之前插过其他 USB 转串口设备新插入的雷达可能被分配到/dev/ttyUSB1而不是/dev/ttyUSB0。所以启动雷达前最好先执行上面这条命令确认一下当前实际端口。有时候lsusb能看到设备但/dev下没有 ttyUSB 节点。这种情况多半是内核没有加载对应驱动。CP2102 和 CH340 的驱动在 Ubuntu 20.04 内核里是默认自带的基本不需要手动装。如果确实没有节点先试着重启或者检查你是不是用了什么精简版内核。2.3 串口权限使用 rplidar_ros 最常见的报错根源很多人在执行roslaunch rplidar_ros rplidar_a1.launch时终端会刷出一行[RPLIDAR] Cannot open serial port /dev/ttyUSB0原因通常是当前用户对/dev/ttyUSB0没有读写权限。Linux 下串口设备默认属于dialout组而普通用户不在这个组里。临时解决方法很简单sudo chmod 666 /dev/ttyUSB0但注意这个权限在设备重新插拔后会丢失而且每次都敲 sudo 很烦。永久正确做法是把当前用户加入dialout组sudo usermod -a -G dialout $USER执行完这条命令后一定要注销重新登录或者重启一下系统组权限才会生效。如果你是在虚拟机里操作这一步尤为重要因为虚拟机的 USB 直通有时会改变设备属主。更进一步我建议写一个 udev 规则把雷达端口固定下来。因为当你同时接了多个 USB 转串口设备时/dev/ttyUSB0和/dev/ttyUSB1的顺序可能交换。在/etc/udev/rules.d/下新建一个文件比如99-rplidar.rulesKERNELttyUSB*, ATTRS{idVendor}10c4, ATTRS{idProduct}ea60, MODE:0666, GROUP:dialout, SYMLINKrplidar保存后重新加载规则sudo udevadm control --reload-rules sudo udevadm trigger之后不管雷达被识别成 ttyUSB 几你都可以用/dev/rplidar来访问这个固定名称对后续写 launch 文件非常方便。有些人看到/dev/rplidar会以为系统多了个设备其实它就是指向真实 ttyUSB 的符号链接。3. 安装 ROS Noetic 与编译 rplidar_ros 驱动包3.1 快速安装 ROS Noetic 的实用命令如果你已经在用 Ubuntu 20.04但还没装 ROS这里给一套我习惯用的安装流程。先添加 ROS 软件源和密钥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 curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update然后安装桌面完整版。我个人认为做雷达和 SLAM 相关开发直接装 desktop-full 最省事因为它包含了 RViz、tf、gmapping 等一堆后面要用到的工具省得后面缺一个包装一个sudo apt install ros-noetic-desktop-full安装过程会比较久耐心等。装完后初始化 rosdepsudo rosdep init rosdep update然后配置环境变量echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrc检查一下是否生效which roscore如果能输出路径ROS 环境就算 OK 了。3.2 创建工作空间并编译 rplidar_rosROS 的工作空间通常叫catkin_ws你完全可以换名字但路径结构要保持固定mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/Slamtec/rplidar_ros.git cd ~/catkin_ws catkin_make编译完成后source 一下工作空间的环境source ~/catkin_ws/devel/setup.bash这里要注意如果你已经运行了/opt/ros/noetic/setup.bash再 source 工作空间的 setup.bash 是叠加效果没问题。但如果你只 source 了工作空间没 source 系统 ROS 环境编译时可能报找不到roscpp之类的错误。所以最稳妥的顺序是先确认echo $ROS_DISTRO输出noetic再去 catkin_make。catkin_make过程中如果卡在下载某些依赖包多半是网络问题。Ubuntu 20.04 下 ROS Noetic 的依赖基本都在官方源里耐心等就好。编译完成后rplidar_ros包会在~/catkin_ws/devel下生成可执行文件。3.3 为什么不推荐直接用 apt 安装 rplidar 包有人可能会问ROS 不是可以用sudo apt install ros-noetic-rplidar-ros直接装吗确实有预编译包但我个人更推荐从源码编译原因是思岚的 rplidar_ros 仓库更新比较频繁apt 仓库里的版本相对滞后。源码编译能保证你拿到最新的 launch 文件里面通常包含新出型号的支持。而且从源码编译能顺便解决一个隐藏问题——你的 catkin 工作空间里如果没有这个包后续跑roslaunch时可能因为包路径问题找不到 launch 文件而从源码编译会把所有路径都理顺。另外如果你只是临时测试雷达想快速看数据不打算建工作空间也可以把 rplidar_ros clone 到任意目录后单独编译。但我还是建议走标准工作空间流程因为你后面做 SLAM迟早要建自己的包。4. 正式启动雷达验证扫描数据是否正常4.1 选择对应的 launch 文件启动驱动节点rplidar_ros 包里提供了多个 launch 文件。进入~/catkin_ws/src/rplidar_ros/launch目录看一下会看到rplidar.launch、rplidar_a1.launch、rplidar_a2.launch、rplidar_a3.launch、rplidar_s1.launch等文件。启动方式很简单source ~/catkin_ws/devel/setup.bash roslaunch rplidar_ros rplidar_a1.launch如果你的雷达是 A2就把文件名换成rplidar_a2.launch。如果你不确定该用哪个也可以直接用最基础的rplidar.launch但它默认的串口参数是/dev/ttyUSB0波特率是 115200。A2 和 A3 的通信波特率可能不同用错波特率时节点虽然能打开串口但输出的数据全是乱码。启动后终端会打印出雷达固件版本和串口状态类似这样RPLIDAR S/N: ... Firmware Ver: ... Hardware Ver: ...看到这些信息说明驱动已经和雷达成功通信。这里顺便说一句用roslaunch启动时它会自动启动roscore所以不需要手动再开一个终端跑roscore。4.2 先用 rostopic 检查数据而不是急着开 RViz我见过不少人启动雷达后直接打开 RViz发现没有点云或者图像就开始怀疑驱动有问题。但正确做法是先用命令行工具确认话题在发数据。新开一个终端source ~/catkin_ws/devel/setup.bash rostopic list正常情况下会看到/scan、/rosout、/tf等话题。然后查看/scan的实时数据rostopic echo /scan终端会不断刷新扫描数据里面的angle_min、angle_max、angle_increment、ranges这些字段就是雷达一圈扫描的核心信息。再检查发布频率rostopic hz /scanA1 的典型扫描频率在 5.5Hz 到 10Hz具体取决于电机转速。如果你看到频率异常低比如 0.1Hz那很可能不是驱动问题而是电机供电不足或者雷达被卡住了。4.3 如果没装 ROS用官方 SDK 快速验证雷达在还没有搭好 ROS 环境的时候想确认雷达本身是不是好的可以用思岚官方 SDK。这个方法可以帮你把“雷达硬件问题”和“ROS 环境问题”彻底隔离开。git clone https://github.com/Slamtec/rplidar_sdk.git cd rplidar_sdk make编译完成后在output/linux/目录下会生成可执行文件。运行其中的ultra_simple./ultra_simple /dev/ttyUSB0它会直接在当前终端打印出每一圈的扫描角度和距离数据。如果 SDK 能正常出数据说明雷达硬件没问题问题肯定出在 ROS 驱动配置或权限上。如果 SDK 也打不开串口那就回到权限和接线问题上去查。我自己的习惯是每次拿到一套新的雷达先跑一次 SDK确认硬件事后再进 ROS 流程。这个方法在排查问题的时候能省下大量时间。4.4 在 RViz 里可视化激光扫描数据确认话题正常后再用 RViz 可视化就很顺理成章了。新开终端source ~/catkin_ws/devel/setup.bash rviz打开 RViz 后要做两件事。第一把左下角Fixed Frame从默认的map改成laser。不做这一步画面里可能什么都看不到因为 RViz 需要知道激光数据在哪个坐标系下。第二点击左下角Add选择By topic标签找到/scan话题添加LaserScan显示类型。如果一切正常RViz 中心会出现一圈由离散点组成的轮廓这就是雷达扫描到的周围环境。转动雷达或者走动一下轮廓会实时变化。这里有个小技巧RPLIDAR 的 frame_id 在 launch 文件里默认为laser如果你在 RViz 里看不到点云先检查固定坐标系是不是写错了。另外如果雷达安装在小车上后续做 SLAM 时需要把laser坐标系通过static_transform_publisher发布到车体坐标系base_link下否则建图程序找不到雷达的位置。5. 实测过程中最容易踩的异常与排查链路5.1 打开串口失败从权限到设备占用逐个排查我在实际调试中遇到过三种“打开串口失败”的情况现象相似原因却完全不同。第一种是权限问题终端输出Cannot open serial port。用ls -l /dev/ttyUSB0看一下权限位如果开头是crw-rw----并且所属组是dialout而你还没加入这个组就会这样。解决办法就是第 2 章里说的usermod加组。第二种是设备被占用。这种情况通常发生在程序崩溃后ROS 节点死掉但串口没释放。此时执行ps -ef | grep rplidar如果你发现有残留的 rplidarNode 进程用kill杀掉再重新启动。有时候串口被screen或者minicom这类串口工具占着也会导致打开失败同样需要先退出。第三种是串口节点根本没生成。lsusb看不到 USB 设备或者内核没分配 ttyUSB 节点。这种只能检查线材、接口或者换一台电脑试试。在虚拟机里还有一个常见原因USB 设备没有直通给虚拟机系统需要在虚拟机设置里把 USB 设备连进去。5.2 数据乱跳或者话题频率不稳定如果你看到 ROS 话题有数据但 RViz 里的点云轮廓乱七八糟或者rostopic hz /scan显示的频率忽高忽低我的排查顺序是这样的先怀疑供电。RPLIDAR 电机对电压比较敏感USB 供电不足时雷达转速会波动导致扫描频率不稳。换一个供电能力更强的 USB 口或者用独立电源给雷达供电看是否恢复。再怀疑接触。雷达的排线、杜邦线如果接触不良数据会在传输过程中出现丢包反映到话题上就是某个角度突然没有数据或者数据跳变。这时候不要在线材上省钱直接把排线重新插紧或者换一根质量好的线。最后才是软件参数问题。如果你手动改过 launch 文件里的波特率、angle_compass_offset这类参数改错了也可能导致数据错乱。我一般会先把 launch 文件恢复默认值再逐步排查。5.3 雷达电机不转或转几秒就停这个问题其实不属于驱动范畴但被问得最多。RPLIDAR 的电机转速由驱动节点通过 PWM 控制启动节点后电机才应该开始转。如果节点启动成功、数据也正常但电机不转检查一下 launch 文件里是不是把电机相关参数设置成了 0。如果电机转几秒就停伴随节点报错基本是供电追不上电机启动电流。USBLANDF 线太细也会导致这种情况我在现场用过一根 2 米的普通 USB 延长线雷达频繁重启换成原装短线后一切正常。5.4 与 SLAM 建图对接时要注意的坐标系和时间戳雷达跑通之后下一步通常就是接gmapping、cartographer或者hector_slam。这里有两个坑值得提前说。第一是坐标系。RPLIDAR 的/scan话题默认 frame_id 是laser但很多 SLAM 算法要求坐标系叫base_laser或者laser_link。如果出现Could not find a connection between map and laser之类报错八成是缺少雷达和机器人中心之间的静态坐标变换。可以用static_transform_publisher发布rosrun tf2_ros static_transform_publisher 0 0 0 0 0 0 base_link laser第二是时间戳。电脑系统时间如果不对雷达数据的时间戳和 SLAM 算法要求的时间基准对不上可能出现 TF 异常。确保系统时间和实际时间一致Ubuntu 下可以用sudo apt install ntpdate sudo ntpdate ntp.aliyun.com同步一下。5.5 几个容易忽略的日常维护细节最后分享几个我长期使用 RPLIDAR 后总结出来的小习惯。雷达的转动部件是电机和光栅连续长时间运转后光栅表面容易积灰导致部分角度数据缺失。定期用气吹清理一下不要用酒精直接擦容易破坏光栅涂层。存放时尽量避免雷达输出口对着强光尤其是做三角测距的 A1 和 A2强光干扰会让测距值变得不稳定。如果你发现雷达在某一个固定角度始终出现距离异常先别急着怀疑驱动拿一块白纸挡在那个角度附近看数据是否变化。如果完全不变再考虑送修。这个方法能快速区分是环境反光问题还是传感器硬件问题。我在实际跑小车时还遇到过一个很有意思的情况把雷达装在小车顶部旁边有一个低矮的金属栏杆因为雷达的扫描平面和栏杆高度几乎平行导致建图时地图边缘总是多出一圈细碎的杂点。后来调整了雷达安装高度杂点立刻消失。这类问题不是驱动能解决的需要在使用场景里结合雷达的扫描平面去理解数据。如果你准备用这套 RPLIDAR 做室内 SLAM建议一开始就把数据话题、坐标系、启动命令整理成一个固定模板每次开机只需要执行两三个命令就能让雷达进入工作状态。实际调试时先用rostopic echo /scan确认数据再开 RViz 看可视化最后才接 SLAM 算法这个顺序能帮你快速定位问题出在哪一层。等你跑通一次全流程之后会发现真正花在驱动安装上的时间并不多大头都在后面点云滤波、坐标系标定和算法调参上。
返回列表