Webots中Radar传感器多目标属性值重复的技术问题咨询
问题解决:Webots雷达getTargets()返回重复属性值
问题描述
在Webots Python控制器中,使用Radar节点的getTargets()方法时,返回的数组长度与getNumberOfTargets()结果一致,但所有目标对象的属性值完全相同,均对应探测范围内最左侧目标的参数。即使对象内存地址不同,属性值也无差异。
当前使用的代码:
from vehicle import Driver from controller import Radar radar = Radar("radar") radar.enable(1) while driver.step() != -1: num_targets = radar.getNumberOfTargets() targets = radar.getTargets() for i in targets: print(vars(i))
示例输出:
array of targets = [<controller.radar_target.RadarTarget object at 0x000002387D0002E0>, <controller.radar_target.RadarTarget object at 0x000002387D000BB0>] object1values = {'distance': 49.36169833744215, 'receiver_power': -58.779710440658974, 'speed': -5.4952828061041314, 'azimuth': -1.4326991352820366} object2values = {'distance': 49.36169833744215, 'receiver_power': -58.779710440658974, 'speed': -5.4952828061041314, 'azimuth': -1.4326991352820366}
原因分析
Webots的Python绑定中,RadarTarget对象存在内部复用机制,直接访问对象属性或使用vars()获取值时,会读取到最后一次填充的目标数据,导致所有对象返回相同参数。必须使用官方提供的getter方法才能正确获取每个目标的独立信息。
解决方案
修改代码,使用RadarTarget类的官方getter方法获取参数:
getDistance():获取目标距离getAzimuth():获取目标方位角getSpeed():获取目标相对速度getReceiverPower():获取接收功率
修正后的代码:
from vehicle import Driver from controller import Radar driver = Driver() # 补充原代码遗漏的driver初始化 radar = Radar("radar") radar.enable(1) while driver.step() != -1: num_targets = radar.getNumberOfTargets() targets = radar.getTargets() print(f"检测到目标数量: {num_targets}") for idx, target in enumerate(targets): distance = target.getDistance() azimuth = target.getAzimuth() speed = target.getSpeed() receiver_power = target.getReceiverPower() print(f"目标{idx+1}信息:") print(f" 距离: {distance}") print(f" 方位角: {azimuth}") print(f" 相对速度: {speed}") print(f" 接收功率: {receiver_power}")
额外说明
- 原代码遗漏了
driver = Driver()的初始化,会导致运行报错,已在修正代码中补充。 - Webots雷达节点默认无最大目标数限制,探测范围内的目标都会被检测到,无需额外配置参数。
内容的提问来源于stack exchange,提问作者Kokoooo04
相关产品推荐
相关产品推荐

