树莓派3 Node-RED问题:三轴加速度合成输出NaN故障排查
解决Node-RED中三轴加速度合成NaN及多输出问题
首先咱们先拆解下你当前遇到的两个核心问题:
- 合成函数里的
a、b、c变量完全未赋值,直接计算必然会得到NaN - 三个输入节点是分别发送单轴数据的,你的合成函数每次只能收到其中一个轴的消息,自然会输出三次结果
下面是具体的修改方案:
步骤1:用Join节点聚合三轴数据
在三个单轴输出函数节点和你的"Acc to Freq"函数节点之间,添加一个Join节点,配置如下:
- 设置Join节点的模式为
Manual - 给三个单轴函数节点分别设置对应的
topic:X轴函数节点加msg.topic = "X",Y轴加msg.topic = "Y",Z轴加msg.topic = "Z" - 选择合并方式为
合并为一个对象,这样当三个轴的数据都到齐后,Join节点会输出一个包含payload.X、payload.Y、payload.Z的完整消息
步骤2:修改"Acc to Freq"合成函数
把原来的合成函数代码替换成下面的内容,它能正确读取聚合后的三轴数据,并计算合加速度:
// 从聚合后的消息中取出三轴数据 const x = msg.payload.X; const y = msg.payload.Y; const z = msg.payload.Z; // 先校验数据有效性,避免NaN if (typeof x === 'number' && typeof y === 'number' && typeof z === 'number') { // 计算合加速度:√(X²+Y²+Z²),注意用Math.pow或者**,^是位运算不是乘方 const accMagnitude = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2)); // 执行你的缩放操作 msg.payload = accMagnitude * 10; } else { // 数据无效时的处理,可根据需求调整,比如输出默认值或跳过发送 msg.payload = 0; // 或者直接 return null; 不发送无效消息 } return msg;
额外优化:给三个单轴函数节点补全topic设置
分别修改三个单轴的函数代码,在return前添加topic配置:
- X轴函数:
var str = msg.payload; str = str[0]['IX']; const a = str * 10; msg.payload = a; msg.topic = "X"; // 添加此行 return msg;
- Y轴函数:
var str = msg.payload; str = str[0]['IY']; const b = str * 10; msg.payload = b; msg.topic = "Y"; // 添加此行 return msg;
- Z轴函数:
var str = msg.payload; str = str[0]['IZ']; const c = str * 10; msg.payload = c; msg.topic = "Z"; // 添加此行 return msg;
这样修改后,Join节点就能准确把三个轴的数据合并成一个消息,合成函数也能正确计算出合加速度,不会再出现NaN和多输出的问题啦。
内容的提问来源于stack exchange,提问作者Mehmet Ali Küçük
相关产品推荐
相关产品推荐

