Робот не останавливается
В приложении приведен код, который перемещает робота на определенное расстояние, однако я хочу, чтобы он прекратил движение по мере приближения и препятствия. Как мне это сделать? Я попытался добавить ультразвук, чтобы обнаружить препятствие. Я использую nxt-python
def move_to(brick, bx, by ,rx, ry):
wheel_circumference = (pi * wheel_diameter)
distance_per_turn = (wheel_circumference / 360)
distance = math.sqrt((math.pow((bx - rx),2)) + (math.pow((by - ry),2)))
rotations = ((distance / distance_per_turn) / 360)
tacho_units = (round((rotations) * 360))
both.turn(power=power, tacho_units=tacho_units, brake=False)
if(ultrasonic.get_sample() < 20):
both.brake()
def activate2():
update_coordinates()
bx,by = get_ballxy()
rx,ry,a = get_robotxya()
if(ultrasonic.get_sample() < 15):
both.turn(power=-65, tacho_units=380, brake= False)
time.sleep(1)
turn_to(brick,bx,by,rx,ry,a)
time.sleep(0.5)
move_to(brick,bx,by,rx,ry)
kickBall(brick,by,ry)
Thread(target=update_coordinates).start()
connect()
update_coordinates()
while True:
#activate()
activate2()
time.sleep(3)
1 ответ
Решение
Ваша проблема в том, что вы проверяете препятствия только один раз после перемещения вашего робота.
both.turn(power=power, tacho_units=tacho_units, brake=False)
# the turn function blocks, so this check comes to late
if(ultrasonic.get_sample() < 20):
both.brake()
Вы должны постоянно проверять наличие препятствий в другой ветке.
Делайте вещи проще, вы можете немного подправить nxc-python.
Изменить turn
метод BaseMotor
в motor.py
в
def turn(self, power, tacho_units, brake=True, timeout=1, emulate=True, cancel_when=None):
и добавьте следующий код в while
цикл в этом методе:
while True:
# these lines are new
if cancel_when and cancel_when():
break
Тогда вы можете легко написать свой код как:
both.turn(power=power, tacho_units=tacho_units, brake=False, cancel_when=lambda: ultrasonic.get_sample() < 20)