3
This commit is contained in:
153
apps/earphone/xtell_Sensor/A_hide/1/1/skiing_tracker.c
Normal file
153
apps/earphone/xtell_Sensor/A_hide/1/1/skiing_tracker.c
Normal file
@ -0,0 +1,153 @@
|
||||
#include "skiing_tracker.h"
|
||||
#include <math.h> // 使用 sqrtf, fabsf, atan2f
|
||||
#include <string.h> // 使用 memset
|
||||
|
||||
// ======================= 用户可配置参数 =======================
|
||||
|
||||
// IMU的采样率 (Hz)
|
||||
#define SAMPLE_RATE 100.0f
|
||||
#define DT (1.0f / SAMPLE_RATE)
|
||||
|
||||
// 传感器灵敏度配置 (必须与硬件配置匹配)
|
||||
// 加速度计量程: ±8G -> 1G = 32768 / 8 = 4096 LSB
|
||||
#define ACCEL_SENSITIVITY 4096.0f // LSB/g
|
||||
#define GRAVITY_MSS 9.80665f // 标准重力加速度 (m/s^2)
|
||||
// 陀螺仪灵敏度 (2000dps)
|
||||
#define GYRO_SENSITIVITY 16.4f // LSB/(deg/s)
|
||||
|
||||
// 状态检测阈值
|
||||
#define MOTION_ACCEL_THRESHOLD (ACCEL_SENSITIVITY * 0.3f) // 加速度变化超过0.3g认为在运动
|
||||
#define MOTION_GYRO_THRESHOLD (GYRO_SENSITIVITY * 90.0f) // 角速度超过xx dps认为在运动
|
||||
#define STILL_SAMPLES_FOR_CALIBRATION 100 // 连续静止1秒 (100个点) 开始校准
|
||||
#define CALIBRATION_SAMPLE_COUNT 50 // 用于平均的校准样本数 (0.5秒)
|
||||
#define MOTION_SAMPLES_TO_START_SKIING 10 // 连续运动0.1秒开始滑行
|
||||
#define STILL_SAMPLES_TO_STOP_SKIING 20 // 连续静止0.2秒停止滑行
|
||||
|
||||
// 角度转弧度
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.14159265358979323846
|
||||
#endif
|
||||
#define RAD_TO_DEG(rad) ((rad) * 180.0f / M_PI)
|
||||
|
||||
// ======================= 内部实现 =======================
|
||||
|
||||
void SkiingTracker_Init(SkiingTracker* tracker) {
|
||||
memset(tracker, 0, sizeof(SkiingTracker));
|
||||
tracker->state = STATE_UNCALIBRATED;
|
||||
}
|
||||
|
||||
// 简单的低通滤波器
|
||||
static float low_pass_filter(float new_input, float prev_output, float alpha) {
|
||||
return alpha * new_input + (1.0f - alpha) * prev_output;
|
||||
}
|
||||
|
||||
static void reset_calibration(SkiingTracker* tracker) {
|
||||
tracker->calib_samples_count = 0;
|
||||
tracker->calib_acc_sum[0] = 0;
|
||||
tracker->calib_acc_sum[1] = 0;
|
||||
tracker->calib_acc_sum[2] = 0;
|
||||
}
|
||||
|
||||
// 核心更新函数
|
||||
void SkiingTracker_Update(SkiingTracker* tracker, signed short* raw_accel, signed short* raw_gyro) {
|
||||
// 运动状态检测
|
||||
// 使用原始数据进行判断,避免校准误差影响
|
||||
float acc_mag = sqrtf((float)raw_accel[0] * raw_accel[0] + (float)raw_accel[1] * raw_accel[1] + (float)raw_accel[2] * raw_accel[2]);
|
||||
float gyro_mag = sqrtf((float)raw_gyro[0] * raw_gyro[0] + (float)raw_gyro[1] * raw_gyro[1] + (float)raw_gyro[2] * raw_gyro[2]);
|
||||
|
||||
int is_moving = (fabsf(acc_mag - ACCEL_SENSITIVITY) > MOTION_ACCEL_THRESHOLD) || (gyro_mag > MOTION_GYRO_THRESHOLD);
|
||||
|
||||
if (is_moving) {
|
||||
tracker->still_counter = 0;
|
||||
tracker->motion_counter++;
|
||||
printf("===motion count===\n");
|
||||
} else {
|
||||
tracker->motion_counter = 0;
|
||||
tracker->still_counter++;
|
||||
printf("===still count===\n");
|
||||
}
|
||||
|
||||
// 2. 状态机处理
|
||||
switch (tracker->state) {
|
||||
case STATE_UNCALIBRATED:
|
||||
if (tracker->still_counter > STILL_SAMPLES_FOR_CALIBRATION) {
|
||||
tracker->state = STATE_CALIBRATING;
|
||||
reset_calibration(tracker);
|
||||
}
|
||||
break;
|
||||
|
||||
case STATE_CALIBRATING:
|
||||
if (is_moving) { // 如果在校准时移动了,则校准失败,返回未校准状态
|
||||
tracker->state = STATE_UNCALIBRATED;
|
||||
reset_calibration(tracker);
|
||||
break;
|
||||
}
|
||||
|
||||
// 累加采样数据
|
||||
tracker->calib_acc_sum[0] += raw_accel[0];
|
||||
tracker->calib_acc_sum[1] += raw_accel[1];
|
||||
tracker->calib_acc_sum[2] += raw_accel[2];
|
||||
tracker->calib_samples_count++;
|
||||
|
||||
if (tracker->calib_samples_count >= CALIBRATION_SAMPLE_COUNT) {
|
||||
// 校准完成,计算平均重力矢量
|
||||
tracker->static_gravity[0] = (short)(tracker->calib_acc_sum[0] / CALIBRATION_SAMPLE_COUNT);
|
||||
tracker->static_gravity[1] = (short)(tracker->calib_acc_sum[1] / CALIBRATION_SAMPLE_COUNT);
|
||||
tracker->static_gravity[2] = (short)(tracker->calib_acc_sum[2] / CALIBRATION_SAMPLE_COUNT);
|
||||
|
||||
// 计算坡度(可选,用于显示)
|
||||
float horiz_g = sqrtf((float)tracker->static_gravity[0] * tracker->static_gravity[0] + (float)tracker->static_gravity[1] * tracker->static_gravity[1]);
|
||||
float vert_g = fabsf((float)tracker->static_gravity[2]);
|
||||
tracker->slope_angle_deg = RAD_TO_DEG(atan2f(horiz_g, vert_g));
|
||||
|
||||
tracker->state = STATE_READY;
|
||||
}
|
||||
break;
|
||||
|
||||
case STATE_READY:
|
||||
if (tracker->motion_counter > MOTION_SAMPLES_TO_START_SKIING) {
|
||||
tracker->state = STATE_SKIING;
|
||||
}
|
||||
break;
|
||||
|
||||
case STATE_SKIING:
|
||||
if (tracker->still_counter > STILL_SAMPLES_TO_STOP_SKIING) {
|
||||
tracker->state = STATE_STOPPED;
|
||||
tracker->velocity = 0.0f; // 零速更新
|
||||
tracker->forward_accel = 0.0f;
|
||||
break;
|
||||
}
|
||||
|
||||
// 计算线性加速度 (重力抵消)
|
||||
// 假设传感器的X轴指向滑雪板前进方向
|
||||
long linear_accel_x_lsb = (long)raw_accel[0] - tracker->static_gravity[0];
|
||||
|
||||
// 转换为 m/s^2
|
||||
float current_accel_mss = (float)linear_accel_x_lsb / ACCEL_SENSITIVITY * GRAVITY_MSS;
|
||||
|
||||
// 低通滤波以平滑加速度
|
||||
tracker->forward_accel = low_pass_filter(current_accel_mss, tracker->forward_accel, 0.3f);
|
||||
|
||||
// 积分计算速度和距离 (梯形积分)
|
||||
float prev_velocity = tracker->velocity;
|
||||
tracker->velocity += tracker->forward_accel * DT;
|
||||
|
||||
// 物理约束:速度不能为负(不能往坡上滑)
|
||||
if (tracker->velocity < 0) {
|
||||
tracker->velocity = 0;
|
||||
}
|
||||
tracker->distance += (prev_velocity + tracker->velocity) / 2.0f * DT;
|
||||
break;
|
||||
|
||||
case STATE_STOPPED:
|
||||
// 在停止状态下,如果再次检测到运动,则重新进入滑行状态
|
||||
if (tracker->motion_counter > MOTION_SAMPLES_TO_START_SKIING) {
|
||||
tracker->state = STATE_SKIING;
|
||||
}
|
||||
// 如果长时间静止,返回未校准状态,以应对更换雪道的情况
|
||||
// if (tracker->still_counter > 3000) { // e.g., 30 seconds
|
||||
// tracker->state = STATE_UNCALIBRATED;
|
||||
// }
|
||||
break;
|
||||
}
|
||||
}
|
||||
53
apps/earphone/xtell_Sensor/A_hide/1/1/skiing_tracker.h
Normal file
53
apps/earphone/xtell_Sensor/A_hide/1/1/skiing_tracker.h
Normal file
@ -0,0 +1,53 @@
|
||||
#ifndef SKIING_TRACKER_H
|
||||
#define SKIING_TRACKER_H
|
||||
|
||||
// 定义滑雪者的运动状态
|
||||
typedef enum {
|
||||
STATE_UNCALIBRATED, // 未校准,等待在斜坡上静止
|
||||
STATE_CALIBRATING, // 正在校准重力矢量
|
||||
STATE_READY, // 校准完成,准备滑行
|
||||
STATE_SKIING, // 正在滑行
|
||||
STATE_STOPPED // 在斜坡上中途停止
|
||||
} MotionState;
|
||||
|
||||
// 存储所有运动学数据
|
||||
typedef struct {
|
||||
// 最终输出
|
||||
float velocity; // 沿斜坡方向的速度 (m/s)
|
||||
float distance; // 沿斜坡方向的滑行距离 (m)
|
||||
float slope_angle_deg; // 动态计算出的坡度 (度)
|
||||
|
||||
// 内部状态变量
|
||||
MotionState state; // 当前运动状态
|
||||
|
||||
// 校准相关
|
||||
short static_gravity[3]; // 校准后得到的静态重力矢量 (LSB)
|
||||
long calib_acc_sum[3]; // 用于计算平均值的累加器
|
||||
int calib_samples_count; // 校准采样计数
|
||||
|
||||
// 运动检测
|
||||
int motion_counter;
|
||||
int still_counter; // 静止状态计数器
|
||||
|
||||
// 物理量
|
||||
float forward_accel; // 沿滑行方向的加速度 (m/s^2)
|
||||
|
||||
} SkiingTracker;
|
||||
|
||||
/**
|
||||
* @brief 初始化滑雪追踪器
|
||||
* @param tracker 指向 SkiingTracker 实例的指针
|
||||
*/
|
||||
void SkiingTracker_Init(SkiingTracker* tracker);
|
||||
|
||||
/**
|
||||
* @brief 处理IMU数据,自动校准并计算速度和距离
|
||||
* @details 这是核心处理函数,应在每次获取新的IMU数据后调用。
|
||||
*
|
||||
* @param tracker 指向 SkiingTracker 实例的指针
|
||||
* @param raw_accel 未经校准的原始加速度数据 [X, Y, Z],单位是 LSB
|
||||
* @param raw_gyro 未经校准的原始陀螺仪数据 [X, Y, Z],单位是 LSB
|
||||
*/
|
||||
void SkiingTracker_Update(SkiingTracker* tracker, signed short* raw_accel, signed short* raw_gyro);
|
||||
|
||||
#endif // SKIING_TRACKER_H
|
||||
207
apps/earphone/xtell_Sensor/A_hide/1/2/skiing_tracker.c
Normal file
207
apps/earphone/xtell_Sensor/A_hide/1/2/skiing_tracker.c
Normal file
@ -0,0 +1,207 @@
|
||||
#include "skiing_tracker.h"
|
||||
#include <math.h> // 使用 sqrtf, fabsf, atan2f
|
||||
#include <string.h> // 使用 memset
|
||||
#include "system/includes.h"
|
||||
#include "btstack/btstack_task.h"
|
||||
#include "app_config.h"
|
||||
#include "app_action.h"
|
||||
#include "asm/pwm_led.h"
|
||||
#include "tone_player.h"
|
||||
#include "ui_manage.h"
|
||||
#include "gpio.h"
|
||||
#include "app_main.h"
|
||||
#include "asm/charge.h"
|
||||
#include "update.h"
|
||||
#include "app_power_manage.h"
|
||||
#include "audio_config.h"
|
||||
#include "app_charge.h"
|
||||
#include "bt_profile_cfg.h"
|
||||
#include "dev_manager/dev_manager.h"
|
||||
#include "update_loader_download.h"
|
||||
#include "../sensor/LIS2DH12.h"
|
||||
#include "../buffer/circle_buffer.h"
|
||||
#include "btstack/avctp_user.h"
|
||||
|
||||
#define ENABLE_XLOG 1
|
||||
#ifdef xlog
|
||||
#undef xlog
|
||||
#endif
|
||||
#if ENABLE_XLOG
|
||||
#define xlog(format, ...) printf("[XT:%s] " format, __func__, ##__VA_ARGS__)
|
||||
#else
|
||||
#define xlog(format, ...) ((void)0)
|
||||
#endif
|
||||
|
||||
// --- 算法核心参数 ---
|
||||
#define SAMPLE_RATE_HZ 100 // 传感器采样率,100Hz
|
||||
#define DT (1.0f / SAMPLE_RATE_HZ) // 每次处理的时间间隔
|
||||
#define TASK_PERIOD_MS (1000 / SAMPLE_RATE_HZ) // 任务执行周期, 10ms for 100Hz
|
||||
Skiing_State_t skiing_state = {0};
|
||||
|
||||
// --- 用于BLE发送的数据包结构 ---
|
||||
typedef struct {
|
||||
float speed_ms;
|
||||
float distance_m;
|
||||
} sensor_ble_packet_t;
|
||||
|
||||
/**
|
||||
* @brief 处理滑雪数据,计算速度和距离
|
||||
* @param acc_gyro_input 传入:6轴原始数据 [AX, AY, AZ, GX, GY, GZ]
|
||||
* @param dt 传入:两次调用之间的时间间隔(秒),例如0.01s for 100Hz
|
||||
* @retval None
|
||||
*/
|
||||
void SL_SC7U22_Process_Skiing_Data(signed short* acc_gyro_input, float dt)
|
||||
{
|
||||
// =================================================================================
|
||||
// 步骤 1: 姿态解算和静态校准
|
||||
// =================================================================================
|
||||
float angles_deg[3] = {0}; // [Pitch, Roll, Yaw] in degrees
|
||||
|
||||
// 调用您现有的姿态解算函数
|
||||
// 假设 calibration_en = 1, yaw_rst = 0
|
||||
unsigned char angle_status = SL_SC7U22_Angle_Output(1, acc_gyro_input, angles_deg, 0);
|
||||
|
||||
if (angle_status != 1) {
|
||||
// 如果校准未完成或计算失败,则不进行后续处理
|
||||
skiing_state.is_calibrated = 0;
|
||||
return;
|
||||
}
|
||||
skiing_state.is_calibrated = 1;
|
||||
|
||||
// 将角度转换为弧度,用于后续三角函数计算
|
||||
skiing_state.angles_rad[0] = angles_deg[0] * DEG_TO_RAD; // Pitch
|
||||
skiing_state.angles_rad[1] = angles_deg[1] * DEG_TO_RAD; // Roll
|
||||
skiing_state.angles_rad[2] = angles_deg[2] * DEG_TO_RAD; // Yaw
|
||||
|
||||
// =================================================================================
|
||||
// 步骤 2: 检测滑雪者是否静止 (这是漂移抑制的关键)
|
||||
// =================================================================================
|
||||
// 静止检测逻辑:
|
||||
// 1. 加速度的模长约等于1g
|
||||
// 2. 角速度的模长非常小
|
||||
long long accel_mag_sq = (long long)acc_gyro_input[0] * acc_gyro_input[0] +
|
||||
(long long)acc_gyro_input[1] * acc_gyro_input[1] +
|
||||
(long long)acc_gyro_input[2] * acc_gyro_input[2];
|
||||
|
||||
long long gyro_mag_sq = (long long)acc_gyro_input[3] * acc_gyro_input[3] +
|
||||
(long long)acc_gyro_input[4] * acc_gyro_input[4] +
|
||||
(long long)acc_gyro_input[5] * acc_gyro_input[5];
|
||||
|
||||
// --- 这些阈值需要根据实际测试进行精细调整 ---
|
||||
const float G_SQ_UPPER = (G_ACCEL * 1.05f) * (G_ACCEL * 1.05f); // (1.05g)^2
|
||||
const float G_SQ_LOWER = (G_ACCEL * 0.95f) * (G_ACCEL * 0.95f); // (0.95g)^2
|
||||
const long long GYRO_MAG_SQ_THRESH = 300; // 对应约 1 deg/s 的抖动
|
||||
const int STILLNESS_DURATION = 100; // 需要持续100个采样点(1秒 @ 100Hz)才确认为静止
|
||||
|
||||
if (accel_mag_sq > G_SQ_LOWER && accel_mag_sq < G_SQ_UPPER && gyro_mag_sq < GYRO_MAG_SQ_THRESH) {
|
||||
if (skiing_state.stillness_counter < STILLNESS_DURATION) {
|
||||
skiing_state.stillness_counter++;
|
||||
}
|
||||
} else {
|
||||
skiing_state.stillness_counter = 0;
|
||||
skiing_state.is_still = 0;
|
||||
}
|
||||
|
||||
if (skiing_state.stillness_counter >= STILLNESS_DURATION) {
|
||||
skiing_state.is_still = 1;
|
||||
}
|
||||
|
||||
// 如果检测到静止,则重置速度(零速更新)
|
||||
if (skiing_state.is_still) {
|
||||
skiing_state.velocity[0] = 0.0f;
|
||||
skiing_state.velocity[1] = 0.0f;
|
||||
skiing_state.velocity[2] = 0.0f;
|
||||
skiing_state.speed = 0.0f;
|
||||
return; // 静止时,不需要进行积分
|
||||
}
|
||||
|
||||
// =================================================================================
|
||||
// 步骤 3: 坐标转换与重力补偿
|
||||
// =================================================================================
|
||||
float accel_body_g[3]; // 机体坐标系下的加速度,单位 g
|
||||
accel_body_g[0] = (float)acc_gyro_input[0] / G_ACCEL;
|
||||
accel_body_g[1] = (float)acc_gyro_input[1] / G_ACCEL;
|
||||
accel_body_g[2] = (float)acc_gyro_input[2] / G_ACCEL;
|
||||
|
||||
// 使用旋转矩阵将机体坐标系加速度(Ab)转换到世界坐标系(An)
|
||||
// An = C_b^n * Ab
|
||||
// C_b^n 是从机体(b)到导航(n)的旋转矩阵,由姿态角决定
|
||||
float sp = sinf(skiing_state.angles_rad[0]); // sin(pitch)
|
||||
float cp = cosf(skiing_state.angles_rad[0]); // cos(pitch)
|
||||
float sr = sinf(skiing_state.angles_rad[1]); // sin(roll)
|
||||
float cr = cosf(skiing_state.angles_rad[1]); // cos(roll)
|
||||
float sy = sinf(skiing_state.angles_rad[2]); // sin(yaw)
|
||||
float cy = cosf(skiing_state.angles_rad[2]); // cos(yaw)
|
||||
|
||||
// 世界坐标系下的加速度(单位g),此时仍包含重力
|
||||
float accel_nav_g[3];
|
||||
accel_nav_g[0] = cy*cr*accel_body_g[0] + (cy*sp*sr - sy*cr)*accel_body_g[1] + (cy*sp*cr + sy*sr)*accel_body_g[2];
|
||||
accel_nav_g[1] = sy*cr*accel_body_g[0] + (sy*sp*sr + cy*cr)*accel_body_g[1] + (sy*sp*cr - cy*sr)*accel_body_g[2];
|
||||
accel_nav_g[2] = -sr*accel_body_g[0] + cp*sr*accel_body_g[1] + cp*cr*accel_body_g[2];
|
||||
|
||||
// 减去重力分量。在世界坐标系下,重力总是指向Z轴负方向(假设Z轴向上),大小为1g
|
||||
// 如果您的世界坐标系Z轴向下,则应为 accel_nav_g[2] -= 1.0f;
|
||||
accel_nav_g[2] += 1.0f;
|
||||
|
||||
// 将线性加速度从 g 转换为 m/s^2
|
||||
float linear_accel_ms2[3];
|
||||
const float G_IN_MS2 = 9.80665f;
|
||||
linear_accel_ms2[0] = accel_nav_g[0] * G_IN_MS2;
|
||||
linear_accel_ms2[1] = accel_nav_g[1] * G_IN_MS2;
|
||||
linear_accel_ms2[2] = accel_nav_g[2] * G_IN_MS2;
|
||||
|
||||
|
||||
// =================================================================================
|
||||
// 步骤 4: 积分计算速度和距离
|
||||
// =================================================================================
|
||||
// 积分得到速度
|
||||
skiing_state.velocity[0] += linear_accel_ms2[0] * dt;
|
||||
skiing_state.velocity[1] += linear_accel_ms2[1] * dt;
|
||||
skiing_state.velocity[2] += linear_accel_ms2[2] * dt;
|
||||
|
||||
// 计算标量速度
|
||||
skiing_state.speed = sqrtf(skiing_state.velocity[0] * skiing_state.velocity[0] +
|
||||
skiing_state.velocity[1] * skiing_state.velocity[1] +
|
||||
skiing_state.velocity[2] * skiing_state.velocity[2]);
|
||||
|
||||
// 积分得到距离
|
||||
skiing_state.distance += skiing_state.speed * dt;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 传感器数据采集与处理任务
|
||||
void sensor_processing_task(signed short * acc_data_buf,signed short * gyr_data_buf) {
|
||||
signed short acc_gyro_data[6];
|
||||
acc_gyro_data[0] = acc_data_buf[0];
|
||||
acc_gyro_data[1] = acc_data_buf[1];
|
||||
acc_gyro_data[2] = acc_data_buf[2];
|
||||
acc_gyro_data[3] = gyr_data_buf[0];
|
||||
acc_gyro_data[4] = gyr_data_buf[1];
|
||||
acc_gyro_data[5] = gyr_data_buf[2];
|
||||
|
||||
// 调用滑雪数据处理函数,传入原始数据和时间间隔DT
|
||||
SL_SC7U22_Process_Skiing_Data(acc_gyro_data, DT);
|
||||
|
||||
// 处理和输出结果
|
||||
if (skiing_state.is_calibrated) {
|
||||
sensor_ble_packet_t packet;
|
||||
packet.speed_ms = skiing_state.speed;
|
||||
packet.distance_m = skiing_state.distance;
|
||||
|
||||
static int print_counter = 0;
|
||||
if (++print_counter >= 10) {
|
||||
print_counter = 0;
|
||||
xlog(": %.2f m/s, Dist: %.2f m, Still: %d",
|
||||
packet.speed_ms, packet.distance_m, skiing_state.is_still);
|
||||
}
|
||||
|
||||
} else {
|
||||
// 如果还未校准完成,可以打印提示信息
|
||||
static int calib_print_counter = 0;
|
||||
if (++calib_print_counter >= 100) { // 每1秒打印一次
|
||||
calib_print_counter = 0;
|
||||
xlog("Calibrating... Please keep the device still.");
|
||||
}
|
||||
}
|
||||
}
|
||||
28
apps/earphone/xtell_Sensor/A_hide/1/2/skiing_tracker.h
Normal file
28
apps/earphone/xtell_Sensor/A_hide/1/2/skiing_tracker.h
Normal file
@ -0,0 +1,28 @@
|
||||
#ifndef SKIING_TRACKER_H
|
||||
#define SKIING_TRACKER_H
|
||||
|
||||
#include "system/includes.h"
|
||||
// 在您的文件顶部添加
|
||||
#define G_ACCEL 8192.0f // 传感器在静止时Z轴的理论读数,对应1g。根据您的代码,±8G量程下,1g ≈ 32768 / 4 = 8192 LSB
|
||||
#define DEG_TO_RAD 0.0174532925f // 角度转弧度 M_PI / 180.0
|
||||
|
||||
typedef struct {
|
||||
// 输出结果
|
||||
float velocity[3]; // 速度 (m/s) 在世界坐标系 [Vx, Vy, Vz]
|
||||
float speed; // 标量速度 (m/s)
|
||||
float distance; // 总滑行距离 (m)
|
||||
|
||||
// 内部状态
|
||||
unsigned char is_calibrated;
|
||||
unsigned char is_still;
|
||||
int stillness_counter;
|
||||
|
||||
// 姿态
|
||||
float angles_rad[3]; // 姿态角 [Pitch, Roll, Yaw] in radians
|
||||
|
||||
} Skiing_State_t;
|
||||
|
||||
|
||||
|
||||
void SL_SC7U22_Process_Skiing_Data(signed short* acc_gyro_input, float dt);
|
||||
#endif // SKIING_TRACKER_H
|
||||
Reference in New Issue
Block a user