Android项目之利用手机传感器做惯性导航
利用手机的传感器做手机的姿态解算,利用扩展卡尔曼滤波算法获得手机的航向角、偏航角和滚转角。再进一步做人步行的惯性导航。
需要程序的源码请联系~~~
整体规划:
1.获得手机传感器的数据,实时发送到电脑。
加上时间戳——日期加精确的ms数。
2.在电脑端接收数据,并保存为指定格式
3.运用扩展卡尔曼滤波算法进行手机的姿态解算
4.做惯性导航的计算
1.Android使用到的技术
1.1 Android开发中保留两位小数
我用的是方法三。。。。
参考链接:https://blog.csdn.net/qq_36487432/article/details/81904207
方法一:
BigDecimal bg = new BigDecimal(xx);double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
方法二:
DecimalFormat df = new DecimalFormat("#.00");df.format(xx)
方法三:
String.format("%.2f", xx);
方法四:
NumberFormat nf = NumberFormat.getNumberInstance();nf.setMaximumFractionDigits(2);nf.format(xx);
1.2 Android传感器的使用
传感器的采样率
a) SENSOR_DELAY_NOMAL (200000微秒) 200ms
b) SENSOR_DELAY_UI (60000微秒) 60ms
c) SENSOR_DELAY_GAME (20000微秒) 20ms
d) SENSOR_DELAY_FASTEST (0微秒) 0ms
设置采样率方法:以下每个传感器函数的最后都有一个设置采样率的参数,如下面代码中的SensorManager.SENSOR_DELAY_NORMAL
传感器的属性
//传感器的名字
String sensorName=event.sensor.getName();
//传感器制造商的名字
String sensorVendor=event.sensor.getVendor();
//传感器的分辨率,传感器所能识别的最小的精度是多少
float sensorRevolution=event.sensor.getResolution();
//传感器的功率
float sensorPower=event.sensor.getPower();
//传感器取得数据的时间是多少
double timeStamp=event.timestamp;
第一、加速度传感器
SensorManager sm = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);//创建一个SensorManager对象,用来管理或者获取传感器//加速度传感器
Sensor acc = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//为该传感器注册一个事件,直接使用内部类
sm.registerListener(new SensorEventListener() {@Overridepublic void onSensorChanged(SensorEvent event) {txtx.setText("x方向的加速度为:" + String.format("%.2f", event.values[0]) + "m/s2");txty.setText("y方向的加速度为:" + String.format("%.2f", event.values[1]) + "m/s2");txtz.setText("z方向的加速度为:" + String.format("%.2f", event.values[2]) + "m/s2");}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}
}, acc, SensorManager.SENSOR_DELAY_NORMAL);
第二、方向传感器
//方向传感器
Sensor direc = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);
//为该传感器注册一个事件,直接使用内部类
sm.registerListener(new SensorEventListener() {@Overridepublic void onSensorChanged(SensorEvent event) {txtxx.setText("x方向为:" + String.format("%.2f", event.values[0])+ "度");txtyy.setText("y方向为:" + String.format("%.2f", event.values[1])+ "度");txtzz.setText("z方向为:" + String.format("%.2f", event.values[2])+ "度");}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}
}, direc, SensorManager.SENSOR_DELAY_NORMAL);
第三、陀螺仪传感器
//陀螺仪传感器
Sensor tuoluo = sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
//为该传感器注册一个事件,直接使用内部类
sm.registerListener(new SensorEventListener() {@Overridepublic void onSensorChanged(SensorEvent event) {txtxxx.setText("x方向的陀螺仪为:" + String.format("%.2f", event.values[0])+ "rad/s");txtyyy.setText("y方向的陀螺仪为:" + String.format("%.2f", event.values[1])+ "rad/s");txtzzz.setText("z方向的陀螺仪为:" + String.format("%.2f", event.values[2])+ "rad/s");}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}
}, tuoluo, SensorManager.SENSOR_DELAY_NORMAL);
第四、线性加速度传感器
//线性加速度传感器
Sensor lineacc = sm.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
//为该传感器注册一个事件,直接使用内部类
sm.registerListener(new SensorEventListener() {@Overridepublic void onSensorChanged(SensorEvent event) {txtxxxx.setText("x方向的线性加速度为:" + String.format("%.2f", event.values[0]) + "m/s2");txtyyyy.setText("y方向的线性加速度为:" + String.format("%.2f", event.values[1]) + "m/s2");txtzzzz.setText("z方向的线性加速度为:" + String.format("%.2f", event.values[2]) + "m/s2");}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}
}, lineacc, SensorManager.SENSOR_DELAY_NORMAL);
第五、重力传感器
//重力传感器
Sensor sr = sm.getDefaultSensor(Sensor.TYPE_GRAVITY);//根据Sensor下枚举获得对应的传感器对象
//为该传感器注册一个事件,直接使用内部类
sm.registerListener(new SensorEventListener() {@Overridepublic void onSensorChanged(SensorEvent event) {txtxxxxx.setText("x方向的重力加速度为:" + String.format("%.2f", event.values[0]) + "m/s2");txtyyyyy.setText("y方向的重力加速度为:" + String.format("%.2f", event.values[1]) + "m/s2");txtzzzzz.setText("z方向的重力加速度为:" + String.format("%.2f", event.values[2]) + "m/s2");}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}
}, sr, SensorManager.SENSOR_DELAY_NORMAL);
1.3 手机利用socket作为TCP客户端发送数据给电脑
参考链接:https://www.cnblogs.com/zhangqie/p/8876059.html
步骤1:添加权限,在AndroidManife.xml中
<uses-permission android:name="android.permission.INTERNET"/>
步骤2:开启新线程,现在要求TCP通信必须在非UI线程中开启
在最开始定义socket
Socket socket_my;
在onCreate中定义新线程,线程在syncRunnable函数中运行
//开网络通信线程
SyncRunnable syncRunnable = new SyncRunnable();//定义Runnable接口
Thread thread = new Thread(syncRunnable, "syncRunnable");//定义新线程
thread.start();//开启新线程
在新线程执行函数中开启网络通信
public class SyncRunnable implements Runnable {@Overridepublic void run() {synchronized (this) {//建立连接try {socket_my = new Socket("192.168.1.5", 8086);} catch (IOException e) {e.printStackTrace();}// try {
// socket = new DatagramSocket(4534);//本机的接收端口号
// serverAddress = InetAddress.getByName("192.168.1.5");//发送到的IP
// } catch (Exception e) {
// e.printStackTrace();
// }while (true) {String sendData = "12345";//发送的数据}}}}
发送数据给服务端
try {// socket.getInputStream()DataOutputStream writer = new DataOutputStream(socket_my.getOutputStream());writer.writeUTF("嘿嘿,你好啊,服务器.."); // 写一个UTF-8的信息System.out.println("发送消息");
} catch (IOException e) {e.printStackTrace();
}
接收服务端发送的数据
//接收数据
byte[] buffer = new byte[10000];
InputStream inputStream = null;
try {inputStream = socket_my.getInputStream();
} catch (IOException e) {e.printStackTrace();
}
DataInputStream input = new DataInputStream(inputStream);
int length = 0;
try {length = input.read(buffer);
} catch (IOException e) {e.printStackTrace();
}
String Msg = null;
try {Msg = new String(buffer, 0, length, "gb2312");
} catch (UnsupportedEncodingException e) {e.printStackTrace();
}
Log.e("data:", Msg);
System.out.println("***Msg***"+Msg);
未完待续~~~~
Android项目之利用手机传感器做惯性导航相关推荐
- 使用 Qt for Android 获取并利用手机传感器数据(上篇)开发环境省心搭建
现代手机拥有许多传感器,包括地磁.姿态.GPS.光照.温度.气压.摄像.声音.电磁等,完全就是一个高度集成的科学仪器.不夸张的说,一部手机加上一个外围的计算机和控制系统,做一个功能较强的自主移动机器人 ...
- 使用 Qt for Android 获取并利用手机传感器数据(下篇)使用C++实现功能
在上一篇,我们搭建了开发环境.本篇,使用C++代码真正实现功能.我们使用UDP协议从手机上指定发送的目的地.端口.效果如下图,完整工程参考https://gitcode.net/coloreagles ...
- 开发android项目实战,Android 项目实战:手机安全卫士开发案例解析
Android 项目实战:手机安全卫士开发案例解析 作 者:王家林,王家俊,王家虎 出版时间:2013 丛编项:移动互联应用开发系列 内容简介 本书通过对一款手机安全卫士开发案例的详细解析,讲解了一个 ...
- 怎么利用手机App做任务赚钱
废话不多说,怎么利用手机App做任务赚钱,我们来看一下具体操作步骤: 首先我们电脑上下载好Total Control,这是一个电脑多控手机的软件,这类软件很多,但是这款软件是我发掘到的最好用最便宜的一 ...
- Android移动开发-利用加速度传感器开发仿微信摇一摇功能的实现
加速度传感器是最常见的传感器,大部分Android手机都内置了加速度传感器,加速度传感器运用最广泛的功能就是微信的摇一摇功能,用户通过摇晃手机寻找周围的人,其它类似的应用还摇骰子.玩游戏等. 下面以摇 ...
- Android项目中调起手机地图导航
现在,移动应用中集成地图已经成为一种趋势.导航 - 作为地图中不可或缺的一项功能,被很多移动应用所青睐,然而,导航方式选择上,为了减少不必要的资源和apk容量,一般应用都选择通过调用第三方的地图应用来 ...
- Android项目实战_手机安全卫士拦截骚扰
###1.骚扰拦截需求分析 1.界面 1.1 黑名单列表界面 1.2 添加黑名单界面 2.功能 2.1 黑名单的添加.删除 2.2 拦截电话 2.3 拦截短信 ###2.黑名单数据库的创建 1.分析需 ...
- Android项目实战_手机安全卫士软件管家
###1.应用程序信息的flags 1. int flags = packageInfo.applicationInfo.flags 2. 0000 0000 0000 0000 0000 0000 ...
- android 项目中打开手机上优酷,腾讯等播放器或任何软件。
项目中点击一个空间打开手机上以安装的播放器, PackageManager packageManager = getActivity().getPackageManager(); ...
- 基于IndRNN的手机传感器动作识别
近日,来自山东大学和电子科技大学的研究者提出了基于 IndRNN 模型利用手机传感器实现动作识别的网络,该模型解决了现有 RNN 模型的梯度消失和梯度爆炸问题,一定程度上实现了动作识别的用户独立性,同 ...
最新文章
- 【数据库(二)】嵌套子查询
- DrawIcon 和 DrawIconEx都失真
- NSIS修改开始菜单中图标
- 软件技术专业-就业提示(IT类详细岗位分化)
- 记账本开发进程第四天
- 搜索推荐中的召回匹配模型综述(三):基于匹配函数学习的深度学习方法
- 【转载】Python线程、进程和协程详解
- UITextView自定义placeholder功能:用一个label写了文字,然后当检测到长度不为0的时候就把label隐藏...
- MAC PHP Composer
- Eclipse的自动build选项,制造时别忘了选上~
- 计算机科学与技术是属于什么学科,计算机科学与技术专业属于什么大类 属于哪个学科...
- 程序员外包兼职平台介绍
- STM32串口3 映射和完全重映射 PB10 PB11 PD8 PD9 PC10 PC11
- 机器学习、深度学习、神经网络还傻傻分不清吗?
- 有关神经网络的训练算法,神经网络算法通俗解释
- 股权转让项目:沈阳派尔化学有限公司55%股权转让
- 名帖60 褚遂良 小楷临《王羲之乐毅论》
- 服务器上Ubuntu系统安装
- 惠普前高管欧明哲任联想台湾区总经理
- 学习多种编程语言的益处
热门文章
- FLV视频格式解码软件开发
- 计算机二级北京工业大学耿丹学院官网,北京工业大学耿丹学院
- ROG GL552VW BIOS 编程器官方固件
- 【智能柜领域】智能快递柜终端系统Axure原型作品(另有智能柜整套作品)
- mysql怎么设置001,[MySQL光速入门]001 让MySQL跑起来
- 关于苹果开发证书、发布证书、开发推送证书、发布推送证书的申请
- 计算机组成与设计第五版课后答案ch04,数据结构第4章例题与答案
- xampp 配置php运行环境
- csapp lab环境搭建及lab1wp
- 纸带打点计算机是什么原理,从电火花打点计时器高清拆解图,分析构造,详细解读电路工作原理...