在 Webots 的 highway_overtaking 场景中模拟 Range Rover PROTO 的指示灯
Simulating Indicator Lights for Range Rover PROTO in highway_overtaking scenario in Webots
我正在尝试通过编辑 Webots 中现有的 highway_overtaking.wbt 来模拟超车场景,以观察指示灯在切换车道前转 on/off。如何使用驱动程序库来执行此操作?
在修改后的场景中,我目前只有 3 辆车在中间车道,灰色林肯车在其他 2 辆车之间。我使用 setIndicator() 函数来设置指示灯(如下面的代码片段所示)但是当林肯车超前车时我没有观察到任何变化。
以下是 highway_overtaking.py 文件中修改后的代码片段
if (is_vehicle_on_side("left") and
(not safeOvertake or sensors["rear left"].getValue() > 0.8 * sensors["rear left"].getMaxValue()) and
sensors["left"].getValue() > 0.8 * sensors["left"].getMaxValue() and
currentLane < 2):
driver.setIndicator(1)
currentLane += 1
overtakingSide = 'right'
lane_change = True
elif (is_vehicle_on_side("right") and
(not safeOvertake or sensors["rear right"].getValue() > 0.8 * sensors["rear right"].getMaxValue()) and
sensors["right"].getValue() > 0.8 * sensors["right"].getMaxValue() and
currentLane > 0):
driver.setIndicator(2)
currentLane -= 1
overtakingSide = 'left'
lane_change = True
我使用 getIndicator() 函数读取了指示器的值,并观察到当我将其设置为 1 时,指示器值从 0 变为 1。但是我没有观察到 window。请帮忙!
这是由于指示灯的自动禁用行为(当您向与指示灯相反的方向转动方向盘时,指示灯会自动关闭)。
这会导致此模拟出现问题,因为发送到方向盘的命令非常嘈杂。
修复它的一个简单解决方案是使用 'enableIndicatorAutoDisabling' 函数 (https://www.cyberbotics.com/doc/automobile/car-library?tab=python#wbu_car_enable_indicator_auto_disabling) 禁用此自动禁用机制。
但是,要使用此功能,您应该使用 Car class 而不是 Driver 一个(Car class 继承自 Driver class)。
这个需要添加对应的import:
from vehicle import Car
并调用 Car 构造函数而不是 Driver 构造函数:
driver = Car()
另一个小细节,您不应将整数值与 'setIndicator' 一起使用,而应使用预定义值之一,例如:
driver.setIndicator(Driver.INDICATOR_OFF)
driver.setIndicator(Driver.INDICATOR_RIGHT)
driver.setIndicator(Driver.INDICATOR_LEFT)
我正在尝试通过编辑 Webots 中现有的 highway_overtaking.wbt 来模拟超车场景,以观察指示灯在切换车道前转 on/off。如何使用驱动程序库来执行此操作?
在修改后的场景中,我目前只有 3 辆车在中间车道,灰色林肯车在其他 2 辆车之间。我使用 setIndicator() 函数来设置指示灯(如下面的代码片段所示)但是当林肯车超前车时我没有观察到任何变化。
以下是 highway_overtaking.py 文件中修改后的代码片段
if (is_vehicle_on_side("left") and
(not safeOvertake or sensors["rear left"].getValue() > 0.8 * sensors["rear left"].getMaxValue()) and
sensors["left"].getValue() > 0.8 * sensors["left"].getMaxValue() and
currentLane < 2):
driver.setIndicator(1)
currentLane += 1
overtakingSide = 'right'
lane_change = True
elif (is_vehicle_on_side("right") and
(not safeOvertake or sensors["rear right"].getValue() > 0.8 * sensors["rear right"].getMaxValue()) and
sensors["right"].getValue() > 0.8 * sensors["right"].getMaxValue() and
currentLane > 0):
driver.setIndicator(2)
currentLane -= 1
overtakingSide = 'left'
lane_change = True
我使用 getIndicator() 函数读取了指示器的值,并观察到当我将其设置为 1 时,指示器值从 0 变为 1。但是我没有观察到 window。请帮忙!
这是由于指示灯的自动禁用行为(当您向与指示灯相反的方向转动方向盘时,指示灯会自动关闭)。 这会导致此模拟出现问题,因为发送到方向盘的命令非常嘈杂。
修复它的一个简单解决方案是使用 'enableIndicatorAutoDisabling' 函数 (https://www.cyberbotics.com/doc/automobile/car-library?tab=python#wbu_car_enable_indicator_auto_disabling) 禁用此自动禁用机制。
但是,要使用此功能,您应该使用 Car class 而不是 Driver 一个(Car class 继承自 Driver class)。 这个需要添加对应的import:
from vehicle import Car
并调用 Car 构造函数而不是 Driver 构造函数:
driver = Car()
另一个小细节,您不应将整数值与 'setIndicator' 一起使用,而应使用预定义值之一,例如:
driver.setIndicator(Driver.INDICATOR_OFF)
driver.setIndicator(Driver.INDICATOR_RIGHT)
driver.setIndicator(Driver.INDICATOR_LEFT)