Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:我如何';零';或';皮重';三维旋转坐标?_Python_Matrix_Quaternions_Angle - Fatal编程技术网

Python:我如何';零';或';皮重';三维旋转坐标?

Python:我如何';零';或';皮重';三维旋转坐标?,python,matrix,quaternions,angle,Python,Matrix,Quaternions,Angle,(Python)我正在使用一个IMU(惯性测量单元),它连接到一个树莓pi上,提供[滚动、俯仰、偏航]角度 该芯片似乎有一个硬件“零”,无法校准它,因此在软件,我想 i、 e.当我打开芯片时,我可能会得到theta=[10,5,-80]*的读数,并希望将其设置为我的“零”。 *角度在+-180度范围内,如果更容易,可以以rad为单位 我有一个粗糙的解决方法,但我追求的是更优雅的东西: tare = [*read initial angles*] # This only gets set once

(Python)我正在使用一个IMU(惯性测量单元),它连接到一个树莓pi上,提供[滚动、俯仰、偏航]角度

该芯片似乎有一个硬件“零”,无法校准它,因此在软件,我想

i、 e.当我打开芯片时,我可能会得到
theta=[10,5,-80]
*的读数,并希望将其设置为我的“零”。
*角度在+-180度范围内,如果更容易,可以以rad为单位

我有一个粗糙的解决方法,但我追求的是更优雅的东西:

tare = [*read initial angles*] # This only gets set once
    #inside a loop
    theta = [*read the imu*]
    deg = map(operator.sub, theta, tare) #zero correction, deg = actual (theta) - 'zero' (tare)
    for d in deg: # if angle > 180 then put angle in terms of +_ 180
    if d > 180: d = d - 360
    elif d  < -179: d = d + 360
    print deg
tare=[*读取初始角度*]#这只设置一次
#圈内
θ=[*读取imu*]
deg=映射(运算符sub、θ、皮重)#零校正,deg=实际值(θ)-‘零’(皮重)
对于d,单位为度:#如果角度>180,则将角度设置为+#180
如果d>180:d=d-360
elif d<-179:d=d+360
打印度数
我研究这个问题已经有一段时间了,有人提到了四元数和旋转矩阵,但我无法理解。 任何帮助都将不胜感激

这里有一个链接,用于C++中实现同一个LIB的链接,我用它从IMU获取数据:

其他可能有用的(stackoverflow)链接:

您可以更简洁地完成您正在做的事情,如下所示:

def correction(args):
    d = args[0] - args[1]
    return d-360 if d > 180 else d+360 if d < -179 else d

tare = [10, 5, -80]

#inside the loop
theta = [10, 5, -80]
print map(correction, zip(tare, theta))  # --> [0, 0, 0]
def校正(args):
d=args[0]-args[1]
如果d>180,则返回d-360;如果d<-179,则返回360
皮重=[10,5,-80]
#圈内
θ=[10,5,-80]
打印地图(校正,压缩(皮重,θ))#-->[0,0,0]

单向,将皮重角从euler映射到旋转矩阵。(或者,如果你愿意的话,转换成四元数)然后将你的旋转矩阵(这将是它的转置)转换成旋转矩阵。带上你的来袭欧拉,将其映射到一个腐垫(如rotMatB),并将你的皮重腐垫乘以它。如果你愿意的话,你可以从那里隐蔽回到euler

rotMatA =eulerToRotMat(tareAngles).transpose()

rotMatB = eulerToRotMat( incomingAngles)

netResult= rotMatToEuler( rotMatA * rotMatB)
从库中获取rotMat到Euler的转换(更好),或者使用以下源代码实现您自己的转换: