点云坐标系转换
把点云搬进另一个坐标系:贴一个 4×4 变换矩阵,浏览器里逐点变换,先看变换前后的叠加预览,再导出 XYZ / CSV。文件不上传,也不需要注册。
把点云文件拖到这里
支持 .pcd(ascii / binary)和 .ply(ascii / binary 大小端)。解析和变换都在本页完成。
变换矩阵
行优先,按 4 行 4 列填写,点按列向量处理(p′ = M · p)。也可以粘贴 KITTI 的 12 个数,或 TUM 的 7 个数(tx ty tz qx qy qz qw)。
坐标系预设
怎么用
- 拖入 PCD / PLY 文件。解析和变换都在这个页面里完成。
- 粘贴矩阵,或者先选一个坐标系预设(Y-up→Z-up、光学系→机体之类)。
- 看预览里灰色(原始)和蓝色(变换后)的相对关系,确认方向对了再导出。
矩阵怎么写:行优先,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-up | Unity / 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 变换,正好回到这一页检查。