手机传感器检测

在手机上打开这一页,把手机放平看气泡是不是停在中间,转一转看陀螺仪有没有数值,最后点几下震动确认马达还在。

授权与状态

权限状态尚未请求
屏幕方向竖屏(正常持握)

iOS 13 之后需要在用户点击里申请「运动与方向访问」,Android 一般不需要。如果这台设备没有传感器(大多数电脑都是),页面等一秒半收不到事件就会提示。

这些数字分别是什么

加速度计算的是「力」,不是「位置」。手机静止在桌上时,重力仍然作用在它身上,所以读数不是 0 而是约 9.8 m/s²;当你把手机往上甩,传感器会先感到一个向上的加速度,读数超过 1 g,松手后的自由落体阶段则接近 0。这个「静止不为零」是第一眼最容易误解的地方,也是水平仪能工作的原因:重力方向固定,手机一倾斜,重力在三个轴上的投影就变了。

陀螺仪测的是角速度,单位度每秒,不是角度。想得到角度必须对时间积分,而积分会把每一次微小误差累积起来,几分钟就能漂出去几十度。所以页面只显示瞬时角速度:静止时应该接近 0,转动时才有数值。真正的姿态融合要靠加速度计和陀螺仪一起做,那是系统层面的算法,网页拿不到中间结果。

指南针的干扰比想象中大得多。地磁场的强度只有几十微特斯拉,一块小磁铁就能让它偏出十几度;手机壳上的磁吸、旁边的音箱、金属桌面、无线充电底座都是常见干扰源。系统一般会要求画「8」字来重新校准,本质是让设备在多个方向上采样,把硬磁和软磁偏差估出来。页面显示的是浏览器给出的方位角,没有做任何补偿。

震动用的是 navigator.vibrate,它只有「震多久、停多久」,没有强度参数。所以你能测出马达会不会响、节奏能不能分辨,但测不出力度的线性。iOS 的 Safari 完全不支持这个接口,Android 上也需要 Chrome 系浏览器;桌面浏览器即使有这个方法也不会真的震。

想测屏幕本身有没有坏点、色彩是不是断层,用屏幕测试;想测触摸有没有死区、多点触控能不能识别,用触控测试;想在电脑上测输入设备,可以看键盘按键测试。

常见问题

电脑上打开什么都没有,是坏了吗?

不是。台式机和大多数笔记本没有加速度计和陀螺仪,浏览器也就不会派发运动和方向事件。这个页面是给手机和平板用的,在电脑上只能确认页面能打开、按钮能点。想在电脑上验证,只能外接带传感器的开发板。

iPhone 上点了没反应,怎么授权?

iOS 13 之后,Safari 要求网页在用户操作里显式申请「运动与方向访问」权限。点页面上的授权按钮,在弹出的系统对话框里选允许。如果之前选过不允许,需要去「设置 → Safari → 运动与方向访问」里改回来,再刷新页面。

静止放在桌上,加速度为什么不是 0?

因为读的是「含重力」的加速度。手机静止时重力仍然作用在传感器上,大小约 9.8 m/s²,所以合加速度是 1 g 而不是 0。这也是水平仪能工作的原理:重力方向固定,手机一倾斜,重力在三个轴上的分量就变了。

指南针读数一直在跳,准吗?

地磁传感器很容易被干扰。手机壳里的磁铁、旁边的音箱、金属桌面、甚至无线充电器都会让读数偏十几度;靠近强磁场时还会出现大幅跳动。校准方法是拿着手机在空中画几个 8 字,让系统重新学习当地磁场。真要定向,用地图软件里那个带罗盘的视角更可靠。

陀螺仪显示的是角度吗?

不是,是角速度,单位度每秒。角度要靠对角速度做时间积分才能得到,而积分会累积误差,几分钟就能漂出去几十度。所以页面只显示瞬时角速度:静止时接近 0,转动时才有数值,这才是陀螺仪的真实输出。

震动按钮没反应?

网页震动依赖 navigator.vibrate,目前只有 Android 上的 Chrome 系浏览器支持,iOS 的 Safari 完全不支持。另外部分浏览器要求页面已经有过用户交互,直接点按钮通常就满足条件。插着充电线时某些机型也会禁用震动。

屏幕方向一直显示竖屏,转手机也不变?

先确认系统的「旋转锁定」没有打开。其次,部分浏览器在页面没有铺满屏幕时不会上报方向变化。屏幕方向角描述的是浏览器视口的方向,不是手机硬件的姿态——如果页面被锁定成竖屏,这里就不会变,但加速度计仍然会跟着手机转。