Pro Android学习笔记(一五四):传感器(4):陀螺仪、加速传感器

 

Pro Android学习笔记(一五四):传感器(4):陀螺仪、加速传感器

  30530人阅读  评论(4)  收藏  举报
  分类:
Android(231) 
 

目录(?)[+]

 

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处http://blog.youkuaiyun.com/flowingflying/以及作者@恺风Wei。

陀螺仪

陀螺仪(Gyroscope sensor)测量设备转动的角速度。最早的陀螺仪发明在中国,科学应用则在西方,陀螺仪是为士大夫坐轿子看书是免收烛光摇曳发明的,这在很久之前一部西方拍的科教片看到,具体名字忘了。Pro Android 4.0中说陀螺仪的误差会慢慢积累,因此通与加速传感器一致使用,通过Kalman filter进行修正。我们只简单地进行陀螺仪数据的读取。小例子和之前的很相似,我们只提供不同部分的代码片段。

public class GyroscopeSensorActivity extends Activity implements SensorEventListener{ 
    ……      
    @Override 
    protected void onCreate(Bundle savedInstanceState) {  
        …… 
        sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
        sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); 
    } 
    
    …… //注册和注销传感器的监听器

   @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) {  …  }

    @Override  /* 对于陀螺仪,测量的是x、y、z三个轴向的角速度,分别从values[0]、values[1]、values[2]中读取,单位为弧度/秒。*/
    public void onSensorChanged(SensorEvent event) { 
        if(event.sensor.getType() == Sensor.TYPE_GYROSCOPE)
            showInfo("事件:" + " x:" + event.values[0] + " y:" + event.values[1]  + " z:" + event.values[2]);
    } 
    
    //在华为P6的机器上,陀螺仪非常敏感,平放在桌面,由于电脑照成的轻微震动在不断地刷屏,为了避免写UI造成的性能问题,只写Log。
    private void showInfo(String info){ 
        //tv.append("\n" + info); 
        Log.d("陀螺仪",info); 
    } 
}

加速度传感器(acceleration)

加速度测量传感器有x、y、z三轴,注意和2D屏幕的坐标,以左上角作为原点的,而且Y向下。注意区分这两个不同的坐标系。

加速传感器的单位是加速度m/s2。如果手机平放好,x,y在位置为0,而z轴方向加速度=当前z方向加速度-g。由于g(重力加速度)垂直向下,则g=-9.81m/s2,即z轴 a=0-(-9.81)=9.81m/s2。也就是自由落体是为0。x、y、z的测量的加速度分别位于value[0]、value[1]、value[2]。

相关的代码和前面大同小异,我们就不再重复,传感器类型为Sensor.TYPE_ACCELEROMETER。减去重力这很重要,当设备静止或者匀速运动时,可以获得设备的角度。

我记得至少两年前,单位请一互联网专家讲课,提到了AR(增强现实),问靠什么传感器,其答案为陀螺仪,这是不对的,陀螺仪可以测量运动过程中的角速度,但要测量手机本身的角度,这靠的是加速仪器,因为有重力方向作为校准。

Android也提供了检测手机旋转角度的API,用于UI绘制,实际靠的就是加速传感器。

WindowManager window = (WindowManager)getSystemService(WINDOW_SERVICE); 
//返回值为Surface.ROTATION_0(0)、Surface.ROTATION_90(1)、Surface.ROTATION_180(2)和Surface.ROTATION_270(3),可以用来确定屏幕UI的旋转方向。注意:需要开启“自动旋转”才能有效检查,否则均为Surface.ROTATION_0(手机以竖屏为主,一般都会0,但不保证都如此)。不是所以的手机都能检测到这4个值,例如我的P6,没有Surface.ROTATION_180,即UI不支持倒过来,如果有某个数值不支持,通过getRotation()获取的数值可能并不准确,仍以P6为例,如果我们顺时针转90°,得到Surface.ROTATION_90,继续顺时针转至180°,无检测新数值,仍未Surface.ROTATION_90,再继续顺时针转90°(至270°),仍显示为Surface.ROTATION_90,而非Surface.ROTATION_270。
int rotation = window.getDefaultDisplay().getRotation(); //在Android2.2之前,为Display.getOrientation(),如果出现API和SDK 的API level相关,可通过Build.VERSION.SDK_INT获得。

我们将手机平放在桌子上,通过加速度测量仪的x、y、z轴的数值,x、y为0,z为g,可以进行判断,但是我们并不知道具体的朝向,平放是朝南还是向北,这需要地磁感应器,将在后面介绍。

下面的小例子,我们将对加速度测量仪的x,y,z数值进行修正处理,减去重力加速度,得到我们这个惯性系的加速度,并根据设备的Y轴与垂直地面方向(重力反方向)的夹角。相关的代码片段如下:

……

private float[] gravity = new float[3];   //重力在设备x、y、z轴上的分量
private float[] motion = new float[3];  //过滤掉重力后,加速度在x、y、z上的分量
private double ratioY; 
private double angle; 
private int counter = 1; 

@Override 
public void onSensorChanged(SensorEvent event) {  
    for(int i = 0 ; i < 3; i ++){ 
        /* accelermeter是很敏感的,看之前小例子的log就知道。因为重力是恒力,我们移动设备,它的变化不会太快,不象摇晃手机这样的外力那样突然。因此通过low-pass filter对重力进行过滤。这个低通滤波器的权重,我们使用了0.1和0.9,当然也可以设置为0.2和0.8。 */
        gravity[i] = (float) (0.1 * event.values[i] + 0.9 * gravity[i]); 
        motion[i] = event.values[i] - gravity[i]; 
    } 
    
    //计算重力在Y轴方向的量,即G*cos(α) 
    ratioY = gravity[1]/SensorManager.GRAVITY_EARTH; 
    if(ratioY > 1.0) 
        ratioY = 1.0; 
    if(ratioY < -1.0) 
        ratioY = -1.0; 
    //获得α的值,根据z轴的方向修正其正负值。 
    angle = Math.toDegrees(Math.acos(ratioY)); 
    if(gravity[2] < 0) 
        angle = - angle; 
    
    //避免频繁扫屏,每10次变化显示一次值 
    if(counter ++ % 10 == 0){ 
        tv.setText("Raw Values : \n" 
                +  "   x,y,z = "+ event.values[0] + "," + event.values[1] + "," + event.values[2] + "\n"
                +  "Gravity values : \n" 
                +  "   x,y,z = "+ gravity[0] + "," + gravity[1] + "," + gravity[2] + "\n"
                +  "Motion values : \n" 
                +  "   x,y,z = "+ motion[0] + "," + motion[1] + "," + motion[2] + "\n"
                +  "Y轴角度 :" + angle    ); 
        tv.invalidate(); 
        counter = 1; 
    }     
} 

……

motion[3]是过滤重力后的数值,如果各值如果非常接近0,表示设备没有被移动。

相关小例子代码: Pro Android学习:传感器小例子

相关链接:我的Android开发相关文章

Android使用陀螺仪 在Android应用中使用陀螺仪可以帮助实现各种功能,比如游戏控制、虚拟现实体验、运动追踪等。首先,需要获取设备上的陀螺仪传感器服务。可以通过类来获取。使用注册一个陀螺仪传感器监听器,以便获取传感器数据。监听器会在手机的陀螺仪传感器有新数据时得到通知。一旦注册了监听器,就可以在相应的回调方法中处理陀螺仪传感器提供的数据。通常,陀螺仪传感器提供的数据包括角速度(角速度变化率)等信息。可以根据陀螺仪传感器提供的数据,实现自定义的功能。例如,可以根据角速度数据计算设备的姿态、方向或者用于控制游戏。 阅读详情

相关推荐

Pro Android学习笔记(一五四:传感器(4:陀螺仪、加速传感器

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文章转载只能用于非商业

skdhfdfc的博客 561

Android开发经验谈:这份字节跳动历年校招Android面试真题解析,薪资翻倍

前言 职场的“金三银四”跳槽季过去了,但是紧接着,眼下“金九银十”又来了。 不同的是今年比往年「冷」一些,形式更加严峻一些,大家多多少少可能都听到或看到一些信息,就是好多公司在优化裁员,作为求职者来说,面试是一道坎,很多人会恐惧面试,即使是工作很多年的老鸟,可能仍存在面试的焦虑。 这些题目是我之前的面试去腾讯、虎牙、美团、阿里、快手等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。 由于涉及到的面试题较多导致篇幅较长,我根据这些面试题所涉及到的常问范围总结了并做出了

fanzhang_vip0723的博客 555

安卓设备完美使用索尼DualShock 4手柄:DS4Android开源方案详解

在移动游戏和安卓应用开发中,实现精准的物理外设控制是一个常见需求,其核心在于理解安卓系统的输入栈和HID(人机接口设备)协议。通过建立系统级的输入驱动模拟器,可以将非标准外设信号翻译为安卓系统能够原生识别的标准化输入事件,从而突破原生兼容性限制,释放硬件全部潜力。这项技术的价值在于为开发者提供了底层输入控制的深度定制能力,并为用户带来了主机级的操控体验。其应用场景广泛,包括移动游戏、云游戏串流、安卓TV交互以及无障碍辅助操作等。本文聚焦的DS4Android项目,正是这一技术原理的典型实践,它通过**虚拟设

weixin_34138056的博客 352

Android开发者指南-运动传感器!!!!!!!!!

传感器: Motion Sensors 英文原文:http://developer.android.com/guide/topics/sensors/sensors_motion.html 版本:Android 4.0 r1 译者注:黄色底色为未决译文 在本文中 使用加速度计 使用重力传感器 使用陀螺仪 使用线性加速度计 使用旋转向量传感器

dylancao的专栏 2084

智能穿戴及传感器调研:第一阶段

智能穿戴设备的传感器及移动计算调研:第一阶段 腕部穿戴设备:手环,手表 Apple Watch Series 6 ¥3199+ 功能 加速度传感器 陀螺仪 血氧传感器 电极式心率传感器 光学心率传感器 环境光传感器 气压传感器 GPS 磁力计 测量步数 √ 久坐提醒 √ 摔倒检测 √ 运动时状态检测分析提示 √ √ 运动后体能状态反馈 √ √ √ 测量心率 √ √ 测量血氧饱和度

weixin_41843993的博客 3097

BMX055_九轴_bmx055芯片手册_九轴传感器_bmx055_

博世九轴传感器,三轴加速度,三轴陀螺仪,三轴磁力计

Pro Android学习笔记(一五四) 传感器(4) 陀螺仪 加速传感器

Pro Android学习笔记(一五四) 传感器(4) 陀螺仪 加速传感器

qq_43724942的博客 346

【智能机器人开发全流程:硬件选型、软件架构与ROS实战,打造高效机器人系统】

通过模块化设计与ROS框架的灵活扩展,可快速搭建适应不同场景的机器人系统。实际开发中需重点关注。

dally2的博客 6034

Gyroflow视频防抖工具:利用陀螺仪数据实现专业级稳定效果

Gyroflow是一款基于陀螺仪运动数据的开源视频稳定工具,通过精确分析相机内置或外接传感器的运动信息,为各类视频素材提供专业级防抖处理。无论您是运动相机爱好者、无人机飞手还是专业影视制作人员,这款工具都能帮助您消除画面抖动,获得流畅自然的视觉体验。 ## 核心功能与工作原理 ### 陀螺仪数据驱动的稳定技术 Gyroflow的核心原理是利用相机内置或外部设备的陀螺仪传感器数据来精确计算每一

gitblog_00679的博客 979

数字IC设计避坑指南:为什么477条net的DRV问题无法修复?解析don‘t touch hierarchy的影响

本文深入解析了数字IC后端实现中,因“don't touch hierarchy”约束导致大量DRV违规(如477条net)无法自动修复的根本原因。文章以Cadence Innovus工具为例,详细阐述了DRV修复机制与设计保护约束的冲突原理,并提供了从日志定位、风险评估到分级解除约束的完整实战策略,帮助工程师有效解决此类设计收敛难题。

hope8的博客 288

ADS2023实战:2.4GHz超外差接收机从设计到链路预算全流程解析

本文以ADS 2023软件为平台,详细解析了2.4GHz超外差接收机从核心指标定义、架构原理到完整链路搭建与仿真的全流程。通过实战演练,重点阐述了如何利用ADS进行谐波平衡仿真和链路预算分析,以量化评估系统增益、噪声系数等关键性能,为射频工程师提供了一套从理论到仿真的系统级设计方法。

herb5的博客 816

荣耀play4tpro有没有鸿蒙,荣耀play4tpro有nfc吗?没有 只能借助支付宝等

荣耀play4tpro作为一款性价比不错的手机很多用户都是想要知道这款手机是否支持陀螺仪,有没有nfc功能,现在就有小编来为大家详细解答吧。一、荣耀play4tpro支持陀螺仪吗?荣耀play4tpro不支持陀螺仪,但是这款手机是中有系统调用重力传感器来模拟出电子陀螺仪。手机陀螺仪常见作用1、导航陀螺仪自被发明开始,就用于导航,先是德国人将其应用在V1、V2火箭上,因此,如果配合GPS,手机的导航...

weixin_36463131的博客 10万+

全志T113s3主线linux开发(0)--基础准备

嵌入式Linux设备的启动大概是三步:1)启动芯片+内存:常见的是Uboot,不过全志的Uboot主线对SPI NAND 不太友好,用TF卡就方便。对于T113S芯片,推荐使用Awboot,简陋但快速。开发阶段用这个就方便好多,对SPINAND支持也方便。2)启动linux内核:主线内核以下通篇都用6.13以上的内核。对比tina5.0还在用5.4 ,主要是性能、安全上有变化。6.0以上内核在devicetree的编写具体格式上有了变化,网上大量tina5.0和5.4内核的编写方式不适用。

2301_79234138的博客 2246

Qt for Android——QSensor传感器与传感器手势的使用

一、前景介绍 在我们用Qt进行Android应用开发的时候,免不了要对一些设备的传感器或者收回进行监测。比如摇晃手机、翻转手机、接电话时等等。QSensor为我们的开发提供了便利,让我们能够获取到这些信息和手势,从而进行我们对应的处理。 二、传感器和传感器手势 传感器相关的类(如QGyroscope)可以获取到传感器的信息,比如陀螺仪、线性加速度等等,但通常...

zhounixing的博客 4288

RK3588+YT9215快速拓展以太网口

YT9215支持7个端口的非阻塞数据传输,确保高效的数据流处理;在开发过程中,最重要的一点就是YT9215与RK3588的GMAC连接和配置部分,下面是gmac1对应dtsi文件的修改,包括注释掉rgmii_phy1对应的mdio1,以及gmac1对应的phy-handle部分,同时将gmac1修改成1000Mbps全双工模式。这就是最简单,最快速的RK3588拓展网口的方法了,如果需要用到交换芯片的其他功能,那就不可以直接使用原厂提供的bin,而是需要对YT9215进行另外的驱动开发。

带着耳朵取流浪的博客 2784

第14.10章 高翔博士最新开源框架Lightning-LM源码解读(十):在线定位run_loc_online涉及到的核心模块总结

本文对Lightning-LM激光SLAM定位框架进行了全面剖析。该框架是一个轻量高效的激光雷达建图与定位系统,支持3D SLAM、动态图层管理等功能。文章首先介绍了项目概况和源码结构,包括核心模块如定位系统(loc_system)、激光匹配(lidar_loc)和位姿图优化(pose_graph)等。接着详细解析了各模块的关键函数和运行流程,如数据接收处理、NDT匹配和位姿优化等。最后总结了学习该框架所需的C++知识要点,包括智能指针、多线程编程等现代C++特性。该分析为SLAM开发者提供了实用的架构参考

行知SLAM 801

Pro Android学习笔记(一五七) 传感器(7) 其他一些传感器

Pro Android学习笔记(一五七) 传感器(7) 其他一些传感器

skdhfdfc的博客 309

2023年五一数学建模 | 第二十届五一数学建模C题:“双碳”目标下低碳建筑研究

2023年五一数学建模 | 第二十届五一数学建模C题:“双碳”目标下低碳建筑研究

前程算法屋的博客 1377

Pro Android学习笔记(一五一) 传感器(1) 传感器列表

Pro Android学习笔记(一五一) 传感器(1) 传感器列表

skdhfdfc的博客 344

windsurf中出现无法Connecting to server的解决方案

本文主要介绍了windsurf中出现无法Connecting to server的解决方案,希望能对使用windsurf的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 6万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

OpCore-Simplify:黑苹果一键生成 OpenCore EFI

Windows 里跑完 Hardware Sniffer,终端里打印着导出进度,`SysReport/` 下即将出现 `Report.json`。对很多人来说,下一步才是卡壳的地方:CPU 和显卡各自支持到哪个 macOS 版本、该写哪些 SSDT 补丁、config.plist 里两百多个键值填什么,全要对着攻略一条条查。OpCore-Simplify 就是从这一步接手的:喂给它硬件报告,它输出

gitblog_00586的博客 834

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Pro Android学习笔记(一五七):传感器(7):其他一些传感器

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处http://blog.youkuaiyun.com/flowingflying/以及作者@恺风Wei。 重力传感器(Gravity Sensors) 重力传感器不是物理传感器,是在加速度传感器的基础上,结合其他的硬件,例如陀螺仪,获得更精确的数据。其读数含义同加速度传感器。 线性加速度传感器(Linear Accele

愷风(Wei)的专栏 7167

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 安卓中运行报错Error:Execution failed for task ':app:transformClassesWithDexForDebug'解决
下一篇: Android裁剪bitmap文件为正方形
hypercube2
博客等级 码龄18年 23粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值