RS-LiDAR-16激光雷达ROS点云可视化从零搭建与避坑指南
2026/9/19 16:36:03 网站建设 项目流程

1. 为什么选择RS-LiDAR-16做ROS点云入门

如果你刚接触激光雷达,手里正好有一台速腾聚创的RS-LiDAR-16,想把它接入ROS环境跑通点云可视化,那这篇内容就是为你准备的。RS-LiDAR-16是一款16线机械旋转式三维激光雷达,测距范围最远150米,水平视场角360度,垂直视场角-15度到+15度,每秒产生约30万个点。这个数据量对于ROS入门来说刚刚好——既不会像32线、64线那样把笔记本CPU吃满,又能提供足够密度的三维点云让你理解SLAM、建图、目标检测这些上层应用的基本逻辑。

很多人拿到雷达后的第一反应是去翻官方手册,但速腾的官方文档偏向驱动参数说明,对ROS环境搭建的完整链路讲得不够细。网上搜到的教程又往往跳步严重,比如默认你已经装好了ROS、默认你知道工作空间的目录结构、默认你理解launch文件的组织方式。结果就是照着做也跑不起来,rviz里要么一片漆黑,要么报一堆TF变换错误。我自己第一次搭这套环境时,光是让点云在rviz里正常显示就折腾了整整一个下午,踩的坑包括但不限于:Ubuntu版本和ROS版本不匹配、驱动编译时缺少依赖、launch文件里的参数没改对、rviz的Fixed Frame设置错误。

所以这篇内容我会从零开始,把每个环节的“为什么”和“怎么做”都讲清楚。不管你是用Ubuntu 20.04配ROS Noetic,还是Ubuntu 22.04配ROS 2 Humble,核心思路是相通的。我主要以ROS 1 Noetic为例来展开,因为RS-LiDAR-16的官方ROS驱动在ROS 1下最成熟,社区资料也最丰富。等你把这套流程跑通之后,再迁移到ROS 2就是换个编译方式的事。

提示:如果你还没装ROS,推荐用“鱼香ROS一键安装”脚本,它能自动处理源配置和依赖问题,比手动一步步来省心很多。但装完之后建议还是了解一下ROS的基本概念,比如节点、话题、消息类型,否则后面出了问题不好排查。

2. 环境准备:Ubuntu版本、ROS发行版与依赖项的匹配逻辑

2.1 Ubuntu和ROS版本的对应关系

这是最容易踩的第一个坑。ROS的每个发行版都绑定特定的Ubuntu版本,装错了后面全是麻烦。截至我写这篇内容时,常见的对应关系是这样的:

Ubuntu版本ROS 1发行版ROS 2发行版支持状态
18.04MelodicDashing已停止维护
20.04NoeticFoxyNoetic仍可用,Foxy已停止
22.04不支持Humble当前主流

RS-LiDAR-16的官方ROS驱动在GitHub上主要维护的是ROS 1版本,ROS 2版本也有但更新频率低一些。如果你用的是Ubuntu 22.04,只能选ROS 2 Humble,那驱动的编译方式会和ROS 1有区别,后面我会单独说明。如果你还在用Ubuntu 20.04,强烈建议直接上ROS Noetic,这是ROS 1的最后一个版本,也是最稳定的版本。

为什么版本匹配这么重要?因为ROS底层依赖大量的系统库,比如Boost、PCL、OpenCV,不同Ubuntu版本自带的库版本不同,ROS发行版在发布时就针对特定Ubuntu版本做了兼容性测试。你强行在22.04上装Noetic,可能编译能过,但运行时会遇到各种诡异的段错误。

2.2 安装ROS Noetic的实操路径

如果你还没装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 # 安装完整版ROS sudo apt install ros-noetic-desktop-full # 初始化rosdep sudo rosdep init rosdep update # 配置环境变量 echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc

第二条路是用“鱼香ROS一键安装”,这个脚本在国内网络环境下确实省事,它会自动帮你换源、装依赖、初始化rosdep。但要注意,一键安装脚本有时候会帮你装一些你不需要的东西,而且如果中途出错,排查起来不如手动安装直观。我的建议是:第一次装可以用一键脚本快速跑通,但之后最好自己手动装一遍,把每个步骤都搞清楚。

2.3 编译RS-LiDAR-16驱动前必须装的依赖

在克隆驱动代码之前,先把这些依赖装好,否则编译时必然报错:

sudo apt install -y libpcap-dev libboost-all-dev libeigen3-dev libyaml-cpp-dev

libpcap-dev是必须的,因为雷达通过网口传数据,驱动底层用pcap库抓包。libboost-all-devlibeigen3-dev是PCL点云库的依赖,libyaml-cpp-dev用于解析驱动的YAML配置文件。这几个库缺一个,编译就会中断。

另外,确保你的系统里已经装了PCL。ROS Noetic的desktop-full版本自带PCL 1.10,一般不需要单独装。但如果你装的是ros-base精简版,就需要手动补上:

sudo apt install -y libpcl-dev ros-noetic-pcl-ros ros-noetic-pcl-conversions

注意:有些教程会让你装ros-noetic-velodyne相关的包,那是给Velodyne雷达用的,RS-LiDAR-16不需要,装了反而可能引起话题名冲突。

3. 驱动获取与编译:从源码到可执行节点的完整链路

3.1 创建工作空间并获取驱动源码

ROS的编译体系要求所有功能包放在一个工作空间的src目录下。先建好目录结构:

mkdir -p ~/rslidar_ws/src cd ~/rslidar_ws/src

然后从速腾聚创的官方仓库克隆驱动。目前常用的有两个仓库:rslidar_sdkros_rslidarrslidar_sdk是新版驱动,支持ROS和ROS 2,功能更全;ros_rslidar是老版,只支持ROS 1,但胜在简单稳定。我建议用rslidar_sdk,因为它的参数配置更灵活,而且后续如果要升级到ROS 2不用换驱动。

git clone https://github.com/RoboSense-LiDAR/rslidar_sdk.git cd rslidar_sdk git submodule init git submodule update

这里有个关键点:rslidar_sdk依赖几个子模块,包括rs_driver(底层驱动库)和yaml-cpp(配置解析)。如果你不执行git submodule initgit submodule update,编译时会报找不到头文件的错误。这是很多人第一次编译时最容易忽略的步骤。

3.2 编译过程中的常见报错与解决思路

回到工作空间根目录开始编译:

cd ~/rslidar_ws catkin_make

如果一切顺利,几十秒到几分钟就能编译完成。但实际过程中大概率会遇到问题,我把常见的几个列出来:

报错一:找不到pcap.h

fatal error: pcap.h: No such file or directory

原因是没有装libpcap-dev,或者装了但头文件路径没被正确引用。解决方法是确认libpcap-dev已安装,然后检查CMakeLists.txt里是否有find_package(PCAP REQUIRED)相关的语句。

报错二:PCL相关符号未定义

undefined reference to `pcl::PointCloud<pcl::PointXYZI>::~PointCloud()'

这通常是因为PCL版本不匹配或者链接顺序有问题。ROS Noetic自带的PCL 1.10一般不会有这个问题,如果你手动装过其他版本的PCL,需要确保CMakeLists.txtfind_package(PCL REQUIRED)找到的是ROS自带的那个。

报错三:yaml-cpp版本冲突

error: ‘YAML::Node’ has no member named ‘as’

这是yaml-cpp 0.5和0.6之间的API差异导致的。ROS Noetic自带的是yaml-cpp 0.6,如果你的系统里同时存在0.5版本,编译时可能链接到错误的版本。解决方法是检查/usr/include/yaml-cpp/usr/local/include/yaml-cpp,确保只保留一个版本。

编译成功后,别忘了source一下工作空间的setup文件:

source ~/rslidar_ws/devel/setup.bash

建议把这行也加到~/.bashrc里,省得每次开终端都要手动source。

3.3 驱动配置文件的关键参数解读

rslidar_sdk的配置文件在src/rslidar_sdk/config/config.yaml,这个文件决定了驱动怎么连雷达、怎么发数据。几个必须改的参数:

common: msg_source: 1 # 1表示从在线雷达读取,0表示从PCAP包读取 send_packet_ros: false # 是否把原始数据包发到ROS话题 send_point_cloud_ros: true # 是否把解析后的点云发到ROS话题 lidar: - driver: lidar_type: RS16 # 雷达型号,RS-LiDAR-16就填RS16 msop_port: 6699 # 雷达数据端口,默认6699 difop_port: 7788 # 雷达信息端口,默认7788 host_address: 192.168.1.102 # 本机IP,要和雷达在同一网段 lidar_address: 192.168.1.200 # 雷达IP,默认是这个 ros: ros_frame_id: rslidar # 点云的frame_id,rviz里要用到 ros_send_point_cloud_topic: /rslidar_points # 点云话题名

msg_source这个参数很关键。如果你手头没有雷达,但想先跑通流程,可以把它设为0,然后指定一个PCAP文件路径,驱动会从录制的数据包里解析点云。这对于调试和开发非常方便。

host_address要改成你电脑网口的IP,lidar_address是雷达的出厂IP。两者必须在同一网段,比如都是192.168.1.x。如果你不确定雷达IP是多少,可以用速腾提供的上位机软件查看,或者用Wireshark抓包看雷达发的数据包源地址。

4. 网络配置与雷达连通性验证

4.1 有线网口的IP设置

RS-LiDAR-16通过百兆以太网传输数据,你需要用一根网线把雷达和电脑的网口直连。然后给电脑网口配一个和雷达同网段的静态IP:

# 查看网口名称,通常是enp3s0或eth0 ip link show # 临时设置IP(重启后失效) sudo ip addr add 192.168.1.102/24 dev enp3s0 sudo ip link set enp3s0 up

如果你想让IP设置永久生效,可以通过NetworkManager的图形界面或者修改/etc/netplan/下的配置文件。Ubuntu 20.04默认用netplan,配置文件长这样:

network: version: 2 ethernets: enp3s0: addresses: - 192.168.1.102/24 dhcp4: no

改完之后执行sudo netplan apply生效。

4.2 用ping和Wireshark确认雷达在线

配好IP后,先ping一下雷达:

ping 192.168.1.200

如果能通,说明物理链路和IP配置没问题。如果ping不通,检查网线是否插好、网口指示灯是否亮、防火墙是否挡住了ICMP包。

ping通之后,进一步确认雷达在发数据。可以用Wireshark抓包,过滤条件设为udp.port == 6699,应该能看到持续不断的数据包。如果看不到,可能是雷达没上电、或者雷达的IP和你设的不在同一网段、或者雷达的端口被改了。

提示:有些电脑的网口默认开启了节能模式,会导致丢包。可以用ethtool关掉:sudo ethtool -K enp3s0 gro off gso off tso off。这个操作对点云稳定性有肉眼可见的提升。

4.3 启动驱动并检查话题

网络通了之后,启动驱动:

roslaunch rslidar_sdk start.launch

如果一切正常,终端会打印出雷达的型号、固件版本、数据包接收状态等信息。然后另开一个终端,查看当前有哪些话题:

rostopic list

你应该能看到/rslidar_points这个话题。再用rostopic hz看一下发布频率:

rostopic hz /rslidar_points

RS-LiDAR-16的正常发布频率是10Hz,也就是每秒10帧点云。如果频率明显偏低或者时断时续,说明网络丢包或者CPU处理不过来。

还可以用rostopic echo看一下点云消息的头部信息:

rostopic echo /rslidar_points/header -n 1

确认frame_idrslidar,和配置文件里的一致。这个frame_id后面在rviz里会用到。

5. Rviz点云可视化:从黑屏到正常显示的排查过程

5.1 Rviz的基本配置步骤

启动rviz:

rosrun rviz rviz

第一次打开rviz,界面是空的。需要做几件事:

第一,设置Fixed Frame。在左侧Displays面板顶部,把Fixed Frame从默认的map改成rslidar。这一步不做,点云不会显示,因为rviz找不到参考坐标系。

第二,添加PointCloud2显示项。点击左下角的Add按钮,在By topic标签页里找到/rslidar_points,选中后点OK。或者在By display type里选PointCloud2,然后手动把Topic设为/rslidar_points

第三,调整点云颜色。默认是按强度着色,你可以改成按高度(Z轴)着色,这样更能看出三维结构。在PointCloud2的属性里,Color Transformer选AxisColor,Axis选Z。

做完这三步,你应该能看到彩色的三维点云了。如果还是黑屏,往下看排查步骤。

5.2 点云不显示的五个常见原因

原因一:Fixed Frame设置错误。这是最常见的。rviz的Fixed Frame必须和点云消息的frame_id一致,或者存在从Fixed Frame到frame_id的TF变换。如果你设的是map但没有任何节点发布maprslidar的TF,rviz就不知道该把点云画在哪个位置。最简单的做法就是把Fixed Frame直接设成rslidar

原因二:话题名不匹配。检查rviz里PointCloud2的Topic是否和rostopic list里看到的一致。有时候驱动发的是/rslidar_points,但rviz里默认填的是/velodyne_points,那当然显示不出来。

原因三:点云数据为空。rostopic echo /rslidar_points -n 1看一下消息里的width字段。如果是0,说明驱动没解析到有效点。回到驱动终端看有没有报错,检查网络是否丢包。

原因四:rviz的Global Options里Frame丢失。如果rviz底部状态栏显示“Fixed Frame [rslidar] does not exist”,说明没有任何节点发布这个frame。可以在驱动launch文件里确认ros_frame_id参数是否正确设置。

原因五:显卡驱动问题。rviz依赖OpenGL做渲染,如果你的显卡驱动没装好,rviz可能能打开但显示异常。这种情况在虚拟机里特别常见。解决方法是装好显卡驱动,或者在虚拟机里开启3D加速。

5.3 用TF树验证坐标系链路

如果你的系统里有多个传感器(比如雷达加相机加IMU),就需要用TF树来管理坐标系之间的变换关系。查看当前TF树的命令:

rosrun tf view_frames

这会生成一个frames.pdf文件,打开后能看到所有坐标系和它们之间的连接关系。如果rslidar这个frame孤立在那里,没有任何父节点,那在rviz里设Fixed Frame为map时就找不到它。

对于单纯的雷达可视化,不需要额外的TF发布节点,直接把Fixed Frame设成rslidar就行。但如果你要做SLAM建图,就需要一个节点来发布maprslidar的变换,通常是里程计节点或者SLAM算法节点来发布。

6. 从可视化到建图:点云数据的下一步用法

6.1 录制和回放点云数据

跑通可视化之后,你可能会想录一段数据下来慢慢分析。ROS提供了rosbag工具:

rosbag record /rslidar_points -O lidar_data.bag

录完之后可以随时回放:

rosbag play lidar_data.bag

回放的时候rviz照样能显示点云,就像雷达还在线一样。这个功能对于调试SLAM算法特别有用,因为你不用每次都把雷达带在身边。

注意:点云数据量很大,录一分钟大概几百MB。录之前确认磁盘空间够用,并且尽量只录需要的话题,不要rosbag record -a把所有话题都录下来。

6.2 接入SLAM算法跑建图

RS-LiDAR-16跑SLAM的常见方案有几种。轻量级的有lego_loamaloam,这两个对16线雷达支持不错,计算量也不算大。功能更全的有lio_sam,它融合了激光雷达和IMU,建图效果更平滑,但配置稍微复杂一些。

lego_loam为例,基本流程是:先把驱动跑起来,确认/rslidar_points话题正常发布;然后启动lego_loam的launch文件,它会订阅点云话题,输出里程计和建图结果;最后在rviz里添加/laser_cloud_surround话题的PointCloud2显示,就能看到逐步构建的三维地图。

这里有一个关键点:lego_loam默认订阅的话题名可能是/velodyne_points,你需要改成/rslidar_points,或者在launch文件里做话题重映射。另外,lego_loam对点云的frame_id有要求,通常需要是velodyne,你可以把驱动的ros_frame_id改成velodyne,或者在launch里加一个静态TF变换。

6.3 点云预处理:降采样和地面分割

原始点云数据量很大,直接送给SLAM算法会拖慢速度。常见的预处理步骤有两个:

降采样:用体素栅格滤波器(VoxelGrid)把点云分辨率降低。比如把体素大小设为0.2米,原来30万个点可能降到3万个,计算量减少一个数量级,但地图的宏观结构基本不变。

地面分割:把地面点和障碍物点分开。地面点对于建图来说信息量低,去掉之后能减少干扰。常用的方法是RANSAC平面拟合或者射线地面滤波器。

这两个步骤在PCL里都有现成的实现,可以写一个ROS节点订阅原始点云,处理后发布新的话题,然后让SLAM算法订阅处理后的话题。

7. 实操中积累的几个经验教训

7.1 网口带宽和CPU占用要提前评估

RS-LiDAR-16的数据率大约是每秒30万个点,每个点包含XYZ坐标和强度信息,算下来每秒的数据量在10MB到20MB之间。百兆网口理论带宽是12.5MB/s,实际可用带宽大概10MB/s左右,所以刚好够用但余量不大。如果你的电脑网口是千兆的,那完全没问题。但如果是百兆网口,建议确认一下有没有其他程序在占用带宽。

CPU方面,驱动解析点云是单线程的,在i5级别的CPU上大概占用10%到20%的单核性能。如果你同时跑SLAM算法,CPU占用会明显上升。建议至少用四核以上的CPU,内存8GB起步。

7.2 驱动启动顺序有讲究

正确的启动顺序是:先配好网络、确认雷达在线,再启动驱动,最后开rviz。如果反过来,先开rviz再启动驱动,rviz可能因为找不到话题而显示空白,需要手动刷新或者重新添加显示项。

另外,如果你同时跑了多个ROS节点,注意话题名不要冲突。比如你之前跑过Velodyne的驱动,它可能还在后台发布/velodyne_points,虽然不影响RS-LiDAR-16,但rviz里可能会混淆。

7.3 固件版本和驱动版本的兼容性

速腾的雷达固件会不定期更新,新固件可能改变了数据包的格式或者端口号。如果你发现驱动能连上雷达但解析不出点云,很可能是固件版本和驱动版本不匹配。解决方法是去速腾官网下载对应版本的驱动,或者用速腾提供的固件升级工具把雷达固件降到驱动支持的版本。

查看雷达固件版本的方法:在驱动启动时的终端输出里通常会打印固件版本号,或者用Wireshark抓DIFOP包(端口7788),里面的数据包含有版本信息。

7.4 ROS 2 Humble下的差异点

如果你用的是ROS 2 Humble,驱动的编译方式从catkin_make变成了colcon build,launch文件的格式也从XML变成了Python。rslidar_sdk的ROS 2分支已经适配好了这些变化,基本流程是:

mkdir -p ~/rslidar_ws/src cd ~/rslidar_ws/src git clone https://github.com/RoboSense-LiDAR/rslidar_sdk.git -b ros2 cd ~/rslidar_ws colcon build source install/setup.bash ros2 launch rslidar_sdk start.py

rviz在ROS 2里叫rviz2,基本操作和ROS 1的rviz一样,但界面布局略有不同。话题查看命令从rostopic变成了ros2 topic,比如ros2 topic hz /rslidar_points

我在实际使用中发现,ROS 2下的驱动稳定性已经和ROS 1差不多了,而且ROS 2的实时性和分布式通信能力更强,如果你是新项目,可以直接上ROS 2 Humble。但如果你需要用到一些只有ROS 1才有的老算法包,那就还是用Noetic。

7.5 点云可视化时的性能优化

rviz显示点云时,如果点数太多,界面会卡顿。几个优化技巧:把PointCloud2的Decay Time设短一点,比如1秒,这样旧的点云会被自动清除;把Size设小一点,比如0.01米,减少渲染负担;如果只是看大致结构,可以用rostopic的降采样功能或者写个节点做体素滤波后再发给rviz。

另外,rviz的渲染帧率可以在Global Options里调,默认是30fps,调到15fps能明显降低CPU占用,肉眼看起来也不会太卡。

8. 常见问题速查与后续扩展方向

8.1 问题速查表

现象可能原因排查方法
rviz黑屏无点云Fixed Frame错误改成rslidar
话题列表无/rslidar_points驱动未启动或编译失败检查终端报错
点云频率低于10Hz网络丢包或CPU过载用Wireshark看丢包率
点云形状异常雷达安装角度或标定问题检查雷达是否水平
驱动启动后立即退出配置文件参数错误检查YAML格式和端口号
ping不通雷达IP不在同一网段检查网口IP和雷达IP

8.2 从单雷达扩展到多雷达融合

如果你后续要加第二个雷达做盲区补盲,思路是给每个雷达配不同的IP和端口,在驱动的配置文件里加一个lidar条目,然后分别发布到不同的话题。再用一个融合节点订阅两个话题,把点云合并后发布到一个新话题。注意两个雷达的frame_id要不同,并且要用TF标定它们之间的相对位置。

8.3 点云数据的上层应用方向

跑通可视化和建图之后,RS-LiDAR-16还能做很多事。比如目标检测,可以用PointPillars或者CenterPoint这类算法在点云上框出车辆和行人;比如语义分割,用RangeNet++把点云分成地面、道路、建筑物等类别;比如定位,用NDT或者ICP算法把当前点云和预先建好的地图做匹配,得到车辆位姿。这些应用都需要你先有一个稳定的点云输入,而这篇内容讲的正是这个基础。

我个人在实际操作中的体会是,激光雷达的ROS环境搭建本身不难,难的是遇到问题时知道去哪里找原因。网络、驱动、rviz这三个环节,任何一个出问题都会导致点云显示不出来。按照“先确认网络通、再确认驱动跑、最后确认rviz配置对”的顺序排查,基本能解决90%的问题。剩下10%的疑难杂症,多半是版本兼容性问题,去GitHub的issue区搜一下,通常能找到答案。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询