六轴驾驶行为分析算法

驾驶行为分析算法

  • 什么是驾驶行为分析
  • 基于GSENSOR的驾驶行为分析
  • 基于六轴传感器的驾驶行为分析
    • BMI160驱动
    • 急加速加速度特征
    • 转弯角速度特征
    • 行为类型判断公式
    • 算法基本思路
  • 参考网站

什么是驾驶行为分析

指的是分析车辆驾驶人员的驾驶习惯,比如统计急加速急减速急转弯等行为频次。

基于GSENSOR的驾驶行为分析

由于不能保证GSENSOR的安装是水平的,同时也无法保证GSENSOR的X轴一定沿着车头向前,所以通常算法是在静止时采集三轴数据与水平向前加速直行的三轴数据进行综合运算,以求解得出GSENSOR实际三轴与标准三轴的夹角,通过此夹算换算得出车头方向和左右方向的加速度值,再通过此加速度值与门限值作比较,得出急加速急减速和急转弯的判定。
Extensive testing has revealed that the different classes of vehicles react to G-forces differently. We therefore offer customized settings to guide the monitoring of aggressive driving in each vehicle class. Passenger Car is self-explanatory; Truck/Cube Van refers to the typical delivery type box trucks or other stepside vans; Heavy-Duty refers to larger box trucks and tractor trailers
六轴驾驶行为分析算法_第1张图片
国外某设备的门限值

基于六轴传感器的驾驶行为分析

BMI160驱动

#define GSEN_DEVICE_ADDR 0x68
#include “bmi160_defs.h”
#include “nrf_twi_mngr.h”

#define BMI160_READ(p_reg_addr, p_buffer, byte_cnt)
NRF_TWI_MNGR_WRITE(GSEN_DEVICE_ADDR, p_reg_addr, 1, NRF_TWI_MNGR_NO_STOP),
NRF_TWI_MNGR_READ (GSEN_DEVICE_ADDR, p_buffer, byte_cnt, 0)

#define BMI160_FIFO_LEN 32
#define GSR_AXIES_NUM 3

static sensor_6_axes_frame_data sysGsensorBuffer[BMI160_FIFO_LEN];
static uint8_t NRF_TWI_MNGR_BUFFER_LOC_IND BMI160_fifo_data_reg = BMI160_FIFO_DATA_ADDR;//BMI160_GYRO_DATA_ADDR;
static uint8_t NRF_TWI_MNGR_BUFFER_LOC_IND BMI160_id_reg = BMI160_FIFO_LENGTH_ADDR;//BMI160_CHIP_ID_ADDR;

#define TWI_INSTANCE_ID 0
#define MAX_PENDING_TRANSACTIONS 10
NRF_TWI_MNGR_DEF(m_nrf_twi_mngr1, MAX_PENDING_TRANSACTIONS, TWI_INSTANCE_ID);
APP_TIMER_DEF(m_gsr_timer_id1); /GSENSOR¶¨Ê±¶ÁÊý¾Ý/

static uint8_t BMI160_id = 0;
static void read_BMI160_xyz_cb(ret_code_t result, void * p_user_data)
{
}

static void bmi160_timer_handler(void* p_context)
{
/¼ÌÐø¶ÁÈ¡XYZÊý¾Ý/
static nrf_twi_mngr_transfer_t const transfers[] =
{
BMI160_READ(&BMI160_id_reg, &BMI160_id, sizeof(uint8_t)),
BMI160_READ(&BMI160_fifo_data_reg, &sysGsensorBuffer[0], sizeof(sensor_6_axes_frame_data) * 13),
};

static nrf_twi_mngr_transaction_t NRF_TWI_MNGR_BUFFER_LOC_IND transaction =
{
    .callback            = read_BMI160_xyz_cb,
    .p_transfers         = transfers,
};

transaction.number_of_transfers = 2 * 2;
transaction.p_user_data = &transaction.number_of_transfers;
APP_ERROR_CHECK(nrf_twi_mngr_schedule(&m_nrf_twi_mngr1, &transaction));    

}

static void write_BMI160_register(uint8_t reg_addr, uint8_t reg_value)
{
uint8_t buffer[] = {reg_addr, reg_value};
nrf_twi_mngr_transfer_t const write_transfers[1] =
{
NRF_TWI_MNGR_WRITE(GSEN_DEVICE_ADDR, buffer, 2, 0)
};

APP_ERROR_CHECK(nrf_twi_mngr_perform(&m_nrf_twi_mngr1, NULL, write_transfers, 1, NULL));

}

static void config_gsensor(void)
{
//BW
write_BMI160_register(BMI160_ACCEL_CONFIG_ADDR, BMI160_ACCEL_ODR_25HZ | (BMI160_ACCEL_BW_NORMAL_AVG4 << 4));
write_BMI160_register(BMI160_GYRO_CONFIG_ADDR, BMI160_GYRO_ODR_25HZ | (BMI160_GYRO_BW_NORMAL_MODE << 4));
//range
write_BMI160_register(BMI160_ACCEL_RANGE_ADDR, BMI160_ACCEL_RANGE_4G); //±4g
write_BMI160_register(BMI160_GYRO_RANGE_ADDR, BMI160_GYRO_RANGE_2000_DPS); //
//power mode
write_BMI160_register(BMI160_COMMAND_REG_ADDR, BMI160_ACCEL_NORMAL_MODE); //normal
nrf_delay_ms(4);
write_BMI160_register(BMI160_COMMAND_REG_ADDR, BMI160_GYRO_NORMAL_MODE); //normal
nrf_delay_ms(80);
//fifo
write_BMI160_register(BMI160_FIFO_CONFIG_0_ADDR, 255); //water mark
write_BMI160_register(BMI160_FIFO_CONFIG_1_ADDR, BMI160_FIFO_ACCEL|BMI160_FIFO_GYRO);
write_BMI160_register(BMI160_COMMAND_REG_ADDR, BMI160_FIFO_FLUSH_VALUE); //fifo reset
nrf_delay_ms(5);
//int1
write_BMI160_register(BMI160_INT_ENABLE_1_ADDR, BMI160_FIFO_WTM_INT_MSK); //
write_BMI160_register(BMI160_INT_OUT_CTRL_ADDR, BMI160_ENABLE | 0x08); //wtm_int_ena, active low, push-pull, output enable

APP_ERROR_CHECK(app_timer_create(&m_gsr_timer_id1, APP_TIMER_MODE_REPEATED, bmi160_timer_handler));
APP_ERROR_CHECK(app_timer_start(m_gsr_timer_id1, APP_TIMER_TICKS(500), NULL));//APP_TIMER_TICKS(1000), NULL));

}

急加速加速度特征

六轴驾驶行为分析算法_第2张图片

转弯角速度特征

角速度持续增大并持续一定时间
六轴驾驶行为分析算法_第3张图片

行为类型判断公式

#define DRV_BEHAVIOR_PARKING(amax, a, gmax) ((amax) <= ACCL_PARKING_THRESHOLD &&
(gmax) < GYRO_PARKING_THRESHOLD &&
ACCL_IS_GRAVITY(a))

#define DRV_BEHAVIOR_SPEEDING(amax,gmax,at) ((amax) > ACCL_PARKING_THRESHOLD_MG &&
(gmax) < GYRO_SPEEDING_THRESHOLD &&
(at) >= DRV_SPEEDDOWN_TIME_COUNT)

#define DRV_BEHAVIOR_SPEEDOVER(amax, gmax, gt) ((amax) >= ACCL_SPEEDOVER_THRESHOLD &&
(((gt) < DRV_SHAKING_TIME_COUNT &&
(gmax) < GYRO_SPEEDING_THRESHOLD) ||
(gmax) < GYRO_TURNLR_THRESHOLD_MD))

#define DRV_BEHAVIOR_SPEEDDOWN(amax, gmax, gt) ((amax) >= ACCL_SPEEDDOWN_THRESHOLD &&
(((gt) < DRV_SHAKING_TIME_COUNT &&
(gmax) < GYRO_SPEEDING_THRESHOLD) ||
(gmax) < GYRO_TURNLR_THRESHOLD_MD))

#define DRV_BEHAVIOR_TURNX(amax, gmax) ((amax) >= ACCL_TURNX_THRESHOLD &&
(gmax) >= GYRO_TURNING_THRESHOLD)

#define DRV_BEHAVIOR_TURNLR(amax, gmax, gt) ((amax) > ACCL_TURNING_THRESHOLD &&
(gt) >= DRV_TURN_PRE_TIME_COUNT &&
(gmax >= GYRO_TURNLR_THRESHOLD))

#define DRV_BEHAVIOR_COLLIS(amax, gmax) ((amax) >= ACCL_COLLIS_THRESHOLD &&
(gmax) >= GYRO_TURNING_THRESHOLD)

算法基本思路

1,首先对六轴数据每个点与前一个点求平均数,滤掉一些异常点。
2,如果算法未确认静止状态,求得每一轴平均值作为静止状态时的值。
3,求取每一轴与静止状态值的变化量。
4,求取三轴变化量平方和,通过判断式求出当前行为类型。
5,对行为类型进行持续计数,达到一定数量时确认为某种行为。

参考网站

1: http://www.nordicsemi.com/
2: https://infocenter.nordicsemi.com/index.jsp
3: https://devzone.nordicsemi.com/

你可能感兴趣的:(技术)