系统: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 启动文件
# 创建工作空间目录(如果还没有)
mkdir -p ~/slam_ws/src
cd ~/slam_ws/src
# 创建功能包(如果需要)
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()
五、构建工作空间
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 Option---->Fixed Frame:设置为 map
-
添加显示项(点击 Add 按钮)
- LaserScan:
- Topic : /scan
- Size : 0.1
- Color : 红色或绿色
- Map:
- Topic : /map
- Color Scheme : costmap
- Draw Behind : √
- TF:
- 显示坐标框架关系
- LaserScan:
-
保存 RViz 配置 file---->Save Config As ----> ~/slam_ws/slam_config.rviz
八、开始建图
- 缓慢移动雷达在环境中行走
- 观察 RViz 中的建图过程
- 确保覆盖所有区域
九、保存地图
建图完成后,保存地图:
ros2 run nav2_map_server map_saver_cli -f ~/my_first_map
