RPLIDAR C1 激光雷达 + ROS2 Humble:从驱动编译到 SLAM 建图全流程
2026/7/7 3:57:54 网站建设 项目流程

RPLIDAR C1 激光雷达 + ROS2 Humble:从驱动编译到 SLAM 建图全流程

本文记录 RPLIDAR C1 在 ROS2 Humble 下的完整使用流程:硬件确认、驱动编译、参数配置、rviz 可视化、数据录制回放,一直到用 slam_toolbox 在线建图,并附常见报错排查。适合刚拿到 C1、想在 ROS2 上跑起来做室内建图的同学。

环境说明

雷达RPLIDAR C1(Slamtec,360° 三角测距 2D 激光雷达)
接口USB 转串口(Silicon Labs CP210x)
波特率460800
系统Ubuntu + ROS2 Humble

坑点提示:Slamtec 的rplidar_ros仓库默认分支是 ROS1(catkin/roscpp)。在 ROS2 下必须切到ros2分支,否则colcon编译会直接报错。仓库支持的型号及波特率:A1/A2M8 = 115200,A2M7/A2M12/A3/S1 = 256000,S2/S3 = 1000000,C1 = 460800,T1 走 UDP。


一、硬件与权限确认

1.1 查看串口设备

ls-l/dev/ttyUSB* /dev/ttyACM*

正常应看到:

crw-rw---- 1 root dialout 188, 0 /dev/ttyUSB0

1.2 确认 USB 转串口芯片

lsusb

RPLIDAR 一般用 Silicon Labs CP210x,能看到:

Bus 003 Device 008: ID 10c4:ea60 Silicon Labs CP210x UART Bridge

1.3 串口权限

/dev/ttyUSB0属于dialout组,当前用户必须在该组里才能开串口:

groups"$USER"# 看是否含 dialout

不在的话加一下,然后重新登录生效:

sudousermod-aGdialout"$USER"

快速自测:

timeout1cat/dev/ttyUSB0>/dev/null&&echo"权限 OK"||echo"无权限,需加 dialout 组"

二、安装驱动包

2.1 克隆 ros2 分支

按 ROS2 惯例放到工作区的src/下:

mkdir-p~/ros2_ws/srccd~/ros2_ws/srcgitclone-bros2 https://github.com/Slamtec/rplidar_ros.git

2.2 编译

cd~/ros2_wssource/opt/ros/humble/setup.bash colcon build --packages-select rplidar_ros

几秒即可编完。看到Finished <<< rplidar_ros就成功了。

编译时会出现一些-Wpedantic警告(SDK 头文件里的零长数组data[0]),无害,可以忽略。

2.3 source 工作区

sourceinstall/setup.bash

2.4 验证可执行文件

ros2 pkg executables rplidar_ros

输出:

rplidar_ros rplidar_client rplidar_ros rplidar_composition rplidar_ros rplidar_node

其中rplidar_node是雷达节点,负责发布/scan;rplidar_client是测试客户端,订阅/scan打印到终端。

小建议:把build/install/log/加进.gitignore,别把编译产物提交进仓库。


三、怎么知道它是 C1?

拿到雷达先别急着选 launch 文件,型号选错波特率不对是连不上的。可以通过串口发 RPLIDAR 协议指令GET_DEVICE_INFO(0xA5 0x50)读型号。

设备返回(示例):

model = 0x41 firmware = 1.02 hardware = 18 serial = D606E0F6C1E092D8A19E9FF946AA4616

关键看model 字节的高 4 位(model >> 4),SDK 里用它区分系列:

majorModelID=devInfo.model>>4;case1,2,3:// A1..A3 系列case4:// C 系列 → 460800case6:// S1case7,8:// S2, S3

本例model = 0x41,0x41 >> 4 = 4C 系列,对应波特率 460800,与rplidar_c1_launch.py的默认参数吻合。

其实更省事的做法是直接启动 C1 的 launch,看节点日志能不能正常出设备信息。成功时日志长这样:

RPLidar S/N: D606E0F6C1E092D8A19E9FF946AA4616 Firmware Ver: 1.02 Hardware Rev: 18 RPLidar health status : OK. current scan mode: Standard, sample rate: 5 Khz, max_distance: 16.0 m, scan frequency:10.0 Hz

看到health status : OKcurrent scan mode就说明驱动和雷达通信正常。


四、启动与可视化

每次操作前先 source 两个环境(或写进~/.bashrc):

source/opt/ros/humble/setup.bashsource~/ros2_ws/install/setup.bash

4.1 节点 + rviz 一键启动

ros2 launch rplidar_ros view_rplidar_c1_launch.py

rviz 自动打开,显示/scan的扫描点云,正常是一个 360° 的环。

(此处可插入 rviz 扫描截图)

4.2 只跑节点

ros2 launch rplidar_ros rplidar_c1_launch.py

4.3 验证数据

另开终端:

ros2 topic list# 应含 /scanros2 topic info /scan# Type: sensor_msgs/msg/LaserScanros2 topic hz /scan# 帧率,约 10 Hzros2 topicecho/scan--once# 打印一帧

也可以用自带客户端:

ros2 run rplidar_ros rplidar_client

五、Launch 参数详解

rplidar_c1_launch.py支持以下参数,都能在命令行覆盖:

参数默认值说明
channel_typeserial通道类型,串口为serial(T1 才用udp)
serial_port/dev/ttyUSB0串口设备路径
serial_baudrate460800C1 必须为 460800
frame_idlaserscan 消息的坐标系名
invertedfalse雷达倒装时设true,角度翻转 180°
angle_compensatetrue角度补偿,让每帧点在角度上均匀分布
scan_modeStandard扫描模式,见下一节

常用覆盖示例:

# 换扫描模式ros2 launch rplidar_ros rplidar_c1_launch.py scan_mode:=Sensitivity# 改电机转速(扫描频率)ros2 launch rplidar_ros rplidar_c1_launch.py scan_frequency:=5.0# 雷达倒装ros2 launch rplidar_ros rplidar_c1_launch.py inverted:=true# 用固定串口名(配合后文 udev 规则)ros2 launch rplidar_ros rplidar_c1_launch.py serial_port:=/dev/rplidar# 多参数组合:建图场景ros2 launch rplidar_ros rplidar_c1_launch.py\scan_mode:=Sensitivity scan_frequency:=5.0serial_port:=/dev/rplidar

六、扫描模式与角分辨率

6.1 扫描模式

通过scan_mode选择工作模式,SDK 里定义了几种:

模式特点适用场景
Standard标准模式,均衡通用,默认
Express快速采样高帧率需求
Sensitivity高灵敏度,弱信号更强远距离、暗光
Stability高稳定性,抗干扰强光、复杂环境

C1 早期固件(如 1.02)不支持GET_LIDAR_CONF查询(该命令需 fw 1.24+),所以具体支持哪几个模式以节点能成功启动、日志里current scan mode正确为准。

6.2 角分辨率怎么算

C1 采样率固定5000 点/秒(5 KHz),与电机转速无关。角分辨率由"每圈点数"决定:

每圈点数 = 采样率 ÷ 扫描频率 角分辨率 = 360° ÷ 每圈点数
扫描频率每圈点数角分辨率
5 Hz10000.36°
10 Hz(默认)5000.72°
12 Hz4170.86°

实用结论:

  • 建图(静态环境):低转速(5 Hz),每圈点更密,地图细节更丰富。
  • 避障(动态环境):高转速(12 Hz),刷新更快。
# 建图推荐:慢转 + 高灵敏ros2 launch rplidar_ros rplidar_c1_launch.py scan_frequency:=5.0scan_mode:=Sensitivity

七、数据录制与回放

7.1 录制

ros2 bag record /scan /tf

Ctrl+C停止,生成rosbag2_年_月_日_.../目录。

7.2 查看信息

ros2 bag info rosbag2_2026_07_06_17_00_00/

7.3 回放

# 终端 1:回放ros2 bag play rosbag2_2026_07_06_17_00_00/# 终端 2:开 rviz 看回放ros2 launch rplidar_ros view_rplidar_c1_launch.py

回放时/scan来自 bag 而非真实雷达,可用于离线调参、复现问题、离线跑 SLAM。


八、SLAM 建图(slam_toolbox)

这是大多数同学买 C1 的目的——室内建图。

8.1 方案对比

方案里程计需求特点
slam_toolbox(推荐)需要 odom TFROS2 官方维护,室内建图稳定,可手持(配伪 odom)
cartographer可纯激光精度高,配置较复杂
hector_slam不需要纯激光,但 ROS2 移植版较少

下面以slam_toolbox online_async(在线异步建图)为例,适合手持 C1 扫一遍建图。

8.2 安装

sudoaptinstallros-humble-slam-toolbox ros-humble-nav2-map-server

8.3 发布静态 TF

slam_toolbox 需要 TF 树:map → odom → base_link → laser

  • base_link → laser:雷达相对机器人本体的位姿(示例假设雷达装在中心,无偏移);
  • odom → base_link:里程计位姿。手持建图没有真实里程计时,先发个静态的占位,slam_toolbox 会自己发布map → odom
# 雷达相对本体ros2 run tf2_ros static_transform_publisher000000base_link laser# 占位里程计(真实机器人应换成轮式里程计节点)ros2 run tf2_ros static_transform_publisher000000odom base_link

真实机器人上,odom → base_link要由轮式里程计/IMU 融合节点发布,不能长期用静态 TF。

8.4 三个终端启动建图

# 终端 1:启动雷达(建图用慢转)ros2 launch rplidar_ros rplidar_c1_launch.py scan_frequency:=5.0# 终端 2:发布静态 TF(上面两条命令)# 终端 3:启动 slam_toolbox 在线建图ros2 launch slam_toolbox online_async_launch.py

slam_toolbox 默认打开 rviz 并显示/map(OccupancyGrid)。手持雷达缓慢平移、转身,地图会逐步长出来。

(此处可插入建图过程 rviz 截图)

8.5 保存地图

ros2 run nav2_map_server map_saver_cli-fmy_map

生成my_map.pgm(栅格图,可直接当图片看)和my_map.yaml(元数据,后续导航用)。

8.6 建图技巧

  • :slam_toolbox 靠扫描匹配定位,走太快会丢匹配、地图错位。
  • 走回环:回到已建图区域,算法会修正累积误差。
  • 低转速:配合第六节,scan_frequency:=5.0让每圈点更密。
  • 环境要有特征:空旷长走廊特征少容易丢,有门窗家具的房间建图更稳。

九、固定串口名(udev 规则)

USB 插拔或重启后,/dev/ttyUSB0可能变成ttyUSB1,launch 就找不到雷达了。用 udev 规则固定一个别名/dev/rplidar

驱动包自带脚本:

cd~/ros2_ws/src/rplidar_rossudobashscripts/create_udev_rules.sh

之后用固定名启动:

ros2 launch rplidar_ros rplidar_c1_launch.py serial_port:=/dev/rplidar

卸载:

sudobashscripts/delete_udev_rules.sh

规则按 USB 的 VID:PID(10c4:ea60)匹配。如果机器上还有别的 CP210x 设备,可能要按序列号进一步区分。


十、坐标系与 TF

  • scan 消息的header.frame_id默认laser(由frame_id参数控制)。
  • 按 RPLIDAR 规范,雷达坐标系x 轴朝前(0°方向),角度逆时针递增。

典型 TF 树:

map └─ odom (slam_toolbox / 里程计发布) └─ base_link (机器人本体) └─ laser (雷达,静态)

雷达倒装(线朝下)时,x 轴朝后、角度方向反转,两种处理方式二选一:

  • launch 加inverted:=true(驱动层翻转数据);
  • 或发一个旋转 180° 的静态 TF:
ros2 run tf2_ros static_transform_publisher000003.14159base_link laser

十一、常见报错排查

11.1 串口权限拒绝

现象:Permission denied: '/dev/ttyUSB0'

groups"$USER"# 是否在 dialout 组

不在就sudo usermod -aG dialout "$USER"然后重新登录。

11.2 端口被占用

现象:Failed to open serial port,或设备对指令无响应。

fuser/dev/ttyUSB0# 看哪个 PID 占着pgrep-afrplidar_node# 有没有残留节点

杀掉残留进程。注意pgrep -af确认 PID 再kill -9 <PID>,别用宽泛的pkill -f rplidar_node误杀别的会话。

11.3 波特率不对

现象:节点起不来、无/scan、health 异常。

C1 必须460800。临时指定:

ros2 launch rplidar_ros rplidar_c1_launch.py serial_baudrate:=460800

11.4 电机不转

C1 电机由驱动协议控制启停,正常启动节点后自动转。不转的话:

  • 查供电(USB 口供电不足就接独立 5V);
  • 看日志有没有checkMotorCtrlSupport相关错误;
  • 手拨一下转子排除卡死。

11.5 rviz 看不到扫描点

逐项查:

ros2 topicecho/scan--once# 有没有数据ros2 topic hz /scan# 帧率正不正常ros2 run tf2_tools view_frames# 生成 TF 树,确认 laser frame 存在

rviz 里确认:Fixed Frame 设为laser(或其父坐标系存在),LaserScan 的 Topic 设为/scan

11.6 退出时报failed to create guard condition

Ctrl+Ckill关闭节点时可能打印:

terminate called after throwing an instance of 'rclcpp::exceptions::RCLError' what(): failed to create guard condition: the given context is not valid...

这是 rclcpp 的已知退出异常,不是功能故障,节点退出前一直正常工作,不用管。

11.7/scan有数据但地图为空

  • 查 TF 树:map → odom → base_link → laser是否完整;
  • 确认 slam_toolbox 订阅的是/scan且 frame 对得上;
  • 移动是否过快导致匹配失败。

十二、规格参数

设备实测(本机雷达真实返回)

型号RPLIDAR C1(model0x41,C 系列)
固件 / 硬件1.02 / 18
接口USB-串口,CP210x(10c4:ea60)
波特率460800
扫描模式Standard
采样率5000 点/秒(5 KHz)
最大量程16.0 m
扫描频率10 Hz(默认,可调 5–12 Hz)
角分辨率(Standard@10Hz)≈0.72°
健康OK

官方标称(以官网为准)

标称值
测距原理三角测距
测距范围0.15–12 m(典型),16 m 为可检测上限
扫描范围360° 全向
采样率5 KHz(固定)
激光808 nm,Class 1 人眼安全
供电5V DC,约 2.5W
扫描模式Standard / Express / Sensitivity / Stability(支持其中部分)

总结

RPLIDAR C1 在 ROS2 Humble 下跑起来其实就三步:切 ros2 分支编译 → 用rplidar_c1_launch.py启动(460800)→ rviz 看/scan。要做建图再装 slam_toolbox,配好map → odom → base_link → laser的 TF,手持慢扫即可出图。

最容易踩的坑是用了默认 ROS1 分支波特率没对上——记住 C1 是 460800。其次就是串口权限(dialout 组)和端口被残留节点占用。

参考链接

  • Slamtec 官网 C1:https://www.slamtec.com/cn/Lidar/C1
  • rplidar_ros(ROS2 分支):https://github.com/Slamtec/rplidar_ros/tree/ros2
  • rplidar SDK:https://github.com/Slamtec/rplidar_sdk
  • slam_toolbox:https://github.com/SteveMacenski/slam_toolbox
  • ROS2 Humble 文档:https://docs.ros.org/en/humble/

如果对你有帮助,欢迎点赞收藏~有问题欢迎评论区交流。

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

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

立即咨询