利用手机的传感器做手机的姿态解算,利用扩展卡尔曼滤波算法获得手机的航向角、偏航角和滚转角。再进一步做人步行的惯性导航。

需要程序的源码请联系~~~

整体规划:

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项目之利用手机传感器做惯性导航相关推荐

  1. 使用 Qt for Android 获取并利用手机传感器数据(上篇)开发环境省心搭建

    现代手机拥有许多传感器,包括地磁.姿态.GPS.光照.温度.气压.摄像.声音.电磁等,完全就是一个高度集成的科学仪器.不夸张的说,一部手机加上一个外围的计算机和控制系统,做一个功能较强的自主移动机器人 ...

  2. 使用 Qt for Android 获取并利用手机传感器数据(下篇)使用C++实现功能

    在上一篇,我们搭建了开发环境.本篇,使用C++代码真正实现功能.我们使用UDP协议从手机上指定发送的目的地.端口.效果如下图,完整工程参考https://gitcode.net/coloreagles ...

  3. 开发android项目实战,Android 项目实战:手机安全卫士开发案例解析

    Android 项目实战:手机安全卫士开发案例解析 作 者:王家林,王家俊,王家虎 出版时间:2013 丛编项:移动互联应用开发系列 内容简介 本书通过对一款手机安全卫士开发案例的详细解析,讲解了一个 ...

  4. 怎么利用手机App做任务赚钱

    废话不多说,怎么利用手机App做任务赚钱,我们来看一下具体操作步骤: 首先我们电脑上下载好Total Control,这是一个电脑多控手机的软件,这类软件很多,但是这款软件是我发掘到的最好用最便宜的一 ...

  5. Android移动开发-利用加速度传感器开发仿微信摇一摇功能的实现

    加速度传感器是最常见的传感器,大部分Android手机都内置了加速度传感器,加速度传感器运用最广泛的功能就是微信的摇一摇功能,用户通过摇晃手机寻找周围的人,其它类似的应用还摇骰子.玩游戏等. 下面以摇 ...

  6. Android项目中调起手机地图导航

    现在,移动应用中集成地图已经成为一种趋势.导航 - 作为地图中不可或缺的一项功能,被很多移动应用所青睐,然而,导航方式选择上,为了减少不必要的资源和apk容量,一般应用都选择通过调用第三方的地图应用来 ...

  7. Android项目实战_手机安全卫士拦截骚扰

    ###1.骚扰拦截需求分析 1.界面 1.1 黑名单列表界面 1.2 添加黑名单界面 2.功能 2.1 黑名单的添加.删除 2.2 拦截电话 2.3 拦截短信 ###2.黑名单数据库的创建 1.分析需 ...

  8. Android项目实战_手机安全卫士软件管家

    ###1.应用程序信息的flags 1. int flags = packageInfo.applicationInfo.flags 2. 0000 0000 0000 0000 0000 0000 ...

  9. android 项目中打开手机上优酷,腾讯等播放器或任何软件。

    项目中点击一个空间打开手机上以安装的播放器, PackageManager packageManager = getActivity().getPackageManager();            ...

  10. 基于IndRNN的手机传感器动作识别

    近日,来自山东大学和电子科技大学的研究者提出了基于 IndRNN 模型利用手机传感器实现动作识别的网络,该模型解决了现有 RNN 模型的梯度消失和梯度爆炸问题,一定程度上实现了动作识别的用户独立性,同 ...

最新文章

  1. 【数据库(二)】嵌套子查询
  2. DrawIcon 和 DrawIconEx都失真
  3. NSIS修改开始菜单中图标
  4. 软件技术专业-就业提示(IT类详细岗位分化)
  5. 记账本开发进程第四天
  6. 搜索推荐中的召回匹配模型综述(三):基于匹配函数学习的深度学习方法
  7. 【转载】Python线程、进程和协程详解
  8. UITextView自定义placeholder功能:用一个label写了文字,然后当检测到长度不为0的时候就把label隐藏...
  9. MAC PHP Composer
  10. Eclipse的自动build选项,制造时别忘了选上~
  11. 计算机科学与技术是属于什么学科,计算机科学与技术专业属于什么大类 属于哪个学科...
  12. 程序员外包兼职平台介绍
  13. STM32串口3 映射和完全重映射 PB10 PB11 PD8 PD9 PC10 PC11
  14. 机器学习、深度学习、神经网络还傻傻分不清吗?
  15. 有关神经网络的训练算法,神经网络算法通俗解释
  16. 股权转让项目:沈阳派尔化学有限公司55%股权转让
  17. 名帖60 褚遂良 小楷临《王羲之乐毅论》
  18. 服务器上Ubuntu系统安装
  19. 惠普前高管欧明哲任联想台湾区总经理
  20. 学习多种编程语言的益处

热门文章

  1. FLV视频格式解码软件开发
  2. 计算机二级北京工业大学耿丹学院官网,北京工业大学耿丹学院
  3. ROG GL552VW BIOS 编程器官方固件
  4. 【智能柜领域】智能快递柜终端系统Axure原型作品(另有智能柜整套作品)
  5. mysql怎么设置001,[MySQL光速入门]001 让MySQL跑起来
  6. 关于苹果开发证书、发布证书、开发推送证书、发布推送证书的申请
  7. 计算机组成与设计第五版课后答案ch04,数据结构第4章例题与答案
  8. xampp 配置php运行环境
  9. csapp lab环境搭建及lab1wp
  10. 纸带打点计算机是什么原理,从电火花打点计时器高清拆解图,分析构造,详细解读电路工作原理...