ARTICLE DETAIL

资讯详情

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

宇树L1 RM激光雷达ROS实战:从驱动配置到点云可视化与SLAM建图

宇树L1 RM激光雷达ROS实战:从驱动配置到点云可视化与SLAM建图 1. 开箱与硬件初识宇树L1 RM到底是个什么定位宇树L1 RM这款激光雷达我第一次拿到手的时候第一反应是“这玩意儿比想象中小太多了”。巴掌大的一个圆柱体拿在手里有点分量金属外壳摸起来质感很扎实。它本质上是一款360度二维机械式激光雷达但宇树给它加了一个“RM”的后缀意思是可以配合他们的运动控制生态做更多事情。不过咱们今天不聊机器人运动只聊怎么把它在ROS里跑起来把点云数据可视化出来。先说清楚它的核心参数这些数据直接决定了你后面怎么配置ROS节点。L1 RM的测距范围官方标称是0.05米到12米扫描频率可以配置在5Hz到20Hz之间角分辨率在10Hz扫描时大约是0.5度左右。接口方面它用的是串口通信通过一个USB转TTL模块连接到电脑或者嵌入式主板上。供电是5V直流电流需求不大普通USB口就能带起来。注意不同批次的L1 RM可能固件版本不同串口波特率会有差异。我手上这台是230400的波特率但早期版本有115200的。拿到手第一件事就是确认波特率不然后面全是乱码。为什么选这款雷达做ROS实战说白了就是性价比和生态。它比思岚的A1贵一点但比禾赛、速腾的固态雷达便宜太多而且宇树官方提供了ROS的SDK包省去了自己写驱动的时间。对于做SLAM建图、自主导航小车、或者室内机器人原型的开发者来说这个价位段能拿到一个12米量程、360度扫描的雷达已经相当够用了。适合谁来参考这篇内容如果你刚接触ROS想找一个便宜的雷达练手或者你已经在做ROS小车项目需要换一个比单线雷达更稳定的传感器再或者你是个嵌入式工程师想了解激光雷达的数据协议和ROS驱动怎么写——这篇都能给你一个可以直接抄作业的流程。2. 环境准备ROS版本选择与依赖安装的坑2.1 ROS版本怎么选才不折腾现在ROS的版本选择其实挺让人纠结的。Ubuntu 20.04对应的是ROS Noetic这是ROS 1的最后一个版本生态最成熟网上教程最多。Ubuntu 22.04对应的是ROS 2 Humble新项目建议直接上这个。但宇树L1 RM的官方SDK我实测下来在Noetic上支持最好Humble的包需要自己改一些编译选项。我的建议是如果你只是想把雷达跑起来看点云用Noetic。如果你整个项目都是ROS 2的架构那就硬着头皮上Humble后面我会说怎么改。至于Ubuntu 24.04目前ROS 2 Jazzy的生态还在完善中雷达驱动这种底层包不一定有现成的新手别去踩这个坑。安装ROS本身网上有个“鱼香ROS一键安装”的脚本流传很广确实能省不少事。但我要说的是一键安装脚本适合快速搭建环境不适合理解ROS的依赖关系。如果你时间充裕还是建议按照官方文档一步步来至少知道每个包是干什么的。一键安装的脚本有时候会把源配置搞乱后面装其他包的时候出现依赖冲突排查起来很头疼。2.2 串口权限与依赖库的配置雷达通过USB转串口连到电脑上Linux默认是不给普通用户读写串口权限的。你插上雷达后用ls /dev/ttyUSB*能看到设备但直接跑节点会报“Permission denied”。解决办法有两个第一个是临时方案每次插拔后执行sudo chmod 777 /dev/ttyUSB0但这样每次都要手动操作很烦。第二个是永久方案把当前用户加到dialout组里sudo usermod -aG dialout $USER然后注销重新登录或者重启电脑。这个操作只需要做一次之后插上雷达就能直接用。提示有些USB转串口芯片比如CH340在Ubuntu下需要额外装驱动但L1 RM附带的模块通常是CP2102或者FT232内核自带驱动插上就能识别。如果ls /dev/ttyUSB*没反应先检查USB线是不是只能供电不能传数据的那种。依赖库方面宇树的SDK依赖serial库和boost库。在Noetic下直接sudo apt install ros-noetic-serial libboost-all-dev在Humble下包名变成ros-humble-serial。另外如果你的系统是刚装好的可能还需要build-essential和cmake这些一般都有没有的话补上就行。3. SDK编译与驱动节点配置从源码到可执行文件3.1 获取SDK与目录结构解析宇树L1 RM的ROS SDK通常是一个catkin工作空间格式的包。你从官方渠道拿到的是一个压缩包解压后大概长这样unitree_lidar_ros/ ├── src/ │ ├── unitree_lidar_ros/ │ │ ├── include/ │ │ ├── launch/ │ │ ├── src/ │ │ └── CMakeLists.txt │ └── CMakeLists.txt └── README.md关键文件在src/unitree_lidar_ros/src/下面通常有一个unitree_lidar_ros_node.cpp这是主节点入口。launch/目录下会有view_lidar.launch之类的启动文件用来一键启动节点和RViz。我建议你不要直接把这个包扔到已有的工作空间里编译而是单独建一个干净的工作空间。因为雷达SDK有时候会依赖特定版本的pcl或者tf跟其他包混在一起容易出冲突。单独编译单独source最稳妥。mkdir -p ~/unitree_ws/src cd ~/unitree_ws/src # 把解压后的unitree_lidar_ros文件夹复制到这里 cd ~/unitree_ws catkin_make source devel/setup.bash编译过程中如果报错找不到serial/serial.h说明ros-noetic-serial没装好回去检查。如果报错boost/asio.hpp找不到装libboost-all-dev。3.2 串口参数与雷达配置文件的修改编译通过之后别急着跑。先找到配置文件通常在launch/目录下或者config/目录下名字可能是unitree_lidar_config.yaml或者直接在launch文件里写死了参数。你需要确认这几个关键参数参数名典型值说明port/dev/ttyUSB0串口设备路径baudrate230400波特率必须和固件一致frame_idlaser_link点云的坐标系名称scan_frequency10扫描频率单位Hzrange_min0.05最小测距单位米range_max12.0最大测距单位米frame_id这个参数很重要后面在RViz里要选对坐标系才能看到点云。如果你同时有IMU或者其他传感器frame_id的命名要统一不然tf树会乱。注意有些版本的SDK把参数写在launch文件的param标签里有些是单独的yaml文件用rosparam加载。改之前先看清楚launch文件的结构别改错地方了。3.3 启动节点与数据话题的确认配置改好之后启动节点roslaunch unitree_lidar_ros view_lidar.launch如果一切正常终端会打印类似“Lidar started successfully”的日志然后RViz窗口弹出来。但很多时候第一次跑不会这么顺利常见的情况是节点启动了但RViz里什么都没有。这时候先别慌用rostopic list看看有没有/unitree_lidar/scan或者/scan这个话题。如果有话题再用rostopic hz /scan看看频率对不对。如果频率是0或者话题不存在说明串口通信没建立起来。我踩过的一个坑是launch文件里默认的串口是/dev/ttyUSB0但电脑上插了多个USB设备时雷达可能被识别成/dev/ttyUSB1。解决办法是用ls -l /dev/serial/by-id/查看设备的唯一ID然后在launch文件里用这个ID代替ttyUSB0这样不管插拔多少次设备路径都不会变。4. 点云可视化实战RViz配置与数据调优4.1 RViz基础配置从零看到点云RViz第一次打开是空的左边是Displays面板。你要做的是把Fixed Frame改成laser_link或者你配置文件里设的frame_id。点击左下角Add按钮找到PointCloud2添加进来。在PointCloud2的设置里把Topic选成/unitree_lidar/scan或者你实际的话题名。调整Size参数一般设成0.01到0.03之间太大了点云会糊成一片。如果这时候能看到一圈一圈的点恭喜你雷达跑通了。如果还是黑的检查Fixed Frame是不是写错了或者话题的frame_id和RViz里的Fixed Frame不一致。用rostopic echo /scan --noarr看一眼消息头里的frame_id字段确保两边对得上。4.2 点云颜色与显示效果的调优默认的点云是单色的看起来不够直观。你可以在PointCloud2的设置里把Color Transformer改成AxisColor或者Intensity。AxisColor会根据点的Z轴高度上色适合看三维结构Intensity根据反射强度上色适合看不同材质的物体。但L1 RM是二维雷达所有点的Z轴都是0所以AxisColor看起来还是一条线。这时候用Intensity更有意义反射率高的物体比如金属、反光条会显示成亮色反射率低的比如黑色布料显示成暗色。这个特性在后续做目标检测或者建图的时候很有用。提示如果点云看起来断断续续的可能是扫描频率和RViz的刷新率不匹配。把Decay Time调大一点比如设成1秒这样点云会保留一段时间看起来更连续。4.3 点云数据的保存与离线分析有时候你需要把点云数据存下来离线慢慢分析。ROS提供了rosbag record工具rosbag record /unitree_lidar/scan -O lidar_data.bag录完之后用rosbag play lidar_data.bag回放RViz里就能看到历史数据。这个功能在做算法调试的时候特别有用不用每次都把雷达带在身边。如果你想把点云导出成PCD文件用CloudCompare看可以用pcl_ros包里的pointcloud_to_pcd节点rosrun pcl_ros pointcloud_to_pcd input:/unitree_lidar/scan它会在当前目录下生成一串PCD文件每个文件是一帧点云。CloudCompare打开PCD文件后可以做测量、配准、滤波等操作比在RViz里方便得多。5. 常见问题与排查技巧实录5.1 串口通信失败从乱码到超时串口问题是最常见的。表现是节点启动后报“Failed to open serial port”或者“Read timeout”。排查顺序如下先确认设备存在ls /dev/ttyUSB*如果没有换USB线或者换USB口。确认权限ls -l /dev/ttyUSB0看权限是不是crw-rw----所属组是不是dialout。确认波特率用stty -F /dev/ttyUSB0查看当前波特率如果不是230400用stty -F /dev/ttyUSB0 230400临时改一下。确认没有其他程序占用lsof /dev/ttyUSB0如果有别的进程在用kill掉。我遇到过一次特别诡异的情况雷达能出数据但点云全是噪点像雪花一样。后来发现是USB线太长导致信号衰减换了一根短的屏蔽线就好了。所以如果你用的是自己配的线尽量控制在1米以内并且带屏蔽层。5.2 点云显示异常漂移、断层与缺失点云漂移通常和frame_id的tf变换有关。如果你在RViz里看到点云整体在缓慢旋转或者平移检查一下是不是有多个节点在发布同一个frame_id的tf。用rosrun tf view_frames生成tf树看看正常情况下laser_link应该是一个独立的叶子节点不应该有别的父节点在动它。点云断层是指扫描一圈中间缺了一段。L1 RM是机械旋转雷达如果转速不稳定或者串口丢包就会出现断层。解决办法是降低扫描频率比如从10Hz降到5Hz给串口通信留更多余量。另外检查baudrate是不是设对了波特率太低会导致数据传不完。点云缺失是指某些角度完全没有数据。先排除是不是有遮挡物挡住了雷达视线。如果确认没有遮挡可能是雷达的盲区。L1 RM的盲区在正下方和正上方水平方向基本没有盲区。如果某个水平角度一直没数据那可能是雷达本身的问题联系售后吧。5.3 ROS 2 Humble下的适配问题如果你用的是ROS 2 Humble宇树的SDK可能需要手动改一些东西。首先是package.xml里的依赖格式ROS 2用的是depend而不是build_depend和run_depend。其次是CMakeLists.txtcatkin要换成ament_cmake。最后是节点代码里的ros::NodeHandle要换成rclcpp::Node。如果你不想改代码还有一个偷懒的办法用ros1_bridge把ROS 1的节点桥接到ROS 2里。但这样会多一层转换延迟会增加点云的实时性会打折扣。我的建议是如果项目允许直接用ROS 1 Noetic省去这些麻烦。如果非要用ROS 2那就老老实实改代码改完之后性能反而更好。6. 从点云到建图L1 RM在SLAM中的实际表现6.1 用Cartographer跑通建图的基本流程雷达跑通之后下一步自然是建图。Cartographer是ROS里最常用的2D建图算法之一配置稍微有点复杂但效果很稳。你需要一个cartographer_ros的配置文件里面指定tracking_frame为laser_linkpublished_frame为base_link然后num_laser_scans设为1。启动顺序很重要先启动雷达节点再启动Cartographer节点最后启动RViz。如果顺序反了Cartographer可能收不到第一帧数据导致初始化失败。建图过程中你可以用rosbag record把/scan和/tf录下来后面用cartographer_ros的离线建图工具重新跑调参更方便。注意L1 RM的扫描频率是10Hz对于Cartographer来说足够了。但如果你的小车移动速度很快10Hz可能会导致建图漂移。这时候可以把扫描频率提到15Hz或者20Hz但要注意串口带宽能不能跟上。6.2 建图漂移的排查与参数调整建图漂移是SLAM里最常见的问题。表现是地图走一圈回来起点和终点对不上或者墙壁变成双层。原因通常有三个里程计不准、雷达安装位置不对、或者Cartographer的参数没调好。里程计不准的话如果你用的是轮式里程计检查轮子直径和轮距的标定。如果是视觉里程计那问题就更复杂了。雷达安装位置方面laser_link到base_link的tf变换要准确特别是Z轴高度和俯仰角。如果雷达装歪了点云投影到地面就是斜的建图肯定漂。Cartographer的参数里TRAJECTORY_BUILDER_2D.min_range和max_range要和雷达的实际量程匹配。L1 RM的最小测距是0.05米但实际用的时候建议设成0.1米因为太近的点噪声很大。max_range设成12米但如果你在室内建图设成8米就够了太远的点反而干扰匹配。6.3 点云数据处理滤波与特征提取原始点云数据里有很多噪声直接拿去做建图或者检测效果不好。常见的滤波方法有体素滤波把三维空间划分成小立方体每个立方体只保留一个点。适合降采样减少数据量。统计滤波计算每个点到邻居的平均距离去掉离群点。适合去除孤立的噪点。半径滤波指定半径内邻居数量少于阈值的点去掉。适合去除稀疏的噪声。在ROS里这些滤波可以用pcl_ros包里的节点实现也可以自己写一个节点订阅/scan处理后发布新的topic。我一般用体素滤波把点云降采样到原来的一半这样Cartographer的处理速度会快很多建图效果基本不受影响。特征提取方面L1 RM的角分辨率是0.5度对于提取直线和角点来说够用了。你可以用laser_geometry包把LaserScan转成PointCloud2然后用PCL的NormalEstimation计算法线或者用ExtractIndices提取平面。这些操作在点云处理里都是基础但组合起来能做出很实用的功能。7. 性能优化与长期运行稳定性7.1 降低CPU占用的几个实用技巧雷达节点本身占用的CPU不多但RViz和Cartographer加起来就很可观了。如果你在嵌入式主板上跑比如树莓派或者Jetson Nano优化就很有必要。第一个技巧是关掉RViz。RViz是可视化工具实际部署的时候不需要一直开着。你可以用rqt的Topic Monitor看数据频率或者直接看终端日志。关掉RViz能省下30%以上的CPU。第二个技巧是降低点云发布频率。雷达本身是10Hz但你可以写一个节点每两帧才发布一次这样下游的Cartographer和RViz压力就小了一半。对于建图来说5Hz的更新率完全够用。第三个技巧是用nodelet代替普通节点。nodelet可以在同一个进程里运行多个节点减少进程间通信的开销。宇树的SDK如果支持nodelet尽量用nodelet方式启动。7.2 长时间运行的稳定性观察我让L1 RM连续跑了72小时观察它的稳定性。结果是前24小时完全正常24到48小时之间出现了两次短暂的串口超时48小时之后超时频率增加。重启节点后恢复正常。这说明雷达本身没有死机但串口通信在长时间运行后可能会因为缓冲区溢出或者驱动问题出现超时。解决办法是加一个看门狗节点定期检查/scan话题的频率。如果频率低于阈值比如低于5Hz就自动重启雷达节点。这个看门狗可以用Python写几十行代码就够了。另外定期清理ROS的日志文件~/.ros/log目录下积累太多日志也会影响性能。提示如果你的应用场景对稳定性要求极高建议用两个雷达做冗余或者选一款工业级的雷达。L1 RM的定位是消费级和科研级不是工业级长时间高负荷运行还是要注意散热和电源质量。7.3 电源与散热的实际经验L1 RM的供电是5V电流在200mA左右看起来要求不高。但如果你用USB口供电要注意USB口的电压稳定性。有些电脑的USB口在接多个设备后电压会降到4.8V以下雷达就会工作不正常。我建议用带外部供电的USB Hub或者直接从主板的5V引脚取电。散热方面L1 RM的金属外壳本身就是散热片正常室温下摸起来只是温热。但如果你把它装在密闭的壳子里或者环境温度超过40度就要考虑加个小风扇。我试过在35度的环境里连续跑外壳温度大概50度左右还能接受但再高就不行了。8. 从L1 RM延伸出去还能做哪些有意思的事雷达跑通、点云可视化、建图都搞定之后其实还有很多可以玩的方向。比如用点云做目标检测把PointCloud2转成深度图然后用YOLO或者SSD做检测虽然L1 RM是2D雷达但投影到图像平面后也能用。再比如多雷达融合如果你有两个L1 RM一个朝前一个朝后可以拼成一个360度无死角的覆盖用ira_laser_tools包里的laser_multi_merger节点就能合并。还有一个方向是用雷达做避障这个在ROS小车里很常见。订阅/scan话题取正前方一定角度范围内的最小距离如果小于阈值就发停止指令。逻辑很简单但实际调的时候要注意雷达的安装高度和盲区太低的话会检测不到地面上的小障碍物。我个人觉得L1 RM最舒服的用法是配合ROS 2做分布式系统。雷达节点跑在嵌入式主板上建图和导航跑在服务器上通过ROS 2的DDS通信自动发现。这样主板的负载很轻服务器的算力可以充分利用。当然网络延迟要控制好最好用有线连接WiFi的抖动对实时建图影响很大。最后分享一个小技巧如果你在RViz里觉得点云太乱可以加一个LaserScan显示把/scan话题直接以线的形式画出来。虽然信息量比点云少但看起来清爽很多调试的时候更容易看出问题。两种显示方式切换着看效率会高不少。
返回列表