点云坐标系转换

把点云搬进另一个坐标系:贴一个 4×4 变换矩阵,浏览器里逐点变换,先看变换前后的叠加预览,再导出 XYZ / CSV。文件不上传,也不需要注册。

把点云文件拖到这里

支持 .pcd(ascii / binary)和 .ply(ascii / binary 大小端)。解析和变换都在本页完成。

怎么用

  1. 拖入 PCD / PLY 文件。解析和变换都在这个页面里完成。
  2. 粘贴矩阵,或者先选一个坐标系预设(Y-up→Z-up、光学系→机体之类)。
  3. 看预览里灰色(原始)和蓝色(变换后)的相对关系,确认方向对了再导出。

矩阵怎么写:行优先,p′ = M · p

页面按 4 行 4 列显示,和你从 tf_echo、T.matrix()、print(T) 里复制出来的顺序一致。前 3 列是旋转,第 4 列是平移:


            x' = r00*x + r01*y + r02*z + tx
y' = r10*x + r11*y + r12*z + ty
z' = r20*x + r21*y + r22*z + tz
          

最后一行必须是 0 0 0 1。不是的话会直接报错,而不是算出一堆看着像点云、其实已经错位的东西。

列优先:最容易踩的一次

Eigen、OpenGL 和不少 SDK 内部按列优先存矩阵。把内存里的 16 个数直接贴出来时,平移量会跑到「最后一行」,于是你会看到一个末尾是 4.2 -1.7 0.3 1 的矩阵。

这时点一下「转置」就好。顺带一提:旋转矩阵的转置等于它的逆,所以「相机系变机体系」和「机体系变相机系」搞反时,结果正好差一个转置——在预览里表现为点云朝反方向转。

预设覆盖了哪些坐标系约定

预设什么时候用数学形式
Y-up → Z-upUnity / OpenGL 场景里 Y 向上,转到 ROS / RViz 的 Z 向上绕 X 轴 +90°,(x,y,z) → (x,−z,y)
Z-up → Y-up反过来:把 ROS 里的点云导进 Unity / three.js绕 X 轴 −90°
光学系 → 机体相机光学系(z 前、x 右、y 下)→ ROS 机体(x 前、y 左、z 上)光学系 z 轴对到机体 x 轴
机体 → 光学系上一条的逆,把激光点投影到图像上时常用机体 x 轴对到光学系 z 轴
毫米 → 米扫描仪、建模软件导出的是毫米,SLAM 里按米算所有坐标 ×0.001
单位矩阵先确认导入导出链路本身没问题不改变任何坐标

法向跟着转,其它字段不动

文件里如果有 nx/ny/nz 或 normal_x/normal_y/normal_z,它们按旋转部分变换(不吃平移)——法向是方向,不是位置。

强度、颜色、时间戳这些标量原样复制。至于「这一列是向量还是标量」,从文件里看不出来,猜错比不动更糟:把 intensity 当方向转一遍,没人看得出问题。

常见症状对照

现象通常是这个原因
形状没变,但整体跑到别处平移列错位:矩阵是列优先的,点「转置」;或者你把「位姿」当成了「点云变换」(两者互为逆)
点云镜像了行列式为负。有些坐标系转换确实要镜像,先确认这是不是你要的
尺寸差 1000 倍单位不一致,用「毫米 → 米」预设
变换完什么都没有矩阵里有 NaN / Inf,或旋转部分退化(行列式接近 0)
方向转反了用成了正变换,点「求逆」

为什么强调本地计算:点云经常带客户现场坐标、未公开的场景数据,甚至能反推设备装在哪。这个工具没有后端,矩阵和点云都不会离开你的浏览器。

点云编辑(裁剪与体素降采样)也上线了,两个工具配套用:先转正、再裁。下一步是配准 —— 它的输出本身就是一个 4×4 变换,正好回到这一页检查。