核心文件: slam_mapping.launch.py, my_slam_params.yaml
涉及节点: keyboard_control_node, rplidar_node, async_slam_toolbox_node
功能目标: 完成里程计、激光雷达与 SLAM 算法的联合调试,构建 /map。
1. 系统节点拓扑 (System Topology)
本系统采用 slam_toolbox 作为核心建图算法,通过 /odom 辅助定位以提高建图鲁棒性。
Visualization 坐标变换树 硬件驱动层 /scan Serial /odom /imu/data_raw TF: odom->base_link TF: base_link->laser TF: base_link->imu_link TF: map->odom /map RViz2 TF_Dynamic TF_Static static_transform_publisher static_transform_publisher TF_Map SLAM Toolbox RPLidar S2 keyboard_control_node STM32F103
2. 坐标变换树 (TF Tree) 设计
SLAM 系统的核心在于 TF 树的完整性。根据您的 Launch 文件,TF 树结构定义如下:
map->odom: 由slam_toolbox发布。这是 SLAM 算法计算出的机器人全局位姿修正(用于消除里程计漂移)。odom->base_link: 由keyboard_control_node发布。代表基于编码器和 IMU 融合的局部连续位姿。base_link->laser: 由slam_mapping.launch.py中的静态发布器发布。- 配置值 :
x=0.1, y=0, z=0.15 - 物理意义: 雷达安装在机器人中心前方 10cm,高度 15cm 处。
- 配置值 :
base_link->imu_link: 由静态发布器发布。- 配置值 :
x=0.05, y=0, z=0.1
- 配置值 :
3. 启动文件深度解析 (slam_mapping.launch.py)
Launch 文件是系统的总指挥,存在几个关键配置修正点,必须注意:
3.1 关键参数修正:脉冲数 (Pulses Per Revolution)
在 Launch 文件中,您注释提到了一个关键修正:
python
# ===【关键修正】===
# 这里的默认值必须更新为 2550.0,否则会覆盖节点代码中的正确设置
pulses_per_revolution = LaunchConfiguration('pulses_per_revolution', default='1320.0')
3.2 节点配置详情
-
keyboard_control_node(驱动):- 串口 : 默认为
/dev/ttyUSB2(需确认实际插入端口)。 - 滑移系数 :
skid_steer_slip_factor设为1.6。这是针对四轮差速机器人的经验值,用于补偿转向时的轮胎打滑。 - EKF频率 :
50.0Hz,保证了 TF 的高频平滑性。
- 串口 : 默认为
-
rplidar_node(雷达):- 波特率 :
1000000(1M)。这是 S2/S3 系列雷达的标准波特率,配置正确。 - 模式 :
DenseBoost。适合室内建图,点云更密集。
- 波特率 :
-
slam_toolbox(算法):- 模式 :
async_slam_toolbox_node。异步模式适合算力有限的嵌入式平台(如 Orange Pi),避免处理每一帧雷达数据导致卡顿。
- 模式 :
4. SLAM 参数分析 (my_slam_params.yaml)
配置文件决定了建图的质量,以下参数至关重要:
| 参数项 | 当前值 | 说明与建议 |
|---|---|---|
use_odom |
true |
正确。利用 STM32 提供的里程计初值,大幅降低匹配难度。 |
use_scan_matching |
true |
正确。启用扫描匹配来修正里程计误差。 |
resolution |
0.05 |
地图分辨率 5cm。如果环境很大(如仓库),可调整为 0.1 以节省内存。 |
odom_linear_covariance |
0.5 |
里程计线性协方差。值越大表示越不信任里程计的直线精度。 |
max_laser_range |
18.0 |
设为 18米。请确认 RPLidar S2 的实际有效量程(通常 S2 可达 30m,但室内 18m 足够)。 |
transform_timeout |
1.5 |
TF 等待超时时间。1.5s 较为宽裕,能容忍一定的网络/串口延迟。 |
5. 启动与调试指南 (Execution Guide)
5.1 硬件权限设置
在运行前,确保 USB 串口权限已授予:
bash
sudo chmod 777 /dev/ttyUSB*
5.2 启动命令
使用以下命令启动整个建图系统(包含修正后的脉冲参数):
bash
ros2 launch my_robot_slam slam_mapping.launch.py \
serial_port:=/dev/ttyUSB2 \
lidar_port:=/dev/ttyUSB0 \
pulses_per_revolution:=2550.0
5.3 验证步骤
-
检查 TF 树:
bashros2 run tf2_tools view_frames生成的 PDF 中,必须看到
map->odom->base_link->laser的完整链条。如果map->odom断开,说明 SLAM 没跑起来;如果odom->base_link断开,说明 STM32 驱动没发数据。 -
检查里程计数据:
bashros2 topic echo /odom推着机器人前进 1 米,检查
pose.position.x是否增加约 1.0。如果增加 2.0 或 0.5,说明pulses_per_revolution或wheel_radius仍有误。 -
RViz 观察 :
在 RViz 中,应该看到白色的地图(Free Space)和黑色的墙壁(Occupied)随着机器人移动逐渐扩展。红色激光点应该紧贴在黑色墙壁边缘。如果激光点和墙壁分离("重影"),说明里程计打滑或 TF 外参(雷达安装位置)配置错误。