我已经花了几个星期来解决这个问题,似乎找不到合适的解决方案,需要一些建议.
我正在使用LWJGL/Java创建一个Camera类,并使用Quaternions来处理轴承(偏航),俯仰和滚转.我希望这款相机可以处理3D空间中的所有6度移动,并且可以滚动.轴承,俯仰和滚动都是四元数.我将它们乘以"变化"四元数,并从中创建一个平移矩阵.我把它放在一个浮动缓冲区中,并将模型视图矩阵乘以包含旋转矩阵的缓冲区.
我可以让轴承和俯仰旋转正常工作,但是当我实施滚动时,我遇到了问题.主要是围绕Z轴旋转(滚动)似乎不起作用.当我"滚动"相机时,它似乎绕全局Z轴而不是本地相机方向轴滚动.我通常可以让3个中的2个工作,这取决于我乘以四元数的顺序,但我不能让它们一起工作.
因为它们都是独立工作的,所以我假设我的方向方法有问题,我将它们组合起来并构建一个旋转矩阵.我在整个课程中遇到了问题,所以这里有与轮换相关的方法和声明:
private final static float DEGTORAD = (float)(Math.PI/180);
//Eye - position of the camera in the 3D world.
private Vector3f eye;
//Camera axis vectors, calculated each time reorient() is called.
//Initialized to global x, y, and z axis initially.
private Vector3f up;
private Vector3f right;
private Vector3f direction;
//Angles of rotation (in degrees)
private float pitchAngle;
private float bearingAngle;
private float rollAngle;
private Quaternion pitch;
private Quaternion bearing;
private Quaternion roll;
private FloatBuffer viewMatrixBuffer = BufferUtils.createFloatBuffer(16);
private …
Run Code Online (Sandbox Code Playgroud) java lwjgl quaternions matrix-multiplication rotational-matrices
因此,我一直在研究SensorEvent文档,试图找出如何找出相对于手机给定轴的北方向.我画了一个小图像,说明了我对坐标系如何工作的概念:
因此,如果世界坐标是x,y和z,其中磁北沿z和y指向天空,并且手机的坐标是Px,Py和Pz,那么我希望能够计算投影将每个载体放在另一个上.
似乎SENSOR_TYPE_ROTATION_VECTOR看起来可能是正确的,但似乎没有给我足够的信息来获得所有这些预测.我应该将ROTATION_VECTOR标准化并将其添加到我关心的轴上,然后拉出组件吗?
另一个大的单个传感器似乎是SENSOR_TYPE_ORIENTATION,但我再也不清楚如何处理这些值.如果我想知道真实世界坐标系在Py上的三个投影,我是否只是沿给定坐标旋转[ 0,1,0 ],如下所示:
// Assume here that I've received values
// and broken them out into
// a = azimuth
// p = pitch
// r = roll
// Convert to radians
a = a*Math.Pi/180;
p = p*Math.PI/180;
r = r*Math.PI/180;
// Given that Py is initially 0, 1, 0, apply general rotation matrix:
float[] Py = …
Run Code Online (Sandbox Code Playgroud) 我的问题类似于在android中更改传感器坐标系
我希望无论设备方向如何,都能够将用户的动作相互比较.因此,当用户以纵向方向拿出电话并弯曲他的手臂时,加速度读数与他在风景中拿出手机然后将手臂向相同方向弯曲时的读数相同.
这就是我所说的"用户"坐标系.它与世界坐标系不同,因为用户面向的风向应该无关紧要.它与设备坐标不同,因为用户如何握住他的设备无关紧要.
在我的应用中,在每次移动之前进行校准步骤是可以接受的,因此可以确定基础/静止方向矩阵.它可能只是将第一个运动的矩阵与第二个运动的倒数相乘(然后是新值?)
提到的问题中的答案似乎是正确的,但我需要一个更具体的解释,实际的代码样本将是理想的.
注意remapCoordinateSystem是不够的,它只接受直角.我需要能够处理小的偏差,因为设备被绑在手腕上,手腕可能并不总是与手臂成直角.
android sensor orientation rotational-matrices android-sensors
我正在尝试使用OpenCV通过SIFT特征跟踪,FLANN匹配以及基本矩阵和基本矩阵的后续计算来估计摄像机相对于另一摄像机的一个姿势。分解基本矩阵后,我检查退化的配置并获得“正确的” R和t。
问题是,它们似乎永远都不对。我包括几个图像对:
结果
结果
在第二种情况下,平移矢量似乎高估了Y方向的运动,而低估了X方向的运动。将旋转矩阵转换为Euler角时,在两种情况下均得出错误的结果。许多其他数据集也会发生这种情况。我尝试过在RANSAC,LMEDS等之间切换基本矩阵计算技术,现在使用RANSAC进行此操作,并且仅使用8点法的内点进行第二次计算。更改特征检测方法也无济于事。对极线似乎是正确的,并且基本矩阵满足x'.Fx = 0
我在这里错过根本上是错的东西吗?假设程序正确理解了对极几何,那么可能发生什么导致完全错误的姿势?我正在检查以确保点都位于两个摄像头的前面。任何想法/建议都将非常有帮助。谢谢!
编辑:尝试使用相同技术,将两个不同的校准摄像机间隔开;并将基本矩阵计算为K2'.F.K1,但平移和旋转仍然相去甚远。
参考代码
import cv2
import numpy as np
from matplotlib import pyplot as plt
# K2 = np.float32([[1357.3, 0, 441.413], [0, 1355.9, 259.393], [0, 0, 1]]).reshape(3,3)
# K1 = np.float32([[1345.8, 0, 394.9141], [0, 1342.9, 291.6181], [0, 0, 1]]).reshape(3,3)
# K1_inv = np.linalg.inv(K1)
# K2_inv = np.linalg.inv(K2)
K = np.float32([3541.5, 0, 2088.8, 0, 3546.9, 1161.4, 0, 0, 1]).reshape(3,3)
K_inv = np.linalg.inv(K)
def in_front_of_both_cameras(first_points, second_points, rot, trans): …
Run Code Online (Sandbox Code Playgroud) python opencv computer-vision rotational-matrices pose-estimation
我有代码(Python),必须对曲线的反射段之间的距离执行一些操作。
为了让思路和代码更清晰,我在执行实际计算之前应用了两次旋转(使用矩阵乘法)。我想可以在没有任何旋转的情况下执行计算,但是代码和思维会更加尴尬。
我要问的是:由于四舍五入的浮点误差,这三个旋转是否对精度损失造成了太大的损失?有没有办法估计这个误差的大小?
谢谢阅读
language-agnostic math floating-accuracy rotational-matrices
我有一个旋转矩阵,并且正在.dot
将其应用于新值。如何将它应用于 numpy 数组中的每一行?
Numpy 数组看起来像:
[-0.239746 -0.290771 -0.867432]
[-0.259033 -0.320312 -0.911133]
[-0.188721 -0.356445 -0.889648]
[-0.186279 -0.359619 -0.895996]
Run Code Online (Sandbox Code Playgroud)
想做类似的事情,for each line in array, rotation_matrix.dot(line)
并将每一行添加到新数组中
对 Numpy 不太熟悉,所以我确定这是我无法理解的非常简单的事情。
我有一个从一个基础到另一个基础的旋转矩阵:
Rot = [0.1227 0.0269 -0.9921;...
0.8635 -0.4956 0.0934;...
0.4892 0.8681 0.0840];
Run Code Online (Sandbox Code Playgroud)
我使用 MATLABrotm2eul
函数获取“ZYZ”约定中的欧拉角:
eulZYZ = rotm2eul(Rot,"ZYZ")
Run Code Online (Sandbox Code Playgroud)
这是 -0.0938 -1.4867 -1.0577
. 如果我使用反函数eul2rotm
:
RotMATLAB = eul2rotm(eulZYZ,"ZYZ");
Run Code Online (Sandbox Code Playgroud)
结果不同于Rot
(第三列除外):
RotMATLAB =
-0.0406 0.1189 -0.9921
-0.8712 0.4819 0.0934
0.4892 0.8681 0.0840
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事?我认为一旦你指定了“ZYZ”,就只存在一个轮换。
我有两个旋转矩阵。一个是我通过解决 PnP 问题得到的真实网络摄像头的旋转矩阵。我有一个世界坐标系,我知道世界空间中世界坐标中每个点的位置。
据我所知,旋转矩阵将世界坐标中的点转换为相机帧坐标(此处不考虑平移)。这意味着,R1 为您提供了世界坐标系相对于相机坐标系的方向。
我的第二个旋转矩阵是一个也在世界坐标中的传感器。即,此旋转矩阵为您提供世界坐标系相对于传感器坐标系的方向。
我想找到真实网络摄像头坐标系相对于传感器坐标系的方向。
让我们命名第一个旋转矩阵 Rw1 和第二个旋转矩阵 Rw2,下标 w1 表示相对于真实网络摄像头的世界,w2 表示相对于传感器的世界(1 和 2 可以被认为分别表示真实的网络摄像头和传感器)。
所以我的目标是找到R12。(而不是 R21)
R12 = R1w * Rw2 = (Rw1)' * Rw2
Run Code Online (Sandbox Code Playgroud)
我假设这个 R12 始终保持不变(在视频的后续帧中),因为传感器和网络摄像头的位置不会相互干扰,并且它们总是一起移动。我的假设有效吗?
如果它有效,那么我的最终目标是计算后续帧中真实网络摄像头的旋转矩阵。我可以计算后续帧中传感器的旋转矩阵,即后续帧的 Rw2。我必须找出 Rw1 并且我不能使用任何 PnP 算法。我想根据当前可用的信息计算它。
现在让我们考虑第二帧。
我知道 R12(我假设它是常数,我在第一帧中计算了它)和 Rw2(第二帧的传感器旋转矩阵)。我必须为第二帧找到 Rw1。
Rw1 = Rw2 * R21 = Rw2 * (R12)'
Run Code Online (Sandbox Code Playgroud)
我的方法正确吗?
PS:(R)'表示R的转置。
我发现两个旋转矩阵
rot1 = [ 0.8736 0.2915 -0.3897;
-0.4011 0.8848 -0.2373;
0.2756 0.3636 0.8898]
rot2 = [ 0.9874 -0.1420 -0.0700;
0.0700 0.7880 -0.6117;
0.1420 0.5991 0.7880]
Run Code Online (Sandbox Code Playgroud)
当向量相乘时
wpt = [200 200 200]
Run Code Online (Sandbox Code Playgroud)
产生相同的结果
cpt = [155.0812 49.2660 305.8148]
Run Code Online (Sandbox Code Playgroud)
谁能解释一下吗?
我有一个单位立方体,我想转换它以连接两个点。我是 OpenGL 的新手,只知道线性代数的最基本部分。我试图模仿类似于极坐标的东西来连接点。当 Z 轴和另一个轴发生变化时,我当前的实现不起作用。我也尝试过mat = glm::lookAt(center, terminal, y_axis);
,但我没有成功。
这来自位于schedule_edge_update()
.
auto const initial = p1;
auto const terminal = p2;
auto const distance = glm::distance(initial, terminal);
auto const length = distance * 0.5f;
auto const center = (initial + terminal) / 2.f;
auto const rejection = terminal - initial;
auto const delta = glm::normalize(rejection);
auto mat = glm::mat4(1);
// translate
mat = glm::translate(mat, center);
// rotate
auto const phi_hyp = glm::length(glm::vec2(delta.x, …
Run Code Online (Sandbox Code Playgroud)