2016-03-04 6 views
2

Я хочу использовать устройство Tango для захвата изображений Point Cloud и сохранения их в файл. Оттуда я могу объединить отдельные облака Point Clouds, чтобы сформировать полное трехмерное изображение интерьера здания. Я изменил приложение PointCloudJava из (официальной страницы github google tango), чтобы включить кнопку, где каждый раз, когда вы нажимаете ее, облачное облако точек зрения сохраняется в файл в двоичном формате вместе с данными Pose. Внешнее приложение преобразует двоичные облака точек в человеческий читаемый формат .PTS. Вот отрывок из этого файла .PTS ...Project Tango Point Cloud Translations and Rotations

… 
3.695209841412947 -0.369136531 -4.512059939636327 
3.688643257302687 -0.479607720759112 -4.520564449562169 
3.693362633866713 -0.489787657644946 -4.520674956573583 
3.689930121583388 -0.445884992268283 -4.507568610443212 
3.685492555779860 -0.462776307847697 -4.512719524635411 
3.667657594365523 -0.480809484508235 -4.535319340957738 
3.687827806157515 -0.496090938236911 -4.526998413337804 
3.673954348248885 -0.508897741224963 -4.541318190826512 
3.666625241918013 -0.498062555577952 -4.540336502327062 
3.678675393742964 -0.474170316841799 -4.529156101478673 
3.684755723161147 -0.485069070842463 -4.528201831115819 
3.680454175156996 -0.519459594872195 -4.541313899292089 
3.673863212747023 -0.492040087368685 -4.534148228897191 
3.683874587697432 -0.502062504079539 -4.534162414802648 
3.662268142384932 -0.486682941105563 -4.540854943527318 
3.659110169095442 -0.521473725226123 -4.556032908691503 
3.673068563622878 -0.526471559789378 -4.549449575676061 
… 

А вот фрагмент из моего файла Pose ...

Snapshot Event ID: 0 
Translation: -2.828956167382643 3.18717159105692 0.4915560231473033 
Quarternion: 0.7047427543062862 0.6239282881689626 0.23707690815727211 0.2405112909905187 
Accuracy: 4.2E-45 
Confidence: 1688685432 

Snapshot Event ID: 1 
Translation: -2.796160158125086 4.193282171082194 0.5346153464487627 
Quarternion: 0.4973877606777205 0.4648489837872261 0.515537924119383 0.520328248891662 
Accuracy: 4.2E-45 
Confidence: 1687633528 

Snapshot Event ID: 2 
Translation: -3.504446692020165 3.1853833575251675 0.5117019018999412 
Quarternion: 0.6256551950823549 0.5778181469917516 -0.3583361921431137 -0.3824616834061323 
Accuracy: 4.2E-45 
Confidence: 1687858272 

Где снимок ID мой метод связывания данных представляют для облака точек; и Quaternion находится в формате WXYZ.

Это правило работает правильно для отдельных облаков точек, я думаю, и после того, как я поменять Y и Z оси каждой точки в облаке Пункта я вижу это ...

real sofa picture Исходное изображение

point cloud sofa Точка помутнения изображение (загружено в облачном сравнении)

Это, как правило, то, что я ожидаю.

Проблема возникает, когда я пытаюсь создать многопользовательские ПК вместе, чтобы сформировать полный 3D-интерьер здания.

Я перевел Point Clouds, добавив координаты XY и Z из соответствующих данных Pose в каждую точку XY и Z в облаке точек соответственно. Не уверен, что это правильно. Затем я поменял местами Y и Z, как и раньше. Большинство облаков точек сбрасываются друг на друга, если я это делаю, но этого можно ожидать, потому что я еще не (и не знаю, как) применить повороты.

Вот мой общий способ сделать это ...

for (File file : files) { 
    if (FilenameUtils.getExtension(file.getAbsolutePath()).equals("dat")) { 
     PointCloud cloud = PointCloud.newInstance(file.toURI().toURL()); 
     if (poseMap.containsKey(cloud.getEventID())) { 
      Pose pose = poseMap.get(cloud.getEventID()); 
      //cloud = cloud.rotate(pose); 
      cloud = cloud.translate(pose); 
     } 
     cloud = cloud.invertYandZ(); 
     //cloud = cloud.invertAllAxis(); 
     String absFilename = ptsFolderTxt.getText() + '\\' + FilenameUtils.getBaseName(cloud.getFilename()) + ".pts"; 
     cloud.write(absFilename); 

Как вы можете видеть, я попытался поворота метод, но это не похоже на работу, так что я заметил это.

Повернуть метод применения этого к каждой точке ...

ThreeDPoint rotatePoint(ThreeDPoint oldPoint) 
{ 
    float ox = oldPoint.getxPoint().floatValue(); 
    float oy = oldPoint.getyPoint().floatValue(); 
    float oz = oldPoint.getzPoint().floatValue(); 

    float qx = quaternion.getX().floatValue(); 
    float qy = quaternion.getY().floatValue(); 
    float qz = quaternion.getZ().floatValue(); 
    float qw = quaternion.getW().floatValue(); 

    float newX = (float)((1-2*qy*qy-2*qz*qz)*ox+(2*qx*qy+2*qw*qz)*oy+(2*qx*qz-2*qw*qy)*oz); 
    float newY = (float)((2*qx*qy-2*qw*qz)*ox+(1-2*qx*qx-2*qz*qz)*oy+(2*qy*qz+2*qw*qx)*oz); 
    float newZ = (float)((2*qx*qz+2*qw*qy)*ox+(2*qy*qz-2*qw*qx)*oy+(1-2*qx*qx-2*qy*qy)*oz); 

    return ThreeDPoint.newInstance(BigDecimal.valueOf(newX), BigDecimal.valueOf(newY), BigDecimal.valueOf(newZ)); 
} 

Но, как я уже сказал, это, кажется, не работает правильно?

Является ли мой способ перевода ОК?

Как использовать кватернион в файле позы для поворота каждого ПК? Некоторые примеры кода были бы превосходными.

Какой порядок я применяю для этих преобразований?

Толчок в правильном направлении будет высоко оценен.

ответ

0

Произошло то, что вы не превратили облако точек в правильную систему координат.Использовать решение в этой должности: Convert device pose to camera pose

В ответ предполагается, что соглашение OpenGL используется, но вы можете использовать аналогичную технику, чтобы преобразовать точку в любое соглашение.

+0

Спасибо, Как новичок в танго, я думаю, у меня есть чему поучиться еще. Я смотрю ссылку на Java в сообщении, с которым вы связались, и класс ScenePoseCalcuator, похоже, содержит большую часть полезной трансформации матрицы для выполнения того, что мне нужно. Это подходящее место для просмотра? – Daedelus

+0

Я не думаю, что есть одна функция, которая делает то же самое, но 'toDepthCameraOpenGlPose' достаточно близко. 'toDepthCameraOpenGlPose' возвращает позу сейчас, но в идеале она должна возвращать матрицу для умножения трехмерной точки из pointcloud. –

+0

Чтобы использовать эту функцию, мне нужно сначала настроить внешние устройства, и это можно сделать только в приложении для запуска устройства. Правильно? В настоящее время у меня нет Танго (я верну его на следующей неделе), поэтому я надеялся, что у меня будет большая часть данных, необходимых для выполнения преобразований в моем внешнем настольном приложении. – Daedelus