【问题标题】:How to get the pose and 4x4 matrix from the log file and save them as a JSON file?如何从日志文件中获取姿势和 4x4 矩阵并将它们保存为 JSON 文件?
【发布时间】:2020-12-13 21:35:41
【问题描述】:

我有一个包含姿势和 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.0000 0 , -0.00000] 0翻译": [ 0.00000000 ,0.00000000 , 0.00000000 ]}, "pose_1": {"旋转": ......) ) ,.我也在图片中展示了所有这些1。 因为我是这个领域的新手,我不知道该怎么做,如果有人能帮助我或给我一些类似的例子,我将不胜感激。谢谢These is my log sample 这是日志文件的示例:

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 字符串形式的所需结果。 “日志文件”是一个非常笼统的术语,甚至无法猜测这样的 4x4 矩阵日志是什么样的。
  • @tdelaney 实际上我已经上传了一个日志文件的样本,你可以在问题的末尾找到它,我也在问题中写了所需的输出,谢谢你的帮助
  • 只需将其粘贴到问题中,这样人们就不必为您进行转录。
  • @ItayDumay 谢谢,但我认为不一样,我不知道如何使用该示例来提取矩阵,我感谢任何提示

标签: python json numpy matrix


【解决方案1】:

由于很容易确​​定每组数据的开始(3 个整数),您可以使用itertools.groupby 为您分解它。每次文件从 3 事物更改为非 3 事物时,这都会为您提供一个子迭代器。当它的 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 行,在 中用于姿势,get_pose_and_matrix_from_log(test) 中的矩阵:文件“log_to_json.py”,第 27 行,在 get_pose_and_matrix_from_log 姿势 = next(data).split(1)[0] TypeError: must be str or None ,而不是 int ,你能告诉我我该如何解决吗?
  • 糟糕 - 我输入了错误的小改进。固定。
  • 非常感谢,还有一件事,现在我想打开我的日志文件,我使用了这个脚本:``` with 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 产量(姿势,矩阵)UnboundLocalError:局部变量'分配前引用的姿势'
  • 它是加载日志文件的正确脚本吗?我该怎么办?谢谢
  • 我更新以展示如何从文件中读取。如果pose 未绑定,则表示 3 整数序列不是文件的第一行。我添加了代码来检测和引发 ValueError。如果您的格式与发布的不同,则需要在代码中加以说明...但由于我不知道 what,因此我不能对 如何.
猜你喜欢
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 2015-03-04
  • 2017-11-16
  • 2019-07-08
  • 2019-05-21
相关资源
最近更新 更多