空中鼠标算法原理讨论

简介:

   空中鼠标是利用陀螺仪输出的数据,对屏幕上的光标进行控制的设备。原理看起来相对简单,但实现起来,也有不少需要解决的问题。本文是作者在之前开发时的总结。

Image

基本原理

     将空中鼠标的X轴(Pitch)角速度和Z轴(Yaw)映射到鼠标的移动速度上。因此抓握设备的方式就事先要确定,比如哪面朝前,哪面朝上。灵敏度也需要通过实验进行确定。如果能够获取屏幕的分辨率或者屏幕尺寸从而进行动态调节,则效果更佳。

抗静态偏移

     鼠标在不移动的时候,光标自然是不能移动的。但不得不指出,廉价的陀螺仪本身会有静态输出。有些甚至能达到20度/s。 好在偏移通常不会因为环境而发生变化。所以需要在出厂前进行校正。这种问题比较容易解决。

平滑算法

     消费级陀螺仪由于成本所限,精度必然不会很高,数据会出现抖动。通过提高采样速率,即所谓的过采样技术,对同一时刻多个数据进行滤波和平滑,从而尽可能准确地反馈当时的运动状态。

运动平面不匹配

Image(1)

     如上图所示,如果以Z为轴,向Y方向旋转,那么鼠标会划出一条水平的轨迹。但当设备本身发生一定倾斜,如在X轴上有一个旋转角,那么像刚才的移动,就会划出一条斜线。这可能会对用户造成费解。如果拥有加速度计,测量设备的倾斜程度,通过传感器融合算法,就能相对而言避免这类问题。但算法要求较高。

旋转,而不是位移

     普通鼠标都是基于位移的,移动多少,光标就移动多少。但空鼠不是,空鼠是基于旋转的。如果把空鼠在不旋转的基础上,移动一定距离,会发现光标完全没有变化(可能会因为一些干扰造成晃动)。这会让用户费解。可能有算法会试图通过所谓的加速度积分获取位移来考虑水平或垂直运动。但这种算法肯定是不行的,因为传感器的精度限制会非常不准确,基本没有解决的可能性。

防按键抖动

      普通鼠标的按键基本都做在鼠标的顶部,所以按键不会造成鼠标位移。想象按键若做在鼠标侧面,而且按键很硬的话,可能就会出现抖动。因此空中鼠标对按键的要求很高,需要尽可能的,同时还能有明确的触觉反馈。在按下去的时候,能尽量让鼠标不发生位移。最麻烦的是双击操作,双击时人点击鼠标的力量通常比单击大不少。而且会有两次连续的抖动。如果位移过远,操作系统会将其认为是一次拖拽操作,而非双击操作,这需要额外的处理。

手势识别

     这涉及到比较高级的问题,空鼠显然脱离键盘,一些快捷操作无法实现,通过一定的手势能够检测特定的动作,从而触发之前定义的操作。但这涉及到机器学习的话题,而且需要较高的用户学习成本。同样的操作,不同用户做出来的特征可能完全不同。

休眠

     电池供电系统,功耗是必须考虑的,可考虑在一定时间内没有检测到运动,则自动进入低功耗模式,间歇式的发送数据。

结论

     通过基本原理实现最简单的空鼠并不困难,但用户体验并不好。通过加入其它方法,能够有效提升准确性。但必须指出,解决运动平面不匹配的方法虽然能解决匹配问题,会降低实时性,产生类似时滞的感觉,所以取舍还需要具体分析。

     不同传感器和硬件设计,需要调节参数,通过反复的实验对比,确定合理的方案。

相关文章
|
存储 Java
BigDecimal类型的数据如何保留小数点后四位
BigDecimal类型的数据如何保留小数点后四位
605 0
|
计算机视觉 C++ Windows
关于 百度飞浆paddleOCR编译32位版本 的解决方案
关于 百度飞浆paddleOCR编译32位版本 的解决方案
关于 百度飞浆paddleOCR编译32位版本 的解决方案
|
Java Spring
动态控制 Spring Boot 中的 @Scheduled 定时任务
Spring Boot 中的 @Scheduled 注解为定时任务提供了一种很简单的实现,只需要在注解中加上一些属性,例如 fixedRate、fixedDelay、cron(最常用)等等,并且在启动类上面加上 @EnableScheduling 注解,就可以启动一个定时任务了。 但是在某些情况下,并没有这么简单,例如项目部署上线之后,我们可能会修改定时任务的执行时间,并且停止、重启定时任务等,因为定时任务是直接写死在程序中的,修改起来不是非常的方便。所以,简单记录一下自己的一些解决方案,仅供参考。
2374 0
|
编译器 API Android开发
Android经典实战之Kotlin Multiplatform 中,如何处理不同平台的 API 调用
本文介绍Kotlin Multiplatform (KMP) 中使用 `expect` 和 `actual` 关键字处理多平台API调用的方法。通过共通代码集定义预期API,各平台提供具体实现,编译器确保正确匹配,支持依赖注入、枚举类处理等,实现跨平台代码重用与原生性能。附带示例展示如何定义跨平台函数与类。
376 0
|
8月前
|
编解码 自然语言处理 JavaScript
智谱发布GLM-OS概念及Agent产品,CogAgent-9B模型开源助力GUI交互场景
11月29日,智谱正式提出 GLM-OS 概念,并发布 AutoGLM 和 GLM-PC 两款 Agent 产品。近期GLM-PC 的基座模型—— CogAgent-9B 开源,供社区进一步开发。
443 8
|
PyTorch 算法框架/工具
【chat-gpt问答记录】torch.tensor和torch.Tensor什么区别?
【chat-gpt问答记录】torch.tensor和torch.Tensor什么区别?
396 2
|
10月前
pyqt6 绘图案例
本文介绍了三个使用 PyQt6 绘制图形的案例:绘制奥运图片、绘制五角星和绘制时钟。每个案例都提供了详细的代码示例和效果图,帮助读者更好地理解和实现这些图形绘制功能。
248 1
|
消息中间件 Kafka 测试技术
【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能
【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能
216 2
|
算法
算法】位运算——常见位运算基础操作总结
算法】位运算——常见位运算基础操作总结
361 0
算法】位运算——常见位运算基础操作总结
|
图形学 Python
使用Python进行曲线拟合:利用贝塞尔曲线
使用Python进行曲线拟合:利用贝塞尔曲线
639 1

热门文章

最新文章