好的,我再帮你详细、逐步分析你遇到的校准阈值总是 have people=0.000000,move=1.569380的原因,结合你上传的两个代码文件与官方框架。
1. 代码流程对比核心差异
官方例程
校准流程规范,esp_radar_train_start与esp_radar_train_stop成对使用,并且 stop 的返回值(两个阈值)会做合理的检查,阈值正常。
打印的阈值总是一个正常小数,比如 0.01、0.003 等。
你的例程
直接调用了
esp_radar_train_stop(&someone_thr, &move_thr)
,没有对返回值做任何校验。打印时
have people=0.000000,move=1.569380
,第一个是 0,第二个是一个奇怪的大浮点数。
2. esp_radar_train_stop 原理与风险
API 设计
esp_err_t esp_radar_train_stop(float* someone_thr, float* move_thr);
正常时,会填充两个指针的内容(得分阈值)。
若状态不对(如未训练或训练数据不够),不会填充,变量保持原值(未初始化状态)。
你代码的实际情况
float someone_thr, move_thr;
这两个变量未初始化!esp_radar_train_stop
如果失败,不会写入你传进去的值,变量内容是栈上“脏数据”。C语言栈变量未初始化,数值内容随机。有的编译器调试环境下,默认填0,有的可能是其他历史值。你刚好出现了“一个0,一个1.569380”这种情况。
3. 实际打印出错根因总结
为什么有时候是 0 有时候是大浮点数?
C语言栈变量如
float move_thr
,如果没手动赋初值,变量内容不定,视芯片启动时内存状态。如果有地方清栈了就是 0,否则就会是未定义的“垃圾值”,比如你这次就是 1.569380。
这不是算法本身问题,而是未初始化的变量和未检查返回值带来的典型 C 语言新手坑。
4. 正确写法范例
一定要这样做:
float someone_thr = 0, move_thr = 0;
esp_err_t ret = esp_radar_train_stop(&someone_thr, &move_thr);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "Radar stop failed: %s", esp_err_to_name(ret));
// 可以再处理,别用 someone_thr/move_thr
return;
}
// 这里用的是有效阈值
g_console_input_config.predict_someone_threshold = someone_thr;
g_console_input_config.predict_move_threshold = move_thr;
ESP_LOGI(TAG, "have people=%.6f,move=%.6f", someone_thr, move_thr);
校准训练一定要保证已经采集足够 CSI 帧数,否则内部算法不会正常计算阈值,stop 会失败!
5. 你的二次问题总结
不是参数配置问题
不是算法本身问题
是C 语言变量未初始化 + 没有检查 esp_radar_train_stop() 返回值
你的
move_thr
打印成 1.569380 只是巧合,每次都可能不同(栈内容变化)。
6. 你可以怎么验证
在
esp_radar_train_stop
前面,加一行someone_thr=999; move_thr=999;
,你会发现出错时打印永远是 999。按照官方例程,加上返回值校验,出错直接 return,不要赋值。
结论
你看到的“0.000000 和 1.569380”不是算法bug,而是:
C语言栈变量未初始化
未检查 API 返回值,在失败时读了未定义的内存数据
只要按照官方例程流程和上面安全写法,就不会再遇到这种情况!
如果还不明白,可以让我对比你两份代码关键段并贴出来分析!