校准操纵杆的算法
Posted
技术标签:
【中文标题】校准操纵杆的算法【英文标题】:Algorithm to calibrate joystick 【发布时间】:2013-08-04 20:26:28 【问题描述】:我正在尝试编写一个应用内操纵杆轴校准工具。
摇杆轴区域应该是一个矩形,但实际上它是一个非线性闭合曲线,我想提高精度。
校准应该这样工作: 我们有一个测量值,这样我们就得到了正确的值:
Correct value = [(measured value)/range] * wantedrange
其中范围是为该轴测量的最大值和最小值之间的差。 但是还有一个偏移量把中心点移动到正确的位置,怎么计算呢?
编辑:我还制作了一个图像:绿色矩形是预期区域,红色形状是“真实”的不准确测量区域,最后蓝色是我转移到 (0, 0) 这样我就可以使用比率将坐标转换为更大的绿色矩形。
EDIT2: 这张图片解释了校准如何更加准确,这要归功于 zapl 回答: 如果我们找到蓝色矩形的中心,我们可以将矩形分成 4 个矩形,并计算该范围与绿色矩形范围之间的比率。 代码应该是这样的:
if(value<axiscenter) correctedvalue = ((value-axismin)/(axiscenter-axismin)) * wantedaxisrange;
else correctedvalue = wantedaxisrange + ((value-offset-axiscenter)/(axismax-axiscenter-axismin)) * wantedaxisrange;
【问题讨论】:
【参考方案1】:您可以通过指示用户沿边缘移动操纵杆来获取蓝色矩形的位置,以便您看到的值是红色曲线。您还应该指示用户将操纵杆留在中心位置,因为您通常需要知道中心。计算出的中心并不总是真正的中心位置。
对于每个轴,将这些值按它们所在的中心的一侧分开,并找到最接近中心点的那些。这将适用于计算中心。现在你有了蓝色矩形。
例如在 X 轴上,您看到的值范围为 0-20 和 80-100,中心为 ~50 > 蓝色矩形为 20 - 80。
假设您要校准它以使值在 0-100(绿色)之间,您计算 x 轴的校正为
calibratedX = (uncalibrated - 20) * 100 / 60
值向右移动 20(-20 将它们标准化为 0-60),它们的范围是 60 (80 - 20),您希望将其放大到 0-100。之后将值剪辑为 0-100,因为它们将在蓝色矩形之外的红线上的每个点之外。
结果看起来像
其中粉色为变换后的值,绿色矩形外的粉色区域被切掉。
关于中心点:也可以通过这些计算来运行它。
【讨论】:
嗨,我接受这个答案,因为我意识到如何正确计算棒的中心。请检查我的编辑是否正常:) @Vektor88 应该可以工作,我猜你得到的点与你将蓝色中心放在转换公式中一样,因为该转换将任何蓝色点映射到绿色点。 上述更通用的版本是使用2D transformation matrix - 允许进行更多调整(剪切、旋转等),因为它同时查看两个轴而不是单独处理它们。 不幸的是,由于实现,我一次只收到一个轴信息:我直接与设备通信,而不是使用 MotionEvent android 侦听器,所以我必须检测轴并计算正确的值每次以上是关于校准操纵杆的算法的主要内容,如果未能解决你的问题,请参考以下文章