# Android-PSINSToolbox **Repository Path**: robertwang-INS/android-psinstoolbox ## Basic Information - **Project Name**: Android-PSINSToolbox - **Description**: Android手机采集IMU数据后,用严老师的PSNS工具箱(http://www.psins.org.cn/kydm)完成组合导航或者航姿解算。 虽然手机中的IMU精度较低,但是还是可以用手机平台实现完整的组合导航解算功能。对于组合导航算法、MEMS航姿算法学习有一定帮助。 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: https://zhuanlan.zhihu.com/p/401588028 - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 20 - **Created**: 2023-12-02 - **Last Updated**: 2023-12-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Android-PSINSToolbox 2.0 (Alpha) --- # 包括伪距数据的传感器数据采集Service已经完成 ## IMU、磁场、气压数据 这几个传感器的采样率比较高,之前是把所有的数据采集、预处理和保存都放到MainActivity中,所以有时候会丢失数据,时间戳也有问题。现在用SensorsService实现这几个100Hz的传感器数据采集。 新版本数据保存时,会在最后两列放上GNSS周秒数据,用于和GNSS数据作时间对齐。 ## GNSS数据 GNSS数据和伪距数据采样率低,之前采集GNSS定位数据保存是没有问题的。这一次更改了GNSS数据格式,新格式为: | Vel-E | Vel-N | Vel-U | Pos-E | Pos-N | Pos-U | Vel-Err | Pos-Err | Week | Second | Android的GNSS接口提供的时间为Unix时间,所以需要自己转换成周秒。 ```java long unixsec = location.getTime()/1000 - UnixSecErr + LeapSecond; gnssdata[0] = (double) ((int) unixsec/604800); // 周 gnssdata[1] = (double) unixsec%604800; // 秒 ``` ## 伪距数据 根据谷歌的说法,大多数设备都可以提供原始测量数据,但是实际操作起来相关的资料很少。开发者网站的指南也比较简单,提供的各种工具倒是非常多,可以下载GNSS Logger App测试和采数,同时提供了丰富的Matlab程序用于数据处理和分析。 > 大多数在 2016 年或之后生产并且搭载 Android 7.0 或更高版本的设备都可以提供 GNSS 数据。 根据设备的不同,GNSS 原始测量数据可以包含以下全部或部分数据: - 伪距和伪距率。 - 导航消息。 - 累计变化量或载波。 - 硬件 (HW) 时钟。 手机采集到的伪距数据(室内靠窗测试,不够稳定) 卫星序号四大系统120颗导航卫星的排序。 --- 1 加入了一个Android Studio工程压缩包,方便在次基础上作二次开发。 2 这个工程也是根据我上传的源代码新建的,花上10分钟就能配置好,中间也没有什么特殊的问题,只需要导入源码后根据提示修改包名就可以了。C++代码需要右键工程通过"Add C++ Module"进行添加。 3 正如介绍中所说,这个代码写的比较随意,写的时候完全没有进行设计与优化,很多功能都是一边学习一边调试,如果有一定的Android开发或者面向对象编程基础,还是建议仅仅把源码作为参考,不要让其中的缺点限制后续开发。 --- ## 介绍 项目可实现Android设备上运动传感器以及GNSS数据读取,整理数据后使用PSINS Toolbox(C++)版本实现实时组合导航解算。虽然智能手机中的传感器精度较低,很难实现精确定位解算,获取有意义的导航结果,但是获取传感器数据较为容易,可以作为学习Android开发、IMU等传感器数据采集与处理,和PSINS工具箱学习的简单应用实例。 这一版本没有进行程序设计规划,在项目进行时,一直是想到什么就写什么,所以程序结构比较乱,代码没有精简优化,可读性不强。如有改进意见可以留言评论。 ## 软件架构 程序主要功能都在MainActivity中实现,创建时就完成所有控件的初始化、为传感器和GNSS注册监听器。消息处理主要更新数据显示,在不同传感器更新后按照设置的间隔刷新数据显示内容。 手机中IMU的传感器精度较低,在获取数据后首先按固定时间进行数据平滑,然后再进行低通滤波,将滤波后的结果作为导航解算的输入值。 ## 安装教程 直接下载网页右侧发行版安装,App需要获取定位权限,并保证手机定位打开,否则会可能出现闪退 部分手机可能存在没有IMU数据的情况 ## 使用说明 ### (1)二次开发说明 MainActivity中的IMUdataTask定时完成传感器数据平滑与异常值隔离,并根据导航状态进行解算。 MainActivity的最后几行是PSINS工具箱(C++)的函数接口,分别实现航姿算法初始化、航姿解算更新、KFApp初始化、KF参数设置、KF时间更新、KF量测更新。如有需要可以在native-lib.cpp中修改以上函数的实例。 ### (2)数据更新 程序启动后会自动开始接收手机运动传感器数据,包括IMU、磁场强度、气压传感器和GNSS。所以手机需要打开系统精确位置开关,同时授权应用位置获取、文件读取等权限。由于手机硬件差异和厂商设置的不同,部分手机会读取不到IMU传感器数据,开发平台是小米10系列,所以小米手机使用应当没什么问题。 ### (3)功能按键 底部有7个按键,但是因为是在程序调试过程中临时加上的,所以使用逻辑有些混乱。 [**KF参数设置**] 根据使用情况调整KF参数,或回复成默认参数; [**开始航姿解算**] 利用角速度、加速度和磁场数据进行航姿解算,得到的姿态作为组合导航的初始姿态角; [**组合导航**] 完成KF初始化,进行KF组合导航; [**保存数据**] 保存传感器数据、导航数据与KF状态与协方差数据,组合导航开始后自动进行数据保存; [**关于应用**] 显示应用说明、数据保存格式等; [**打开文件**] 使用系统文件管理器,打开保存的数据(*Android11及以上版本无法打开,待优化*); [**微信分享**] 调用微信分享API发送数据(*旧的函数无法使用,尚未完成*)。 ## 测试结果 | 机型 |测试结果| |-------------------|-----| |xiaomi 10 pro |正常 | |xiaomi 10 |正常 | |xiaomi mix2s |正常 | |xiaomi 6 |正常 | |Honor |正常 | ## 参与贡献 杨小康 Android程序开发 杨 浩 软件测试