校准操纵杆的算法

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 侦听器,所以我必须检测轴并计算正确的值每次

以上是关于校准操纵杆的算法的主要内容,如果未能解决你的问题,请参考以下文章

文本分类《融合后验概率校准训练的文本分类算法》

无目标非重叠立体相机校准

未校准的磁力计问题

用于校准的广义加法模型

人工智能,价值与校准

随机 python 模拟的校准