- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用Reach RS +设备来捕获GPS位置数据以及IMU数据(侧倾,俯仰和偏航);请参阅制造商website上的“ Point Collection”图像。
我正在尝试确定底点的GPS坐标(接收器固定在其杆的空端)。
为了能够以米为单位进行计算,我将经度(X)和纬度(Y)转换为UTM,同时保持高度(Z)不变。
当杆直立时,X和Y保持不变
Z1 = Z - ROD_LENGTH
X1 = X + ROD_LENGTH * func_X(roll, pitch, yaw)
Y1 = Y + ROD_LENGTH * func_Y(roll, pitch, yaw)
Z1 = Z + ROD_LENGTH * func_Z(roll, pitch, yaw)
最佳答案
我必须说,事实证明这比我预期的要复杂得多。我想我已经很直截了当了,但是在任何更正的评论中让我知道,我将尝试修复。
在查看下面的代码之前,请注意!这些假设很重要,您需要验证它们是否适用。有数十种(至少!)定义空间方向和位置的方法。您需要确保与设备对齐的主要假设是我们在其中进行操作的空间框架。 This article将使您对为什么它如此重要感到赞赏!最明显的是我们如何标记轴,即向上标记(正Z,如我在下面选择的,但是例如,在谈论潜艇时,我们可能会选择负Z)。
框架假设:想象一下一架飞机(我知道它不是飞机,但用这种方式更容易解释),直立地悬挂着一根长杆。我们将Z轴定义为向上(正)和向下(负)。 X轴指向前(正)和后(负)。 Y轴是围绕机翼的旋转轴,左翼为正,右翼为负-这是“ right handed coordinate system”。因此,轴相交在飞机的中间,大约是机翼所在的位置。旋转定义为绕轴逆时针旋转为正角,顺时针旋转为负。所以...
“偏航”表示绝对航向的变化(因此,即使俯仰和滚动,这也是您相对于实际地球指向的方向。
“俯仰”表示机翼周围的角度-基本上是鼻子是向上还是向下。
“侧倾”代表飞机的倾斜方向-机翼轴线平行于地面还是围绕机身倾斜。
重要的是要做好所有这些工作,尤其是与角度相关的符号(+/-)-尝试将其倾斜并滚动约30度,并确保结果与输出一致-否则更改角度的符号。进行偏航时,您需要同时更改航向以及俯仰和横滚,因为航向本身不会影响杆端的位置(如果杆是向上或向下的话)。
如上所述,您描述的“飞机”数据是位置(三个数字),在相同的XYZ框架中,三个角度(以度数为-180到180度)。
设备假设:这些是您可能需要与供应商联系的情况。如果相对于预期的(或允许的)GPS错误,这些数字较小,则可能关系不大。
该代码假定所有轴都在设备底部恰好相交,并且杆从该点垂直垂下。例如,如果杆长度为2米,并且轴实际上在连接点上方相交三厘米,则可以将杆长度调整为2.03米。如果将杆实际连接到不在轴线相交处的某个点,则需要对软件进行一些更改以说明末端不在其正下方。同样,在宏伟的事物中,几毫米对您可能并不重要。
该代码假定设备声称的位置实际上是轴相交。如果不是,则需要将位置调整为该位置(或更改软件以允许该位置)。
您需要以与设备位置相同的单位指定杆长度。
其他假设:
这不会处理地球曲率-除非您的杆异常长,否则不重要,并且如果您将其笔直(或几乎垂直)将其完全无关紧要。
编码:
我遗留了一些不必要的内容(如果您需要对其进行完全重组,可能会需要这些内容),并且也没有尝试使其变得更有效率(例如,对相同的正弦和余弦进行不断的重新计算)以使其更加清晰。我留下了闭包编译器的类型,既有一些文档说明,也有待以后缩小的地方。 rodloc
是您想要的功能...
function presentresult(location, length, yaw, pitch, roll) {
console.log("Starting point");
console.log(location);
console.log("Rod length = " + length);
console.log("Yaw = " + yaw + ", Pitch = " + pitch + ", Roll = " + roll);
console.log("Result:");
console.log(rodloc(location, length, yaw, pitch, roll));
}
presentresult([100, 100, 100], 2, 0, 0, 0); // Result: [100, 100, 98] (3)
presentresult([100, 100, 100], 2, 30, 0, 0); // Result: [100, 100, 98] (3)
presentresult([100, 100, 100], 2, -30, 0, 0); // Result: [100, 100, 98] (3)
presentresult([100, 100, 100], 2, 0, 30, 0); // Result: [99, 100, 98.26794919243112] (3)
presentresult([100, 100, 100], 2, 0, -30, 0); // Result: [101, 100, 98.26794919243112] (3)
presentresult([100, 100, 100], 2, 0, 0, 30); // Result: [100, 101, 98.26794919243112] (3)
presentresult([100, 100, 100], 2, 0, 0, -30); // Result: [100, 99, 98.26794919243112] (3)
presentresult([100, 100, 100], 2, 30, 30, 30); // Result: [98.75, 100.43301270189222, 98.5] (3)
presentresult([100, 100, 100], 2, -30, -30, -30); // Result: [100.25, 98.70096189432334, 98.5] (3)
presentresult([100, 100, 100], 2, -30, 30, -30); // Result: [98.75, 99.56698729810778, 98.5] (3)
/** @typedef {Array<number,number,number>} */ var Vector3D;
/** @typedef {Array<Vector3D,vector3D,Vector3D>} */ var Matrix3D;
/**
* @param {Vector3D} location - The location (3 coordinates) of the "plane"
* @param {number} length - The length of the rod
* @param {number} yaw - the yaw (heading) in degrees
* @param {number} pitch - the pitch in degrees
* @param {number} roll - the roll in degrees
* @returns {Vector3D} - the location of the end of the rod
*/
function rodloc(location, length, yaw, pitch, roll) {
let ryaw = yaw * Math.PI / 180.0; // Convert to radians
let rpitch = pitch * Math.PI / 180.0;
let rroll = roll * Math.PI / 180.0;
// This is where our axes start
let x = [1, 0, 0];
let y = [0, 1, 0];
let z = [0, 0, 1];
// NOTE: ORDER MATTERS - your data may mean different things (see
// assumptions in answer!
// Rotate axes around z by yaw
let yprime = rotatearound([0, 1, 0], [0, 0, 1], ryaw);
let xprime = rotatearound([1, 0, 0], [0, 0, 1], ryaw);
let zprime = z; // rotating around itself
// Next we need to rotate for pitch (around the Y axis...)
let x2prime = rotatearound(xprime, yprime, rpitch);
let y2prime = yprime; // dont need this
let z2prime = rotatearound(zprime, yprime, rpitch);
// Now we need to roll around the new x axis...
let x3prime = x2prime // dont need this
let y3prime = rotatearound(y2prime, x2prime, rroll); // dont need this
let z3prime = rotatearound(z2prime, x2prime, rroll);
// now take what started out as [0, 0, 1] and place the end of the rod
// (at what started out as [0, 0, -length])
let rotend = [0,1,2].map(n=>-length*z3prime[n]);
// now take that and add it to the original location of the plane
// and return it as the result
return [0,1,2].map(n=>location[n]+rotend[n]);
}
/** Multiply a vector times a matrix
* @param {Vector3D} offset - The vector of the offset
* @param {Matrix3D} rotate - The rotation vector
* @returns {Vector3D} - The new offset vector
*/
function vmmult(offset, rotate) {
return [0,1,2].map(x=>xmult(offset,rotate[x]));
}
/** dot product of two vectors
* @param {Vector3D} col
* @param {Vector3D} row
* @returns {number}
*/
function xmult(col, row) {
return [0,1,2].reduce((a,c)=>a+col[c]*row[c],0);
}
/** Rotate a point around a vector projecting from the origin
* @param {Vector3D} point - the we want to rotate
* @param {Vector3D} vec - the vector (from origin to here) to rotate around
* @param {number} angle - the angle (in radians) to rotate
* @returns {Vector3D} - the new point location
*/
function rotatearound(point, vec, angle) {
let rotmat = setuprotationmatrix(angle, vec);
return vmmult(point, rotmat);
}
/**
* Adapted from C courtesy of Bibek Subedi
* https://www.programming-techniques.com/2012/03/3d-rotation-algorithm-about-arbitrary.html
* @param {number} angle - the angle to rotate around the vector
* @param {Vector3D} vec - the vector around which to rotate
* @returns {Matrix3D} - the rotation matrix
*/
function setuprotationmatrix(angle, vec) {
// Leaving L in for reusability, but it should always be 1 in our case
let u = vec[0], v = vec[1], w = vec[2];
let L = (u*u + v * v + w * w);
let u2 = u * u;
let v2 = v * v;
let w2 = w * w;
let rotmat = [[],[],[]];
rotmat[0][0] = (u2 + (v2 + w2) * Math.cos(angle)) / L;
rotmat[0][1] = (u * v * (1 - Math.cos(angle)) - w * Math.sqrt(L) * Math.sin(angle)) / L;
rotmat[0][2] = (u * w * (1 - Math.cos(angle)) + v * Math.sqrt(L) * Math.sin(angle)) / L;
rotmat[1][0] = (u * v * (1 - Math.cos(angle)) + w * Math.sqrt(L) * Math.sin(angle)) / L;
rotmat[1][1] = (v2 + (u2 + w2) * Math.cos(angle)) / L;
rotmat[1][2] = (v * w * (1 - Math.cos(angle)) - u * Math.sqrt(L) * Math.sin(angle)) / L;
rotmat[2][0] = (u * w * (1 - Math.cos(angle)) - v * Math.sqrt(L) * Math.sin(angle)) / L;
rotmat[2][1] = (v * w * (1 - Math.cos(angle)) + u * Math.sqrt(L) * Math.sin(angle)) / L;
rotmat[2][2] = (w2 + (u2 + v2) * Math.cos(angle)) / L;
return rotmat;
}
关于javascript - 使用横滚,俯仰,偏航和长度确定新的GPS位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52370496/
我现在没有 iPhone 4,我正在尝试找到一个文档来显示偏航、俯仰和滚动的范围以及设备的相应位置。 我知道加速度计的变化范围是 -1 到 +1,但昨天在我的 iPhone 上进行的测试显示,横滚的变
我有两个不同的系统(引擎 A、引擎 B)。引擎 A(运动跟踪软件)生成(偏航、俯仰、横滚),引擎 B(Cinema 4D)期望(航向、俯仰、倾斜)。 我的研究得出的结果是这两个系统之间没有区别。 Ya
如何通过 Quartz 以编程方式将矩形从正面朝上(在 2D 中显示为线)设置为全高? 以下(请原谅粗略的绘图)是我想要得到的:一副卡片(线),卡片旋转到全高。我没有任何调整视角的方法。 可能的作案手
我想找出 iPad 1 上的俯仰、偏航和滚动。由于没有 deviceMotion 工具,我可以从加速度计中获取这些数据吗?我假设我可以使用它返回的向量与引用向量(即重力)进行比较。 iOS 会检测设备
我在 WorldWind 中有一个 3D 飞机模型,这是一个在 OpenGL Java 上运行的 3D 地球模型。我使用数据库中的数据(包括纬度、经度和替代度)更新此模型的位置。如何从当前位置获取航向
我将 Cesium 的一个模型加载到场景中,我有两个点要用来计算模型的方向,这是我创建的函数。 // calculate the direction which the model is facing
几个小时以来,我一直在努力解决这个问题,但我根本想不出一个解决方案:我想要实现的是将方向 vector 转换为 3 glm::rotation调用。 我有一个位于 (0, 0, 0) 的圆柱体,具有一
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在使用 CMMotionManger 通过以下代码获取偏航读数。无论 UIInterfaceOrientation 如何,如果向右偏航 90 度,我都会尝试获取负 1.5708 rad 的读数;如
我有一个基于提供的纬度/经度坐标、缩放、偏航和俯仰的谷歌地图和街景。我需要调用一个 javascript 来为每个值更新一个隐藏字段,每当任何细节从它们的默认值发生变化或当一个按钮被点击时。 因此,无
我有一个 CMRotationMatrix *rot,我想从矩阵中获取俯仰、偏航和滚动。我有什么想法可以做到这一点吗? 谢谢 最佳答案 使用四元数比使用欧拉角更好....滚转、俯仰和偏航值可以使用以下
在 Android 中,我可以使用 GAME_ROTATION_VECTOR 传感器获取设备的偏航、滚动和俯仰。 我需要在 Flutter 中做同样的事情,但除了 sensors 之外我找不到任何东西
如何通过 Eigen 库使用俯仰、偏航、滚动创建旋转矩阵? 最佳答案 鉴于我无法找到执行此操作的预构建函数,我构建了一个,以防将来有人发现此问题 Eigen::AngleAxisd rollAngle
我已经研究了一段时间,现在我必须决定走哪条路。 矿山要求:需要知道设备相对于真实航向(地理北极,而非磁极)的方向。为此,我必须使用指南针,现在我必须决定其他的东西,加速度计或陀螺仪。 因为这对我来说是
我的问题 我想用 3x3 旋转矩阵旋转一个 mayavi.mlab.imshow 对象。我能找到的唯一旋转此对象的方法是将对象的 actor.orientation 设置为 [pitch, roll,
我是一名优秀的程序员,十分优秀!