CN108985533B - 一种基于Android平台的运动管理系统和方法 - Google Patents
一种基于Android平台的运动管理系统和方法 Download PDFInfo
- Publication number
- CN108985533B CN108985533B CN201710407386.1A CN201710407386A CN108985533B CN 108985533 B CN108985533 B CN 108985533B CN 201710407386 A CN201710407386 A CN 201710407386A CN 108985533 B CN108985533 B CN 108985533B
- Authority
- CN
- China
- Prior art keywords
- data
- user
- motion
- value
- interface
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06Q—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
- G06Q10/00—Administration; Management
- G06Q10/06—Resources, workflows, human or project management; Enterprise or organisation planning; Enterprise or organisation modelling
- G06Q10/063—Operations research, analysis or management
- G06Q10/0639—Performance analysis of employees; Performance analysis of enterprise or organisation operations
- G06Q10/06393—Score-carding, benchmarking or key performance indicator [KPI] analysis
Landscapes
- Business, Economics & Management (AREA)
- Human Resources & Organizations (AREA)
- Engineering & Computer Science (AREA)
- Strategic Management (AREA)
- Development Economics (AREA)
- Economics (AREA)
- Entrepreneurship & Innovation (AREA)
- Educational Administration (AREA)
- Operations Research (AREA)
- Marketing (AREA)
- Game Theory and Decision Science (AREA)
- Quality & Reliability (AREA)
- Tourism & Hospitality (AREA)
- Physics & Mathematics (AREA)
- General Business, Economics & Management (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Measurement Of The Respiration, Hearing Ability, Form, And Blood Characteristics Of Living Organisms (AREA)
- Mobile Radio Communication Systems (AREA)
Abstract
本发明实施例提出了一种基于Android平台的运动管理系统和方法,包括:姿态识别子系统、运动方案管理子系统、运动数据统计子系统;其中所述姿态识别子系统包括:静态状态识别模块、行走状态识别模块、跑步状态识别模块;其中所述运动数据统计子系统包括:轨迹绘制模块、运动轨迹绘制模块。
Description
技术领域
本发明属于电子技术领域,尤其涉及一种基于Android平台的运动管理系统和方法。
背景技术
随着技术的发展,各种各样的可穿戴设备逐渐开始普及,其中智能手环一直是一种最常见的可穿戴设备。现有的可穿戴设备(例如智能手环)大多设有计步电路、蓝牙通讯电路,以通过蓝牙连接移动终端(可以为智能手机、平板电脑、PDA等基于Android操作系统的设备),并通过移动终端对计步电路的输出信号进行统计以获取跑步健身数据。但是由于各种不可避免的误差,导致最终的计步结果以及随之产生的运动轨迹计算、运动数据计算都会不够精确。
发明内容
针对现有技术中存在的跑步健身数据不准确的问题,本发明要解决的技术问题是提供一种基于Android平台的运动管理系统和方法,能够更为准确的确定使用者的状态以精确进行计步,提高计算的可靠性。
为了解决上述问题,本发明实施例提出了一种基于Android平台的运动管理系统,包括:姿态识别子系统、运动方案管理子系统、运动数据统计子系统;
其中所述姿态识别子系统包括:静态状态识别模块、行走状态识别模块、跑步状态识别模块;
其中静止状态识别模块执行以下操作:
步骤11、取连续十个相邻拐点差值的绝对值|Δavr|,如果该连续十个相邻拐点差值的绝对值|Δavr|均小于4.5714,则预判断当前状态为静止状态;否则步骤结束;
步骤12、如果连续十个相邻拐点差值的绝对值|Δavr|之间的时间间隔为0.6s以内,则判断当前状态为静止状态;如果连续十个相邻拐点差值的绝对值|Δavr|之间的时间间隔大于0.6s,则需要判断0.6s内所有|Δavr|是否均小于4.5714;如果是则判断当前状态为静止状态,否则判断当前状态为运动状态;
步骤13、获取步伐判断量|Δstep|,其最大值为1.2253,若此时计步阀值小于1.2253,则当前数据为抖动;
其中行走状态识别模块执行以下操作:通过以下参数判断当前状态是否为行走状态:
其中行走状态下三轴加速度传感器的三轴加速度值Aaccx、Aaccy、Aaccz均为非零值,其中X轴加速度值Aaccx在大小为236.0604的值附近上下波动,其中Y轴加速度值Aaccx在大小为220.197的数值附近上下波动,其中Z轴加速度值Aaccz在大小为239.6163的值附近上下波动;且加速度平均值mAvr在大小为229.0932的值附近上下波动;
如果连续m个相邻拐点差值的绝对值|Δavr|都大于56.274,且小于130.7574,则认为当前状态为行走状态;
其中跑步状态识别模块执行以下操作:通过以下参数判断当前状态是否为跑步状态:
如果连续m个相邻拐点差值的绝对值|Δavr|均大于130.7574,则认为当前状态为跑步状态;
其中所述运动方案管理子系统包括:创建模块、编辑模块、显示模块;
所述创建模块用于从运动方案数据库中调用预设的健身方案模板并通过所述显示模块显示给用户,其中所述健身方案模板中至少包括三个预设的运动方案:初级运动方案、中级运动方案、高级运动方案;其中每一预设的运动方案中包括预设的运动参数;且所述创建模块还用于根据用户输入对所述预设的方案进行调整并存储到运动方案数据库中;所述创建模块还用于提取空白运动模板以根据用户选择的运动参数生成自定义运动方案并存储到运动方案数据库;
所述编辑模块用于读取所述运动方案数据库中存储的运动方案并以列表通过显示模块进行显示,并根据用户选择的运动方案调用显示模块将该运动方案对应的运动参数显示给用户;还用于接收用户输入以对运动方案的运动参数进行修改或是删除运动方案,并相应更新运动方案数据库;
所述显示模块用于读取根据创建模块和编辑模块的数据进行显示;
其中所述运动参数至少包括以下的一种:目标计步值、运动项目、每一运动项目的目标值、目标总运动量、目标消耗量、运动时间段;
其中所述创建模块执行以下操作:
在PlanShowActivity界面顶部设置有一个创建按键以监听函数调用startActivityForResult()跳转到创建页面,创建页面利用ListView控件将健身方案模板中的设的运动方案以列表形式进行显示;且所述创建页面上有详情按键以被选中的运动方案的运动参数显示给用户;
在用户完成创建步骤时PlanShowActivity界面通过OnActivityResult()函数获取用户输入的数据存储到运动方案数据库;
在用户点击非详情按键的位置时ListView的点击监听函数会调用setResult()方法将选中运动方案的ID及信息返回给PlanShowActivity,并调用finish()方法销毁PlanCreateActivity界面;
其中所述编辑模块执行以下操作:
编辑模块调用显示模块的PlanShowActivity界面以将运动方案数据库中存储的运动方案以列表形式显示,当用户点击运动方案时ListView点击事件监听函数会调用startActivityForResult()函数跳转到PlanEditActivity界面,并调用运动方案数据库的查询函数来查询该运动方案的信息,然后调用ProgressBar显示该运动方案的完成度;
编辑模块在接收到用户点击开始训练按钮后,按钮点击事件监听函数会调用startActivity()函数将界面跳转至首页并等待用户开启训练,同时PlanEditActivity界面会调用finish()函数销毁界面;
编辑模块在接收到用户点击删除按钮后,按钮点击事件监听函数会调用运动方案数据库的删除方法删除数据,并调用finish()函数销毁界面,同时调用setResult()方法返回删除命令以指示显示界面删除该运动方案;
其中,所述显示模块执行以下操作:
通过PlanShowActivity界面初始化ListView控件,然后查询free_running.db数据库中用户自建的所有运动方案,最后将查询的方案显示在列表中;
当用户创建或删除运动方案时,PlanShowActivity界面调用OnActivityResult()函数接收目标Activity页面返回的信息,并根据返回的信息调整ListView函数的显示;
其中所述运动数据统计子系统包括:轨迹绘制模块、运动轨迹绘制步骤。
轨迹绘制模块,用于根据计步结果调用高德地图绘制出用户的运动轨迹;具体包括:
初始化步骤:
步骤21、利用Android Studio,在Terminal中输入>keytool–list–keystorekeystore.jks,以获取sha1值;
步骤22、利用获取的Sha1值在高德地图控制台添加key值以获取高德地图开发的API key参数;
步骤23、在系统中添加并加载以下依赖包:
地图jar包:Android_Map_V2.0.4.jar
定位jar包:MapApiLocation.jar
搜索jar包:MapApiSearch.jar;三个jar包(即地图jar包、定位jar包及搜索jar包),将jar包作为项目的依赖包使用,需要在gradle文件中设置依赖语句:
步骤24、将获取的API key参数配置到系统的AndroidManifest.xml文件中并进行配置;
运动轨迹绘制步骤:
步骤31、初始化高德地图设置,并开启定位;判断定位是否成功,如果否则步骤结束;
步骤32、调用回调函数onLocationChanged()返回AMapLocation对象,使用AMapLocation对象的getXXX()方法获取到定位参数,所述定位参数包括:经纬度、地址信息、错误码;
步骤32、利用连续两次定位的经纬度生成移动轨迹,包括:
mAMap.addPolyline(mPolylineOptions)
.add(mLatLngList.get(k-1),mLatLngList.get(k).color(Color.BLACK);
其中,mAMap为高德地图的MapView对象,用来显示地图界面;color()方法用来设置线段颜色;add()方法用来在地图上绘制两点之间的线段,接收参数为LatLng对象。代码中mLatLngList为存储LatLng型数据的集合,mLatLngList.get(k-1)表示起始点,mLatLngList.get(k)表示结束点;addPolyline()方法用来将Polyline对象添加到地图上,接收参数为PolylineOptions对象,PolylineOptions对象可设置线段的宽度、颜色等信息;
在每次绘制线段之后调用postInvalidate()方法刷新地图以显示出绘制的运动轨迹;
步骤33、当用户结束运动时,调用stopLocation()方法结束定位,同时停止运动轨迹的绘制;并将绘制的全部运动轨迹进行存储。
同时,本发明实施例还提出了一种基于Android平台的运动管理系统,包括:姿态识别子方法、运动方案管理子方法、运动数据统计子方法。该方法与前述系统相对应,在此不再赘述。
本发明的上述技术方案的有益效果如下:本发明实施例提出了一种基于Android平台的运动管理系统和方法,能够针对不同用户提供不同的运动方案,并能够更为精准的确定使用者的姿态,同时还提出了更为准确的计步、轨迹计算方法,以实现更为精确的用户运动计量和提醒,提高数据的可靠性,提高用户的使用体验。
附图说明
图1为本发明实施例的运动方案管理系统的整体架构图;
图2为本发明实施例的运动方案的创建模块的工作流程图;
图3为本发明实施例的运动方案创建界面;
图4为本发明实施例的运动方案的编辑模块的工作流程图;
图5为本发明实施例的运动方案编辑界面;
图6为本发明实施例的显示模块的工作流程图;
图7为本发明实施例的运动方案显示界面;
图8为本发明实施例的基于Android平台的运动数据统计系统的整体架构图;
图9为本发明实施例的计步算法的工作流程图;
图10为本发明实施例的计步条件算法的工作流程图;
图11为本发明实施例的计步分析结果示意图;
图12为本发明实施例的使用sha1值查询结果示意图;
图13为本发明实施例的高德地图APIKey申请结果示意图;
图14为本发明实施例的高德地图APIKey及权限配置示意图;
图15为本发明实施例的高德地图运动轨迹的绘制流程图;
图16为本发明实施例的高德地图初始化对象及参数说明示意图;
图17为本发明实施例的方法在高德地图上绘制出的运动轨迹;
图18为行走与跑步的运动能耗对比图;
图19为静止状态下的三轴加速度计的输出波形;
图20为行走状态下的三轴加速度计的输出波形;
图21为跑步状态下的三轴加速度计的输出波形;
图22为验证码发送流程图;
图23为注册操作流程图;
图24为登录操作流程图;
图25为个人资料获取流程图;
图26为个人资料修改流程图;
图27为个人资料上传流程图;
图28为个人资料下载流程图;
图29为本发明实施例的个人中心框架图;
图30为历史数据查询结果示意图;
图31为获取天气展示示意图;
图32为数据库实体对象示意图;
图33为user实体EER示意图;
图34为天气实体EER示意图;
图35为运动数据实体EER示意图;
图36为实体之间的关联示意图;
图37为user_info表结构示意图;
图38为weather表结构示意图;
图39为motion_parameter表结构示意图。
具体实施方式
为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。
针对现有技术中运动轨迹绘制不准确的问题,本发明实施例提出了一种基于Android客户端的步行运动管理APP软件是基于jdk1.8.0_65、jre1.8.0_65开发环境和xUtils框架,采用Android Studio、MYSQL开发工具开发完成。软件实现对步行(跑步)运动健身管理。包括运动方案管理、运动数据计算、运动轨迹绘制、运动状态识别以及用户注册、个人数据管理等功能。
一、步行运动方案管理整体功能设计
软件给出了三种最常用的步行(跑步)健身方案:一种是适合初学者、老人的初级运动方案;一种是适合学生、上班族的中级运动方案;一种是适合跑步达人的专业运动方案。初级方案主要以健康状况和体能的评估作为制定方案的依据,中级方案主要以有氧运动标准作为制定方案的依据,高级方案以运动员训练标准作为制定方案的依据。运动方案主要实现运动方案的创建、展示及编辑功能,其实现框架如图1。
由图1可知,运动方案管理功能模块主要由三个Activity组成:由PlanCreateActivity类创建的“运动方案创建”界面、由PlanEditActivity类创建的“运动方案编辑”界面,由PlanShowActivity类创建的“运动方案展示”界面。
1.运动方案的创建
运动方案创建流程如图2。运动方案的创建需要“运动方案展示”界面和“运动方案创建”界面的联合运作才能实现。在PlanShowActivity界面顶部设置有一个“创建”button(button监听函数调用startActivityForResult()方法实现界面跳转,使用该方法可以获得目标Activity的返回参数),点击button可进入由PlanCreateActivity类创建的“运动方案创建”界面。界面会将运动方案以列表形式展示给用户(列表使用ListView控件生成),列表项设置有“详情”按钮,用户可点击“详情”按钮查看方案详情。当用户点击某一列表项除“详情”按钮以外的任何地方时,会触发ListView的点击监听函数,该函数会调用setResult()方法将选中运动方案的id及相关方案信息返回给PlanShowActivity,并调用finish()方法销毁PlanCreateActivity界面。如果PlanShowActivity界面通过OnActivityResult()函数获取到相关数据,并成功存储到本地数据库中,则表示该运动方案创建成功,效果如图3。
2.运动方案的编辑
图4为编辑功能实现流程图。编辑功能的实现需要PlanShowActivity界面的配合。在单击运动方案之后,ListView点击事件监听函数会调用startActivityForResult()函数跳转到PlanEditActivity界面。跳转之后,编辑程序会调用数据库查询函数查询该方案的信息,然后调用ProgressBar显示该方案的进度。数据库查询代码如下:
MPlan=mDbUtils.findAll(Selector.from(MyPlan.class).where(“plan_id”.”=”,num))
其中,mPlan为ArrayList<MyPlan>数组,用来接收查询到的数据。mDbUtils为操作free_running.db数据库的全局变量。在application中初始化,其生命周期跟随App生命周期。“plan_id”为需要巡查的字段,“num”指当前运动方案“plan_id”的编号,MyPlan为方案的实体类。
除显示当前方案的进度外,编辑功能还需实现开启训练和删除方案两个操作。当点击“开始训练”按钮,按钮点击事件监听函数会调用startActivity()函数将界面跳转至首页,等待用户开启训练,同时PlanEditActivity会调用finish()函数销毁界面。当点击“删除”按钮时,按钮点击事件监听函数会调用数据库删除方法删除数据,之后销毁该页面,并调用setResult()方法返回删除命令,指示展示界面删除该方案。数据库删除代码如下:
MDbUtils.delete(Myplan.class,WhereBuilder.b(“plan_id”,“=”,num);
编辑功能效果如图5。
3.运动方案展示
图6为展示功能实现流程。运动方案展示界面主要用来展示用户的自建跑步方案,同时也为运动方案的创建和编辑提供必要的支持。由图6可知,PlanShowActivity界面首先会初始化ListView控件,然后查询free_running.db数据库中用户自建的所有运动方案,最后将查询的方案显示在列表中,从而实现数据显示功能。其数据库查询代码如下:
mMyPlan=mDbUtils.findAll(MyPlan.class);
其中,findAll()为数据库查询函数,用来查询当前用户自建的所有运动方案,mMyPlan为ArrayList<MyPlan>数组,用来暂存查询到的所有运动方案。
由于用户创建和删除运动方案的操作均会影响到PlanShowActivity界面的显示。所以,该页面会调用OnActivityResult()函数接收目标Activity页面返回的信息,并根据返回信息调整ListView的显示。OnActivityResult()有三个参数,分别为请求码requestCode(int型)、返回码resultCode(int型)及“意图”data(intent型)。其中,data用来处理两个Activity之间传值的问题,可使用data.getXXXExtra()方法可获取Activity返回数据。requestCode用来标识发送请求的Activity,resultCode用来区分是哪个Activity返回的信息。
本模块设置PlanCreateActivity的resultCode为“0”,PlanEditActivity的resultCod为“1”。若接收到的resultCode为“0”,则将返回的运动方案添加到该页面的ListView列表中(同时将信息储到本地数据库),若接收到的resultCode为“1”,则判断返回的信息是否为删除指令,若为删除指令则删除该方案,否则保留该方案。展示功能效果如图7。
二、运动数据统计功能的实现
运动数据统计模块主要用来实现三个功能:计步功能、运动轨迹绘制功能及相关运动数据的计算功能。本模块的框架如图8。
1.计步功能的实现
计步算法是实现计步功能的关键部分,传统计步算法采用简单阈值控制算法来识别运动步伐,是利用阈值将采集到的加速度波形分为运动区和非运动区两部分,对处于非运动区的数据将不做处理,对于处于运动区域的数据,进行波谷检测,并将检测到的波谷数记作跑步累计步数。计算过程简单、数据处理量小,能够满足大众的初级需求。但算法存在识别率低,统计数据不准确,极易受外界不稳定因素影响等缺点。因此,为解决以上问题,设计提出了一种改进的基于三轴加速度传感器的自适应计步算法。根据人体运动规律,改进计步算法的实现流程如图9。
第一步为蓝牙的连接。此步骤主要用来为数据的传输建立通道。采用4.0通讯协议。两个设备的连接需要首先开启一个BluetoothServerSocket server(即蓝牙Socket通讯服务),Android中使用listenUsingRfcommWithServiceRecord(String,UUID)方法获取一个BluetoothServerSocket,参数String为主机名称,UUID为通用唯一标识符(两个设备通过UUID进行匹配),两个参数均由SDP(蓝牙服务发现协议,Service DiscoveryProtocol)记录。获取的BluetoothServerSocket用于监听其他蓝牙设备的接连请求(设计连接设备为DA14580),若是有其他设备接受了主机发送的连接请求,则建立一个可进行双向数据传输的BluetoothSocket,通讯方式为Notification。
第二步为数据的接收。此步骤主要用来实时接收从机发送过来的数据(此处接收传感器测量到的加速度值),开启一个新的线程。从机DA14580使用函数attmdb_att_set_value()更新attribute database中的值,使用prf_server_send_event()方法发送携带有特征值的notification。APP则使用socket的getInputStream()方法获取数据流,最后通过自定义方法解析获取的数据。
第三步为数据来源的判断。主要用来判断该数据是否来自手环的加速度传感器。设计设定传送数据的长度为18个字节,其中前三个字节为数据来源表示码,若解析的数据中前三位为“acc”,则表示而此段特征值来自三轴加速度传感器。在确定了数据来源于加速度传感器后,便可对信号进行处理,从而识别步伐信息。若第四位为“0”,则表示x轴的值,为“1”则表示y轴的值,“2”则表示z轴的值。结束标志位为“end”。
计步算法具体实现步骤如下:
①修正三轴加速度传感器传递过来的三个特征值
由于用户的跑步海拔、所处地方地磁强度的不同,会对加速度的测量造成一定的影响。为最大程度上消除以上因素引起的误差,设计对x、y、z三个轴上的加速度值做了修正补偿,修正公式如下:
Aacc=Ccompsation+Vvalues×K (公式1)
其中,Aacc为修正值,Ccompsation为加速度补偿量,Vvalues为某一方向上的加速度值,K为比例系数。Ccompsation由海拔高度决定。当海拔在2000米以下时设定补偿量为245,当海拔在2000米到4000米范围时设定补偿量为255,当海拔在4000米以上时设定补偿量为265。K为比例系数,控制信号缩放比的关键量,其计算公式:
从式可以看出,比例系数与加速度补偿量成正比关系,式中Mmax为地球表面最大磁场强度。
②计算平均值
计算公式如下:
mAvr=(Aaccx+Aaccy+Aaccz)/3 (公式3)
其中,mAvr为加速度平均值,Aaccx为X轴上的加速度分量,Aaccy为y轴上的加速度分量,Aaccz为z轴上的加速度分量。
②判断被测点的前一个值是否为拐点
由mAvr绘制的波形图记为函数F(t),将被测点记作F(t0),将被测点的前两个值分别定义为F(t1)(流程图中的F(t前))、F(t2)。然后计算F(t1)与F(t2)差值,记作Δ1。计算F(t1)与F(t0)差值,记作Δ2。若Δ1、Δ2异号则认为F(t1)为拐点,反之则认为F(t1)不为拐点。若为极值点,则将极值点存入数组集合mExtremums中,进入下一步计算,否则结束本次判断。
④计算该极值点与上一极值点的差值,并取绝对值。
该步骤即计算相邻波峰波谷之差的绝对值,计算公式:
|Δ|=|Ek-Ek-1| (公式4)
其中,|Δ|为两极值点差值的绝对值,也是识别运动步伐的判断依据(判断所需特征值),Ek为本次测量出的拐点,Ek-1为记录的上一个极值点。
⑤判断特征值是否满足计步条件
在获取到|Δ|之后,则可使用|Δ|来判断本次采样数据是否满足计步条件,若满足计步条件则记录一步,否则记录相关数据,退出本次判断。使用|Δ|判断是否满足计步条件的流程图如图10。
由流程图10可知,|Δ|需要满足五个条件才能使计步程序记录一步,且记上次计算值为|Δ|1。
第一个条件为识别区间的确定条件。|Δ|大于阈值的部分为运动识别区,小于阈值的部分为非识别区。阈值即为灵敏度。灵敏度过高或过低均会给计步造成较大误差,所以,只有选择了正确的阈值才能使计步更加准确。
第二个条件为|Δ|1是否合理的判断条件。若|Δ|1相比当前|Δ|小于阈值,即|Δ|1<|Δ|/4,则认为上一次波动为抖动干扰,将不能进入下一步判断,否则认为|Δ|1合理数据,可以进入下一步判断。
第三个条件为当前|Δ|是否合理的判断条件。在判定|Δ|1有效的情况下可以进一步判断当前|Δ|是否合理。若当前|Δ|大于三分之二倍的|Δ|1时,则认为|Δ|为合理数据,可以进入下一步判断。若|Δ|值过小,则认为本次波动为抖动干扰,将不能进入下一步判断。
第四个条件为波谷判断条件。由人体的运动规律可知,完成迈步的动作不可能出现在波峰阶段。所以,如果满足条件的拐点为波峰数据,则舍弃;如果为波谷数据,则进入下一个判断条件。
最后一个判断条件为时间间隔判断条件。人体的最快运动频率为50Hz,即两步之间的时间间隔最小为0.2s,所以设计设置该判断条件来滤除高频噪声干扰。
⑥记录相关数据
设计的计步算法为一种自适应算法,即当前数据的计算需要使用到上一步的相关数据。软件将本次计算的数据保存到相应数组中,以供下次判断调用。使用计步算法分析步伐的效果如图11。
2.运动轨迹绘制功能实现
(1)高德地图的配置实现
运动轨迹绘制使用高德地图SDK开发,详配置细步骤如下:
①获取app的sha1安全码
打开Android Studio,在Terminal中输入如下命令:
>keytool–list–keystore keystore.jks
其中,“-list”命令是被查询项以列表形式展现,“-keystore”是密库查询指令,“keystore.jks”为具体密匙的路径,设计使用sha1值查询结果如图12。
②申请高德地图API key
在高德地图控制台web页面创建“FreeRunning”项目。点击“添加新key”按钮,打开添加key的对话框,输入第一步中获取的sha1值,并填写其他必填项,最后点击“提交”按钮便可获取到高德地图开发的API key。获取的API key如图13。
③添加依赖包
运动轨迹绘制主要用到了Android_Map_V2.0.4.jar、MapApiLocation.jar及MapApiSearch.jar三个jar包(即地图jar包、定位jar包及搜索jar包),将jar包作为项目的依赖包使用,需要在gradle文件中设置依赖语句:
dependencies{
……
compile files('libs/Android_Map_V2.0.4.jar')
compile files('libs/MapApiLocation.jar')
compile files('libs/MapApiSearch.jar')}
④配置API Key及相应权限
申请到key之后,便可在AndroidManifest.xml中配置申请到的key及使用到的权限,具体配置如图14。
(2)运动轨迹的绘制
运动轨迹的绘制流程图如图15。由图15可知,程序开始时需要初始化高德地图的相关对象及参数。高德地图相关对象及参数的设置、说明如图16。参数设置完成之后,用户点击“开始跑步”按钮开启定位。若定位成功,系统会调用回调函数onLocationChanged()返回AMapLocation对象,使用AMapLocation对象的getXXX()方法可获取到所需信息(经纬度、地址信息及错误码)。运动轨迹是由多个连贯点的集合线段组成,每一个小线段可由相邻两个经纬度绘制出,绘制小线段的代码如下:
mAMap.addPolyline(mPolylineOptions)
.add(mLatLngList.get(k-1),mLatLngList.get(k).color(Color.BLACK);
其中,mAMap为高德MapView对象,用来显示地图界面;color()方法用来设置线段颜色;add()方法用来在地图上绘制两点之间的线段,接收参数为LatLng对象。代码中mLatLngList为存储LatLng型数据的集合,mLatLngList.get(k-1)表示起始点,mLatLngList.get(k)表示结束点;addPolyline()方法用来将Polyline对象添加到地图上,接收参数为PolylineOptions对象,PolylineOptions对象可设置线段的宽度、颜色等信息。每次绘制线段之后调用postInvalidate()方法刷新地图,只有刷新地图之后才能显示绘制的线段。
当用户点击“结束跑步”按钮时,调用stopLocation()方法结束定位,同时停止运动轨迹的绘制工作。在轨迹绘制完成之后,跑步运动中获取的所有经纬度会通过“http:www.freerunning.com:8080/api/user/data/{user_id}/up/{flag}”接口上传到后台服务器中。Requestbody携带的json数据格式如下:
{
“trajectory”:[
{latitude”:”32.98763”,
“longitude”:88.23423”,},
……
]}
运动轨迹的绘制结果如图17。
3.相关运动数据计算
采用建立SportsDataUtils工具类管理相关运动数据的计算方法,该类中设立的计算方法和功能说明如表1。
表1运动数据的计算方法及功能说明表
(1)运动能耗计算
采用AEE算法计算人体运动能耗。图18为75公斤、175cm男子不同速度下行走/跑步实际能耗与该算法计算值的比较。从图中可以看出,计算结果与实际能耗相差不大。
AEE算法公式如下:
其中,KEaee为人体运动能耗,k为修正参数,其值经测算为0.016,m为用户身体质量,加速度a为三轴加速度的几何平均值,t为运动持续时间,计算公式如下:
其中,TAx、TAy、TAz分别为X、Y、Z轴方向上的加速度分量。如果将能量的消耗用不同颜色加以区分,则可结合前面的方法绘制出显示实时能耗的运动轨迹。
(2)运动距离的计算
①计算两次定位之间的距离
设本次定位的点为M(结束点),坐标为(Mlng,Mlat),上一次定位的点为N(起始点),坐标为(Nlng,Nlat)。其中,Mlng为结束点M的经度,由mLatLngList.get(k).getLongitude()方法获取;Mlat为结束点M的纬度,由mLatLngList.get(k).getLatitude()方法获取;Nlng为起始点N的经度,由mLatLngList.get(k-1).getLongitude()方法获取;Nlat为起始点N的纬度,由mLatLngList.get(k-1).getLatitude()方法获取。
获取的经纬度需要进一步转换为弧度进行计算,转换之后M点坐标表示为(RMlng,RMlat),N点坐标表示为(RNlng,RNlat)。Java算法中计算两经纬度之间距离的公式:
其中,L为两点之间的距离,单位为千米,ER为地球半径,此处取地球平均半径值(6371.004千米)。具体实现代码如下:
public static double totalDistance(double mlng,double mlat,doublenlng,double nlat)
{double l=2*R*Math.asin(Math.sqrt(Math.pow(Math.sin((cm(mlat)-cm(mlat))/2),2)
+Math.cos(cm(mlat)) //R为地球半径,6371.004千米
*Math.cos(cm(nlat)) //cm(double rad)为弧度转换函数
*Math.pow(Math.sin((cm(nlat)-cm(nlng))/2),2)));
return l;}
②计算运动距离
每定位一次便计算一次相邻两次定位之间的距离,这些小线段长度相加,便可得到最终的运动距离。计算公式如下:
(3)其他运动数据计算
(1)实时运动速度计算
由于两次定位之间的时间非常短(只有500ms),可以将两次定位之间的平均速度看作是实时运动速度,其计算公式如下:
Vrt=L/t (公式9)
具体实现代码如下:
public static double realTimeSpeed(double 1,double t){double rts=1/t,return s;}
(2)平均运动速度计算
平均速度用来描述用户在跑步过程中整体速度的快慢程度,计算公式如下:
V=Ltot/T (公式10)
其中,V为平均速度,Ltot为跑步距离,T为跑步持续时间。具体实现代码如下:
public static double averageSpeed(double 1,double t){double rts=1/t,return s;}
三、运动状态识别模块的实现
运动状态识别主要用来识别三种运动状态:静止、行走与跑步。通过大量实验,统计出了不同运动状态下加速度数据的不同特征值,并用这些特征值反过来识别人体相应的运动状态。在获取到用户较多数据之后,还可以动态修改不同运动状态下计步阈值的大小,从而适应不同用户的运动习惯(计步阈值为初始值)。实验中被测者身高为175cm,体重75公斤的成年男子,被测加速度均为经过滤波、放大、补偿的修正值,非原值。
运动状态识别的特征值为相邻拐点差值的绝对值,若|Δ|>4.5714(统计值)则认为波形有效,不可忽略。否则,将此波动看作噪声干扰,不予计算(静止状态下特殊考虑)。
1.静止状态识别
图19为人体静止状态下相关数据统计图。图19的前三个数据为各个轴上的加速度值,人体在静止状态下各个轴上的加速度基本保持不变。其中,垂直方向加速度受重力影响为非零值(修正后数值为200),其余方向上加速度在零值附近波动(噪声和谐波干扰造成的波动。另外,采集数据时被测者身体晃动也会造成非垂直方向上加速度的波动。其修正后数值为235,不为零值)。
第四个数据为加速度平均值mAvr,其最大值为224.2693,最小值为222.84,其差值绝对值最大只有1.4293,小于4.5714。所以,需要做特殊处理,方法如下:
(1)取连续N个|Δ|(经测试N为10时效果较为良好),如果N个连续|Δ|均小于4.5714,则可初步认为为静止状态,此时需要进一步判断。
(2)如果这N个连续值持续时间大于0.6s(人体行走频率最快为50Hz,0.6s为极限情况下迈出三步所需时间),则认为此时处于静止状态。满足则认为运动者处于静止状态,不满足则认为为运动状态。
计步阈值确定:步伐判断量|Δ|最大值为1.2253,若此时计步阈值小于1.2253,则会将抖动误认为迈出动作。所以,静止状态下应将计步阈值设置为大于1.2253的值,即静止状态下计步阈值的下限为1.2253。计步阈值的上限由行走状态下mAvr波谷振幅最小处对应的|Δ|决定(该值为49.9981)。为取得最佳计步效果,计步阈值确定为阈值上下限的平均值(计算为25.6117),这样既能保证不将身体抖动误认为跑步动作,也可以保证不将个别较大干扰波动误认为跑步动作。
2.行走状态识别
人体行走状态是一种有规律可循的周期性行为。忽略人体上体动作,人体迈出一步的动作可分解为左脚触地、右脚迈出、双脚触地三个阶段(另一组动作与之相同)。此过程中垂直方向上加速度值变化最大,但会在某一固定值附近上下波动,水平方向受惯性及摩擦力的影响,也会在某个固定值附近波动。此外,人体行走时不可避免的会发生左右晃动,此时也会在第三个坐标轴方向产生周期性波动。所以产生的mAvr也会周期性的在某个固定值附近发生小范围波动。人体行走状态下的数据统计如图20。
由图20可知,行走状态下Aaccx、Aaccy、Aaccz的值均为非零值,且具有很强的规律性。其中,Aaccx在大小为236.0604的值附近上下波动,Aaccx在大小为220.197的数值附近上下波动,而Aaccz在大小为239.6163的值附近上下波动,并且加速度平均值mAvr同样在大小为229.0932的值附近上下波动。
mAvr有效波形的最大值为261.044,最小为204.77,差值绝对值为56.274。所以,如果连续m个|Δ|均小于56.274,且大于4.5714(有效波形最小值),则认为人体处于行走状态。
计步阈值的确定:考虑到mAvr的波谷处代表一次有效计步,所以,计步阈值的上限为mAvr波谷振幅最小处对应的|Δ|(该值为49.9981),下限静止状态下的计步阈值,取平均值可得最终的计步阈值,其值为37.8049。
3.跑步状态识别
跑步运动的加速度变化状况与行走时基本相同,不同的地方在于其幅值波动更为剧烈,完成一个动作的周期更长,且有腾空期。图21为跑步状态下的统计数据。由图21展示的数据可知,mAvr有效波形的最大值为316.0027,最小为210.2453,其差值的绝对值为130.7574。如果连续m个|Δ|均小于130.7574且大于56.274(行走状态判别条件的最大值),则认为人体处于跑步状态。计步阈值的上限为mAvr波谷振幅最小处对应的|Δ|(该值为89.9981),下限为行走状态下的计步阈值,取平均值可得最终的计步阈值,其值为63.9015。
四、其他功能的实现
1.注册功能的设计与实现
注册模块实现主要分为两步完成:第一步为发送验证码操作,第二步为注册操作。具体操作步骤如下:
(1)发送验证码操作
图22为验证码发送流程。接收APP发送的验证码获取请求,使用随机数函数生成一个六位数验证码,生成的验证码在反馈给客户端APP做本地保存的同时,调用短信发送程序给用户发送一条验证码短信。
(2)注册操作
注册流程的control ler关键代码如下:
@RequestMapping(value="/api/register/users",method=RequestMethod.POST)
public ResponseEntity<Resp>registerMember(@RequestBody User user){
ResponseEntity<Resp>responseEntity=userService.register(user);
return responseEntity;}
本段代码采用Spring中注解方式完成数据的请求与响应。其中,Resp为响应体的bean类,User为用于解析请求体json数据的bean类,“value”即接口。Register()函数即为注册流程处理函数,其操作流程如图23。由图23可知,首先验证手机号。如果传递过来的手机号为空,则返回自定义错误码600,提示内容为“手机号缺失”。如果发现在数据库中存在此手机号,则说明此手机号已注册过,不可再注册,返回错误码401,提示内容为“此手机号已注册”。如果手机号不为空也并未被注册过,则将用户信息保存到数据库中,保存成功后设置返回码为200,告诉客户端已注册。
2.登录功能的设计与实现
录流程的Control ler代码如下:
@RequestMapping(value="/api/login",method=RequestMethod.POST)
public@ResponseEntity Resp userLogin(@RequestBody User user){
return userService.userLogin(user);}
其中,userLogin()函数即为登录流程处理函数,传入参数RequestBody携带Json数据。具体实现过程如图24。由图24可知,登录程序会将APP传递过来的user name和password依次放到数据库中进行查询。如果user name不存在则返回错误码400,提示信息设置为“账号不存在”;如果user name存在而password不正确,同样返回错误码400,而提示信息则设置为“密码错误”;如果两者均正确则设置返回码为200,提示用户登录成功。
3.数据交互功能的实现
设计定义了若干API接口来实现与web server交互的功能,APP可以使用这些接口访问server的相关功能与资源(即使用URL调用方式实现数据交互功能)。接口使用的通讯协议为http1.1,数据请求方式为GET与POST,Request host定义为“http://www.freeruning.com:8080”,response数据格式为Json,对应的bean文件为“Resp.java”,基本格式定义如下:
(1)个人中心接口设计
①个人资料获取接口设计
个人资料获取流程的代码如下:
@RequestMapping(value="/api/user/{user_id}/get",method=RequestMethod.GET)
public ResponseEntity<Resp>getUserInfo(@PathVariable String user_id){
return userService.getUserInfo(user_id);}
由以上代码可知,个人资料的获取接口为“/api/user/{user_id}/get”,请求方式为GET。具体数据获取函数为getUserInfo(),该函数传入参数为String型数据user_id。其具体实现过程如图25。由图25可知,个人资料获取程序首先连接数据库,然后查询user_info table。如果该表中存在传入的user_id,则将该user_id下的所有信息取出,反馈给用户,如果该表中不存在传入的user_id,则返回错误码400,提示信息设置为“该账户信息不存在”。
②个人资料修改接口
个人资料修改流程的代码如下:
@RequestMapping(value="/api/user/{user_id}/up",method=RequestMethod.POST)
public ResponseEntity<Resp>userUpInfo(@PathVariable String user_id,
@RequestBody JSONObject upInfo){
return userService.userUpInfo(user_id,upInfo);}
由上述代码可知,个人资料修改接口为“/api/user/{user_id}/up”,请求方式为POST。RequestBody携带数据为Json数据。实现函数为userUpInfo(),传入参数为user_id和upInfo,user_id数据类型为String,upInfo数据类型为JSONObject。该函数具体实现过程如图26。由图26可知,个人资料修改程序在接收到客户端发送来的POST请求后,首先将Request Body中的Json数据使用JSONObject工具类进行解析。解析后的数据传递到userBean类中(userBean为javaBean文件,包含个字段的get/set方法),然后将userBean作为参数传递到数据库保存函数save(),完成数据保存工作。最后个人资料修改程序返回ResponseEntity类,告诉客户端APP数据修改成功。
(2)个人数据管理接口设计
①个人数据上传接口
个人数据上传流程的代码如下:
@RequestMapping(value="/api/user/data/{user_id}/up/{flag}",
method=RequestMethod.POST)
public ResponseEntity<Resp>updata(@RequestBody JSONObject jsonData,
@PathVariable String user_id,
@PathVariable String flag)
{return userService.updata(jsonData,user_id,flag);}
由以上代码可知,个人数据的接口为“/api/user/data/{user_id}/up/{flag}”。其中,字段“flag”为数据类型判断字段,数据上传实现函数为updata(),传入参数为“jsonData”,“user_id”及“flag”,该函数具体实现过程如图27。由图27可知,个人数据上传程序在接收到客户端URL之后,首先对URL进行分析,从中提取出“user_id”及“flag”参数。“user_id”是唯一标识用户信息的字段,“flag”参数用来确定上传数据的类型。若“flag”为“0”,则代表上传天气信息;若“flag”为“1”,则代表上传生理参数;若“flag”为“2”,则代表上传运动数据;若“flag”为“3”,则代表上传所有数据;若“flag”的值不符合以上四种情况,则返回错误码400,表示请求错误。在确定好上传数据的类型之后,通过相应的bean解析对应Request Body中Json数据,然后调用dbDao类的save()函数,将解析好的数据存入对应table中。最后,返回ResponseEntiy类,通知客户端APP数据已存储成功。
②个人数据下载接口
个人数据下载流程的代码如下:
@RequestMapping(value="/api/user/data/{user_id}/down/{flag}",
method=RequestMethod.GET)
public ResponseEntity<Resp>downData(@PathVariable String user_id,
@PathVariable String flag)
{return userService.downData(user_id,flag);}
由上述代码可知,下载程序接口为“/api/user/data/{user_id}/down/{flag}”,实现函数为downData(),传入参数为“user_id”及“flag”。具体实现过程如图28。由图28可知,在获取到客户端GET请求之后,首先使用“flag”参数判断所要查询的数据类型,然后通过“user_id”查找出该用户相关数据,并将数据以map形式传入Resp bean中。最后返回ResponseEntity类,将数据传送到客户端。
4.个人中心的设计与实现
个人中心模块主要包括个人信息展管理功能和历史数据查询功能(包含生理参数查询和运动数据查询两部分),该模块主要由MyCenterAtivity类实现,组织框架如图29。
(1)个人信息管理模块设计
个人信息管理模块主要用来查看和修改用户基本资料。当用户做下拉操作,且手指未离开触摸屏时(手指未离开表示下拉操作并未完成),PullToRefreshListView的Header会提示用户下拉可获取最新个人资料。当用户完成下拉操作,即手指离开触摸屏时,会触发PullToRefreshListView的onPullDownToRefresh()函数,此函数为下拉操作的监听函数,获取个人资料的数据请求代码即放在此处构建。当数据获取成功后,个人信息管理模块会展示出用户最新个人信息。当用户需要修改个人信息时,则需要进入用户资料修改页面。用户修改项目后,可点击提交按钮发送修改请求。若服务器端返回码为200(即“ResultCode”的值为“200”),则证明资料修改成功,否则,提示“提交失败”信息,用户需重新提交数据请求。
获取资料接口为“http://www.freerunning.com:8080/api/user/{user_id}/get”,请求方式为GET,修改接口为“http://www.freerunning.com:8080/api/user/{user_id}/up”,请求方式为POST。
(2)历史数据查询模块设计
历史数据查询模块主要以图表的形式展示用户运动数据。设计使用MPAndroidChart开源图表库绘制相关数据,MPAndroidChart能够很好的支持多种常用图表,且与AChartEngine等其他图表库相比,该图表库更轻巧、更友好。此外,该图表库还支持数据高亮显示与图形缩放。
本模块由周报、月报、年报三部分组成,三个切换模块使用fragment实现。初始化完成后,会hide月报和年报fragment,show周报fragment,当点击事件触发相应的tab时,程序会hide其他fragment,show被点击的fragment。每个fragment中的图表均使用MPAndroidChart开源图表库绘制。
历史数据查询模块主要采用了两种图表显示形式:一种为平滑折线图,一种为柱状图。为更直观的表现不同数据的特征,设计使用平滑曲线图来展示能量消耗量等信息,使用柱状图来展示跑步步数等数据。获取所有数据的bean为AllData,ArrayList<T>中泛型T使用AllData代替,将ArrayList强制转换为自定义数据类型。mUserinfo为获取user信息的bean类,通过mUserinfo.getXXX()函数获取制定数据,也可以通过mUserinfo.setXXX()函数存储指定数据。图中各函数功能如表2。
表2历史数据查询各函数功能表
历史数据的查询接口为“http://www.freerunning.com:8080/api/user/data/{user_id}/up/{flag}”。其中,“{user_id}”为用户的ID,用来区分是哪个用户来查看历史数据,“{flag}”为查询哪种数据的标志量。若“flag”为“0”,则代表下载天气信息;若“flag”为“1”,则代表下载生理参数;若“flag”为“2”,则代表下载运动数据;若“flag”为“3”,则代表下载所有数据。设置“flag”为“3”,获取所以数据,结果如图30。
5.天气数据的获取
利用高德地图自带的天气预报API为跑步APP获取相关天气信息。其中,WeatherSearchQuery类构造函数用来设置需要查询天气的城市,以及需要获取的天气类型(1为实时天气,2为天气预报)。使用WeatherSearch类中的searchWeatherAsyn()方法异步请求数据,使用onWeatherForecastSearched()回调方法接收返回天气信息。解析天气之后,将天气信息展示给用户,同时上传到server,存储到weather表中。获取天气情况如图31。
四、数据库设计
图32为需要建立的数据库实体对象,这些实体对象由FreeRunning APP各个功能抽象出。主要工作是规划数据库实体对象的E-R图,其中user_info entity与其他entity之间需要使用foreign key进行关联。设计使用MySQL的WorkBench设计EER图。
1.user_info实体对象
“user_info”实体用来记录用户的基本信息。包括用户名ID(user_id)、qq(qq)、用户名(username)、用户密码(password)、注册时间(create_time)、上一次登录时间(last_login_time)、性别(gender)、体重(weight)、用户头像(user_avatar)、用户签名(user_signature)、邮箱(usere_email)、手机号码(user_tel)等属性。其中,用户ID(user_id)为本实体的唯一标识,数据类型为int型,可自增长,其他信息为用户相关资料信息。user实体ER图如图33。
2.天气实体对象
天气实体用来记录运动时的天气状况。主要包括天气数据编号(weather_id)、当前天气状况(now_temperature)、当前时间(weather_data_time)、一天中气温最高值与最低值(max_min_tmp)、当前天气详情(weather_details)、提交时间(weather_create_time)、外键约束(user_info_user_id)等属性。其中,FK的约束字段user_info_user_id依赖于user实体的主键user_id,weather_id为天气实体类别唯一标识,可自增长。天气实体对象EER图如图34。
3.运动数据实体
运动数据实体主要用来记录与用户跑步运动相关的数据。除主键(mp_id)外还包括跑步步数(mp_step_num)、卡路里消耗(mp_calorie)、上次提交数据时的运动姿势(mp_posture)、经度(mp_longitude)、纬度(mp_latitude)、速度(mp_speed)、实时速度(mp_real_time_speed)、创建时间(mp_create_time)及外键约束(user_info_user_id)等属性。其中,FK的约束字段user_info_user_id依赖于user实体的主键user_id,mp_id为运动数据实体类别唯一标识,可自增长。运动数据实体对象EER图如图35。
4.实体对象之间的关联
三个实体之间的关联即三张数据表之间的关联,由各模块之间的关系可知,user_info表为其余三表的父表,其关联图如36。
5.数据库逻辑结构设计
数据库逻辑结构设计EER Diagram转换为MySQL数据表结构,转换过程使用SQL语句实现。
(1)user_info(用户资料表)
user_info表结构如图37。
(2)weather(天气数据表)
weather表结构38。
(3)motion_parameter(运动参数数据表)
motion_parameter表结构如图39。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (9)
1.一种基于Android平台的运动管理系统,其特征在于,包括:姿态识别子系统、运动方案管理子系统、运动数据统计子系统;
其中所述姿态识别子系统包括:静态状态识别模块、行走状态识别模块、跑步状态识别模块;
其中静止状态识别模块执行以下操作:
步骤11、取连续十个相邻拐点差值的绝对值|Δavr|,如果该连续十个相邻拐点差值的绝对值|Δavr|均小于4.5714,则预判断当前状态为静止状态;否则步骤结束;
步骤12、如果连续十个相邻拐点差值的绝对值|Δavr|之间的时间间隔为0.6s以内,则判断当前状态为静止状态;如果连续十个相邻拐点差值的绝对值|Δavr|之间的时间间隔大于0.6s,则需要判断0.6s内所有|Δavr|是否均小于4.5714;如果是则判断当前状态为静止状态,否则判断当前状态为运动状态;
步骤13、获取步伐判断量|Δstep|,其最大值为1.2253,若此时计步阀值小于1.2253,则当前数据为抖动;
其中行走状态识别模块执行以下操作:通过以下参数判断当前状态是否为行走状态:
其中行走状态下三轴加速度传感器的三轴加速度值Aaccx、Aaccy、Aaccz均为非零值,其中X轴加速度值Aaccx在大小为236.0604的值附近上下波动,其中Y轴加速度值Aaccx在大小为220.197的数值附近上下波动,其中Z轴加速度值Aaccz在大小为239.6163的值附近上下波动;且加速度平均值mAvr在大小为229.0932的值附近上下波动;
如果连续m个相邻拐点差值的绝对值|Δavr|都大于56.274,且小于130.7574,则认为当前状态为行走状态;
其中跑步状态识别模块执行以下操作:通过以下参数判断当前状态是否为跑步状态:
如果连续m个相邻拐点差值的绝对值|Δavr|均大于130.7574,则认为当前状态为跑步状态;
其中所述运动方案管理子系统包括:创建模块、编辑模块、显示模块;
所述创建模块用于从运动方案数据库中调用预设的健身方案模板并通过所述显示模块显示给用户,其中所述健身方案模板中至少包括三个预设的运动方案:初级运动方案、中级运动方案、高级运动方案;其中每一预设的运动方案中包括预设的运动参数;且所述创建模块还用于根据用户输入对所述预设的方案进行调整并存储到运动方案数据库中;所述创建模块还用于提取空白运动模板以根据用户选择的运动参数生成自定义运动方案并存储到运动方案数据库;
所述编辑模块用于读取所述运动方案数据库中存储的运动方案并以列表通过显示模块进行显示,并根据用户选择的运动方案调用显示模块将该运动方案对应的运动参数显示给用户;还用于接收用户输入以对运动方案的运动参数进行修改或是删除运动方案,并相应更新运动方案数据库;
所述显示模块用于读取根据创建模块和编辑模块的数据进行显示;
其中所述运动参数至少包括以下的一种:目标计步值、运动项目、每一运动项目的目标值、目标总运动量、目标消耗量、运动时间段;
其中所述创建模块执行以下操作:
在PlanShowActivity界面顶部设置有一个创建按键以监听函数调用startActivityForResult()跳转到创建页面,创建页面利用ListView控件将健身方案模板中的设的运动方案以列表形式进行显示;且所述创建页面上有详情按键以被选中的运动方案的运动参数显示给用户;
在用户完成创建步骤时PlanShowActivity界面通过OnActivityResult()函数获取用户输入的数据存储到运动方案数据库;
在用户点击非详情按键的位置时ListView的点击监听函数会调用setResult()方法将选中运动方案的ID及信息返回给PlanShowActivity,并调用finish()方法销毁PlanCreateActivity界面;
其中所述编辑模块执行以下操作:
编辑模块调用显示模块的PlanShowActivity界面以将运动方案数据库中存储的运动方案以列表形式显示,当用户点击运动方案时ListView点击事件监听函数会调用startActivityForResult()函数跳转到PlanEditActivity界面,并调用运动方案数据库的查询函数来查询该运动方案的信息,然后调用ProgressBar显示该运动方案的完成度;
编辑模块在接收到用户点击开始训练按钮后,按钮点击事件监听函数会调用startActivity()函数将界面跳转至首页并等待用户开启训练,同时PlanEditActivity界面会调用finish()函数销毁界面;
编辑模块在接收到用户点击删除按钮后,按钮点击事件监听函数会调用运动方案数据库的删除方法删除数据,并调用finish()函数销毁界面,同时调用setResult()方法返回删除命令以指示显示界面删除该运动方案;
其中,所述显示模块执行以下操作:
通过PlanShowActivity界面初始化ListView控件,然后查询free_running.db数据库中用户自建的所有运动方案,最后将查询的方案显示在列表中;
当用户创建或删除运动方案时,PlanShowActivity界面调用OnActivityResult()函数接收目标Activity页面返回的信息,并根据返回的信息调整ListView函数的显示;
其中所述运动数据统计子系统包括:轨迹绘制模块、运动轨迹绘制模块;
轨迹绘制模块,用于根据计步结果调用高德地图绘制出用户的运动轨迹;具体包括:
初始化步骤:
步骤21、利用Android Studio,在Terminal中输入>keytool–list–keystorekeystore.jks,以获取sha1值;
步骤22、利用获取的Sha1值在高德地图控制台添加key值以获取高德地图开发的APIkey参数;
步骤23、在系统中添加并加载以下依赖包:
地图jar包:Android_Map_V2.0.4.jar
定位jar包:MapApiLocation.jar
搜索jar包:MapApiSearch.jar;三个jar包(即地图jar包、定位jar包及搜索jar包),将jar包作为项目的依赖包使用,需要在gradle文件中设置依赖语句:
步骤24、将获取的API key参数配置到系统的AndroidManifest.xml文件中并进行配置;
运动轨迹绘制模块:
步骤31、初始化高德地图设置,并开启定位;判断定位是否成功,如果否则步骤结束;
步骤32、调用回调函数onLocationChanged()返回AMapLocation对象,使用AMapLocation对象的getXXX()方法获取到定位参数,所述定位参数包括:经纬度、地址信息、错误码;
步骤32、利用连续两次定位的经纬度生成移动轨迹,包括:
mAMap.addPolyline(mPolylineOptions)
.add(mLatLngList.get(k-1),mLatLngList.get(k).color(Color.BLACK)) ;
其中,mAMap为高德地图的MapView对象,用来显示地图界面;color()方法用来设置线段颜色;add()方法用来在地图上绘制两点之间的线段,接收参数为LatLng对象;代码中mLatLngList为存储LatLng型数据的集合,mLatLngList.get(k-1)表示起始点,mLatLngList.get(k)表示结束点;addPolyline()方法用来将Polyline对象添加到地图上,接收参数为PolylineOptions对象,PolylineOptions对象可设置线段的宽度、颜色等信息;
在每次绘制线段之后调用postInvalidate()方法刷新地图以显示出绘制的运动轨迹;
步骤33、当用户结束运动时,调用stopLocation()方法结束定位,同时停止运动轨迹的绘制;并将绘制的全部运动轨迹进行存储。
2.根据权利要求1所述的基于Android平台的运动管理系统,其特征在于,所述系统还包括个人中心,所述个人中心连接姿态识别子系统、运动方案管理子系统、运动数据统计子系统以接收并存储数据,其中所述个人中心包括:注册模块、登录模块、数据交互模块:
所述注册模块执行以下操作:发送验证码操作、注册操作:
其中发送验证码操作包括:接收APP发送的验证码获取请求,使用随机数函数生成一个六位数验证码,生成的验证码在反馈给客户端APP做本地保存的同时,调用短信发送程序给用户发送一条验证码短信;
其中注册操作包括:注册操作采用Spring中注解方式完成数据的请求与响应,代码具体包括:
其中,Resp为响应体的bean类,User为用于解析请求体json数据的bean类,“value”即接口;Register()函数即为注册流程处理函数,其首先验证手机号;如果传递过来的手机号为空,则返回自定义错误码600,提示内容为“手机号缺失”;如果发现在数据库中存在此手机号,则说明此手机号已注册过不可再注册,返回错误码401,提示内容为“此手机号已注册”;如果手机号不为空也并未被注册过,则将用户信息保存到数据库中,保存成功后设置返回码为200,通知客户端已注册;
其中登录模块的代码如下:
@RequestMapping(value="/api/login",method=RequestMethod.POST)
public@ResponseEntity Resp userLogin(@RequestBody User user){
return userService.userLogin(user);}
其中,userLogin()函数即为登录流程处理函数,传入参数RequestBody携带Json数据;登录程序会将APP传递过来的user name和password依次放到数据库中进行查询;如果username不存在则返回错误码400,提示信息设置为“账号不存在”;如果user name存在而password不正确,同样返回错误码400,而提示信息则设置为“密码错误”;如果两者均正确则设置返回码为200,提示用户登录成功;
其中数据交互模块包括:API接口;
其中API接口用于实现与web server交互的功能以使APP用这些接口访问远端服务器;接口使用的通讯协议为http1.1,数据请求方式为GET与POST,Request host定义为“http://www.freeruning.com:8080”,response数据格式为Json,对应的bean文件为“Resp.java”,基本格式定义如下:
其中API接口包括:个人资料获取接口、个人资料修改接口、个人数据管理接口;
其中个人中心接口的个人资料获取流程的代码如下:
@RequestMapping(value="/api/user/{user_id}/get",method=RequestMethod.GET)
public ResponseEntity<Resp>getUserInfo(@PathVariable String user_id){
return userService.getUserInfo(user_id);}
其中个人资料的获取接口为“/api/user/{user_id}/get”,请求方式为GET;具体数据获取函数为getUserInfo(),该函数传入参数为String型数据user_id;
其中个人资料获取程序首先连接数据库,然后查询user_info table;如果该表中存在传入的user_id,则将该user_id下的所有信息取出,反馈给用户,如果该表中不存在传入的user_id,则返回错误码400,提示信息设置为“该账户信息不存在”;
其中个人资料修改接口的代码如下:
@RequestMapping(value="/api/user/{user_id}/up",method=RequestMethod.POST)
public ResponseEntity<Resp>userUpInfo(@PathVariable String user_id,
@RequestBody JSONObject upInfo){
return userService.userUpInfo(user_id,upInfo);}
其中,个人资料修改接口为“/api/user/{user_id}/up”,请求方式为POST;RequestBody携带数据为Json数据;实现函数为userUpInfo(),传入参数为user_id和upInfo,user_id数据类型为String,upInfo数据类型为JSONObject;
其中个人资料修改接口在接收到客户端发送来的POST请求后,首先将Request Body中的Json数据使用JSONObject工具类进行解析;解析后的数据传递到userBean类中,然后将userBean作为参数传递到数据库保存函数save(),完成数据保存工作;最后个人资料修改程序返回ResponseEntity类,告诉客户端APP数据修改成功;
其中个人数据管理接口包括:个人数据上传接口、个人数据下载接口:
个人数据上传流程的代码如下:
个人数据上传接口为“/api/user/data/{user_id}/up/{flag}”;其中,字段“flag”为数据类型判断字段,数据上传实现函数为updata(),传入参数为“jsonData”,“user_id”及“flag”;
其中个人数据上传程序在接收到客户端URL之后,首先对URL进行分析,从中提取出“user_id”及“flag”参数;“user_id”是唯一标识用户信息的字段,“flag”参数用来确定上传数据的类型;若“flag”为“0”,则代表上传天气信息;若“flag”为“1”,则代表上传生理参数;若“flag”为“2”,则代表上传运动数据;若“flag”为“3”,则代表上传所有数据;若“flag”的值不符合以上四种情况,则返回错误码400,表示请求错误;在确定好上传数据的类型之后,通过相应的bean解析对应Request Body中Json数据,然后调用dbDao类的save()函数,将解析好的数据存入对应table中;最后,返回ResponseEntiy类,通知客户端APP数据已存储成功;
其中个人数据下载接口的代码如下:
个人数据下载接口为“/api/user/data/{user_id}/down/{flag}”,实现函数为downData(),传入参数为“user_id”及“flag”;
其中个人数据下载接口在获取到客户端GET请求之后,首先使用“flag”参数判断所要查询的数据类型,然后通过“user_id”查找出该用户相关数据,并将数据以map形式传入Resp bean中;最后返回ResponseEntity类,将数据传送到客户端。
3.根据权利要求2所述的基于Android平台的运动管理系统,其特征在于,其中所述个人中心还包括:个人信息管理模块、历史数据查询模块;
个人信息管理模块用于查看和修改用户基本资料;当用户做下拉操作,且手指未离开触摸屏时,PullToRefreshListView的Header会提示用户下拉可获取最新个人资料;当用户完成下拉操作,即手指离开触摸屏时,会触发PullToRefreshListView的onPullDownToRefresh()函数,此函数为下拉操作的监听函数,获取个人资料的数据请求代码即放在此处构建;当数据获取成功后,个人信息管理模块会展示出用户最新个人信息;当用户需要修改个人信息时,则需要进入用户资料修改页面;用户修改项目后,可点击提交按钮发送修改请求;若服务器端返回码为200,则证明资料修改成功,否则,提示“提交失败”信息,用户需重新提交数据请求;
获取资料接口为“http://www.URL.com:8080/api/user/{user_id}/get”,请求方式为GET,修改接口为“http://www.URL.com:8080/api/user/{user_id}/up”,请求方式为POST;
其中历史数据查询模块用于以图表的形式展示用户运动数据;所述历史数据查询模块使用MPAndroidChart开源图表库绘制数据,以周报、月报、年报的形式生成报告;其中周报、月报、年报都使用fragment实现;初始化完成后,会hide月报和年报fragment,show周报fragment,当点击事件触发相应的tab时,程序会hide其他fragment,show被点击的fragment;每个fragment中的图表均使用MPAndroidChart开源图表库绘制;
历史数据查询模块利用平滑折线图或柱状图进行显示;其中平滑曲线图用来展示能量消耗量,柱状图用来展示跑步步数;其中获取所有数据的bean为AllData,ArrayList<T> 中泛型T使用AllData代替,将ArrayList强制转换为自定义数据类型;mUserinfo为获取user信息的bean类,通过mUserinfo.getXXX()函数获取制定数据,也可以通过mUserinfo.setXXX()函数存储指定数据;其中所述历史数据查询模块包括以下函数:
initPullToRefresh(),用于初始化PullTorefresh下拉刷新菜单;
AnimInitData(),用于Fragment初始化时触发数据请求;
getBarData(),用于获取柱状图数据,返回BarData;
showBarChart(),用于获取的BarData数据显示柱状图;
getLineData(),用于获取柱状图数据,返回LineData;
showLineChart(),用于根据获取的LineData数据显示柱状图;
showData(),用于显示数据库中的单个数据;
历史数据的查询接口为:
“http://www.URL.com:8080/api/user/data/{user_id}/up/{flag}”;其中,“{user_id}”为用户的ID,用来区分是哪个用户来查看历史数据,“{flag}”为查询哪种数据的标志量;若“flag”为“0”,则代表下载天气信息;若“flag”为“1”,则代表下载生理参数;若“flag”为“2”,则代表下载运动数据;若“flag”为“3”,则代表下载所有数据;设置“flag”为“3”,获取所以数据。
4.根据权利要求1所述的基于Android平台的运动管理系统,其特征在于,所述运动数据统计子系统还包括:
计步模块,用于根据三轴加速度计获取的数据进行计步,具体包括:
步骤11、根据当前的海拔、地磁场强度,对接收到的三轴加速度传感器发送来的持续的计步电路输出信号进行数据修正;由于使用者的跑步海拔、所处地方地磁强度的不同,会对加速度的测量造成一定的影响;为消除以上因素引起的误差,本发明实施例需要通过以下步骤进行数据修正:
通过公式(1)对三轴加速度传感器发送来的持续的计步电路输出信号中X、Y、Z三个轴上的加速度值做了修正补偿,修正公式如下:
Aacc=Ccompsation+Vvalues×K (1)
其中,Aacc为修正值,Ccompsation为加速度补偿量,Vvalues为某一方向上的加速度值,K为比例系数;
其中Ccompsation由海拔高度决定,当海拔在2000米以下时设定补偿量为245;当海拔在2000米到4000米范围时设定补偿量为255;当海拔在4000米以上时设定补偿量为265;
其中比例系数K为控制信号缩放比的关键量,可以通过以下的公式(2)计算:
其中Mmax为地球表面最大磁场强度;由公式(2)可以看出比例系数K与加速度补偿量Ccompsation成正比;
步骤12、通过以下的公式(3)计算加速度平均值mAvr:
mAvr=(Aaccx+Aaccy+Aaccz)/3 (3)
其中Aaccx为X轴上的加速度分量,Aaccy为Y轴上的加速度分量,Aaccz为Z轴上的加速度分量;
步骤13、将加速度平均值mAvr绘制的波形图记为函数F(t),并将被测点记作F(t0),将被测点的前两个值分别定义为F(t1)、F(t2);然后计算F(t1)与F(t2)差值,记作Δ1;计算F(t1)与F(t0)差值,记作Δ2;
如果Δ1、Δ2异号则认为F(t1)为拐点,否则认为F(t1)不为拐点;若为极值点则将极值点存入数组mExtremums[]中,并进入步骤14;其中,F(t1)也称为F(t前);
其中步骤13中Δ1、Δ2异号则认为F(t1)为拐点是指,如果Δ1、Δ2一个为正、一个为负,则可以说明其中F(t1)为一个极值点;采用该步骤可以找到波形图中的所有极值点;
步骤14、获取当前的极值点Ek以及前一极值点Ek-1,并计算相邻波峰波谷之间的差值绝对值|Δ|;
|Δ|=|Ek-Ek-1| (4)
其中,|Δ|为相邻的两个极值点之间的差值的绝对值,也是识别运动步伐的判断依据,Ek为本次测量出的拐点,可以用数组mExtremums[k]表示,Ek-1为记录的上一个极值点,可以用数组mExtremums[k-1]表示;
步骤15、根据步骤14获取的极值点之间的差值绝对值|Δ|,判断相邻的两个极值点之间的差值的绝对值|Δ|是否满足计步条件;|Δ|需要满足五个条件才能使计步程序记录一步,且记上次计算值为|Δ|1;如图3所示的,五个条件具体包括:
(1)、识别区间的确定条件;当前值|Δ|大于阀值的部分为运动识别区,小于阀值的部分为非识别区;阀值即为可穿戴设备的计步电路的灵敏度,灵敏度过高或过低均会给计步造成较大误差;
(2)、上次计算值|Δ|1是否合理的判断条件;若上次计算值|Δ|1相比当前值|Δ|小于阈值,即|Δ|1<|Δ|/4,则认为上一次波动为高频干扰,上一步不记为一步;否则认为|Δ|1合理数据;
(3)、当前值|Δ|是否合理的判断条件;在通过第2个条件判定上次计算值|Δ|1有效的情况下,可以进一步判断当前值|Δ|是否合理;若当前|Δ|大于三分之二倍的|Δ|1时,则认为当前值|Δ|为合理数据,可以进入下一步判断;若当前值|Δ|过小,则认为本次波动为抖动干扰,不计为一步;
(4)、波谷判断;由人体的运动规律可知,完成迈步的动作不可能出现在波峰阶段;所以如果满足条件的拐点为波峰数据,则舍弃;如果为波谷数据则进入下一个判断条件;
(5)、时间间隔判断条件;由于人体的最快运动频率为50Hz,即两步之间的时间间隔最小为0.2s,因此当前值|Δ|与上次计算值|Δ|1之间的时间间隔小于0.2s,则该当前值|Δ|为高频噪声干扰,不计为一步;
步骤16、如果当前值|Δ|满足步骤14的五个条件时,当前值|Δ|可以记为一步。
5.根据权利要求4所述的基于Android平台的运动管理系统,其特征在于,所述运动数据统计子系统还包括:
运动能耗计算模块,用于采用以下公式(5)计算运动能耗:
其中,KEaee为人体运动能耗,k为修正参数,m为使用者身体质量,a为三轴加速度的几何平均值,t为运动持续时间,d为运动距离;
其中三轴加速度的几何平均值a通过以下的公式(6)计算:
其中,TAx为x轴方向上的加速度分量,TAy为y轴方向上的加速度分量,TAz为Z轴方向上的加速度分量;
运动距离计算模块,用于通过以下方法计算运动距离:
步骤41、计算两次定位之间的距离,具体包括:
设结束点M的坐标为(Mlng,Mlat),起始点N的坐标为(Nlng,Nlat);
将结束点M与起始点N之间的经纬度转换为弧度;转换之后结束点M的坐标表示为(RMlng,RMlat),起始点N的坐标表示为(RNlng,RNlat);
采用公式(7)计算起始点N与结束点M之间的距离:
其中,L为两点之间的距离;ER为地球半径;
步骤42、根据每两次邻近的定位之间的距离,采用公式(8)获取整个运动轨迹中的运动距离:
且所述运动距离计算模块还用于计算实时速度和平均速度;其中所述实时速度计算步骤包括:
通过公式(9)确定两次定位之间的时间以得到该时间段的实时速度:
Vrt=L/t (9)
其中平均速度计算步骤包括:
通过公式(10)计算使用者在整个运动过程中的平均速度:
V=Ltot/T (10)
其中,V为平均速度,Ltot为跑步距离,T为跑步持续时间。
6.一种基于Android平台的运动管理方法,其特征在于,包括:姿态识别子方法、运动方案管理子方法、运动数据统计子方法;
其中所述姿态识别子方法包括:静态状态识别步骤、行走状态识别步骤、跑步状态识别步骤;
其中静止状态识别步骤执行以下操作:
步骤11、取连续十个相邻拐点差值的绝对值|Δavr|,如果该连续十个相邻拐点差值的绝对值|Δavr|均小于4.5714,则预判断当前状态为静止状态;否则步骤结束;
步骤12、如果连续十个相邻拐点差值的绝对值|Δavr|之间的时间间隔为0.6s以内,则判断当前状态为静止状态;如果连续十个相邻拐点差值的绝对值|Δavr|之间的时间间隔大于0.6s,则需要判断0.6s内所有|Δavr|是否均小于4.5714;如果是则判断当前状态为静止状态,否则判断当前状态为运动状态;
步骤13、获取步伐判断量|Δstep|,其最大值为1.2253,若此时计步阀值小于1.2253,则当前数据为抖动;
其中行走状态识别步骤执行以下操作:通过以下参数判断当前状态是否为行走状态:
其中行走状态下三轴加速度传感器的三轴加速度值Aaccx、Aaccy、Aaccz均为非零值,其中X轴加速度值Aaccx在大小为236.0604的值附近上下波动,其中Y轴加速度值Aaccx在大小为220.197的数值附近上下波动,其中Z轴加速度值Aaccz在大小为239.6163的值附近上下波动;且加速度平均值mAvr在大小为229.0932的值附近上下波动;
如果连续m个相邻拐点差值的绝对值|Δavr|都大于56.274,且小于130.7574,则认为当前状态为行走状态;
其中跑步状态识别步骤执行以下操作:通过以下参数判断当前状态是否为跑步状态:
如果连续m个相邻拐点差值的绝对值|Δavr|均大于130.7574,则认为当前状态为跑步状态;
其中所述运动方案管理子方法包括:创建步骤、编辑步骤、显示步骤;
所述创建步骤用于从运动方案数据库中调用预设的健身方案模板并通过所述显示步骤显示给用户,其中所述健身方案模板中至少包括三个预设的运动方案:初级运动方案、中级运动方案、高级运动方案;其中每一预设的运动方案中包括预设的运动参数;且所述创建步骤还用于根据用户输入对所述预设的方案进行调整并存储到运动方案数据库中;所述创建步骤还用于提取空白运动模板以根据用户选择的运动参数生成自定义运动方案并存储到运动方案数据库;
所述编辑步骤用于读取所述运动方案数据库中存储的运动方案并以列表通过显示步骤进行显示,并根据用户选择的运动方案调用显示步骤将该运动方案对应的运动参数显示给用户;还用于接收用户输入以对运动方案的运动参数进行修改或是删除运动方案,并相应更新运动方案数据库;
所述显示步骤用于读取根据创建步骤和编辑步骤的数据进行显示;
其中所述运动参数至少包括以下的一种:目标计步值、运动项目、每一运动项目的目标值、目标总运动量、目标消耗量、运动时间段;
其中所述创建步骤执行以下操作:
在PlanShowActivity界面顶部设置有一个创建按键以监听函数调用startActivityForResult()跳转到创建页面,创建页面利用ListView控件将健身方案模板中的设的运动方案以列表形式进行显示;且所述创建页面上有详情按键以被选中的运动方案的运动参数显示给用户;
在用户完成创建步骤时PlanShowActivity界面通过OnActivityResult()函数获取用户输入的数据存储到运动方案数据库;
在用户点击非详情按键的位置时ListView的点击监听函数会调用setResult()方法将选中运动方案的ID及信息返回给PlanShowActivity,并调用finish()方法销毁PlanCreateActivity界面;
其中所述编辑步骤执行以下操作:
编辑步骤调用显示步骤的PlanShowActivity界面以将运动方案数据库中存储的运动方案以列表形式显示,当用户点击运动方案时ListView点击事件监听函数会调用startActivityForResult()函数跳转到PlanEditActivity界面,并调用运动方案数据库的查询函数来查询该运动方案的信息,然后调用ProgressBar显示该运动方案的完成度;
编辑步骤在接收到用户点击开始训练按钮后,按钮点击事件监听函数会调用startActivity()函数将界面跳转至首页并等待用户开启训练,同时PlanEditActivity界面会调用finish()函数销毁界面;
编辑步骤在接收到用户点击删除按钮后,按钮点击事件监听函数会调用运动方案数据库的删除方法删除数据,并调用finish()函数销毁界面,同时调用setResult()方法返回删除命令以指示显示界面删除该运动方案;
其中,所述显示步骤执行以下操作:
通过PlanShowActivity界面初始化ListView控件,然后查询free_running.db数据库中用户自建的所有运动方案,最后将查询的方案显示在列表中;
当用户创建或删除运动方案时,PlanShowActivity界面调用OnActivityResult()函数接收目标Activity页面返回的信息,并根据返回的信息调整ListView函数的显示;
其中所述运动数据统计子方法包括:轨迹绘制步骤、运动轨迹绘制步骤:
轨迹绘制步骤,用于根据计步结果调用高德地图绘制出用户的运动轨迹;具体包括:
初始化步骤:
步骤21、利用Android Studio,在Terminal中输入>keytool–list–keystorekeystore.jks,以获取sha1值;
步骤22、利用获取的Sha1值在高德地图控制台添加key值以获取高德地图开发的APIkey参数;
步骤23、在系统中添加并加载以下依赖包:
地图jar包:Android_Map_V2.0.4.jar
定位jar包:MapApiLocation.jar
搜索jar包:MapApiSearch.jar;三个jar包(即地图jar包、定位jar包及搜索jar包),将jar包作为项目的依赖包使用,需要在gradle文件中设置依赖语句:
步骤24、将获取的API key参数配置到系统的AndroidManifest.xml文件中并进行配置;
运动轨迹绘制步骤:
步骤31、初始化高德地图设置,并开启定位;判断定位是否成功,如果否则步骤结束;
步骤32、调用回调函数onLocationChanged()返回AMapLocation对象,使用AMapLocation对象的getXXX()方法获取到定位参数,所述定位参数包括:经纬度、地址信息、错误码;
步骤32、利用连续两次定位的经纬度生成移动轨迹,包括:
mAMap.addPolyline(mPolylineOptions)
.add(mLatLngList.get(k-1),mLatLngList.get(k).color(Color.BLACK)) ;
其中,mAMap为高德地图的MapView对象,用来显示地图界面;color()方法用来设置线段颜色;add()方法用来在地图上绘制两点之间的线段,接收参数为LatLng对象;代码中mLatLngList为存储LatLng型数据的集合,mLatLngList.get(k-1)表示起始点,mLatLngList.get(k)表示结束点;addPolyline()方法用来将Polyline对象添加到地图上,接收参数为PolylineOptions对象,PolylineOptions对象可设置线段的宽度、颜色等信息;
在每次绘制线段之后调用postInvalidate()方法刷新地图以显示出绘制的运动轨迹;
步骤33、当用户结束运动时,调用stopLocation()方法结束定位,同时停止运动轨迹的绘制;并将绘制的全部运动轨迹进行存储。
7.根据权利要求6所述基于Android平台的运动管理方法,其特征在于,姿态识别子方法包括:获取相邻拐点差值的绝对值|Δavr|进行;如果|Δavr|>4.5714则认为波形有效,否则将此波动作为噪声干扰。
8.根据权利要求6所述的基于Android平台的运动管理方法,其特征在于,所述运动数据统计子方法还包括:
计步步骤,用于根据三轴加速度计获取的数据进行计步,具体包括:
步骤11、根据当前的海拔、地磁场强度,对接收到的三轴加速度传感器发送来的持续的计步电路输出信号进行数据修正;由于使用者的跑步海拔、所处地方地磁强度的不同,会对加速度的测量造成一定的影响;为消除以上因素引起的误差,本发明实施例需要通过以下步骤进行数据修正:
通过公式(1)对三轴加速度传感器发送来的持续的计步电路输出信号中X、Y、Z三个轴上的加速度值做了修正补偿,修正公式如下:
Aacc=Ccompsation+Vvalues×K (1)
其中,Aacc为修正值,Ccompsation为加速度补偿量,Vvalues为某一方向上的加速度值,K为比例系数;
其中Ccompsation由海拔高度决定,当海拔在2000米以下时设定补偿量为245;当海拔在2000米到4000米范围时设定补偿量为255;当海拔在4000米以上时设定补偿量为265;
其中比例系数K为控制信号缩放比的关键量,可以通过以下的公式(2)计算:
其中Mmax为地球表面最大磁场强度;由公式(2)可以看出比例系数K与加速度补偿量Ccompsation成正比;
步骤12、通过以下的公式(3)计算加速度平均值mAvr:
mAvr=(Aaccx+Aaccy+Aaccz)/3 (3)
其中Aaccx为X轴上的加速度分量,Aaccy为Y轴上的加速度分量,Aaccz为Z轴上的加速度分量;
步骤13、将加速度平均值mAvr绘制的波形图记为函数F(t),并将被测点记作F(t0),将被测点的前两个值分别定义为F(t1)、F(t2);然后计算F(t1)与F(t2)差值,记作Δ1;计算F(t1)与F(t0)差值,记作Δ2;
如果Δ1、Δ2异号则认为F(t1)为拐点,否则认为F(t1)不为拐点;若为极值点则将极值点存入数组mExtremums[]中,并进入步骤14;其中,F(t1)也称为F(t前);
其中步骤13中Δ1、Δ2异号则认为F(t1)为拐点是指,如果Δ1、Δ2一个为正、一个为负,则可以说明其中F(t1)为一个极值点;采用该步骤可以找到波形图中的所有极值点;
步骤14、获取当前的极值点Ek以及前一极值点Ek-1,并计算相邻波峰波谷之间的差值绝对值|Δ|;
|Δ|=|Ek-Ek-1| (4)
其中,|Δ|为相邻的两个极值点之间的差值的绝对值,也是识别运动步伐的判断依据,Ek为本次测量出的拐点,可以用数组mExtremums[k]表示,Ek-1为记录的上一个极值点,可以用数组mExtremums[k-1]表示;
步骤15、根据步骤14获取的极值点之间的差值绝对值|Δ|,判断相邻的两个极值点之间的差值的绝对值|Δ|是否满足计步条件;|Δ|需要满足五个条件才能使计步程序记录一步,且记上次计算值为|Δ|1;如图3所示的,五个条件具体包括:
(1)、识别区间的确定条件;当前值|Δ|大于阀值的部分为运动识别区,小于阀值的部分为非识别区;阀值即为可穿戴设备的计步电路的灵敏度,灵敏度过高或过低均会给计步造成较大误差;
(2)、上次计算值|Δ|1是否合理的判断条件;若上次计算值|Δ|1相比当前值|Δ|小于阈值|Δ|1<|Δ|/4,则认为上一次波动为高频干扰,上一步不记为一步;否则认为|Δ|1合理数据;
(3)、当前值|Δ|是否合理的判断条件;在通过第2个条件判定上次计算值|Δ|1有效的情况下,可以进一步判断当前值|Δ|是否合理;若当前|Δ|大于三分之二倍的|Δ|1时,则认为当前值|Δ|为合理数据,可以进入下一步判断;若当前值|Δ|过小,则认为本次波动为抖动干扰,不计为一步;
(4)、波谷判断;由人体的运动规律可知,完成迈步的动作不可能出现在波峰阶段;所以如果满足条件的拐点为波峰数据,则舍弃;如果为波谷数据则进入下一个判断条件;
(5)、时间间隔判断条件;由于人体的最快运动频率为50Hz,即两步之间的时间间隔最小为0.2s,因此当前值|Δ|与上次计算值|Δ|1之间的时间间隔小于0.2s,则该当前值|Δ|为高频噪声干扰,不计为一步;
步骤16、如果当前值|Δ|满足步骤14的五个条件时,当前值|Δ|可以记为一步。
9.根据权利要求8所述的基于Android平台的运动管理方法,其特征在于,所述运动数据统计子方法还包括:
运动能耗计算步骤,用于采用以下公式(5)计算运动能耗:
其中,KEaee为人体运动能耗,k为修正参数,m为使用者身体质量,a为三轴加速度的几何平均值,t为运动持续时间,d为运动距离;
其中三轴加速度的几何平均值a通过以下的公式(6)计算:
其中,TAx为x轴方向上的加速度分量,TAy为y轴方向上的加速度分量,TAz为Z轴方向上的加速度分量;
运动距离计算步骤,用于通过以下方法计算运动距离:
步骤41、计算两次定位之间的距离,具体包括:
设结束点M的坐标为(Mlng,Mlat),起始点N的坐标为(Nlng,Nlat);
将结束点M与起始点N之间的经纬度转换为弧度;转换之后结束点M的坐标表示为(RMlng,RMlat),起始点N的坐标表示为(RNlng,RNlat);
采用公式(7)计算起始点N与结束点M之间的距离:
其中,L为两点之间的距离;ER为地球半径;
步骤42、根据每两次邻近的定位之间的距离,采用公式(8)获取整个运动轨迹中的运动距离:
且所述运动距离计算步骤还用于计算实时速度和平均速度;其中所述实时速度计算步骤包括:
通过公式(9)确定两次定位之间的时间以得到该时间段的实时速度:
Vrt=L/t (9)
其中平均速度计算步骤包括:
通过公式(10)计算使用者在整个运动过程中的平均速度:
V=Ltot/T (10)
其中,V为平均速度,Ltot为跑步距离,T为跑步持续时间。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710407386.1A CN108985533B (zh) | 2017-06-02 | 2017-06-02 | 一种基于Android平台的运动管理系统和方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710407386.1A CN108985533B (zh) | 2017-06-02 | 2017-06-02 | 一种基于Android平台的运动管理系统和方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108985533A CN108985533A (zh) | 2018-12-11 |
CN108985533B true CN108985533B (zh) | 2021-12-28 |
Family
ID=64502658
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710407386.1A Active CN108985533B (zh) | 2017-06-02 | 2017-06-02 | 一种基于Android平台的运动管理系统和方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108985533B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112822977A (zh) * | 2018-12-24 | 2021-05-18 | 深圳迈瑞生物医疗电子股份有限公司 | 一种监护信息的展示方法及监护设备 |
CN110704132B (zh) * | 2019-08-30 | 2022-06-17 | 北京浪潮数据技术有限公司 | 一种接口服务桩的处理方法和系统 |
CN111367590A (zh) * | 2020-02-27 | 2020-07-03 | 北京字节跳动网络技术有限公司 | 中断事件处理方法及其装置 |
CN113295182B (zh) * | 2021-05-20 | 2022-11-15 | 北京智慧图科技有限责任公司 | 一种Wi-Fi SLAM轨迹还原方法 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105372687A (zh) * | 2015-09-29 | 2016-03-02 | 上海斐讯数据通信技术有限公司 | 一种基于移动设备的运动轨迹绘制方法及系统 |
CN106092097A (zh) * | 2016-06-15 | 2016-11-09 | 北京奇虎科技有限公司 | 空间活动轨迹生成方法、装置 |
CN106197473A (zh) * | 2016-06-24 | 2016-12-07 | 北京奇虎科技有限公司 | 设备的活动行为识别方法及装置 |
CN106649594A (zh) * | 2016-11-23 | 2017-05-10 | 腾讯科技(深圳)有限公司 | 数据的展示方法和装置 |
CN107970574A (zh) * | 2016-10-25 | 2018-05-01 | 四川理工学院 | 一种基于Android平台的跑步健身系统及其数据处理方法 |
CN107970590A (zh) * | 2016-10-25 | 2018-05-01 | 四川理工学院 | 一种基于Android平台的跑步健身数据系统及方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9599632B2 (en) * | 2012-06-22 | 2017-03-21 | Fitbit, Inc. | Fitness monitoring device with altimeter |
-
2017
- 2017-06-02 CN CN201710407386.1A patent/CN108985533B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105372687A (zh) * | 2015-09-29 | 2016-03-02 | 上海斐讯数据通信技术有限公司 | 一种基于移动设备的运动轨迹绘制方法及系统 |
CN106092097A (zh) * | 2016-06-15 | 2016-11-09 | 北京奇虎科技有限公司 | 空间活动轨迹生成方法、装置 |
CN106197473A (zh) * | 2016-06-24 | 2016-12-07 | 北京奇虎科技有限公司 | 设备的活动行为识别方法及装置 |
CN107970574A (zh) * | 2016-10-25 | 2018-05-01 | 四川理工学院 | 一种基于Android平台的跑步健身系统及其数据处理方法 |
CN107970590A (zh) * | 2016-10-25 | 2018-05-01 | 四川理工学院 | 一种基于Android平台的跑步健身数据系统及方法 |
CN106649594A (zh) * | 2016-11-23 | 2017-05-10 | 腾讯科技(深圳)有限公司 | 数据的展示方法和装置 |
Non-Patent Citations (1)
Title |
---|
基于加速度传感器的人体运动状态监测的研究;张义龙;《中国优秀硕士学位论文全文数据库 信息科技辑》;20150515(第05期);I140-280 * |
Also Published As
Publication number | Publication date |
---|---|
CN108985533A (zh) | 2018-12-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108985533B (zh) | 一种基于Android平台的运动管理系统和方法 | |
US9948734B2 (en) | User activity tracking system | |
US10016165B2 (en) | Information processing apparatus, information processing method, and program | |
US10220258B2 (en) | Method and device for providing workout guide information | |
CN102985897B (zh) | 高效姿势处理 | |
CN100399994C (zh) | 使用加速度传感器测量体育运动量的设备和方法 | |
CN108984562B (zh) | 一种基于Android平台的运动数据统计系统和方法 | |
JP5953673B2 (ja) | 行動識別装置、行動識別方法、及びプログラム | |
US10022071B2 (en) | Automatic recognition, learning, monitoring, and management of human physical activities | |
WO2015148559A1 (en) | Data mesh platform | |
US20130179958A1 (en) | Authentication system, authentication method, authentication device, information terminal, program and information recording medium | |
CN105706093A (zh) | 用于生物特征数据的具有双向通信的远程无线显示 | |
WO2018200897A4 (en) | Baseball pitch simulation and swing analysis using virtual reality device and system | |
US9687180B1 (en) | Intelligent human motion systems and methods | |
KR102089002B1 (ko) | 행동에 대한 피드백을 제공하는 웨어러블 디바이스 및 방법 | |
US10133539B2 (en) | Sensor-driven audio playback modification | |
US11673025B2 (en) | Workout recommendation engine | |
CN108182626A (zh) | 服务推送方法、信息采集终端及计算机可读存储介质 | |
CN107970590A (zh) | 一种基于Android平台的跑步健身数据系统及方法 | |
US11358026B2 (en) | Activity tracking system with multiple monitoring devices | |
US9699859B1 (en) | Configuration of an automated personal fitness coaching device | |
TW201730838A (zh) | 互動式服務平台及其運作方法 | |
CN108986883B (zh) | 一种基于Android平台的运动状态识别系统和方法 | |
CN109107093B (zh) | 一种基于vr的动感单车交互系统 | |
KR20200089934A (ko) | 실시간 피트니스 모니터링 방법, 장치 및 시스템 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |