新建一个Webots世界
添加障碍物
选择木块,可用ctrl+c和ctrl+v来复制相同的木块
添加e-puck机器人
确保世界虚拟时间为零并暂停。
注意:对世界的任何修改都应按以下顺序执行:暂停、重置、修改和保存模拟。
选择场景树视图的最后一个节点WoodenBox。单击场景树视图顶部的“添加”按钮。在对话框中,选择PROTO节点(Webots项目)/robots/gctronic/e-puck/e-puck(Robot)。一个电子吸盘机器人应该出现在竞技场的中央。移动和旋转这个机器人
点击运行,机器人应该移动、闪烁LED并避开障碍物。这是因为它有一个具有该行为的默认控制器。
可以注意到一个黑色的小窗口出现在三维视图的左上角。它显示了电子吸盘机器人的摄像头拍摄的图像。该图像将保持黑色,直到机器人的控制器明确启用相机。这个小图像窗口可以通过拖动来移动。也可以通过拖动右下角来调整大小。最后,单击右上角的“x”可以关闭它。可以通过在“Overlays ”子菜单中选择“Camera Devices”菜单,使其再次可见。
通过按Alt+左键单击+拖动,对机器人施加力。无法对WoodenBox节点施加力,因为默认情况下,它们没有质量,并且被视为粘在地板上。若要在WoodenBox节点上启用物理,应将其质量场设置为特定值(例如0.2 kg)。一旦完成了这一点,就应该能够对它们施加力。
创建机器人控制器
将控制器与机器人节点相连接,然后点击保存
创建一个新的避障控制器用于避障
将新控制器与机器人链接
避障控制器完整代码如下
from controller import Robot, DistanceSensor, Motor
# time in [ms] of a simulation step
TIME_STEP = 64
MAX_SPEED = 6.28
# create the Robot instance.
robot = Robot()
# initialize devices
ps = []
psNames = [
'ps0', 'ps1', 'ps2', 'ps3',
'ps4', 'ps5', 'ps6', 'ps7'
]
for i in range(8):
ps.append(robot.getDevice(psNames[i]))
ps[i].enable(TIME_STEP)
leftMotor = robot.getDevice('left wheel motor')
rightMotor = robot.getDevice('right wheel motor')
leftMotor.setPosition(float('inf'))
rightMotor.setPosition(float('inf'))
leftMotor.setVelocity(0.0)
rightMotor.setVelocity(0.0)
# feedback loop: step simulation until receiving an exit event
while robot.step(TIME_STEP) != -1:
# read sensors outputs
psValues = []
for i in range(8):
psValues.append(ps[i].getValue())
# detect obstacles
right_obstacle = psValues[0] > 80.0 or psValues[1] > 80.0 or psValues[2] > 80.0
left_obstacle = psValues[5] > 80.0 or psValues[6] > 80.0 or psValues[7] > 80.0
# initialize motor speeds at 50% of MAX_SPEED.
leftSpeed = 0.5 * MAX_SPEED
rightSpeed = 0.5 * MAX_SPEED
# modify speeds according to obstacles
if left_obstacle:
# turn right
leftSpeed = 0.5 * MAX_SPEED
rightSpeed = -0.5 * MAX_SPEED
elif right_obstacle:
# turn left
leftSpeed = -0.5 * MAX_SPEED
rightSpeed = 0.5 * MAX_SPEED
# write actuators inputs
leftMotor.setVelocity(leftSpeed)
rightMotor.setVelocity(rightSpeed)
小车避障视频如下
epuck避障