如果esp_radar_train_stop()调用失败(比如训练未正常启动、持续时间不足、或其他配置未完成),那么:
重新详细分析差异后的关键问题:
结合你给出的两个文件代码进行更细致的分析,真正导致你打印阈值异常的根本原因是:
根本原因:
在你自己的例程(第二个文件)中的校准完成回调函数(calib_done_cb
)里,你调用了:
esp_radar_train_stop(&someone_thr, &move_thr);
但没有检查返回值,直接赋值:
g_console_input_config.predict_someone_threshold = someone_thr;
g_console_input_config.predict_move_threshold = move_thr;
为什么导致打印固定值?
如果esp_radar_train_stop()
调用失败(比如训练未正常启动、持续时间不足、或其他配置未完成),那么:
函数返回
ESP_FAIL
或其他非ESP_OK
错误。传入的两个浮点指针
someone_thr
和move_thr
的值不会被有效填充,导致它们保持未初始化的状态。因为局部变量
someone_thr
和move_thr
默认未初始化(编译器优化时会变成随机值或固定值,比如0.000000
或1.569380
),直接打印就会看到这两个异常固定值。
正确的做法示例:
修改你的calib_done_cb
函数,添加严格的错误检查:
static void calib_done_cb(TimerHandle_t t)
{ESP_LOGI(TAG, "校准完成倒计时 %d 秒...", g_start_countdown_left);if (--g_start_countdown_left == 0){xTimerStop(g_calib_timer, 0);xTimerDelete(g_calib_timer, 0);g_calib_timer = NULL;float someone_thr = 0.0f, move_thr = 0.0f;esp_err_t ret = esp_radar_train_stop(&someone_thr, &move_thr);if (ret != ESP_OK){ESP_LOGE(TAG, "校准失败!错误代码: %s", esp_err_to_name(ret));return; // 出错后不要再继续执行}g_console_input_config.predict_someone_threshold = someone_thr;g_console_input_config.predict_move_threshold = move_thr;ESP_LOGI(TAG, "校准完成!有人阈值=%.6f,运动阈值=%.6f", someone_thr, move_thr);start_csi_radar();}
}
额外提醒:
训练时长至少需要达到算法要求(一般官方要求至少10~30秒),确保调用
esp_radar_train_start()
后有足够的训练帧。严格按照官方例程执行状态机流程:
先
esp_radar_train_start()
。等待足够长时间后,再调用
esp_radar_train_stop()
取出阈值。
确认配置的
send_data_interval
足够短(如100ms)确保足够数据帧输入训练。
最终结论:
导致你打印固定异常阈值的问题就是:
缺少
esp_radar_train_stop()
调用返回值的错误检查,导致未经初始化的变量被打印出来。
改进方法已经详细提供,按照上述建议调整即可解决问题。