- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在这个特定问题上浪费了 2 天(和两夜),但在倾斜补偿我的磁力计输出方面完全失败了。
我尝试了我在谷歌和开源示例中可以阅读的所有内容,但没有任何内容指导我对两者(滚动和俯仰)进行适当的倾斜补偿。 .
设置:我使用校准值而不是统一值。
我有一个融合的重力 vector ,它工作正常且准确。
传感器是 9dof BMX055 ( http://www.mouser.com/ds/2/621/BST-BMX055-DS000-01-274824.pdf )每个轴上的磁力计最小值/最大值为 +- 512(差异很小,但所有轴都归零)。硬件为Sam3X8e(Cortex M3),全部用C语言编写。
float 和三角函数可以很快完成,所以这没问题。BMX055 芯片对齐,使引脚 20、19、18 指向前面。
数据表第 159-161 页显示方向。当我升高前部时音高升高。
左侧上升的话滚动上升。
示例值:
指向我的算法在水平水平时称为 305deg 的方向
Pitch: 0 , Roll 0 : MAG cal: x 132 y 93 z -364
Pitch: +24, Roll 0 : MAG cal: x -109 y 93 z -397
Pitch: +46, Roll 0 : MAG cal: x -303 y 89 z -351
Pitch: 0 , Roll -44 : MAG cal: x 151 y 352 z -235
Pitch: 0 , Roll +36 : MAG cal: x 130 y -140 z -328
Pitch: 78 , Roll -2 : MAG cal: x -503 y 93 z -199
Pitch: 7 , Roll -53 : MAG cal: x 135 y 424 z -180
对齐应该始终在 305 度左右(尽我所能),也许是 +- 5 度。
公式:(到处都用同一个)
uint16_t compass_tilt_compensation(float roll_radians, float pitch_radians,float mag_y, float mag_x, float mag_z)
{
float tilt_compensated_heading;
float MAG_X;
float MAG_Y;
float cos_roll;
float sin_roll;
float cos_pitch;
float sin_pitch;
int16_t heading;
//pitch_radians =roll_radians;
//roll_radians *= -1;
//mag_x *= -1;
//roll_radians=0.0f;
//pitch_radians=0;v
//pitch_radians *=-1;
cos_roll = cos(roll_radians);
sin_roll = sin(roll_radians);
cos_pitch = cos(pitch_radians);
sin_pitch = sin(pitch_radians);
#if 0
MAG_X = mag_x*cos_pitch+mag_y*sin_roll*sin_pitch+mag_z*cos_roll*sin_pitch;
MAG_Y = mag_y*cos_roll-mag_z*sin_roll;
tilt_compensated_heading = atan2f(-MAG_Y,MAG_X);
#else
MAG_X = mag_x * cos_pitch + mag_z * sin_pitch;
MAG_Y = mag_x * sin_roll * sin_pitch + mag_y * cos_roll - mag_z * sin_roll * cos_pitch;
tilt_compensated_heading = atan2f(-MAG_Y,MAG_X);
//tilt_compensated_heading = atan2f(-mag_y,mag_x); // works fine when leveled
#endif
//convert to degree from 0-3599
heading = tilt_compensated_heading * RAD_TO_DEG * 10;
if ( heading < 0 )
{
heading += 3600;
}
return heading;
}
我尝试了各种组合,我尝试只固定一个轴并让一个轴始终为 0,在任何输入上交换 X/Y 俯仰/滚动,*-1。
结果总是完全错误的。有时(取决于我尝试通过试验/错误来反转或不反转值的位置)这些值似乎接近线性。有时在正区域补偿一个轴。
然而,滚动和俯仰总是会导致“随机”跳跃和航向变化。
数学从来不是我的最爱,现在我后悔了。
我个人的猜测是公式在原则上是正确的,杂志在原则上是有效的(毕竟我在升级时获得了适当的学位)但我不知何故喂错了东西。(比如Y和X需要互换,z*-1,pitch需要*-1)
谁能看一看这方面的知识并指导我如何获得正确的标题?
今晚能睡上几个小时,而不必再梦到功能失调的算法,那就太好了 :)
更新:当指向 305 度航向时,此处的倾斜补偿适用于负侧倾。也用在这里:http://www.emcu.it/MEMS/Compass/MEMS_Compass_A_RTM1v3.pdf
最佳答案
3 天的工作,终于我找到了我遇到的问题,倾斜补偿正在工作!
我在各种论坛上看到很多人遇到过这样的问题,所以我是这样做的:
我会逐步解释我做了什么以及为什么这样做。也许有类似问题的人会以这种方式找到解决方案。
玩弄这些值会有所帮助(也许只是需要颠倒俯仰或滚动,必须交换 X 或 Y)。
但是,如果您的问题不止一个小问题,那么值会很多,并且组合的数量会太多。
发布的公式工作正常(在事件 #if 分支中的那个。
如果您有磁力计,并且 atan2(-y,x) 在放平时为您提供正确的航向,那么这个公式也适用于您。
我所做的是从 I2C 二进制逻辑(和数据表)开始完全检查我所有的传感器和 vector 。
在此特殊案例 (BMX055) 中很重要,数据表方向页面错误!
关于轴 (x,y) 的方向以及旋转为正或负时,存在多个错误。有时右手法则适用,有时不适用,并且图纸具有误导性(错误)。博世在记录该芯片(以及之前的芯片)方面做得很糟糕。他们似乎不希望人们正确理解它,他们多次使用优化的定点算法和高级校准编写融合 API,但它不对公众开放。
我需要做的是制作一个合适的 body 引用系统。自己决定 X 的位置,然后让所有传感器在向同一方向(正/负)倾斜/滚动时正确地改变 X 轴。对俯仰、滚动和重力/磁场执行此操作。
一旦他们一起玩得很好,我就重新开始。
标题公式仍然不正常,但现在我第一次相信了 vextors。
我添加了一个 vector 旋转矩阵函数,并使用 roll 和 pitch 以及 yaw=0 将磁 vector 旋转回来。惊喜:磁 vector 被倾斜补偿。
现在我知道这是可以做到的了:)
我回到原来的公式,用 Y 替换 X(因为我已经交换它们以匹配 body 引用系统(陀螺仪/磁体的 X 和 Y)。
现在倾斜补偿适用于俯仰但不适用于横滚。
所以我反转了 roll_radians 突然它得到了完美的倾斜补偿。
我现在有两个解决方案。一种是旋转矩阵解决方案,另一种是每个人都在使用的标准解决方案。我会看看其中一个是否表现更好,如果结果值得的话,我可能会在这里给出最后的更新。
关于c - 倾斜磁力计输出 - 俯仰和滚动倾斜补偿 - 我迷路了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24639529/
我必须在 Android 中从陀螺仪的智能手机输出中计算偏航、滚转、俯仰,我编写了以下代码: if(event.sensor.getType()==Sensor.TYPE_GYROSCOPE){
四元数有利于它们之间的内插旋转。到目前为止,一切都很好。 如果我有一个网络游戏,将旋转量转换为vector3f就足够了还是应该使用四元数? 为了使游戏更流畅,我可能必须在上次发送的旋转和当前旋转之间进
我正在使用Reach RS +设备来捕获GPS位置数据以及IMU数据(侧倾,俯仰和偏航);请参阅制造商website上的“ Point Collection”图像。 我正在尝试确定底点的GPS坐标(接
如果可能的话,我想知道如何获得确定 Android 设备位置的航向、俯仰和滚动角度。不要考虑设备相关的细节。引用有用的文档也很有值(value)。谢谢! 最佳答案 我手头没有精确的解决方案,但全口径解
我在 WorldWind 中有一个 3D 飞机模型,这是一个在 OpenGL Java 上运行的 3D 地球模型。我使用数据库中的数据(包括纬度、经度和替代度)更新此模型的位置。如何从当前位置获取航向
我想在没有红外感应条的情况下使用 wiimote 来控制光标。我为此使用了俯仰和滚动值。问题是俯仰接近0度的时候,横滚很不稳定,而俯仰接近90度的时候,本身就很不稳定,但是横滚还好。我非常频繁地轮询
我正在为我的学校做一个编程主题的项目。我在 Swift 的 Xcode 中工作。我想制作一个使用陀螺仪的应用程序。我不知道,但由于 Xcode 中的一些我不知道如何修复的错误,它不会在我的 iPhon
我正在尝试使用 Vision 框架获取图像中人脸的俯仰/偏航/滚动,但始终为所有值获取 0。图像应该很容易处理(主要是前瞻性肖像)。 我通过对它们使用 Amazon Rekognition 成功获得了
我有一个基于提供的纬度/经度坐标、缩放、偏航和俯仰的谷歌地图和街景。我需要调用一个 javascript 来为每个值更新一个隐藏字段,每当任何细节从它们的默认值发生变化或当一个按钮被点击时。 因此,无
我的观众没有收到来自被跟随球员的任何投球轮换。 我正尝试与 ShooterGame 项目合作,对 FPS 旁观者功能进行概念验证。我在 GameMode 中添加了将 VictimPlayer 切换到旁
我正在尝试使用陀螺仪制作一个简单的应用程序,其中角色会根据 iPad 1 的旋转进行移动。 我的代码无法正常工作,因此我测试了原始、俯仰、偏航的值,无论我如何移动设备,它们实际上都保持为零。我确定 i
用于从 cvPOSIT 生成的 3*3 旋转矩阵计算偏航(z 轴)、横滚(x 轴)和俯仰(y 轴)的算法是什么。 最佳答案 使用cv::RQDecomp3x3() .“它可选择返回三个旋转矩阵,每个轴
我已经研究了一段时间,现在我必须决定走哪条路。 矿山要求:需要知道设备相对于真实航向(地理北极,而非磁极)的方向。为此,我必须使用指南针,现在我必须决定其他的东西,加速度计或陀螺仪。 因为这对我来说是
我的问题 我想用 3x3 旋转矩阵旋转一个 mayavi.mlab.imshow 对象。我能找到的唯一旋转此对象的方法是将对象的 actor.orientation 设置为 [pitch, roll,
我是一名优秀的程序员,十分优秀!