系统环境基于 Ubuntu 22.04,ROS2 版本选用 Humble,雷达设备为 RPLidar A1。下面直接开始配置流程。
安装必要的软件包
先更新系统并安装核心依赖。这里需要 slam_toolbox、RPLidar 驱动以及导航相关的基础包。
sudo apt update
sudo apt install ros-humble-slam-toolbox
sudo apt install ros-humble-rplidar-ros
sudo apt install ros-humble-navigation2 ros-humble-nav2-bringup
配置 RPLidar A1
为了让系统能正确识别 USB 雷达,需要创建 udev 规则。这步很关键,否则后续可能找不到设备。
echo 'KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666", GROUP:="dialout", SYMLINK+="rplidar"' | sudo tee /etc/udev/rules.d/rplidar.rules
sudo udevadm control --reload-rules
sudo udevadm trigger
重新插拔雷达 USB 线后,检查设备节点是否生成:
ls -l /dev | grep ttyUSB
# 预期看到类似:lrwxrwxrwx 1 root root 7 Nov 6 10:20 rplidar -> ttyUSB0
启动雷达测试
单独启动雷达节点,确认激光数据正常输出。
ros2 launch rplidar_ros rplidar_a1_launch.py
新开一个终端查看 /scan 话题是否有数据:
ros2 topic echo /scan --no-arr | head -5
这一步偶尔报错很正常,主要是验证前几行数据格式即可。
创建 SLAM 功能包与启动文件
接下来创建工作空间并编写自定义的 Launch 文件,将雷达和 SLAM 节点整合在一起。
mkdir -p ~/slam_ws/src
cd ~/slam_ws/src
ros2 pkg create my_slam --build-type ament_cmake --dependencies rclcpp slam_toolbox nav2_msgs
mkdir -p ~/slam_ws/src/my_slam/launch
编辑启动文件 slam_with_rplidar.launch.py:
import launch
from launch_ros.actions import Node
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
def generate_launch_description():
use_sim_time = LaunchConfiguration('use_sim_time', default='false')
# RPLidar A1 节点
rplidar_node = Node(
package='rplidar_ros',
executable='rplidar_node',
name='rplidar_node',
parameters=[{
'serial_port': '/dev/rplidar',
'serial_baudrate': 115200,
'frame_id': 'laser',
'inverted': False,
'angle_compensate': True,
'scan_mode': 'Standard'
}],
output='screen'
)
# slam_toolbox 节点
slam_toolbox_node = Node(
package='slam_toolbox',
executable='async_slam_toolbox_node',
name='slam_toolbox',
output='screen',
parameters=[{
'use_sim_time': use_sim_time,
'map_frame': 'map',
'odom_frame': 'odom',
'base_frame': 'base_link',
'scan_topic': '/scan',
'mode': 'mapping',
'resolution': 0.05,
'max_laser_range': 12.0
}]
)
# 静态 TF 发布 - 定义雷达位置
static_tf_laser = Node(
package='tf2_ros',
executable='static_transform_publisher',
name='static_transform_publisher_laser',
arguments=['0', '0', '0.1', '0', '0', '0', 'base_link', 'laser']
)
# 静态 TF 发布 - 定义 base_link 到 odom 的初始位置
static_tf_odom = Node(
package='tf2_ros',
executable='static_transform_publisher',
name='static_transform_publisher_odom',
arguments=['0', '0', '0', '0', '0', '0', 'odom', 'base_link']
)
return launch.LaunchDescription([
DeclareLaunchArgument('use_sim_time', default_value='false'),
rplidar_node,
static_tf_laser,
static_tf_odom,
slam_toolbox_node,
])
修改 CMakeLists.txt 确保 launch 目录被安装:
cmake_minimum_required(VERSION 3.8)
project(my_slam)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(slam_toolbox REQUIRED)
find_package(nav2_msgs REQUIRED)
install(DIRECTORY launch DESTINATION share/${PROJECT_NAME})
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
set(ament_cmake_copyright_FOUND TRUE)
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()
构建工作空间
编译之前记得清理一下旧缓存(可选),然后执行构建命令:
cd ~/slam_ws
colcon build
source install/setup.bash
启动完整的 SLAM 系统
准备两个终端窗口:
终端 1: 启动 SLAM 和雷达
ros2 launch my_slam slam_with_rplidar.launch.py
终端 2: 打开 RViz2 可视化
ros2 run rviz2 rviz2
配置 RViz2 显示建图过程
在 RViz2 界面中进行以下设置,以便观察建图效果:
- Fixed Frame:在 Global Options 中将 Fixed Frame 设置为
map。 - 添加显示项:点击 Add 按钮依次添加:
- LaserScan:Topic 设为
/scan,Size 设为0.1,颜色选红色或绿色。 - Map:Topic 设为
/map,Color Scheme 选costmap,勾选 Draw Behind。 - TF:用于显示坐标框架关系。
- LaserScan:Topic 设为
- 保存配置:File -> Save Config As ->
~/slam_ws/slam_config.rviz。
开始建图与保存地图
启动后,缓慢移动机器人覆盖整个环境区域,观察 RViz 中地图的实时构建情况。建图完成后,使用以下命令保存地图文件:
ros2 run nav2_map_server map_saver_cli -f ~/my_first_map
至此,基础的 ROS2 SLAM 建图流程就完成了。后续可以根据实际需求调整分辨率或最大扫描范围参数。

