我在理解在3D空间中旋转矢量时如何使用轴角旋转矢量时遇到了一些麻烦.为什么使用这些以及这些与旋转矩阵有什么关系?
我还发现一个叫做的函数vrrotvec2mat
似乎做我想要的但是我无法理解文档.具体来说,有人可以给出更明确的解释(有一些例子)输入参数r
和options
?
MathWorks的解释非常有限,如下所示:
将旋转从轴角转换为矩阵表示
m = vrrotvec2mat(r)
返回由轴角旋转矢量定义的旋转的矩阵表示r
.
m = vrrotvec2mat(r,options)
返回由轴角旋转矢量r定义的旋转矩阵表示,默认算法参数由选项中定义的值替换.选项结构包含参数epsilon,该参数表示一个值,低于该值时,数字将被视为零(默认值为
1e-12
).旋转矢量
r
是四个元素的行向量,其中前三个元素指定旋转轴,最后一个元素定义角度.要旋转三个元素的列向量,请将其乘以旋转矩阵.>要旋转三个元素的行向量,请将其乘以转置的旋转矩阵.
我知道我们可以让对象有一个新的父对象作为枢轴,或者我们可以调整网格内的几何位置。
但是,我们如何在不重新指定对象的父对象或修改对象的父对象,并且不修改对象的几何形状(如果它是网格)的情况下在数学上实现这一点?
换句话说,我们需要对它的变换矩阵(或部分、旋转、位置、四元数等)做些什么才能达到相同的效果,同时满足上述不接触父级或几何体的要求?
我正在尝试恢复图像中建筑物三个轴的 3D 方向。
我目前的做法是手动标注三个轴对应的三个消失点,估计相机标定矩阵K,然后通过归一化K^{-1}v_{i}从一个消失点计算旋转矩阵的每一列,如本文附录中所述。
尽管这似乎有效,但 R 的计算列并不完全正交,我怀疑如果消失点噪声更大,问题会更加明显。
我可以通过使用 SVD 分解估计的 R 并将所有奇异值设置为 1 来捏造它,但我更喜欢更有原则的解决方案。另一种思路是将其作为约束优化问题来解决,该问题旨在最小化消失点上的投影误差。
是否有更好的方法从 K 和消失点计算旋转矩阵,同时考虑正交性和列单位约束?
提前致谢。
问题在于Polygon::FindAxisLeastPenetration
:
double Polygon::FindAxisLeastPenetration(unsigned int *faceIndex, const Polygon &polygonA, const Polygon &polygonB) const {
double bestDistance = -std::numeric_limits<double>::infinity();
unsigned int bestIndex;
for (unsigned int i = 0; i < polygonA.points.size(); i++) {
Vector2D n = polygonA.normals[i];
Vector2D nw = polygonA.rotationMatrix * n; //ROTATION
Matrix22 buT = polygonB.rotationMatrix.Transposed();
n = buT * nw; //ROTATION
Vector2D support = polygonB.points[polygonB.GetSupport(-n)];
Vector2D vertex = polygonA.points[i];
vertex = polygonA.rotationMatrix * vertex; //ROTATION
vertex.Add(polygonA.body->GetPosition());
vertex.Subtract(polygonB.body->GetPosition());
vertex = buT * vertex; // ROTATION
double distance = …
Run Code Online (Sandbox Code Playgroud) c++ math rotation rotational-matrices separating-axis-theorem
我已经搜索了一段时间关于如何获得最准确的设备方位角并想出了这个:
//Activity members
private SensorManager sensorManager;
private float mAzimuth = 0.0f;
private float[] mRotation = null;
private float rMat[] = new float[16];
private float orientation[] = new float[3];
//Later inside the Activity: Rotation Listener
SensorEventListener rotationListener = new SensorEventListener() {
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
mRotation = event.values.clone();
if (mRotation != null) {
float RmatVector[] = new float[16];
SensorManager.getRotationMatrixFromVector(RmatVector, mRotation);
SensorManager.remapCoordinateSystem(RmatVector, SensorManager.AXIS_X, SensorManager.AXIS_Z, rMat);
SensorManager.getOrientation(rMat, orientation);
mAzimuth = …
Run Code Online (Sandbox Code Playgroud) 我是旋转矩阵领域的新手,我试图了解旋转矢量传感器的行为。我无法理解 yaw、pith 和 roll 与旋转矢量传感器返回的值之间的关系。
我在这里检查了SensorManager.getRotationMatrixFromVector() 的源代码和Android 文档。旋转矢量传感器返回以下值:
values[0]: x*sin(?/2)
values[1]: y*sin(?/2)
values[2]: z*sin(?/2)
values[3]: cos(?/2)
values[4]: estimated heading Accuracy (in radians) (-1 if unavailable)
Run Code Online (Sandbox Code Playgroud)
来自文档:“设备已围绕轴 (x, y, z) 旋转了一个角度?”。所以我现在的问题是,什么是?什么是 x、y 和 z?遵循OpenGL 文档中的本教程,要旋转矢量 VI 需要使用我构建旋转矩阵的 pith、roll 和 yaw 值。最后,我必须将此矩阵乘以 V 以旋转向量。如果我是对的,这个矩阵不同于与使用SensorManager.getRotationMatrixFromVector()获得的值向量相关的矩阵。我对吗?那么什么代表那个矩阵呢?
我的基于运动和位置的 iOS 应用程序中有一些功能,它需要一个旋转矩阵作为输入。一些图形输出依赖于这个矩阵。随着设备的每一次移动,图形输出都会改变。这是代码的一部分,它使得:
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical
toQueue:motionQueue
withHandler:
^(CMDeviceMotion* motion, NSError* error){
//get and process matrix data
}
Run Code Online (Sandbox Code Playgroud)
在此结构中,只有 4 个帧可用:
X任意Z垂直
XArbitraryCorrectedZVertical
XMagneticNorthZ垂直
XTrueNorthZ垂直
我需要另一个参考,fe 陀螺仪值而不是 North,而这些框架不能完全提供我想要的。
为了达到我的目标,我使用下一个结构:
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryCorrectedZVertical
toQueue:motionQueue
withHandler:
^(CMDeviceMotion* motion, NSError* error){
//get Euler angles and transform it to rotation matrix
}
Run Code Online (Sandbox Code Playgroud)
你可能会问我,为什么我不使用内置的旋转矩阵?答案很简单。我需要制作某种自己的参考系,我可以通过放入修改后的角度值来实现。
为了从欧拉角获得旋转矩阵,我们需要为每个角度制作矩阵,然后将它们相乘。对于 3D 情况,我们将为每个轴(其中 3 个)设置矩阵。之后我们乘以矩阵。问题是输出取决于乘法的顺序。X Y Z 不等于 Z Y X。维基百科告诉我,有 12 种变体,我不知道哪一种适合 iOS 实现。我需要知道我需要按什么顺序将它们相乘。另外,我需要知道哪些角度代表X、Y、Z。例如,X-roll,Y-pitch,Z-yaw。
实际上,Apple 多年前就解决了这个问题,但我无法访问 .m 文件,而且我不知道哪种乘法顺序适合 iOS 设备。
transformation objective-c euler-angles ios rotational-matrices
我正在开展一个涉及 Aruco 标记和 openCV 的项目。我的项目进展还很远。我可以读取旋转向量并使用 openCV 将它们转换为罗德里格斯矩阵rodrigues()
。
这是我得到的罗德里格斯矩阵的示例:
[0,1,0;
1,0,0;
0,0,-1]
Run Code Online (Sandbox Code Playgroud)
我使用以下代码。
Mat m33(3, 3, CV_64F);
Mat measured_eulers(3, 1, CV_64F);
Rodrigues(rotationVectors, m33);
measured_eulers = rot2euler(m33);
Degree_euler = measured_eulers * 180 / CV_PI;
Run Code Online (Sandbox Code Playgroud)
我使用预定义的 rot2euler 将罗德里格斯矩阵转换为欧拉角。我将收到的弧度转换为度数。
rot2euler 如下所示。
Mat rot2euler(const Mat & rotationMatrix)
{
Mat euler(3, 1, CV_64F);
double m00 = rotationMatrix.at<double>(0, 0);
double m02 = rotationMatrix.at<double>(0, 2);
double m10 = rotationMatrix.at<double>(1, 0);
double m11 = rotationMatrix.at<double>(1, 1);
double m12 = rotationMatrix.at<double>(1, 2);
double m20 = rotationMatrix.at<double>(2, 0);
double …
Run Code Online (Sandbox Code Playgroud) 我有两个独立的 3D 数据点向量,它们表示曲线,我正在使用 matplotlib 在 3D 图中将它们绘制为散点数据。
两个向量都从原点开始,并且都是单位长度。曲线彼此相似,但是,两条曲线之间通常存在旋转(出于测试目的,我实际上使用了一条曲线并对其应用了旋转矩阵以创建第二条曲线)。
我想对齐两条曲线,使它们在 3D 中对齐,例如旋转曲线 b,使其起点和终点与曲线 a 对齐。我一直试图通过从第一个点中减去最后一个点来做到这一点,以获得表示从每条曲线的起点到终点的直线的方向向量,将它们转换为单位向量,然后计算交叉和点积和使用本答案(https://math.stackexchange.com/a/476311/357495)中概述的方法来计算旋转矩阵。
但是,当我这样做时,计算出的旋转矩阵是错误的,我不知道为什么?
我的代码如下(我使用的是 Python 2.7):
# curve_1, curve_2 are arrays of 3D points, of the same length (both start at the origin)
curve_vec_1 = (curve_1[0] - curve_1[-1]).reshape(3,1)
curve_vec_2 = (curve_2[index][0] - curve_2[index][-1]).reshape(3,1)
a,b = (curve_vec_1/ np.linalg.norm(curve_vec_1)).reshape(3), (curve_vec_2/ np.linalg.norm(curve_vec_2)).reshape(3)
v = np.cross(a,b)
c = np.dot(a,b)
s = np.linalg.norm(v)
I = np.identity(3)
vXStr = '{} {} {}; {} {} {}; {} {} {}'.format(0, -v[2], v[1], v[2], 0, …
Run Code Online (Sandbox Code Playgroud) 我想围绕它的中心随机旋转图像张量(B、C、H、W)(我认为是 2d 旋转?)。我想避免使用 NumPy 和 Kornia,这样我基本上只需要从 torch 模块导入。我也没有使用torchvision.transforms
,因为我需要它与 autograd 兼容。本质上,我正在尝试为 DeepDream 等torchvision.transforms.RandomRotation()
可视化技术创建一个 autograd 兼容版本(因此我需要尽可能避免伪影)。
import torch
import math
import random
import torchvision.transforms as transforms
from PIL import Image
# Load image
def preprocess_simple(image_name, image_size):
Loader = transforms.Compose([transforms.Resize(image_size), transforms.ToTensor()])
image = Image.open(image_name).convert('RGB')
return Loader(image).unsqueeze(0)
# Save image
def deprocess_simple(output_tensor, output_name):
output_tensor.clamp_(0, 1)
Image2PIL = transforms.ToPILImage()
image = Image2PIL(output_tensor.squeeze(0))
image.save(output_name)
# Somehow rotate tensor around it's center
def rotate_tensor(tensor, radians):
...
return rotated_tensor
# Get a random angle …
Run Code Online (Sandbox Code Playgroud) 3d ×2
android ×2
euler-angles ×2
matrix ×2
python ×2
rotation ×2
c++ ×1
ios ×1
javascript ×1
math ×1
matlab ×1
numpy ×1
objective-c ×1
opencv ×1
opengl-es ×1
python-2.7 ×1
pytorch ×1
three.js ×1
transform ×1