напиши код на Python чтобы робот проезжал по лабир...
बनाया गया: 1 दिसंबर 2025
का उपयोग करके उत्तर दिया गया GPT-5.1 Thinking द्वारा Chat01
बनाया गया: 1 दिसंबर 2025
का उपयोग करके उत्तर दिया गया GPT-5.1 Thinking द्वारा Chat01
напиши код на Python чтобы робот проезжал по лабиринту в coppelia sim используя 3 сенсора, примерный код в документе
Вот пример скрипта на Python для CoppeliaSim, который ведёт робота по лабиринту с помощью трёх датчиков расстояния (левый, фронтальный, правый).
Алгоритм — простое «следование по правой стенке».
⚠️ Тебе нужно только:
- Поставить в сцене remote API (порт 19999 по умолчанию).
- Подставить свои имена моторов и сенсоров вместо
'left_motor','right_motor','sensor_front','sensor_left','sensor_right'.
python# -*- coding: utf-8 -*- import sim # модуль remote API (sim.py должен лежать рядом со скриптом) import time import math import sys # ------------------ НАСТРОЙКИ ------------------ IP = '127.0.0.1' PORT = 19999 LEFT_MOTOR_NAME = 'left_motor' # ИМЯ СУСТАВА ЛЕВОГО КОЛЕСА В СЦЕНЕ RIGHT_MOTOR_NAME = 'right_motor' # ИМЯ СУСТАВА ПРАВОГО КОЛЕСА В СЦЕНЕ FRONT_SENSOR_NAME = 'sensor_front' # ИМЯ ФРОНТАЛЬНОГО ДАТЧИКА LEFT_SENSOR_NAME = 'sensor_left' # ИМЯ ЛЕВОГО ДАТЧИКА RIGHT_SENSOR_NAME = 'sensor_right' # ИМЯ ПРАВОГО ДАТЧИКА # Базовые скорости колёс (рад/с или как у тебя настроено) BASE_SPEED = 3.0 TURN_SPEED = 2.0 # Параметры поведения MAX_DIST = 1.0 # "Нет препятствий" — если дальше этого расстояния FRONT_LIMIT = 0.30 # Если объект ближе 30 см спереди — нужно поворачивать WALL_DIST = 0.25 # Желаемая дистанция до правой стены WALL_TOLER = 0.05 # Допустимое отклонение по расстоянию до стены # ------------------------------------------------ def connect(): print('Закрываю старые соединения...') sim.simxFinish(-1) # на всякий случай закрываем все print('Подключаюсь к CoppeliaSim...') client_id = sim.simxStart(IP, PORT, True, True, 5000, 5) if client_id == -1: print('Не удалось подключиться к CoppeliaSim') sys.exit(1) print('Подключение установлено, clientID =', client_id) return client_id def get_handle(client_id, name, what='объекта'): rc, handle = sim.simxGetObjectHandle(client_id, name, sim.simx_opmode_blocking) if rc != sim.simx_return_ok: print(f'Ошибка получения хэндла {what} "{name}", код = {rc}') sys.exit(1) return handle def start_sensor_streams(client_id, sensors): # Первый вызов -- режим STREAMING, чтобы запустить поток значений for s in sensors: sim.simxReadProximitySensor(client_id, s, sim.simx_opmode_streaming) # даём немного времени, чтобы данные начали приходить time.sleep(0.2) def read_distance(client_id, sensor_handle): """ Чтение расстояния с датчика. Возвращает расстояние в метрах, либо MAX_DIST если ничего не видит. """ rc, detected, point, _, _ = sim.simxReadProximitySensor( client_id, sensor_handle, sim.simx_opmode_buffer ) # rc может быть simx_return_novalue, если стрим ещё не готов if rc not in (sim.simx_return_ok, sim.simx_return_novalue_flag): # Если прям ошибка API — считаем, что датчик ничего не видит return MAX_DIST if detected: # point = [x, y, z] в метрах dist = math.sqrt(point[0]**2 + point[1]**2 + point[2]**2) return dist else: return MAX_DIST def set_speed(client_id, left_motor, right_motor, v_left, v_right): sim.simxSetJointTargetVelocity(client_id, left_motor, v_left, sim.simx_opmode_streaming) sim.simxSetJointTargetVelocity(client_id, right_motor, v_right, sim.simx_opmode_streaming) def main(): client_id = connect() # Получаем хэндлы моторов left_motor = get_handle(client_id, LEFT_MOTOR_NAME, 'левого мотора') right_motor = get_handle(client_id, RIGHT_MOTOR_NAME, 'правого мотора') # Получаем хэндлы сенсоров front_sensor = get_handle(client_id, FRONT_SENSOR_NAME, 'фронтального датчика') left_sensor = get_handle(client_id, LEFT_SENSOR_NAME, 'левого датчика') right_sensor = get_handle(client_id, RIGHT_SENSOR_NAME, 'правого датчика') # Запускаем стриминг для всех датчиков start_sensor_streams(client_id, [front_sensor, left_sensor, right_sensor]) print('Начинаю движение по лабиринту. Нажми Ctrl+C в консоли для остановки.') try: while True: # Считываем расстояния dist_front = read_distance(client_id, front_sensor) dist_left = read_distance(client_id, left_sensor) dist_right = read_distance(client_id, right_sensor) # ----------- ПРОСТОЙ АЛГОРИТМ СЛЕДОВАНИЯ ПО ПРАВОЙ СТЕНЕ ----------- # 1) Если спереди близко стена — нужно повернуть if dist_front < FRONT_LIMIT: # если справа свободнее, чем слева — поворачиваем направо, # иначе налево if dist_right > dist_left: # поворот направо (левое колесо вперёд, правое назад) vL = TURN_SPEED vR = -TURN_SPEED else: # поворот налево vL = -TURN_SPEED vR = TURN_SPEED else: # 2) Спереди свободно — едем прямо, но держим дистанцию до правой стены # слишком далеко от правой стены -> подруливаем вправо if dist_right > WALL_DIST + WALL_TOLER: # поворачиваем немного вправо (правое колесо медленнее) vL = BASE_SPEED vR = BASE_SPEED * 0.6 # слишком близко к правой стене -> подруливаем влево elif dist_right < WALL_DIST - WALL_TOLER: # поворачиваем немного влево (левое колесо медленнее) vL = BASE_SPEED * 0.6 vR = BASE_SPEED # всё ок, едем прямо else: vL = BASE_SPEED vR = BASE_SPEED # ------------------------------------------------------------------- set_speed(client_id, left_motor, right_motor, vL, vR) # маленькая задержка, чтобы не зашивать CPU и дать роботу двигаться time.sleep(0.05) except KeyboardInterrupt: print('\nОстановка по Ctrl+C') # Останавливаем робота set_speed(client_id, left_motor, right_motor, 0.0, 0.0) # Закрываем соединение sim.simxFinish(client_id) print('Скрипт завершён.') if __name__ == '__main__': main()
Имена объектов
Открой CoppeliaSim → щёлкни по своему роботу → в иерархии сцены найди:
Pioneer_p3dx_leftMotor, Pioneer_p3dx_rightMotor)sensor_front, sensor_left, sensor_right)Подставь эти имена в константы в начале скрипта:
pythonLEFT_MOTOR_NAME = 'Pioneer_p3dx_leftMotor' RIGHT_MOTOR_NAME = 'Pioneer_p3dx_rightMotor' FRONT_SENSOR_NAME = 'Pioneer_p3dx_ultrasonicSensor1' # и т.д.
Порты / IP
В скрипте в CoppeliaSim (обычно remoteApiServer) проверь порт (стандартно 19999).
Если другой — измени PORT в скрипте.
Пороговые расстояния
Если робот «боится» слишком рано или поздно реагирует — поиграй:
FRONT_LIMIT — когда начинать поворот от стены спередиWALL_DIST и WALL_TOLER — «желаемая» дистанция до боковой стеныЕсли хочешь, можешь скинуть имена объектов из сцены (или кусок своего «примерного кода»), я подправлю скрипт прямо под твою конкретную модель.