在 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 |