车载碰撞和侧翻算法实现


车载的侧翻算法根据上面的公式实现,而碰撞时根据三个方向的加速度的值。主要利用了传感器的onSensorChanged来实现。

package com.leadcore.edr.packet;

import java.util.*;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import java.lang.Math;
import android.util.Log;

public class GSensorService {
    private static final String TAG = "GSensorService";
    private Context mContext = null;
    private boolean mIsRolloverWarning = false;
    private boolean mIsCrashWarning = false;

    public GSensorService(Context context) {
        mContext = context;
    }

    private final SensorEventListener mSensorListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            if (Sensor.TYPE_ACCELEROMETER == event.sensor.getType()) {
                float xAxis = event.values[0];
                float yAxis = event.values[1];
                float zAxis = event.values[2];
                float max_accelerometer = GlobalData.getCrashacceleration()
                                            * SensorManager.STANDARD_GRAVITY / 10;
                boolean isOverAccelerometer = Math.abs(xAxis) > max_accelerometer
                                            || Math.abs(yAxis) > max_accelerometer
                                            || Math.abs(zAxis) > max_accelerometer;
                if (isOverAccelerometer && !mIsCrashWarning) {
                    mIsCrashWarning = true;
                    GlobalData.setWarningFlag(JTT808.MSG_WARN_CRASH_WARN);
                    Log.i(TAG, "crash warning.");
                } else if (!isOverAccelerometer && mIsCrashWarning) {
                    mIsCrashWarning = false;
                    GlobalData.ClearWarningFlag(JTT808.MSG_WARN_CRASH_WARN);
                }

                double rad2 = Math.atan(xAxis / Math.sqrt(yAxis * yAxis + zAxis * zAxis));
                double degree2 = Math.toDegrees(rad2);

                int max_degree = GlobalData.getCrashDegree();
                if (Math.abs(degree2) >= max_degree && !mIsRolloverWarning) {
                    mIsRolloverWarning = true;
                    GlobalData.setWarningFlag(JTT808.MSG_WARN_ROLLOVER);
                    Log.i(TAG, "Roll over warning.");
                } else if (Math.abs(degree2) < max_degree && mIsRolloverWarning) {
                    GlobalData.ClearWarningFlag(JTT808.MSG_WARN_ROLLOVER);
                    mIsRolloverWarning = false;
                }
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // Not used.
        }
    };

    private void registerListener() {
        SensorManager sm = (SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);
        sm.registerListener(mSensorListener, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                        SensorManager.SENSOR_DELAY_NORMAL);
    }

    public void start()  {
        registerListener();
    }
}



  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值