问题分析
从你的日志看,所有TF和话题都是空的,说明你的机器人系统缺少关键的节点在发布数据。这是典型的TF树不完整问题。
核心原因
SLAM建图需要完整的TF树:
map → odom → base_link → laser_frame
你的系统缺少:
- 静态TF发布器:
base_link → laser_frame
- 里程计节点:发布
odom → base_link
- SLAM节点:发布
map → odom 和 /map
排查步骤
步骤1:检查激光雷达驱动是否正常
# 查看激光雷达话题
ros2 topic list | grep scan
ros2 topic hz /scan
# 查看雷达驱动节点
ros2 node list
如果 /scan 没有数据,先解决雷达驱动问题。
步骤2:添加静态TF发布
亚博YDLIDAR需要手动发布 base_link → laser_frame 的静态变换。
方法A:使用static_transform_publisher
# 假设雷达安装在机器人中心上方,z轴偏移0.1m
ros2 run tf2_ros static_transform_publisher \
0 0 0.1 0 0 0 1 \
base_link laser_frame
方法B:在launch文件中添加
from launch_ros.actions import Node
Node(
package='tf2_ros',
executable='static_transform_publisher',
arguments=['0', '0', '0.1', '0', '0', '0', '1', 'base_link', 'laser_frame']
)
步骤3:检查里程计数据
# 查看里程计话题
ros2 topic list | grep odom
ros2 topic echo /odom --once
# 如果没有/odom,需要启动你的STM32里程计节点
步骤4:启动SLAM节点
推荐使用 slam_toolbox(轻量级,适合X5):
# 安装(如果未安装)
sudo apt install ros-humble-slam-toolbox
# 启动在线建图
ros2 launch slam_toolbox online_async_launch.py \
slam_params_file:=/path/to/your/slam_params.yaml
slam_params.yaml 关键配置:
slam_toolbox:
ros__parameters:
frame_id: base_link
odom_frame: odom
map_frame: map
base_frame: base_link
scan_topic: /scan
use_map_saver: true
mode: mapping
步骤5:验证TF树
# 查看完整TF树
ros2 run tf2_ros tf2_monitor
# 或可视化
ros2 run tf2_tools view_frames
# 然后查看生成的 frames.pdf
完整启动示例
创建一个 slam_launch.py:
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
# 1. 静态TF:base_link → laser_frame
Node(
package='tf2_ros',
executable='static_transform_publisher',
arguments=['0', '0', '0.1', '0', '0', '0', '1', 'base_link', 'laser_frame']
),
# 2. 激光雷达驱动(根据你的驱动调整)
Node(
package='ydlidar_ros2_driver',
executable='ydlidar_ros2_driver_node',
name='ydlidar_ros2_driver_node',
output='screen',
remappings=[('scan', 'scan')]
),
# 3. SLAM节点
Node(
package='slam_toolbox',
executable='async_slam_toolbox_node',
name='slam_toolbox',
output='screen',
parameters=['/path/to/slam_params.yaml']
),
])
常见坑点
| 问题 |
解决方案 |
| TF树断链 |
确保所有frame_id拼写一致 |
| 雷达数据帧率低 |
检查USB带宽,降低分辨率 |
| 里程计漂移 |
校准STM32轮速计参数 |
| slam_toolbox不建图 |
检查 scan_topic 和 frame_id 配置 |
推荐参考
社区已有相关讨论:
先执行步骤1和步骤2,确认雷达数据和静态TF正常后,再启动SLAM节点。如果还有问题,把 ros2 node list 和 ros2 topic list 的输出发出来。