напиши код на Python чтобы робот проезжал по лабир...

作成日: 2025年12月1日

使用モデル GPT-5.1 Thinking by Chat01

質問

напиши код на Python чтобы робот проезжал по лабиринту в coppelia sim используя 3 сенсора, примерный код в документе

思考

Creating Python code for robot control with sensors

I’ll write a generic example code for controlling a robot through a maze using CoppeliaSim's remote API. The user likely needs this in Russian with comments in Russian. To keep things simple, I’ll use the common "sim" remote API, with typical functions like simxStart and simxGetObjectHandle.

Writing code for wall-following algorithm in CoppeliaSim

I’ll write Python code for a robot to use three proximity sensors: ‘sensor_left’, ‘sensor_front’, and ‘sensor_right’. The robot will follow the right wall using simple logic. I’ll start by streaming sensor data and then use buffer mode for subsequent readings. I'll provide minimal explanation in Russian to go along with the code, focusing on simplicity and clarity around motor and sensor names.

Creating simple maze-solving algorithm with 3 sensors

I’m creating a basic maze-solving algorithm with three sensors (likely front, left, right). I’ll define the wheel speeds (like base speed and turning speed) and focus on a simple reactive behavior for the robot. It won’t perfectly solve the maze, but it should help the robot navigate through it.

Crafting maze-solving algorithm with sensor input

I’m creating a reactive algorithm where the robot reads distances from front, left, and right sensors. The robot will adjust speeds based on proximity to obstacles (e.g., turning when too close in front, adjusting if too far/too close to the right wall). I'll use numpy to calculate distances and set motor velocities while enabling interruptions via KeyboardInterrupt.

Thought for 1m 9s

回答

Вот пример скрипта на Python для CoppeliaSim, который ведёт робота по лабиринту с помощью трёх датчиков расстояния (левый, фронтальный, правый).
Алгоритм — простое «следование по правой стенке».

⚠️ Тебе нужно только:

  1. Поставить в сцене remote API (порт 19999 по умолчанию).
  2. Подставить свои имена моторов и сенсоров вместо '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()

Как подстроить под твою сцену

  1. Имена объектов
    Открой CoppeliaSim → щёлкни по своему роботу → в иерархии сцены найди:

    • суставы колёс (например Pioneer_p3dx_leftMotor, Pioneer_p3dx_rightMotor)
    • датчики расстояния (например sensor_front, sensor_left, sensor_right)

    Подставь эти имена в константы в начале скрипта:

    python
    LEFT_MOTOR_NAME = 'Pioneer_p3dx_leftMotor' RIGHT_MOTOR_NAME = 'Pioneer_p3dx_rightMotor' FRONT_SENSOR_NAME = 'Pioneer_p3dx_ultrasonicSensor1' # и т.д.
  2. Порты / IP
    В скрипте в CoppeliaSim (обычно remoteApiServer) проверь порт (стандартно 19999).
    Если другой — измени PORT в скрипте.

  3. Пороговые расстояния
    Если робот «боится» слишком рано или поздно реагирует — поиграй:

    • FRONT_LIMIT — когда начинать поворот от стены спереди
    • WALL_DIST и WALL_TOLER — «желаемая» дистанция до боковой стены

Если хочешь, можешь скинуть имена объектов из сцены (или кусок своего «примерного кода»), я подправлю скрипт прямо под твою конкретную модель.

このQ&Aを共有