- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试对我的加速度计数据进行重力补偿。给定一个具有 6 DOF(加速计、陀螺仪)的加速计,我想消除/补偿加速计读数中重力的影响(加速计可以自由旋转)。
以下是我将原始传感器值存储到名为 sample
的 struct
的方法:
uint8_t *p=data; // p is a pointer to the sensor data
int i;
for(i=0; i<4; i++) // quaternion
{
sample.quaternion[i]=((float)get_int32(p))/(1<<29);
len+=snprintf(s+len, sizeof(line)-len, "\t%9.6f", sample.quaternion[i]);
p+=4;
}
for(i=0; i<3; i++) // euler213_degrees
{
sample.euler213_degrees[i]=get_int16(p);
len+=snprintf(s+len, sizeof(line)-len, "\t%d", sample.euler213_degrees[i]);
p+=2;
}
for(i=0; i<3; i++) // euler123_degrees
{
sample.euler123_degrees[i]=get_int16(p);
len+=snprintf(s+len, sizeof(line)-len, "\t%d", sample.euler123_degrees[i]);
p+=2;
}
for(i=0; i<3; i++) // acceleration_g
{
sample.acceleration_g[i]=(2.0*get_int16(p))/(1<<15);
len+=snprintf(s+len, sizeof(line)-len, "\t%6.3f", sample.acceleration_g[i]);
p+=2;
}
for(i=0; i<3; i++) // gyroscope_dps
{
sample.gyroscope_dps[i]=(2000.0*get_int16(p))/(1<<15);
len+=snprintf(s+len, sizeof(line)-len, "\t%6.1f", sample.gyroscope_dps[i]);
p+=2;
}
你能告诉我一种获取重力补偿加速度计数据的方法吗?
最佳答案
IMU(6 DOF 设备)计算的四元数基本上是设备相对于本地地球引用系的姿态(3D 方向);因此它可以用于将加速度测量从本地 body 引用系(IMU直接测量的值)旋转到本地地球引用系(x-y平面与地面相切的坐标系)。您可以使用四元数乘法来执行此操作
v' = q 。 v. q *
其中 q 是四元数,v 是加速度 vector (请查找四元数 vector 乘法以了解更多详细信息*)。因为我们知道重力是本地地球引用系中的 vector u = (0,0,g)(其中 g ≈ 9.81 m/s^2,假设IMU 测量值的单位也是 m/s^2),然后我们可以从 v'
中减去该 vectorv'' = v' - u
v'' 是重力补偿/移除 vector 。但是,它不在 IMU 的本地 body 引用系中(记住我们将其旋转到本地地球引用系)。因此,要将其转换回来,您可以将其乘以逆四元数
v''' = q-1 。 v''。 q-1 *
v''' 将是原始加速度测量值减去重力。为了确认结果正确,您可以在设备静止时进行测量。无论设备如何旋转,加速度测量值都应接近 (0,0,0)。
如果 IMU 没有提供四元数测量,则可以通过加速度计和陀螺仪读数的融合来计算(这正是 IMU 正在做的事情)。如果您对此感兴趣,我建议查找 Madgwick、Mahony 或扩展卡尔曼滤波器算法来进行姿态估计。
*有用的资源
四元数乘法:https://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/arithmetic/index.htm
用四元数旋转 vector (如果您想查看一些代码,尤其是第三个答案):https://math.stackexchange.com/questions/40164/how-do-you-rotate-a-vector-by-a-unit-quaternion
关于c++ - IMU数据中的重力补偿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60492369/
我看到以下关于 MPEG 1 运动估计/补偿的解释,只是想知道它是否正确: 为什么我们不直接编码当前 block 和引用 block 之间的原始差异?因为残差的数字通常会小很多。例如,假设一个物体在图
计算机屏幕上像素的亮度通常与像素的数字 RGB 三元组值不线性相关。早期 CRT 的非线性响应需要补偿非线性编码,我们今天仍在继续使用此类编码。 通常我们在计算机屏幕上生成图像并在那里使用它们,所以一
我不知道它叫什么。状态栏?随着接待和电池生命周期的增加。但是有没有一种简单的方法可以判断它是否显示在应用程序中? 我正在编写一些通用代码,如果没有栏,我希望将某些内容放置在屏幕顶部,如果有,则在栏下方
观察下面的简单示例: div { border-bottom: 1px solid black; border-radius: 20%; padding: 10px; } Test 在 S
我有一个这样的嵌套视频: Live camera feed 当用户拍照时,图像沿y轴偏移 Captured Still image 我确实想要捕获整个图像并让用户上下滚动。他们目前可以这样做,但我希望
我从客户端收到了一个字体 (Calibre) 作为 OTF 文件,用于网络应用程序,但文件的“行高”(或者你怎么调用它?)有些奇怪。实际文本溢出顶部的 dom 元素并在下面留下一堆空间,导致各种丑陋。
我编写了一个数学计算器,它从用户那里接收一个字符串并对其进行解析。它使用 double 来保存计算时涉及的所有值。解决后,我将其打印出来,并使用 std::setprecision() 确保其输出正确
不同的 Android 设备具有不同的屏幕尺寸和屏幕密度。编写视频游戏时,补偿差异的好方法是什么? 最佳答案 我们先从 Android 的文档开始 Supporting Multiple Screen
我正在制作个人资料图片裁剪编辑器,它允许在区域内拖动、缩放和旋转图像。 图片的拖动是通过捕捉区域的mousedown和mousemove事件,计算区域内游标开始和停止的x/y坐标,得到游标移动的距离。
我正在尝试按地理区域对 AnyLogic GISRegions 集合进行排序。所述面积是使用GISRegion.area(units)计算的,这很简单。然而,我使用的区域是城市规模的,并且该方法返回一
首先,我希望这不是重复的。我读过很多类似的问题,但找不到与此特定问题相关的问题。 我有一个 javascript 日期选择器,它在内部使用 javascript 日期,这会产生意想不到的副作用。当我选
您可以在此处查看实时版本:http://steffiwilson.com/test . IE9 没有将内容 block 居中。 (我很确定旧版本的 IE 也不能正常工作,但我不能肯定地说。)我已经确保
我是一名优秀的程序员,十分优秀!