Webots中为无Children字段的KUKA机器人添加距离传感器及数值异常排查
解决Webots中KUKA机器人距离传感器读取NaN的问题
在Webots软件中为无Children字段的KUKA机器人添加距离传感器,将传感器放置在bodyslot字段后,传感器始终读取NaN值,相关C代码如下:
#include <webots/keyboard.h> #include <webots/robot.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <webots/distance_sensor.h> #define TIME_STEP 32 int main(int argc, char **argv) { wb_robot_init(); WbDeviceTag ps[1]; char ps_names[1][3] = {"DS"}; ps[0] = wb_robot_get_device(ps_names[0]); wb_distance_sensor_enable(ps[0], TIME_STEP); // read sensors outputs double ps_values; ps_values = wb_distance_sensor_get_value(ps[0]); while (true) { step(); printf ("\n %f \n", ps_values); //while (ps_values > 80){ base_forwards_increment(); //} // base_backwards_increment(); } wb_robot_cleanup(); return 0; }
有效解决方法
1. 修正代码核心逻辑错误
你的代码存在两个关键问题:
- 仅在初始化阶段读取一次传感器值,后续循环始终使用这个旧值
- 循环中的
step()是未定义函数,正确的仿真推进函数是wb_robot_step()
修改后的循环部分代码:
while (true) { // 推进仿真步骤,返回-1表示仿真结束 if (wb_robot_step(TIME_STEP) == -1) break; // 每次仿真步都重新读取传感器最新值 ps_values = wb_distance_sensor_get_value(ps[0]); printf("\n %f \n", ps_values); // 建议用if替代原代码中的while,避免死循环阻塞仿真流程 // if (ps_values > 80) { // base_forwards_increment(); // } }
2. 确认传感器挂载与配置正确性
- 设备名称匹配:检查Webots场景树中传感器的
name属性是否与代码中的"DS"完全一致(区分大小写),名称不匹配会导致设备无法被正确获取。 - 挂载位置与朝向:由于机器人无Children字段,挂载到bodyslot后,需确保传感器的检测方向(可通过Webots的
Show Ray选项查看射线)未被机器人自身部件遮挡,射线需指向外部可检测区域。 - Lookup Table配置:使用默认DistanceSensor节点时,保持默认Lookup Table即可;若自定义传感器,需确保表格包含有效的距离-输出对应数据。
3. 验证传感器启用状态
在获取设备后,可添加打印语句验证设备是否成功获取:
ps[0] = wb_robot_get_device(ps_names[0]); if (ps[0] == 0) { printf("Failed to get distance sensor device!\n"); return 1; } wb_distance_sensor_enable(ps[0], TIME_STEP);
如果输出错误信息,说明传感器未被正确识别,需检查传感器是否已添加到机器人的bodyslot中。
4. 排查仿真环境问题
- 确保传感器检测范围内存在可被检测的物体(如立方体、地面),部分传感器在无检测目标时会返回NaN或最大值。
- 检查Webots仿真步长设置,确保与代码中
TIME_STEP值一致,避免步长不匹配导致数据读取异常。
内容的提问来源于stack exchange,提问作者Gehad Makhlouf
相关产品推荐
相关产品推荐

