0%

在 RViz 里显示已经转换到世界坐标系的点云

在 RViz 里显示已经转换到世界坐标系的点云

假设相机一直向外发送点云(PointCloud2)消息,点云数据是相机坐标系下的。已知相机的外参(即相机坐标系到世界坐标系的变换),想在 RViz 里显示已经转换到世界坐标系的点云。


方案概述

RViz 显示点云时,会根据消息的 header.frame_id 和 TF 树中的坐标变换,把点云变换到 RViz 选定的固定坐标系(通常是 world_frame )下显示。

关键点:

  • 确保 TF 树中有相机坐标系到世界坐标系的变换(外参)
  • 点云消息的 header.frame_id 设置为相机坐标系
  • RViz 选择的固定坐标系为世界坐标系

这样 RViz 会自动根据 TF 变换把点云从相机坐标系变换到世界坐标系显示。


具体步骤

1. 发布 TF 变换

发布一个静态或动态的 TF 变换,将相机坐标系(如 camera_frame)和世界坐标系(如 world_frame)关联起来。

如果外参是固定的,可以用 static_transform_publisher

1
ros2 run tf2_ros static_transform_publisher [--x X] [--y Y] [--z Z] [--qx QX] [--qy QY] [--qz QZ] [--qw QW] [--roll ROLL] [--pitch PITCH] [--yaw YAW] --frame-id FRAME_ID --child-frame-id CHILD_FRAME_ID

参数说明:

  • --frame-id FRAME_ID--child-frame-id 是必填的参数

  • x y z qx qy qz qw:相机坐标系相对于世界坐标系的四元数旋转,可选填

示例:

1
ros2 run tf2_ros static_transform_publisher --z 2.0 --frame-id world_frame --child-frame-id camera_frame

2. 点云消息的 header.frame_id

确保相机发布的点云消息的 header.frame_id 是相机坐标系名(如 camera_frame),这样 RViz 才知道点云是在哪个坐标系下的。

3. RViz 设置

  • 固定坐标系(Fixed Frame)设置为 world_frame
  • 添加 PointCloud2 显示,订阅相机发布的点云 topic

RViz 会自动根据 TF 树把点云从 camera_frame 坐标系变换到 world_frame 坐标系显示


总结

步骤 说明
发布 TF 变换 static_transform_publisher 发布相机到世界的外参
点云消息 frame_id 设置为相机坐标系名
RViz 固定坐标系 设置为世界坐标系名
RViz 订阅点云 topic 添加点云显示,选择相机点云 topic