Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 操纵杆标定算法_Java_Android_Input_Joystick_Calibration - Fatal编程技术网

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监听器,因此每次都必须检测轴并计算正确的值