ROS2机器人slam_toolbox建图零基础
系统:Ubuntu22.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()这一步主要添加了launch目录:
install(DIRECTORY launch
DESTINATION share/${PROJECT_NAME}
)
五、构建工作空间
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