у меня есть большой файл журнала, который содержит позы и матрицы 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 ]},
Опубликуйте код, который вы написали до сих пор. Он должен включать образец журнала из нескольких элементов и желаемый результат в виде строки JSON. «log-файл» — это очень общий термин, и невозможно даже предположить, как выглядит такой матричный журнал 4x4.
@tdelaney на самом деле я загрузил образец файла журнала, который вы можете найти в конце вопроса, также я написал желаемый вывод в вопросе, спасибо за вашу помощь.
Просто вставьте его в вопрос, чтобы людям не приходилось делать транскрипцию за вас.
@ItayDumay спасибо, но я думаю, что это не то же самое, я не знаю, как я могу использовать этот пример для своей цели, извлечения матриц, я ценю любой намек
Цель состоит в том, чтобы получить пример, который мы можем скопировать/изменить, а затем протестировать, запустив и сравнив с ожидаемым результатом.
@tdelaney вы правы, я только что отредактировал свой вопрос, спасибо за вашу помощь
Это просто вопрос о получении списка поз и матрицы 4x4? Я могу это сделать, но я не знаю, как вы хотите, чтобы матричный перевод работал. Можно ли сузить вопрос до того, как получить позу и матрицу 4х4 из файла?
@tdelaney да, это похоже на то, что вы сказали, если бы вы могли дать мне результат, подобный тому, что я написал, это было бы для меня большой помощью, и я также отредактирую заголовок.
Поскольку легко определить начало каждой группы данных (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 , можете мне сказать как я могу это решить?
К сожалению, я неправильно набрал незначительное улучшение. Зафиксированный.
Большое спасибо, еще одна вещь, теперь я хочу открыть свой файл журнала, и я использовал этот скрипт: ``` с 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' указана перед назначением
это правильный сценарий для загрузки файла журнала? что мне делать с ошибкой? Спасибо
Я обновил, чтобы показать, как читать из файла. Если pose
не связан, это означает, что последовательность из 3 целых чисел не была первой строкой в файле. Я добавил код для обнаружения и возбуждения ValueError. Если ваш формат отличается от опубликованного, это нужно будет учесть в коде... но, поскольку я не знаю что, я не могу много сказать о том, как это сделать.
На это уже был дан ответ: stackoverflow.com/questions/54689242/…