Matrix 为什么三维旋转矩阵的实现会改变矢量的大小?

Matrix 为什么三维旋转矩阵的实现会改变矢量的大小?,matrix,vector,rotation,arduino,rotational-matrices,Matrix,Vector,Rotation,Arduino,Rotational Matrices,当设备以一定的旋转(偏航、俯仰、滚动)四处移动时,我试图将旋转矩阵应用于重力向量(从静态加速计获取和存储)时,我遇到了问题。旋转矩阵不应该改变向量的大小,但在我的例子中,向量的大小在每次迭代中都会改变。下面的代码显示了我使用的旋转矩阵: averageA包含一个恒定的重力矢量,AngleYper包含yam,俯仰角和侧倾角,使用陀螺仪、磁强计和加速度计计算 temp[0]=averageA[0]; temp[1]=averageA[1]; temp[2]=averageA[2]; //Yaw

当设备以一定的旋转(偏航、俯仰、滚动)四处移动时,我试图将旋转矩阵应用于重力向量(从静态加速计获取和存储)时,我遇到了问题。旋转矩阵不应该改变向量的大小,但在我的例子中,向量的大小在每次迭代中都会改变。下面的代码显示了我使用的旋转矩阵:

averageA包含一个恒定的重力矢量,AngleYper包含yam,俯仰角和侧倾角,使用陀螺仪、磁强计和加速度计计算

temp[0]=averageA[0];
temp[1]=averageA[1];
temp[2]=averageA[2];
//Yaw   
temp[0]=cos(angleypr[0]*pi/180)*temp[0]+sin(angleypr[0]*pi/180)*temp[1];
temp[1]=-sin(angleypr[0]*pi/180)*temp[0]+cos(angleypr[0]*pi/180)*temp[1];
temp[2]=temp[2];   
//pitch    
temp[0]=temp[0];  
temp[1]=(cos(angleypr[1]*pi/180))*temp[1]+(sin(angleypr[1]*pi/180))*temp[2];
temp[2]=(-sin(angleypr[1]*pi/180))*temp[1]+cos(angleypr[1]*pi/180))*temp[2];    
//roll   
temp[0]=(cos(angleypr[2]*pi/180))*temp[0]-(sin(angleypr[2]*pi/180))*temp[2];
temp[1]=temp[1];  
temp[2]=(sin(angleypr[2]*pi/180))*temp[0]+(cos(angleypr[2]*pi/180))*temp[2];
gravity[0]=temp[0];
gravity[1]=temp[1];
gravity[2]=temp[2];
我现在面临的问题的一个简单例子:

temp[0]=cos(angleypr[0]*pi/180)*20+sin(angleypr[0]*pi/180)*30;
temp[1]=-sin(angleypr[0]*pi/180)*20+cos(angleypr[0]*pi/180)*30;
temp[2]=50;

temp[0]=cos(angleypr[0]*pi/180)*temp[0]+sin(angleypr[0]*pi/180)*temp[1];
temp[1]=-sin(angleypr[0]*pi/180)*temp[0]+cos(angleypr[0]*pi/180)*temp[1];
temp[2]=temp[2];
我在向量[20,30,50]上应用相同的偏航旋转矩阵两次,第一次旋转给我一个恒定的幅度,但第二次旋转每次迭代的值都不同


请让我知道我哪里做错了,提前谢谢

首先,我要删除执行temp[x]=temp[x]的行。它们是多余的。然后,调试每次修改临时向量值时出现的值。您可能需要为每个偏航、俯仰和滚转单独提供一个温度矢量,并将这些效果组合在一起,以获得最终矢量。感谢您的回复@ManoDestra。我会删除多余的部分,但我不太理解关于每个旋转都有一个单独的温度向量的建议,你介意详细说明吗?创建一些变量,比如偏航[0]、偏航[1]、偏航[2]、俯仰[0]、俯仰[1]、俯仰[2]和滚转[0]、滚转[1]、滚转[2]。然后更新每个,并在最终的结果向量中组合效果。你不必这样做,但它可以帮助你调试哪里出了问题,把你的问题分为几个小问题,这些小问题可以单独隔离和调试。好的,我试试看我能做些什么。也许你可以看看上面编辑的问题,因为这个例子正是我现在面临的问题。我正在使用相同的矩阵来执行旋转,但是第一个矩阵给出了一个恒定的大小,而第二个矩阵给出了一个不同的大小。@Manodesa感谢您的建议!这才是真正的问题所在,我没有添加额外的变量来存储每次旋转得到的向量,因此temp值总是得到错误的更新。