Загрузка данных


import sys
import select
import termios
import tty
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist

# Настройки скоростей
LINEAR_SPEED = 0.2   # Скорость вперед/назад (м/с)
ANGULAR_SPEED = 0.5  # Скорость поворота (рад/с)

INSTRUCTIONS = """
---------------------------
Управление роботом (WASD):
   w : вперед
   s : назад
   a : влево
   d : вправо
   пробел : СТОП
   q / Ctrl+C : выход
---------------------------
"""

def get_key(settings):
    """Считывает одну нажатую клавишу без нажатия Enter"""
    tty.setraw(sys.stdin.fileno())
    rlist, _, _ = select.select([sys.stdin], [], [], 0.1)
    if rlist:
        key = sys.stdin.read(1)
    else:
        key = ''
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
    return key

def main():
    settings = termios.tcgetattr(sys.stdin)
    rclpy.init()
    node = rclpy.create_node('teleop_wasd')
    pub = node.create_publisher(Twist, '/cmd_vel', 10)

    print(INSTRUCTIONS)

    try:
        while True:
            key = get_key(settings)
            twist = Twist()

            if key == 'w':
                twist.linear.x = LINEAR_SPEED
                print("Вперед  ▲", end='\r')
            elif key == 's':
                twist.linear.x = -LINEAR_SPEED
                print("Назад   ▼", end='\r')
            elif key == 'a':
                twist.angular.z = ANGULAR_SPEED
                print("Влево   ◄", end='\r')
            elif key == 'd':
                twist.angular.z = -ANGULAR_SPEED
                print("Вправо  ►", end='\r')
            elif key == ' ':
                twist.linear.x = 0.0
                twist.angular.z = 0.0
                print("Стоп    ■", end='\r')
            elif key == 'q' or key == '\x03':  # 'q' или Ctrl+C
                print("\nВыход...")
                break
            else:
                # Если ничего не нажато, продолжаем крутить цикл
                continue

            pub.publish(twist)

    except Exception as e:
        print(f"\nОшибка: {e}")

    finally:
        # При выходе отправляем нулевую скорость для безопасности
        stop_twist = Twist()
        pub.publish(stop_twist)
        termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
        node.destroy_node()
        rclpy.shutdown()

if __name__ == '__main__':
    main()