Как получить позу и матрицу 4x4 из файла журнала и сохранить их в виде файла JSON?

у меня есть большой файл журнала, который содержит позы и матрицы 4x4, я хочу разделить каждую матрицу на матрицу вращения 3x3 и матрицу перевода 3x1, и каждая матрица указана pose_number (только первый номер поверх каждой матрицы - pose_number) и сохранить их в файл JSON такого формата ( {"pose_0": {"rotation": [[1.00000000, 0.00000000, 0.00000000], [-0.00000000, 1.00000000, -0.00000000], [0.00000000, -0.000000 00 , 1.00000000 ]], "перевод": [ 0.00000000 ,0.00000000 , 0.00000000 ]}, "pose_1": {"вращение": ...... )) ,. также я показываю их все на картинке1. так как я новичок в этой области, я не знаю, как это сделать, я был бы признателен, если бы кто-нибудь помог мне в этом или дал мне похожий пример. спасибо Это мой образец журнала это образец файла журнала:

0 0 1
1.00000000 0.00000000 0.00000000 0.00000000
-0.00000000 1.00000000 -0.00000000 0.00000000
0.00000000 -0.00000000 1.00000000 0.00000000
0.00000000 0.00000000 0.00000000 1.00000000
1 1 2
0.99987256 -0.00294761 -0.01569025 -0.00016514
0.00261951 0.99977833 -0.02089080 0.00523247
0.01574835 0.02084704 0.99965864 -0.00371881
0.00000000 0.00000000 0.00000000 1.00000000
2 2 3
0.99973679 -0.00740811 -0.02171352 0.00091496
0.00681182 0.99960112 -0.02740798 0.01052933
0.02190790 0.02725285 0.99938848 -0.00518150
0.00000000 0.00000000 0.00000000 1.00000000

и вывод для первой матрицы должен быть таким:

{"pose_0": {"rotation": [[1.00000000 , 0.00000000 , 0.00000000 ], [-0.00000000 , 1.00000000  , -0.00000000 ], [ 0.00000000 , -0.00000000 , 1.00000000 ]], "translation": [ 0.00000000 ,0.00000000  , 0.00000000 ]},

На это уже был дан ответ: stackoverflow.com/questions/54689242/…

Itay Dumay 13.12.2020 22:40

Опубликуйте код, который вы написали до сих пор. Он должен включать образец журнала из нескольких элементов и желаемый результат в виде строки JSON. «log-файл» — это очень общий термин, и невозможно даже предположить, как выглядит такой матричный журнал 4x4.

tdelaney 13.12.2020 22:52

@tdelaney на самом деле я загрузил образец файла журнала, который вы можете найти в конце вопроса, также я написал желаемый вывод в вопросе, спасибо за вашу помощь.

Hosein shirali 13.12.2020 23:01

Просто вставьте его в вопрос, чтобы людям не приходилось делать транскрипцию за вас.

tdelaney 13.12.2020 23:15

@ItayDumay спасибо, но я думаю, что это не то же самое, я не знаю, как я могу использовать этот пример для своей цели, извлечения матриц, я ценю любой намек

Hosein shirali 13.12.2020 23:15

Цель состоит в том, чтобы получить пример, который мы можем скопировать/изменить, а затем протестировать, запустив и сравнив с ожидаемым результатом.

tdelaney 13.12.2020 23:19

@tdelaney вы правы, я только что отредактировал свой вопрос, спасибо за вашу помощь

Hosein shirali 13.12.2020 23:28

Это просто вопрос о получении списка поз и матрицы 4x4? Я могу это сделать, но я не знаю, как вы хотите, чтобы матричный перевод работал. Можно ли сузить вопрос до того, как получить позу и матрицу 4х4 из файла?

tdelaney 14.12.2020 00:05

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

Hosein shirali 14.12.2020 00:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
9
409
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку легко определить начало каждой группы данных (3 целых числа), вы можете использовать itertools.groupby разбить его для вас. Это дает вам подитератор каждый раз, когда файл меняется с трех вещей на не три вещи. Если это 3 вещи, разделите позу, иначе пусть numpy создаст массив из остальных.

import itertools
import io
import numpy as np

test = io.StringIO("""0 0 1
1.00000000 0.00000000 0.00000000 0.00000000
-0.00000000 1.00000000 -0.00000000 0.00000000
0.00000000 -0.00000000 1.00000000 0.00000000
0.00000000 0.00000000 0.00000000 1.00000000
1 1 2
0.99987256 -0.00294761 -0.01569025 -0.00016514
0.00261951 0.99977833 -0.02089080 0.00523247
0.01574835 0.02084704 0.99965864 -0.00371881
0.00000000 0.00000000 0.00000000 1.00000000
2 2 3
0.99973679 -0.00740811 -0.02171352 0.00091496
0.00681182 0.99960112 -0.02740798 0.01052933
0.02190790 0.02725285 0.99938848 -0.00518150
0.00000000 0.00000000 0.00000000 1.00000000""")


def get_pose_and_matrix_from_log(fileobj):
    """yield pose, np.array for each group in log file"""
    pose = None
    # each group starts with a 3 integer sequence
    for is_pose_number, data in itertools.groupby(test, 
            lambda line: len(line.strip().split()) == 3):
        if is_pose_number:
            if pose is None:
                raise ValueError("Invalid file format")
            pose = next(data).split(" ", 1)[0]
        else:
            matrix = np.genfromtxt(data)
            yield (pose, matrix)

for pose, matrix in get_pose_and_matrix_from_log(test):
    pass # transform and make json

Чтобы прочитать из файла, измените этот цикл на

with open("\\path\\trajectory.log") as log_file:
    for pose, matrix in get_post_and_matrix_from_log(log_file):
        pass # ... xform

большое спасибо, извините за слишком много простых вопросов, я попытался запустить и распечатать позу и матрицу, но я получил эту ошибку: Traceback (последний последний вызов): файл "log_to_json.py", строка 33, в <module> для поза, матрица в get_pose_and_matrix_from_log(test): файл "log_to_json.py", строка 27, в get_pose_and_matrix_from_log pose = next(data).split(1)[0] TypeError: должно быть str или None, а не int , можете мне сказать как я могу это решить?

Hosein shirali 14.12.2020 11:59

К сожалению, я неправильно набрал незначительное улучшение. Зафиксированный.

tdelaney 14.12.2020 17:28

Большое спасибо, еще одна вещь, теперь я хочу открыть свой файл журнала, и я использовал этот скрипт: ``` с open("\\path\\trajectory.log", "r") as log_file: log_string = log_file .read() ``` и я изменил тест с помощью log_string, но я получаю эту ошибку: Файл "pose_matrix.py", строка 34, в get_pose_and_matrix_from_log yield (pose, matrix) UnboundLocalError: локальная переменная 'pose' указана перед назначением

Hosein shirali 14.12.2020 22:40

это правильный сценарий для загрузки файла журнала? что мне делать с ошибкой? Спасибо

Hosein shirali 14.12.2020 22:41

Я обновил, чтобы показать, как читать из файла. Если pose не связан, это означает, что последовательность из 3 целых чисел не была первой строкой в ​​файле. Я добавил код для обнаружения и возбуждения ValueError. Если ваш формат отличается от опубликованного, это нужно будет учесть в коде... но, поскольку я не знаю что, я не могу много сказать о том, как это сделать.

tdelaney 14.12.2020 23:13

Другие вопросы по теме