This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] OPT8241-CDK-EVM:voxelSDK 错误、PointCloudTransform::getDirection (int row、int col)返回错误结果并可能崩溃

Guru**** 2577385 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/639737/opt8241-cdk-evm-voxelsdk-bug-pointcloudtransform-getdirection-int-row-int-col-returns-a-wrong-result-and-will-likely-crash

器件型号:OPT8241-CDK-EVM

 Thilo 在 GitHub 上( https://github.com/3dtof/voxelsdk/issues/93)输入了此漏洞(又名 theten85)、该漏洞已于2016年9月1日报告

但是、TI 的反应是没有什么问题、这种拒绝让我们的团队决定放弃官方 SDK 并自行应用 Thilo 的错误修复。

这不是一个理想的情况,因此,下面我要重复一个问题:

在 voxelSDK 0.6.11 (和早期版本)中、方法 CloudPointTransform::getDirection (int row、int col)返回值"directions[col * width + row]"

这是错误的、它应该返回"Directions [row * width + col]"!!!

很容易看到、SDK 此区域中的所有平面阵列都具有各自的数据"逐行"(主要行顺序)、

因此、水平= x =列= u 方向"变快"、

垂直= y =行= v 方向"变慢"。

为了更加具体:数组方向[]填充方法 CloudPointTransform::_init()如下所示:

Directions.clear();
对于(int v = top;v < top + height;v++)

   对于(int u = left;u < left + width;u++)
   {
       点方向=……;
       Directions.push_back (dir);
   }

为简单起见、顶部=左侧= 0、然后显然要在(y、x)=(v、u)=(row、col)处访问元素、我们必须使用 index = row*width + col;

要说服自己、请执行以下代码:


   uint32_t left = 0;
   uint32_t top = 0;
   uint32_t 宽度= 320;
   uint32_t 高度= 240;
   uint32_t rowsToMerge = 1;
   uint32_t 列 ToMerge = 1;
   float fx = 200;
   FY 悬空= 200;
   浮点 Cx =(宽度- 1)* 0.5f;
   浮动 cy =(高度- 1)* 0.5f;
   浮点 K1 = 0;
   浮点 K2 = 0;
   浮点 K3 = 0;
   浮点 P1 = 0;
   浮点 P2 = 0;

   体素::PointCloudTransformation pcltransl()
       左侧、顶部、宽度、高度、行至合并、 列合并、
       FX、FY、CX、Cy、K1、 K2、K3、P1、P2);

   int row_ar[]={0、高度- 1、高度- 1、0};

   int col_ar[]={0、0、宽度- 1、宽度- 1};

   对于(int k = 0;k < 4;+k)
   {
       点&pt = pcltransform.getDirection (row_ar[k]、col_ar[k]);
       std:::cout <<"(row、col)=("<< row_ar[k]<<"、"<< col_ar[k]<<"):(x、y、z)="<< pt.x <<"<< pt.y <<"<<"<< pt.z << std:endl;
   }

使用官方 SDK 时、这将崩溃、并在应用错误修复时正常运行。

希望这足够清楚、谨致问候、

时代范达尔夫森

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的备注。 您在 GitHub 上报告了类似问题(不确定是否完全相同)。 我回顾了代码、发现代码流是正确的、尽管可能存在变量命名问题、但逻辑是正确的。 我们尚未在点云中看到任何奇怪的几何体、也没有其他客户遇到任何类似您的问题、但我们将仔细查看您的上述代码。 从一瞥我看到您正在将 K1..K3和 P1.P2设置为0、并且 CX 和 cy 已关闭、这些设置的目的是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请再次阅读我的帖子。 一年前,我不是在吉特集线器上报告了这个问题,而是 Thilo 进入了这个问题(又称 theten85)。 此通信中有一些错误(有关行主矩阵顺序与列主矩阵顺序)、但问题本身仍然存在。 但是、请重新查看我的帖子、并将其视为一份新报告。
    您在点云中没有看到任何奇怪几何体的原因可能是您从未使用过此方法"getDirection"。 在 SDK 内部、此函数仅供 PointCloudTransform::calcAperatureAnglRadians (被称为"无位置")和 PointCloudTransform::imageToWorld (也称为"无位置")使用。 可能所有其他客户也不使用 getDirection (直接或间接)。
    但是、在我们的应用程序中、我们确实使用 CloudPointTransform::imageToWorld、因此我们注意到了该错误。

    然后、关于我的代码:将 K1...K3、P1、P2设置为零只是使用一个没有失真的镜头。 我不明白为什么您说 cx 和 cy 是"偏转"的、它们是镜头的正确值而不会失真(它们是传感器中心的 u、v 坐标、因此位于左顶(u、v)=(0、0)和右下(u、v)=(width-1、height-1)之间的中间位置。 我使用的唯一"奇怪"值是针对焦距 Fx=FY=200、其中 EVM 中使用的真实透镜的真实编号介于220和230之间...

    我的代码片段的输出:
    在错误修复之前:
    (row、col)=(0、0):(x、y、z)=-0.564905 - 0.423236 0.708345
    (row、col)=(239、0):(x、y、z)= 0.322945 - 0.485434 0.812441
    (row、col)=(239,319):(x、y、z)=

    修复错误后:
    (row、col)=(0、0):(x、y、z)=-0.564905 - 0.423236 0.708345
    (row、col)=(239,0):(x、y、z)=-0.564905 0.423236 0.708345
    (row、col)=(239,319):(x、y、z)= 0.564905 0.423236 0.708345
    (行、列)=(0、319):(x、y、z)= 0.564905 - 0.423236 0.708345
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Age van Dalfsen、

    感谢您报告此问题。 我看了 getDirection(),并同意它的 col 和 row 被反转。 其他人可能没有看到这种情况的原因是因为他们没有使用调用 getDirection()的函数。 Voxel SDK 其余部分调用的主函数是 deptToPointCloud(),它不调用 getDirection();因此,这只会影响使用 CloudPointTransformation 类其他方法的用户。

    我们将作出必要的改变。

    Larry
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Thx