Forum

Author Topic: Вопрос новичка по синтаксису в скрипте  (Read 11915 times)

HongSe

  • Newbie
  • *
  • Posts: 15
    • View Profile
Не могу понять зачем после единицы стоит точка?
R = R * (1. / s)
И в инете не могу найти.

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 14813
    • View Profile
Добрый день,

Обычно точка ставится для того, чтобы указать, что это вещественное число, а не целое. Скорее всего в данном случае можно обойтись и без точки.
Best regards,
Alexey Pasumansky,
Agisoft LLC

HongSe

  • Newbie
  • *
  • Posts: 15
    • View Profile
Спасибо!
Разбираюсь со скриптом, позволяющим ориентировать Boundary box chunk-а по осям системы координат (СК).
В скрипте есть строчки:
   M_chunk = chunk.transform.matrix
   v_t = M_chunk.mulp(PhotoScan.Vector([0, 0, 0]))
   m = chunk.crs.localframe(v_t)
В первой строке получаем матрицу преобразования между мировой СК и СК chunk-а.
Во второй строке переменной v_t, путем умножения матрицы преобразования chunk.transform.matrix на нормализованный вектор PhotoScan.Vector([0, 0, 0]), возвращается вектор положения начала СК chunk-а в мировой системе координат.
В третьей строке переменной m возвращается так же матрица преобразования, но уже из геоцетрической СК в локальную СК.
Читаю описание в руководстве по API.
Для первой строки:
   Transformation between chunk and world coordinates systems.
Для третьей строки:
   Returns 4x4 transformation matrix to LSE coordinates at the given point.
      Parameters point (Vector) – Coordinates of the origin in the geocentric coordinates.
      Returns Transformation from geocentric coordinates to local coordinates.
Насколько я понял из руководства по API, есть четыре СК: мировая, chunk-а, локальная, геоцетрическая и географическая.
И вот с этими СК прошу помочь разобраться. Какая между ними взаимосвязь? Мировая СК - это геоцентрическая СК, а локальная СК - это СК chunk-а?
Например, у меня есть построенное облако точек с привязкой к системе координат MSK. Как мне перейти от координат какой-либо точки в MKS, полученной, например, путем измерения командой "Линейка",  к координатам этой точки в любой другой из этих координат? Или, например, получить координаты центра Boundary box-а chunk-а в MSK?
« Last Edit: July 28, 2018, 04:52:23 PM by HongSe »

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 14813
    • View Profile
Добрый день,

Скорее всего в ближайшее время будет доступен онлайн курс по Python в PhotoScan Pro, где вопросы систем координат будут также затронуты. Когда будет открытый доступ, я выложу ссылку в эту тему.

В целом же связь следующая:
- есть внутренняя СК чанка (существует всегда даже без привязки), координат в этой системе по умолчанию и получаются при обращении к рабочей области chunk.region, положениям камер camera.center, вершинам полигональной модели и т.д.
- из внутренней системы можно перейти в геоцентрическую систему, путём домножения на chunk.transform (в случае, если привязка модели произведена в Локальных Координатах, то chunk.transform будет пересчитывать из внутренней системы в эти локальные координаты),
- географическая система (система привязки чанка) - чтобы пересчитать координаты в эту систему, нужно использовать метод chunk.crs.project() на координаты в геоцентрической системе.
Помимо этого существует локальная прямоугольная система координат (LSE - Local Space Euclidean), касательная к эллипсоиду, для пересчёта в неё используется метод chunk.crs.localframe(), он используется, чтобы, например, рассчитывать углы ориентирования камеры (курс, крен, тангаж) через скрипт.


Чтобы пересчитать координаты из внутренней системы чанка в географическую (МСК в Вашем случае, например):
Code: [Select]
point_geog = chunk.crs.project(chunk.transform.matrix.mulp(point_internal))в геоцентрическую:
Code: [Select]
point_geoc = chunk.transform.matrix.mulp(point_internal)Чтобы пересчитать в обратную сторону нужно, соответственно, инвертировать операции:
Code: [Select]
point_local = chunk.transform.matrix.inv().mulp(chunk.crs.unproject(point_geog))
Best regards,
Alexey Pasumansky,
Agisoft LLC

HongSe

  • Newbie
  • *
  • Posts: 15
    • View Profile
Re: Вопрос новичка по синтаксису в скрипте
« Reply #4 on: August 01, 2018, 01:12:03 PM »
Алексей, если можно, помогите разобраться с матрицей chunk.region.rot.
Какие элементы в ней за что отвечают? Например, мне нужно получить поворот вокруг одной из осей региона на определенный угол.

HongSe

  • Newbie
  • *
  • Posts: 15
    • View Profile
Re: Вопрос новичка по синтаксису в скрипте
« Reply #5 on: August 02, 2018, 04:34:35 PM »
Вопрос по матрице chunk.region.rot снимается. Разобрался. Как я понял, эта матрица результат последовательного произведения трех матриц поворота относительно осей X, Y, Z системы координат chunk-а. Получилось "достать" направляющие углы поворота region-а через элемент [0,2] матрицы, содержащей sin угла поворота относительно оси Y.

HongSe

  • Newbie
  • *
  • Posts: 15
    • View Profile
Re: Вопрос новичка по синтаксису в скрипте
« Reply #6 on: August 07, 2018, 09:44:16 AM »
На панели инструментов есть команда Линейка, с помощью которой можно получать координаты точек. Сами координаты можно "выловить" в Консоли и скопипастить в скрипт.
Вопрос: есть ли возможность вызывать из скрипта Линейку, чтобы получать координаты в момент выполнения скрипта?

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 14813
    • View Profile
Re: Вопрос новичка по синтаксису в скрипте
« Reply #7 on: August 07, 2018, 03:21:42 PM »
Добрый день,

С такого рода "интерактивными" скриптами мы не экспериментировали.

Теоретически можно "отлавливать" результаты измерений из Консоли, читая PhotoScan.app.console.contents.
Best regards,
Alexey Pasumansky,
Agisoft LLC

HongSe

  • Newbie
  • *
  • Posts: 15
    • View Profile
Re: Вопрос новичка по синтаксису в скрипте
« Reply #8 on: August 08, 2018, 06:19:00 AM »
Понятно. Тогда сделаю так, сниму Линейкой координаты точек в консоль, скопирую из консоли в текстовый файл, и из скрипта, базовыми средствами python-а для работы с файлами, считаю координаты из текстового файла в скрипт для обработки.

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 14813
    • View Profile
Re: Вопрос новичка по синтаксису в скрипте
« Reply #9 on: August 08, 2018, 02:38:12 PM »
Может быть, проще было бы расставить точечные фигуры (шейпы) в интересующих точках модели, а потом экспортировать их? Либо средствами Python просто выгрузить координаты для этих шейпов.
Best regards,
Alexey Pasumansky,
Agisoft LLC

HongSe

  • Newbie
  • *
  • Posts: 15
    • View Profile
Re: Вопрос новичка по синтаксису в скрипте
« Reply #10 on: August 09, 2018, 08:11:33 AM »
Спасибо за идею с шейпами. Подумаю, что из этого можно сделать.
В моем случае удобнее всего было бы интерактивно указывать точки во время выполнения скрипта. Т.к. задача состоит в том, чтобы из общей модели местности (городская среда, квадрат 250х250м) "выцепить" отдельные фрагменты (отдельные здания и объекты) для их более детальной проработки на этапе создания плотного облака точек и полигональной модели с текстурами. Я написал скрипт, который по трем точкам (P1, P2, P3): 1) ориентирует chunk's boundary box так, что P1 и P2 задают продольную ось, а P3 - направление поперечной оси; 2) расстояние между P1 и P2 является длиной, а нормаль из P3 на вектор P1P2 - шириной chunk's boundary box. И теперь ищу как наиболее оптимально обойти ограничение по интерактивному указанию нужных точек. До идеи с шейпами остановился на том, чтобы, для всех интересующих меня объектов, снять нужные точки Линейкой, "скопипастить" из Консоли в текстовый редактор (Notepad++), привести в нужную структуру и потом считывать по номеру (или другому идентификатору) записи уже при выполнении скрипта. Номер будет задаваться в диалоговом окне, которое инициируется при запуске скрипта при помощи виджетов.
З.Ы. В силу своих, пока еще, ограниченных знаний и небольшого опыта как в фотограмметрии, так и в программировании на Python, приходится обращаться за советами к специалистам. Спасибо за помощь )

HongSe

  • Newbie
  • *
  • Posts: 15
    • View Profile
Re: Вопрос новичка по синтаксису в скрипте
« Reply #11 on: August 09, 2018, 11:15:44 AM »
Даже в "рукопашную" работать с shape в виде точек оказалось очень удобно. Точкам можно присваивать уникальные имена и "распихивать" их по слоям, перетаскивать их курсором с места на место и т.д. И визуально хорошо видно, и точки хранятся в файле проекта в организованном виде. И, соответственно, доступ к ним из скрипта организовать тоже проще.
З.Ы. Просматривая темы, в которых упоминаются shape, наткнулся на интересную тему (http://www.agisoft.com/forum/index.php?topic=8060.msg38554), перекликающуюся с моей задачей по ориентации boundary box. С точки зрения лаконичности реализации скрипта очень интересно, у меня же получилось топорно, по рабоче-крестьянски  :)

HongSe

  • Newbie
  • *
  • Posts: 15
    • View Profile
Re: Вопрос новичка по синтаксису в скрипте
« Reply #12 on: August 17, 2018, 05:49:01 PM »
Улучшая и оптимизируя скрипт по ориентации boundary box при помощи координат трех точек, заметил одну особенность, касающуюся boundary box.
Например, имеются координаты трех точек P1, P2, P3 образующие вершины прямоугольника в плане. Я могу ориентировать boundary box двумя способами: способ 1 - продольная сторона по вектору P1P2; способ 2 - продольная сторона по вектору P2P3. В обоих случаях получается вроде бы одинаковый boundary box. Но в одном из случаев происходит некорректное построение полигональной модели (по цвету) и текстур к ней. Стоит применить другой способ, переориентировав продольную сторону ошибка исчезает.
1) В чем может быть причина? Имеется какое то правило по ориентированию boundary box?
2) На параллелепипеде, ограничивающем boundary box на экране, у верхней и нижней граней имеются короткие вертикальные отрезки. Что они означают?

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 14813
    • View Profile
Re: Вопрос новичка по синтаксису в скрипте
« Reply #13 on: August 20, 2018, 08:55:02 PM »
А можете скинуть матрицы вращения region.rot() для обоих случаев, а также сказать, какой метод построения меше используется?

Цветная грань бокса важна для построения полигональной модели в Height Field режиме. А вертикальные отрезки важны для текстурирования при сферической параметризации и построения DEM/ортофотоплана в цилиндрической проекции.
Best regards,
Alexey Pasumansky,
Agisoft LLC

HongSe

  • Newbie
  • *
  • Posts: 15
    • View Profile
Re: Вопрос новичка по синтаксису в скрипте
« Reply #14 on: August 27, 2018, 12:52:54 PM »
Прошу прощения за задержку с ответом.
Три точки являются строго узлами прямоугольника.
Вариант 1. Точка P1 - левый нижний угол, P2 - правый нижний угол, P3 - правый верхний угол.
Вариант 2. Точка P1 - левый верхний угол, P2 - левый нижний угол, P3 - правый нижний угол.

Исходные точки и матрицы поворота для каждого случая.
Примечание: Коодинаты Z точек после пересчета в СК chunk-а приравниваются координате Z точки центра исходного chunk-а.

Вариант 1
Исходные точки в географической СК:
P1: 335944.272312,399404.287080,459.412
P2: 335982.751667,399418.103683,458.177
P3: 335971.78239234,399448.65320473,459.728
Эти же точки в системе координат chunk-а:
---P1_chunk: Vector([0.8653454322193284, 5.930116143339546, -8.003445653266768])
---P2_chunk: Vector([1.4807616356702056, 3.1243880709880614, -8.003445653266768])
---P3_chunk: Vector([3.828758996009128, 3.577138339402154, -8.003445653266768])
---Matrix_rot_new:
Matrix([[0.21422909856979924, 0.9766863342261944, 0.013773084686069229],
            [-0.9266238938859724, 0.1899008007324427, 0.31916707763880925],
            [0.3089887580569382, -0.08113734469834596, 0.9475983741489495]])

Вариант 2
Исходные точки в географической СК:
P1: 335971.78239234,399448.65320473,459.728 - опечатка
P1: 335933.30303734,399434.83660173,459.412
P2: 335944.272312,399404.287080,459.412
P3: 335982.751667,399418.103683,458.177
Эти же точки в системе координат chunk-а:
---P1_chunk: Vector([3.2133371863747016, 6.382863208986237, -8.003445653266768])
---P2_chunk: Vector([0.8653454322193284, 5.930116143339546, -8.003445653266768])
---P3_chunk: Vector([1.4807616356702056, 3.1243880709880614, -8.003445653266768])
---Matrix_rot_new:
Matrix([[-0.9818193334512496, 0.18931745455602986, 0.013773084686069241],
            [-0.1751141363914599, -0.9310406629956549, 0.3191670776388095],
            [0.07325186480368466, 0.31095254559667174, 0.9475983741489504]])

Так же прилагаю результаты в виде текстурированных полигональных моделей.
Качество модели для Варианта 1 заметно хуже.
« Last Edit: August 28, 2018, 04:57:02 AM by HongSe »