
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/ttyUSB01.2 确认 USB 转串口芯片lsusbRPLIDAR 一般用 Silicon Labs CP210x,能看到:Bus 003 Device 008: ID 10c4:ea60 Silicon Labs CP210x UART Bridge1.3 串口权限/dev/ttyUSB0属于dialout组,当前用户必须在该组里才能开串口:groups$USER# 看是否含 dialout不在的话加一下,然后重新登录生效:sudousermod-aGdialout$USER快速自测:timeout1cat/dev/ttyUSB0/dev/nullecho权限 OK||echo无权限,需加 dialout 组二、安装驱动包2.1 克隆 ros2 分支按 ROS2 惯例放到工作区的src/下:mkdir-p~/ros2_ws/srccd~/ros2_ws/srcgitclone-bros2 https://github.com/Slamtec/rplidar_ros.git2.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.bash2.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 里用它区分系列:majorModelIDdevInfo.model4;case1,2,3:// A1..A3 系列case4:// C 系列 → 460800case6:// S1case7,8:// S2, S3本例model 0x41,0x41 4 4→C 系列,对应波特率 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 : OK和current scan mode就说明驱动和雷达通信正常。四、启动与可视化每次操作前先 source 两个环境(或写进~/.bashrc):source/opt/ros/humble/setup.bashsource~/ros2_ws/install/setup.bash4.1 节点 rviz 一键启动ros2 launch rplidar_ros view_rplidar_c1_launch.pyrviz 自动打开,显示/scan的扫描点云,正常是一个 360° 的环。此处可插入 rviz 扫描截图4.2 只跑节点ros2 launch rplidar_ros rplidar_c1_launch.py4.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 必须为 460800frame_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 /tfCtrlC停止,生成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-server8.3 发布静态 TFslam_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.pyslam_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 设备,可能要按序列号进一步区分。十、坐标系与 TFscan 消息的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:46080011.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 conditionCtrlC或kill关闭节点时可能打印: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)角分辨率(Standard10Hz)≈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/C1rplidar_ros(ROS2 分支):https://github.com/Slamtec/rplidar_ros/tree/ros2rplidar SDK:https://github.com/Slamtec/rplidar_sdkslam_toolbox:https://github.com/SteveMacenski/slam_toolboxROS2 Humble 文档:https://docs.ros.org/en/humble/如果对你有帮助,欢迎点赞收藏~有问题欢迎评论区交流。