四元数转欧拉角代码报错:RuntimeError: shape '[4,3]'与输入大小3不兼容
问题分析与解决方案
报错根源
你遇到的RuntimeError是因为输入张量维度处理不当:
当输入的四元数是一维张量(形状为[4])时,代码错误地将quaternions.shape[0]的值(4)当作batch size,但实际这是单个四元数的元素数量,真实batch size应为1。此时Rotation.from_quat输出的欧拉角是一维数组[3],执行view(4,3)时,总元素数(3)与目标形状所需元素数(12)不匹配,导致报错。
修复后的代码
def compute_euler_angles_from_quaternion(quaternions, sequence='xyz'): # 统一输入为二维张量 [batch_size, 4],自动适配一维/二维输入 quaternions = quaternions.view(-1, 4) batch_size = quaternions.shape[0] q = quaternions.detach().cpu().numpy() rotations = Rotation.from_quat(q) euler_angles = rotations.as_euler(sequence, degrees=False) # 转换为torch张量并放回原设备 euler_angles = torch.tensor(euler_angles, device=quaternions.device) # 确保输出形状为 [batch_size, 3](可选,因为as_euler已返回对应形状) euler_angles = euler_angles.view(batch_size, 3) return euler_angles
关键改动说明
- 统一输入维度:
使用quaternions.view(-1,4)自动调整输入张量维度:- 若输入是一维张量
[4],会转换为[1,4](batch size=1) - 若输入是二维张量
[N,4],保持原形状不变(batch size=N)
- 若输入是一维张量
- 避免错误的batch size计算:
经过维度统一后,quaternions.shape[0]能正确获取真实的batch size,后续的view操作不会再出现元素数不匹配的问题。
测试验证
- 输入单个四元数:
torch.tensor([-0.07577483, 0.17546612, -0.10769336, 0.9756393]),输出形状为[1,3] - 输入批量四元数:
torch.randn(4,4),输出形状为[4,3]
内容的提问来源于stack exchange,提问作者Redhwan
相关产品推荐
相关产品推荐

