Ниже — минимальная универсальная стратегия (градиентный подъём по громкости): быстро обойти/просканировать окружность, запомнить направление максимальной громкости, повернуть в это направление и двигаться вперёд до источника. Код — в виде компактного псевдо-Python, можно адаптировать под ваш API (замените get_sound(), turn(), forward(), stop()).
Параметры: SCANS = число шагов поворота при сканировании (напр., 12), TURN_ANGLE = 360/SCANS, STEP = шаг движения (м), THRESH = уровень громкости, при котором считаем, что дошли.
code: SCANS = 12 TURN_ANGLE = 360/SCANS STEP = 0.5 THRESH = 80 # dB или единицы вашего датчика
# быстрый обзор, найти направление максимальной громкости best = get_sound(); best_angle = 0 for i in range(SCANS): turn(TURN_ANGLE) s = get_sound() if s > best: best = s best_angle = (i+1)*TURN_ANGLE # направление максимума # повернуть к максимуму и идти пока не близко turn_to(best_angle) while get_sound() < THRESH: forward(STEP) # при необходимости проверяйте препятствия и обновляйте best_angle при падении сигнала stop()
Короткие рекомендации по адаптации:
Если есть датчик направленного микрофона, SCANS можно уменьшить до 2–4.Для робота с ощупыванием/избеганием препятствий добавьте проверку препятствий перед forward().Если сигнал шумный — усредняйте несколько измерений get_sound() перед сравнениями.
Скажите, под какой API/платформу писать (ROS, Arduino, VEX, Python-robot и т.п.), и я перепишу код точнее.
Ниже — минимальная универсальная стратегия (градиентный подъём по громкости): быстро обойти/просканировать окружность, запомнить направление максимальной громкости, повернуть в это направление и двигаться вперёд до источника. Код — в виде компактного псевдо-Python, можно адаптировать под ваш API (замените get_sound(), turn(), forward(), stop()).
Параметры: SCANS = число шагов поворота при сканировании (напр., 12), TURN_ANGLE = 360/SCANS, STEP = шаг движения (м), THRESH = уровень громкости, при котором считаем, что дошли.
code:
# быстрый обзор, найти направление максимальной громкостиSCANS = 12
TURN_ANGLE = 360/SCANS
STEP = 0.5
THRESH = 80 # dB или единицы вашего датчика
best = get_sound(); best_angle = 0
for i in range(SCANS):
turn(TURN_ANGLE)
s = get_sound()
if s > best:
best = s
best_angle = (i+1)*TURN_ANGLE # направление максимума
# повернуть к максимуму и идти пока не близко
turn_to(best_angle)
while get_sound() < THRESH:
forward(STEP)
# при необходимости проверяйте препятствия и обновляйте best_angle при падении сигнала
stop()
Короткие рекомендации по адаптации:
Если есть датчик направленного микрофона, SCANS можно уменьшить до 2–4.Для робота с ощупыванием/избеганием препятствий добавьте проверку препятствий перед forward().Если сигнал шумный — усредняйте несколько измерений get_sound() перед сравнениями.Скажите, под какой API/платформу писать (ROS, Arduino, VEX, Python-robot и т.п.), и я перепишу код точнее.