Java 操纵杆标定算法
我正在尝试编写一个应用程序内操纵杆轴校准工具 操纵杆轴区域应该是一个矩形,但实际上它是一个非线性闭合曲线,我想提高精度 校准应按以下方式进行: 我们有一个测量值,这样我们就得到了正确的值:Java 操纵杆标定算法,java,android,input,joystick,calibration,Java,Android,Input,Joystick,Calibration,我正在尝试编写一个应用程序内操纵杆轴校准工具 操纵杆轴区域应该是一个矩形,但实际上它是一个非线性闭合曲线,我想提高精度 校准应按以下方式进行: 我们有一个测量值,这样我们就得到了正确的值: Correct value = [(measured value)/range] * wantedrange 其中,范围是该轴测量的最大值和最小值之间的差值。 但也有一个偏移,将中心点移动到正确的位置,如何计算呢 编辑:我还制作了一幅图像:绿色矩形是预期区域,红色形状是“真实”的不准确测量区域,最后蓝色是我
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;
if(value您可以通过指示用户沿边缘移动操纵杆来获得蓝色矩形的位置,这样您看到的值就是红色曲线。您还应该指示用户将操纵杆保持在居中位置,因为您通常需要知道中心。计算出的中心并不总是真正的中心位置
对于每个轴,将这些值按其所在中心的一侧分开,并找到最接近中心点的值。这将适用于计算中心。现在您有了蓝色矩形
例如,在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应该可以工作,我猜你得到的点与你在变换公式中抛出蓝色中心的点是一样的,因为该变换将蓝色的任何点映射为绿色的点。上面更通用的版本是使用a-允许更多的调整(剪切、旋转等)因为它同时查看两个轴,而不是单独处理它们。不幸的是,由于实现原因,我一次只收到一个轴信息:我直接与设备通信,而不是使用MotionEvent android监听器,因此每次都必须检测轴并计算正确的值