【问题标题】:Transform 3D Lidar-Points from cartesian coordinate-system to spherical coordinate-system and a stereographic projection将 3D 激光雷达点从笛卡尔坐标系转换为球坐标系和立体投影
【发布时间】:2021-01-10 17:24:57
【问题描述】:

我正在撰写我的硕士论文,以模拟来自 Lidar-Data 的半球形照片。所以我的主要目标是将笛卡尔坐标系中的 3D 点 (X,Y,Z) 投影到立体投影(见图 1,来自:here)。我的 Pointcloud 的坐标系进行了转换,使中心点位于 (0,0,0) 并且所有 z 值都是正数。

我在 RStudio 中编码,我首先尝试通过使用wikipedia 上列出的笛卡尔到球坐标的公式来实现点云的球面投影。

r     <- sqrt(x^2 + y^2  + z^2)
theta <- acos(z/r)
phi   <- atan2(y,x)

我还尝试使用 RPackage pracma 中的 cart2sph-function 来执行此操作,它也应该这样做。但不幸的是,这两种方法的结果看起来都不像我想要的那样。这些点不适合平面半球体,但似乎只是沿 z 轴定向(见图 2)。

有没有人建议如何在 RStudio 中实现激光雷达点云的立体投影?甚至可能有一个包含一些功能的包来进行坐标转换?不幸的是,我没有很多编码经验,我会非常感谢每一个帮助。

编辑

我使用 Allans 脚本在半球上绘制笛卡尔点。使用 Cloudcompare 软件的结果如下所示:

图片: Hemisphere

我还使用转换后的笛卡尔坐标进行了立体投影:

x2 <- (x / (1 + z))
y2 <- (y / (1 + z))
project_2d <- data.frame(x2, y2)

图片: Stereographic projection

我仍然想知道为什么图的外边缘不适合一个完美的圆圈,因为所有树干都有相同的 min(z) 值(我使用了一个剪切框)。所以所有的树干都应该排列在半球的“赤道”上。你有什么线索吗?

【问题讨论】:

  • 嗨拉德。看起来你的点都在 y-z 平面上(尽管很难用这个特定的图像来判断)。你确定转换后的变量在这个平面上不正确吗?
  • 嘿,点沿 x-z 平面定向,x 零点将点云分成两半。但在我的结果中我仍然看不到任何类似球形的变换。
  • 如果我理解,您将场景投影到一个半球上,然后通过立体成像将后者投影到一个平面上。你在图片 2(别名 4)上向我们展示了什么?
  • 为什么要提到球面投影并显示转换为球面坐标的公式?
  • 嘿伊夫,谢谢你的回答。我想首先将我的局部点从 carthesian 坐标系投影到球面半平面上,然后再投影到立体 2D 平面上(如图 1 所示)。我不需要转换为球坐标吗?

标签: r geometry coordinate-transformation lidar


【解决方案1】:

很难用 3D 显示这个结果,但我会尽力而为。

假设我们有一个十字形状的点的集合,悬挂在相机上,与地面平行:

x <- c(rep(seq(-10, 10, 1), 2), rep(-1, 21), rep(1, 21))
y <- c(rep(-1, 21), rep(1, 21), rep(seq(-10, 10, 1), 2))
z <- rep(3, 84)

我们可以尝试在rgl中显示这个,添加一个红点来表示摄像头位置:

library(rgl)

plot3d(x, y, z, zlim = c(0, 10))
points3d(0, 0, 0, col = "red")

使用您找到的转换为球坐标的公式,我们可以将这些 3D 点从 x、y、z 转换为 theta、phi 和 r。但是,要将它们投影到笛卡尔坐标中的半球上,我们需要在距相机固定距离处设置 r。然后,我们需要根据 theta、phi 和固定 r 计算该半球上点的 x、y、z 坐标。这个函数应该这样做:

projection <- function(x, y, z) {
  r     <- sqrt(x^2 + y^2  + z^2)
  theta <- acos(z / r)
  phi   <- atan2(y, x)
  y <- theta * cos(phi)
  x <- theta * sin(phi)
  z <- sqrt((pi / 2)^2 - x^2 - y^2)
  data.frame(x, y, z)
}

所以现在我们这样做:

df <- projection(x, y, z)

我们可以再次绘图以显示投影到半球上的点:

plot3d(df$x, df$y, df$z, zlim = c(0, pi))

从下方查看

侧视图

【讨论】:

  • @Radde1683 查看我对应该在 rgl 中工作的实现的更新
  • 嗨艾伦,非常感谢您的回答!该功能适用​​于我的点云,因此它将点投影到半球上。使用立体投影公式,我能够将半球投影到 2D 平面上: X' =x/1+z, Y' =y/1+z (x, y, z) 还有一个问题:你的函数是否定义半球的半径?如果没有,是否可以为“球”坐标定义半径为 1?
  • @Radde1683 是的,半径设置为 pi/2。我已经更新了使半球半径为 1 的函数。如果您能够将其作为附录添加到您的问题中,我很想看到您从点云中获得的结果图像。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
相关资源
最近更新 更多