跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Shell / BashAI算法

ROS2 slam_toolbox 激光雷达建图教程

介绍在 Ubuntu 22.04 和 ROS2 Humble 环境下,使用 slam_toolbox 和 RPLidar A1 进行机器人建图的完整流程。内容包括软件包安装、雷达驱动配置、自定义 Launch 文件编写、工作空间构建及 RViz 可视化设置,最后演示如何保存地图。

未来可期发布于 2026/4/6更新于 2026/5/2029 浏览

系统:Ubuntu 22.04

ROS2 版本:Humble

雷达设备:rplidar_a1

一、安装必要的软件包

# 更新系统
sudo apt update
# 安装 slam_toolbox
sudo apt install ros-humble-slam-toolbox
# 安装 RPLidar 驱动
sudo apt install ros-humble-rplidar-ros
# 安装导航相关包
sudo apt install ros-humble-navigation2 ros-humble-nav2-bringup

二、配置 RPLidar_A1

创建 udev 规则(让系统识别雷达)

# 创建 udev 规则
echo 'KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666", GROUP:="dialout", SYMLINK+="rplidar"' | sudo tee /etc/udev/rules.d/rplidar.rules
# 重新加载 udev 规则
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

三、启动雷达

# 启动 RPLidar A1
ros2 launch rplidar_ros rplidar_a1_launch.py
# 在另一个终端检查激光数据
ros2 topic echo /scan --no-arr | head -5
# 这一步有报错很正常,因为我们只看前 5 行的数据

四、创建 SLAM 启动文件

# 创建工作空间目录(如果还没有)
 -p ~/slam_ws/src
 ~/slam_ws/src
mkdir
cd
# 创建功能包(如果需要)
ros2 pkg create my_slam --build-type ament_cmake --dependencies rclcpp slam_toolbox nav2_msgs
# 创建 launch 目录
mkdir -p ~/slam_ws/src/my_slam/launch

创建启动文件

nano ~/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,
    ])

添加依赖

cd ~/slam_ws/src/my_slam
nano CMakeLists.txt

将内容修改为:

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 dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(slam_toolbox REQUIRED)
find_package(nav2_msgs REQUIRED)

# 添加这行:安装 launch 目录
install(DIRECTORY launch DESTINATION share/${PROJECT_NAME})

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # comment the line when a copyright and license is added to all source files
  set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # comment the line when this package is in a git repo and when
  # a copyright and license is added to all source files
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

这一步主要添加了 launch 目录的安装指令。

五、构建工作空间

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 中:

  1. 修改 Fixed Frame:

    • Global Option ----> Fixed Frame: 设置为 map
  2. 添加显示项(点击 Add 按钮):

    • LaserScan:
      • Topic: /scan
      • Size: 0.1
      • Color: 红色或绿色
    • Map:
      • Topic: /map
      • Color Scheme: costmap
      • Draw Behind: √
    • TF:
      • 显示坐标框架关系
  3. 保存 RViz 配置:

    • File ----> Save Config As ----> ~/slam_ws/slam_config.rviz

八、开始建图

  1. 缓慢移动雷达在环境中行走
  2. 观察 RViz 中的建图过程
  3. 确保覆盖所有区域

九、保存地图

建图完成后,保存地图:

ros2 run nav2_map_server map_saver_cli -f ~/my_first_map

目录

  1. 一、安装必要的软件包
  2. 更新系统
  3. 安装 slam_toolbox
  4. 安装 RPLidar 驱动
  5. 安装导航相关包
  6. 二、配置 RPLidar_A1
  7. 创建 udev 规则
  8. 重新加载 udev 规则
  9. 查看雷达是否被识别
  10. 应该看到类似:lrwxrwxrwx 1 root root 7 Nov 6 10:20 rplidar -> ttyUSB0
  11. 三、启动雷达
  12. 启动 RPLidar A1
  13. 在另一个终端检查激光数据
  14. 这一步有报错很正常,因为我们只看前 5 行的数据
  15. 四、创建 SLAM 启动文件
  16. 创建工作空间目录(如果还没有)
  17. 创建功能包(如果需要)
  18. 创建 launch 目录
  19. find dependencies
  20. 添加这行:安装 launch 目录
  21. the following line skips the linter which checks for copyrights
  22. comment the line when a copyright and license is added to all source files
  23. the following line skips cpplint (only works in a git repo)
  24. comment the line when this package is in a git repo and when
  25. a copyright and license is added to all source files
  26. 五、构建工作空间
  27. 六、启动完整的 SLAM 系统
  28. 终端 1:启动 SLAM 和雷达
  29. 终端 2:启动 RViz2
  30. 七、配置 RViz2 显示建图过程
  31. 八、开始建图
  32. 九、保存地图
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • LeetCode 128:哈希集合巧解最长连续序列
  • 2023 年电赛 H 题:信号分离装置 FPGA 与 STM32 实现方案
  • C++ 哈希表:概念、冲突解决与代码实现
  • Python 正则表达式核心用法与实战示例
  • 飞算 JavaAI 辅助 Java 项目开发流程与效率提升实践
  • Visual Studio 关闭 Copilot AI 代码提示的方法
  • Stable Diffusion v1.5 GPU 算力成本分析:单图推理耗时与电费测算
  • Java 语言特点与八种基本数据类型
  • 写真馆在线管理系统设计与实现
  • Python 算法题解:链表、二叉树、动态规划等
  • Java 核心基础:语言特点、环境架构与八种基本数据类型详解
  • VS Code GitHub Copilot 不支持自定义模型 API 配置
  • Web3 前端安全:连接钱包的风险与防护
  • 基于 Composition API 和 Custom Hook 实现前端权限控制
  • 字节跳动前端开发面试核心考点与实战指南
  • 基于 FPGA 的日志与参数存储方案设计
  • Web3 前端安全:钱包连接风险与防护指南
  • GitHub Copilot 不支持在 VS Code 中配置自定义模型 API
  • Ubuntu 24.04 下使用 Docker Compose 本地部署 Whisper 语音识别
  • CycleGAN 图像转换原理与实现

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online