12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- #include "turnDetection.h"
- //--------------------------define
- // 定义转弯阈值
- #define TURNING_THRESHOLD 1.0 // 以角度为单位,这个值需要根据实际情况调整
- // 低通滤波参数
- #define ALPHA 0.9 // 这个值需要根据实际情况调整
- //--------------------------param
- // 初始化姿态角度和角速度
- float previousPitch = 0.0;
- float previousRoll = 0.0;
- float previousYaw = 0.0;
- float previousAngularVelocity = 0.0;
- // 转弯标志
- uint8_t turnFlag = 0;
- /**
- * @brief 将陀螺仪值转换为角速度值
- * @param none
- * @note
- * @retval angle:角速度值
- */
- float getAngularVelocity(void)
- {
- int16_t gyroscopeData[3] = {0};
- // // 读取陀螺仪数据
- atk_ms6050_get_gyroscope(&gyroscopeData[0], &gyroscopeData[1], &gyroscopeData[2]);
-
- // 计算陀螺仪数据的模长(即角速度)
- float gyroMagnitude = sqrt(pow(gyroscopeData[0], 2) + pow(gyroscopeData[1], 2) + pow(gyroscopeData[2], 2));
- return gyroMagnitude;
- }
- // 低通滤波函数
- float lowPassFilter(float previousValue, float rawValue) {
- return ALPHA * previousValue + (1 - ALPHA) * rawValue;
- }
- // 判断车辆是否正在转弯的函数
- int isTurning(void) {
- // 获取当前的 pitch、roll 和 yaw 角度
- float roll = 0.0, pitch = 0.0, yaw = 0.0;
- atk_ms6050_dmp_get_data(&pitch, &roll, &yaw);
- printf("pitch:%.1f\n", pitch);
- printf("roll:%.1f\n", roll);
- printf("yaw:%.1f\n", yaw);
- // 获取当前的角速度
- float angularVelocity = getAngularVelocity();
- // 应用低通滤波
- pitch = lowPassFilter(previousPitch, pitch);
- roll = lowPassFilter(previousRoll, roll);
- yaw = lowPassFilter(previousYaw, yaw);
- angularVelocity = lowPassFilter(previousAngularVelocity, angularVelocity);
- // 计算姿态角度的变化速度
- float pitchChangeRate = fabs(pitch - previousPitch);
- float rollChangeRate = fabs(roll - previousRoll);
- float yawChangeRate = fabs(yaw - previousYaw);
- printf("pitchChangeRate:%.1f\n", pitchChangeRate);
- printf("rollChangeRate:%.1f\n", rollChangeRate);
- printf("yawChangeRate:%.1f\n", yawChangeRate);
- // 判断车辆是否正在转弯
- if (pitchChangeRate > TURNING_THRESHOLD || rollChangeRate > TURNING_THRESHOLD || yawChangeRate > TURNING_THRESHOLD) {
- turnFlag = 1; // 表示车辆正在转弯
- } else {
- turnFlag = 0; // 表示车辆未转弯
- }
- // 更新上一次的姿态角度和角速度
- previousPitch = pitch;
- previousRoll = roll;
- previousYaw = yaw;
- previousAngularVelocity = angularVelocity;
- if(turnFlag == 1){
- return 1;
- }else{
- return 0;
- }
- }
|