四元数与位姿矩阵的相互转换

1. 位姿矩阵转四元数

#coding:utf-8
#将位姿图由4*4矩阵转化为四元数表示
import numpy as np
import math
from pyquaternion import Quaternion

#读入loop矩阵       all_loop_matrix  inter_true_loop_matrix
########################################################
pose_txt = open("all_loop_matrix.txt","r") 
data = pose_txt.readlines() 
save_pose=data[:]     #存loop矩阵
number= data[:]        #存loop数字 如1 10

j=0
for i in save_pose:            #清空   save_pose 和  number
    i=[]
    save_pose[j]=i
    number[j] = i
    j=j+1

num=0
line_num=0
for i in data:
    if line_num%5==0:
        num=num+1
        data10,data11,data12=str(i).split() 
        print(number[num-1])
        number[num-1]=[]
        number[num-1].append(int(data10))
        number[num-1].append(int(data11)) 
    else:
        data0,data1,data2,data3=str(i).split()   #type of data0 is 'str'
        save_pose[num-1].append(float(data0))
        save_pose[num-1].append(float(data1))
        save_pose[num-1].append(float(data2))
        save_pose[num-1].append(float(data3))
    line_num=line_num+1
##########################################################
#写入顶点信息

#robot1 顶点数  robot2顶点数
vextex_1=169  ;vextex_2=324   # 从0开始  0-169  170-324
x=0 ; z=0
############写入0.g2o  f1
f1=open("0.g2o","w")
for  i in range(vextex_1+1):
    f1.write("VERTEX_SE3:QUAT "+str(i+6989586621679009792)+" "+str(x)+" 0 "+str(z)+ " 0 0 0 1\n")
    x=x+0.5
    z=z+0.5

trans=np.array([[1,0,0,1],[0.0,0.0,1.0, 0.0],[0.0,-1.0,0.0, 1.0], [0.0,0.0,0.0, 1.0]])
rotate=trans[0:3,0:3] 
RM = np.array(rotate)
q = Quaternion(matrix=RM)
x=170 ; z=170
############写入1.g2o  f2
f2=open("1.g2o","w")
for  i in range((vextex_1+1)-(vextex_1+1),(vextex_2+1)-(vextex_1+1),1):
    f2.write("VERTEX_SE3:QUAT "+str(i+7061644215716937728)+" "+str(x)+" 0 "+str(z)+" "+str(q.x)+" "+str(q.y)+" "+str(q.z)+" "+str(q.w)+" \n")
    x=x+0.5
    z=z+0.5
###########################################################
#写入odometry的位姿信息
#robot1 odmometry数 robot2 odometry数
#向0.g2o写入odometry
for  i in range(vextex_1+1):       #0.5 0 0.5 0 0 0 1            0.01 0 0.01
    if i == vextex_1:
        continue
    f1.write("EDGE_SE3:QUAT "+str(i+6989586621679009792)+" "+str(i+1+6989586621679009792)+" "+"0.00 0 0.00 0 0 0 1   100.000000 0.000000 0.000000 0.000000 0.000000 0.000000   100.000000 0.000000 0.000000 0.000000 0.000000   100.000000 0.000000 0.000000 0.000000   10000.000000 0.000000 0.000000   10000.000000 0.000000   10000.000000\n")
for  i in range((vextex_1+1)-(vextex_1+1),vextex_2-(vextex_1+1),1):    #0.5 -0.5 0 0 0 0 1         0.01 -0.01 0
    f2.write("EDGE_SE3:QUAT "+str(i+7061644215716937728)+" "+str(i+1+7061644215716937728)+" "+"0 0.00 0 0 0 0 1   100.000000 0.000000 0.000000 0.000000 0.000000 0.000000   100.000000 0.000000 0.000000 0.000000 0.000000   100.000000 0.000000 0.000000 0.000000   10000.000000 0.000000 0.000000   10000.000000 0.000000   10000.000000\n")


##########################################################
#写入loop四元数格式的位姿信息
trans=np.array([[0,0,0,1],[0.0,0.0,0.0, 1.0],[0.0,0.0,0.0, 1.0], [0.0,0.0,0.0, 1.0]])
first=0
for i in save_pose:
    if i==[]:
        break
    trans[0][0]=save_pose[first][0] ;trans[0][1]=save_pose[first][1] ;trans[0][2]=save_pose[first][2];    trans[0][3]=save_pose[first][3]
    trans[1][0]=save_pose[first][4];trans[1][1]=save_pose[first][5]; trans[1][2]=save_pose[first][6];    trans[1][3]=save_pose[first][7]
    trans[2][0]=save_pose[first][8];trans[2][1]=save_pose[first][9]; trans[2][2]=save_pose[first][10];   trans[2][3]=save_pose[first][11]
    rotate=trans[0:3,0:3]   
    translate=trans[0:3,3]
    RM = np.array(rotate)
    print(number[first]) # loop 序号
    print(translate)   #loop的位置
    print(f"x: {q.x}, y: {q.y}, z: {q.z}, w: {q.w}")    #loop的四元数
    # 旋转矩阵转换为四元数
    q = Quaternion(matrix=RM)
    if number[first][1]<vextex_1+1:    #robot1的intra-loop 写入f1  0.g2o
        f1.write("EDGE_SE3:QUAT "+str(number[first][0]+6989586621679009792)+" "+str(number[first][1]+6989586621679009792)+" "+str(translate[0])+" "+str(translate[1])+" "+str(translate[2])+" "+ str(q.x)+" "+str(q.y)+" "+str(q.z)+" "+str(q.w)+" 10000 0 0 0 0 0 10000 0 0 0 0 10000 0 0 0 10000 0 0 10000 0 10000\n")
    if number[first][0]>vextex_1:   #robot2的intra-loop 写入f2 1.g2o
        f2.write("EDGE_SE3:QUAT "+str(number[first][0]+7061644215716937728-(vextex_1+1))+" "+str(number[first][1]+7061644215716937728-(vextex_1+1))+" "+str(translate[0])+" "+str(translate[1])+" "+str(translate[2])+" "+ str(q.x)+" "+str(q.y)+" "+str(q.z)+" "+str(q.w)+" 10000 0 0 0 0 0 10000 0 0 0 0 10000 0 0 0 10000 0 0 10000 0 10000\n")
    if number[first][0]<(vextex_1+1) and number[first][1]>vextex_1:   #robot1-2的inter-loop 0.g2o和1.g2o都写入
        f1.write("EDGE_SE3:QUAT "+str(number[first][0]+6989586621679009792)+" "+str(number[first][1]+7061644215716937728-(vextex_1+1))+" "+str(translate[0])+" "+str(translate[1])+" "+str(translate[2])+" "+ str(q.x)+" "+str(q.y)+" "+str(q.z)+" "+str(q.w)+" 10000 0 0 0 0 0 10000 0 0 0 0 10000 0 0 0 10000 0 0 10000 0 10000\n")
        f2.write("EDGE_SE3:QUAT "+str(number[first][0]+6989586621679009792)+" "+str(number[first][1]+7061644215716937728-(vextex_1+1))+" "+str(translate[0])+" "+str(translate[1])+" "+str(translate[2])+" "+ str(q.x)+" "+str(q.y)+" "+str(q.z)+" "+str(q.w)+" 10000 0 0 0 0 0 10000 0 0 0 0 10000 0 0 0 10000 0 0 10000 0 10000\n")
    first=first+1

f1.close()
f2.close()

2. 四元数转位姿矩阵

#coding:utf-8
#代码用途: 将fullGraph_optimized.g2o中最终的位姿由四元数表示转化为4*4矩阵并输出, 以进行下一步的误差分析
import numpy as np
import math
from pyquaternion import Quaternion
from scipy.spatial.transform import Rotation as R

#读入fullGraph_optimized.g2o 读其中的position+四元数位姿,转化为4*4矩阵形式
########################################################
vertex_total = 325      #总顶点数

pose_txt = open("fullGraph_optimized.g2o","r")      #PCM输出的最终位姿文件(四元数形式)
f1=open('pose_final.txt','w')       #用于误差分析的位姿文件(矩阵形式)

#初始化 position和q
position=[0, 0, 0]
q=[0,0,0,1]
for  i in range(vertex_total):
    input=pose_txt.readline()
    name, num, position[0], position[1], position[2], q[0], q[1], q[2], q[3] = input.split("\n")[0].split(' ')  #['VERTEX_SE3:QUAT', '7061644215716937882', '24.2379', '-5.55041', '-154.986', '-0.604195', '-0.0597147', '0.256727', '0.75198']
    quaternion = R.from_quat(q)
    Rotation3_3=quaternion.as_matrix()    #得到的旋转矩阵3*3 Rotation3_3          位置向量3*1存储在position中

    f1.write(str(i)+" "+str(i)+" "+str(i+1)+"\n")
    f1.write(str(Rotation3_3[0][0])+" "+str(Rotation3_3[0][1])+" "+str(Rotation3_3[0][2])+" "+position[0]+"\n")
    f1.write(str(Rotation3_3[1][0])+" "+str(Rotation3_3[1][1])+" "+str(Rotation3_3[1][2])+" "+position[1]+"\n")
    f1.write(str(Rotation3_3[2][0])+" "+str(Rotation3_3[2][1])+" "+str(Rotation3_3[2][2])+" "+position[2]+"\n")
    f1.write("0 0 0 1\n")
    # print("原:",q," 现:", R.from_matrix(Rotation3_3).as_quat()) 
    


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 位置描述:位置描述是指物体在三维空间中的位置,通常用一个三维向量表示。假设 $\vec{p}$ 表示物体的位置,则其矩阵表达式为: $$ \vec{p} = \begin{bmatrix} p_x \\ p_y \\ p_z \end{bmatrix} $$ 姿态描述:姿态描述是指物体在三维空间中的朝向,通常用旋转矩阵四元数表示。假设 $R$ 表示物体的旋转矩阵,则其矩阵表达式为: $$ R = \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix} $$ 位姿描述:位姿描述是指物体在三维空间中的位置和朝向,通常用一个四元数或一个由位置向量和旋转矩阵组成的变换矩阵表示。假设 $T$ 表示物体的变换矩阵,则其矩阵表达式为: $$ T = \begin{bmatrix} r_{11} & r_{12} & r_{13} & p_x \\ r_{21} & r_{22} & r_{23} & p_y \\ r_{31} & r_{32} & r_{33} & p_z \\ 0 & 0 & 0 & 1 \end{bmatrix} $$ 其中 $r_{ij}$ 表示旋转矩阵中的元素,$p_x$、$p_y$、$p_z$ 表示位置向量中的元素。 ### 回答2: 位置描述、姿态描述和位姿描述都是对物体在空间中的位置和姿态的描述方式。 位置描述通常使用位置向量来表示,它表示物体的三维坐标。位置描述的矩阵表达式为: P = [x, y, z] 其中P为位置向量,x、y、z分别表示物体在x轴、y轴、z轴上的坐标。 姿态描述通常使用旋转矩阵来表示,它表示物体的旋转状态。姿态描述的矩阵表达式为: R = [r11, r12, r13; r21, r22, r23; r31, r32, r33] 其中R为旋转矩阵,r11、r12、r13等为矩阵元素,表示物体在三个坐标轴上的旋转角度。 位姿描述是位置描述和姿态描述的组合,可以使用齐次变换矩阵来表示,它表示物体在空间中的位置和姿态的综合描述。位姿描述的矩阵表达式为: T = [r11, r12, r13, x; r21, r22, r23, y; r31, r32, r33, z; 0, 0, 0, 1] 其中T为齐次变换矩阵,r11、r12、r13等为旋转矩阵的元素,x、y、z为位置向量的元素。这个矩阵描述了物体在三维空间中的位置和姿态信息。 ### 回答3: 位置描述、姿态描述和位姿描述都可以使用矩阵表达式来表示。 1. 位置描述矩阵:位置描述矩阵是一个3x1的矩阵,表示目标对象在三维空间中的位置坐标。通常用[x, y, z]表示,其中x、y、z分别代表目标对象在x、y、z轴上的位置。 2. 姿态描述矩阵:姿态描述矩阵是一个3x3的矩阵,表示目标对象在三维空间中的旋转情况。通常用R表示该矩阵,其每一行代表目标对象的坐标轴在全局坐标系下的方向向量。例如,R = [[r11, r12, r13], [r21, r22, r23], [r31, r32, r33]],其中r11、r12、r13分别代表目标对象x轴在全局坐标系下的方向向量,r21、r22、r23分别代表目标对象y轴的方向向量,r31、r32、r33分别代表目标对象z轴的方向向量。 3. 位姿描述矩阵位姿描述矩阵是一个4x4的矩阵,结合位置描述矩阵和姿态描述矩阵来表示目标对象在空间中的整体位置和旋转情况。通常用T表示该矩阵,其左上角3x3部分为姿态描述矩阵R,右侧是位置描述矩阵的3x1部分。例如,T = [[r11, r12, r13, x], [r21, r22, r23, y], [r31, r32, r33, z], [0, 0, 0, 1]]。 这样,通过位姿描述矩阵可以直观地同时描述目标对象的位置和姿态,方便进行坐标转换和运动规划等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值