忽略差异很大的电子输入值

问题描述 投票:0回答:1

我有一个连接到 Raspberry Pi 的物理可拖动设备,该设备在移动时将其当前位置输出为键盘输入。物理设备可以“拥有一个位置”,范围为 91 像素到 955 像素。

像素应该控制屏幕上的图像。图像应根据手柄的位置/生成的值平滑地向上/向下滚动。请参阅下图以进行可视化。

Visualization of setup

向下拖动手柄即可正常工作;这些值是相当连续的。但是,当向上拖动手柄时,电子设备会输出随机/跳跃值。

我需要数学方面的帮助来标准化值并忽略 JavaScript 中的大差异。

即这些值可能会从 92、94、96、100、105… 平稳地移动一段时间,然后突然跳到 847。

不幸的是,我无法修理电子设备,所以我需要一个编程解决方案。

这是从电子设备接收到的键盘输出的真实示例:

const values = [
  92,
  94,
  96,
  100,
  102,
  105,
  107,
  112,
  123,
  134,
  116,
  114, // Last acceptable position
  847, // Huge diff compared to previous value
  299,
  628, // Huge diff again
  559, // Not as big of a diff compared to the previous value, but too big compared to 114 which was the last acceptable value
  395,
  788,
  189,
  948,
  135, // ≈ 20 px difference to 114 would be OK
  907,
  190,
  853,
  134,
  981,
  34,
  940,
  64,
  899,
  214,
  168,
  174,
  182,
  187,
  189,
  191,
  193,
  195,
  198,
  200,
  204,
  209,
  211,
  214,
  217,
  220,
  222,
  225,
  231,
  229,
  232,
  225,
  233,
  230,
  245,
  241,
  237,
  241,
  239,
  242,
  57,
  275,
  125,
  242,
  238,
  245,
  240,
  243,
  230,
  244,
  233,
  360,
  241,
  248,
  240,
  249,
  251,
  260,
  32,
  1007,
  68,
  1018,
  243,
  711,
  498,
  440,
  765,
  199,
  951,
  121,
  932,
  148,
  274,
  271,
  214,
  271,
  285,
  267,
  351,
  246,
  376,
  102,
  412,
  61,
  580,
  0,
  336,
  270,
  391,
  269,
  279,
  282,
  284,
  288,
  291,
  293,
  298,
  305,
  309,
  311,
  313,
  318,
  322,
  324,
  330,
  332,
  337,
  332,
  339,
  980,
  120,
  835,
  370,
  557,
  667,
  273,
  909,
  77,
  761,
  324,
  873,
  104,
  1005,
  156,
  799,
  418,
  509,
  715,
  229,
  366,
  369,
  410,
  369,
  365,
  374,
  376,
  381,
  383,
  387,
  392,
  394,
  398,
  405,
  408,
  410,
  418,
  427,
  433,
  437,
  439,
  441,
  228,
  660,
  562,
  362,
  849,
  120,
  999,
  25,
  993,
  60,
  916,
  70,
  900,
  81,
  884,
  191,
  879,
  196,
  873,
  101,
  1007,
  168,
  781,
  444,
  479,
  749,
  198,
  961,
  101,
  959,
  103,
  956,
  40,
  946,
  48,
  934,
  56,
  808,
  268,
  918,
  68,
  904,
  78,
  886,
  460,
  472,
  480,
  489,
  497,
  499,
  501,
  509,
  520,
  526,
  528,
  530,
  536,
  544,
  551,
  565,
  558,
  556,
  558,
  532,
  558,
  556,
  584,
  500,
  558,
  551,
  540,
  612,
  559,
  579,
  581,
  583,
  581,
  590,
  596,
  598,
  600,
  606,
  615,
  622,
  626,
  628,
  632,
  646,
  659,
  962,
  687,
  699,
  705,
  710,
  714,
  720,
  729,
  740,
  757,
  753,
  775,
  748,
  757,
  204,
  775,
  789,
  802,
  811,
  813,
  815,
  818,
  827,
  830,
  832,
  836,
  841,
  845,
  847,
  850,
  852,
  842,
  852,
  828,
  851,
  849,
  852,
  849,
  852,
  850,
  852,
  850,
  853,
  851,
  864,
  829,
  852,
  850,
  852,
  850,
  852,
  854,
  852,
  861,
  326,
  871,
  129,
  880,
  887,
  894,
  899,
  903,
  905,
  908,
  910,
  912,
  915,
  919,
  921,
  927,
  932,
  934,
  939,
  944,
  947,
  949,
  954,
  978,
  923,
  1002,
  872,
  965,
  877,
  964,
  912,
  987,
  957,
  966,
  973,
  962,
  978,
  939,
  1021,
  723,
  989,
  899,
  1023,
  961,
  963,
  959,
  1020,
  957,
  962,
  960,
  968,
  944,
  980,
  961,
  963,
  961]

我尝试计算前一个位置和接收到的值之间的差异,如果差异太大(即超过 20 个像素),则跳过它。当向下拖动手柄时,这可以正常工作,因为接收到的输入在限制范围内,但向上拖动手柄时,则不能接收到数据集。

值的跳跃在某些时候变得太大,然后图形变得“卡住”,因为手柄拖动得太快并且(似乎)不可能确定其新的“真实”位置。

即如果查看上面的数据集,114 将是“最后一个可接受的位置”(数组中的索引 11),然后新的可接受位置将是 135(索引 20),然后我想之后是 168 左右。

手柄是用户控制的(即人拖动手柄),因此无法以编程方式“停止”它或改变其位置,或对其施加任何阻力。

我还尝试使用最后 3 个和 5 个值的平均值,但这似乎不是最好的方法,因为有时有太多不正确的连续值(10 左右),这会扭曲最后一个已知的“真实”的位置。或者我应该增加平均值中包含的值的数量?那么如何处理“边缘情况”,例如当可拖动手柄位于最顶部/底部并且没有以前的值可供参考时?

非常欢迎任何帮助/想法/创意方法!

javascript math raspberry-pi mean normalization
1个回答
0
投票

啊,显然这被称为“异常值”,常见的方法是使用四分位数范围 (IQR) 来获取中间 50% 的值。

以下是 JavaScript 中的异常值过滤器示例:https://gist.github.com/ogun/f19dc055e6b84d57e8186cbc9eaa8e45

还没有完全实现平滑滚动,但我想如果其他人偶然发现这一点并且不是统计专家,我会在此处添加术语作为参考。

© www.soinside.com 2019 - 2024. All rights reserved.