65.9K
CodeProject 正在变化。 阅读更多。
Home

使用加速度计检测碰撞

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2021年1月11日

CPOL

2分钟阅读

viewsIcon

14712

在“Android 上的 AI 危险检测”系列文章的下一篇中,我们将探讨碰撞检测和通知。

这是关于使用 Android 和 Tensorflow Lite 构建实时危险检测器的系列文章的第五篇。 在这部分中,我们将向应用程序添加碰撞检测功能,并赋予应用程序向紧急联系人发送通知的能力。

利用大多数 Android 设备的特性,我们可以为设备添加碰撞检测功能。 大多数 Android 设备都配备了加速度计和 GPS。 我们可以将它们结合起来,如果认为发生了碰撞,就发送带有位置信息的紧急消息。

为了检测碰撞,我创建了一个名为 CrashDetector 的新类。 该类将监控加速度计的读数。 当它收到高于某个级别的读数时,就假定车辆发生了撞击。 我选择的指示撞击的值是基于对汽车碰撞相关资料的了解的最佳估计。

var coolDownExpiry:Long = 0
val COOL_DOWN_TIME = 10000

fun resetCooldown() {
   coolDownExpiry = Date().time + COOL_DOWN_TIME
}
fun hasCooldownExpired():Boolean {
   val now = Date().time
   return now > coolDownExpiry
}



fun alert(direction: Int) {
   // using the when statement to filter out invalid
   // values should they be passed to this function
   if(hasCooldownExpired() && currentSpeedMPS>MIN_ALERT_MPS) {
       when (direction) {
           ALARM_CENTER, ALARM_RIGHT, ALARM_LEFT -> {
               soundPlayer = MediaPlayer.create(context, direction)
               soundPlayer!!.start()
           }
       }
   }
   resetCooldown()
}

还有一些其他条件可能导致加速度计突然出现高读数。 设备可能被掉落,用户可能行驶在坑洼路面上,或者用户可能发生了他们不想发送警报的碰撞。 为了降低意外发送紧急消息的几率,在发送消息之前会有一个延迟。 在此延迟期间,设备会显示一个提示,允许用户取消消息或发送消息。 如果在对话框过期时未选择任何选项,它将向用户选择的紧急联系人电话号码发送消息。 如果有驾驶员的最后已知位置,它将作为指向 Google 地图的链接发送。

fun sendEmergencyMessage() {
   var  msg = crashMessage
   if(this.location != null) {
       msg = msg + " https://www.google.com/maps/@${location!!.latitude},${location!!.longitude},15z"
   }
   val smsManager = SmsManager.getDefault() as SmsManager
   smsManager.sendTextMessage(crashPhoneNumber, null,msg , null, null)
}

现在所有主要功能都已构建完成,我们可以将最后一部分到位,并让应用程序使用实时视频流而不是静态图像。 在 本系列文章的下一部分 中,我们将让应用程序处理实时数据。

© . All rights reserved.