如何使用活动识别来检测步行/跑步与步行状态

6
在Google Play服务的活动识别中,有一个功能:
DetectedActivity.RUNNING,
DetectedActivity.WALKING,
DetectedActivity.ON_FOOT

每当我收到关于步行或跑步的活动更新时,我得到的是 ON_FOOT。如何区分二者?我知道 RUNNING 和 WALKING:“这是 ON_FOOT 的子活动”。谢谢您的帮助。

尝试他们的示例:https://github.com/googlesamples/android-play-location “ActivityRecognition” - android developer
3个回答

6
emil10001提供的walkingOrRunning()方法有效,但是它不能获得置信度最高的活动(跑步或步行),这是因为他的for循环中第二个if子句的条件总是将活动的置信度与0进行比较。
为了澄清这一点,让我们假设我们将大小为2的"probableActivities"列表作为参数传递给walkingOrRunning()方法,即我们调用walkingOrRunning(probableActivities)。
假设,
List probableActivities = [activity1, activity2],
其中:
activity1 = "walking",置信度为75%
activity2 = "running",置信度为5%。
简而言之,walkingOrRunning(probableActivities)方法的执行如下:
1)在for循环的第一次迭代后,myActivity = "walking"
2)在for循环的第二次迭代后,myActivity = "running"
而该方法返回"running"作为活动类型,而我们期望返回的活动类型是"walking"。
总之,为了获得最高置信度的活动类型(步行/跑步),我将walkingOrRunning()方法修改如下:

[FYI:我已经实施并测试了代码,它按预期工作,欢迎任何反馈/评论/问题。]

 private DetectedActivity walkingOrRunning(List<DetectedActivity> probableActivities) {
    DetectedActivity myActivity = null;
    int confidence = 0;
    for (DetectedActivity activity : probableActivities) {
        if (activity.getType() != DetectedActivity.RUNNING && activity.getType() != DetectedActivity.WALKING)
            continue;

        if (activity.getConfidence() >= confidence) {
            confidence = activity.getConfidence();
            myActivity = activity;
        }
    }

    return myActivity;
}

3
正如Sam所提到的,WALKINGRUNNING活动出现在列表中的次要活动(ActivityRecognitionResult.getProbableActivities())中,你需要解析它们。
// Get the update
ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);

// Get the most probable activity from the list of activities in the update
DetectedActivity mostProbableActivity = result.getMostProbableActivity();

// Get the type of activity
int activityType = mostProbableActivity.getType();

if (activityType == DetectedActivity.ON_FOOT) {
    DetectedActivity betterActivity = walkingOrRunning(result.getProbableActivities());
    if (null != betterActivity)
        mostProbableActivity = betterActivity;
}

private DetectedActivity walkingOrRunning(List<DetectedActivity> probableActivities) {
    DetectedActivity myActivity = null;
    int confidence = 0;
    for (DetectedActivity activity : probableActivities) {
        if (activity.getType() != DetectedActivity.RUNNING && activity.getType() != DetectedActivity.WALKING)
            continue;

        if (activity.getConfidence() > confidence)
            myActivity = activity;
    }

    return myActivity;
}

今晚我测试了以上代码,无论是步行还是跑步,它似乎都表现得不错。如果你不明确地筛选只有RUNNINGWALKING,你很可能会得到错误的结果。

1
在 getProbableActivities 为 { ON_FOOT, WALKING, RUNNING } 的情况下,你的 walkingOrRunning 方法将返回 RUNNING,但实际上你可能更想返回 WALKING,因为它具有更高的置信度。我认为你希望在找到第一个满足置信度阈值的 RUNNING 或 WALKING 活动时停止。 - mbeaty

2
我观察到类似的行为。我的理论是,当您接收到一个 ActivityRecognitionResult 对象时,通常会包含几个可解析的 DetectedActivity 对象,每个对象都有一个由整数指定的置信度分数。对于步行而言,至少会有两个 DetectedActivity 对象 - 一个 DetectedActivity 对象代表步行中的 ON_FOOT,其置信度级别较高,另一个 DetectedActivity 对象代表步行的 WALKING,其置信度级别较低或相等。
在实践中,我想你经常会得到一些排列组合的 ON_FOOT + WALKING || RUNNING,或者所有三种活动,其置信度得分不同,而 ON_FOOT 很可能是最高的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接