import time
import keyboard
from getkey import getkey, keys
from cyber.python.cyber_py3 import cyber_time
from cyber.python.cyber_py3 import cyber
from modules.common_msgs.control_msgs import control_cmd_pb2
from modules.common_msgs.chassis_msgs import chassis_pb2
import sys, select, os
if os.name == 'nt':
import msvcrt, time
else:
import tty, termios
derta_speed = 2.0
derta_heading = 2.0
def getKey():
if os.name == 'nt':
timeout = 0.1
startTime = time.time()
while(1):
if msvcrt.kbhit():
if sys.version_info[0] >= 3:
return msvcrt.getch().decode()
else:
return msvcrt.getch()
elif time.time() - startTime > timeout:
return ''
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
class CarController:
def __init__(self):
self.throttle = 0.0
self.brake = 0.0
self.steering = 0.0
self.max_throttle = 100.0
self.steering_rate = 0.1
cyber.init()
self.node = cyber.Node("keyboard_control")
self.control_writer = self.node.create_writer("/apollo/control", control_cmd_pb2.ControlCommand)
def send_control_command(self):
"""发布控制指令至 Apollo 控制模块"""
cmd = control_cmd_pb2.ControlCommand()
cmd.header.timestamp_sec = cyber_time.Time.now().to_sec()
cmd.header.module_name = "keyboard_control"
cmd.throttle = self.throttle
cmd.brake = self.brake
cmd.steering_target = self.steering
cmd.gear_location = 1
self.control_writer.write(cmd)
print(f"指令: 油门={self.throttle:.2f}, 刹车={self.brake:.2f}, 转向={self.steering:.2f}")
def keyboard_listener(self):
"""监听键盘输入并更新控制参数"""
print("使用 WASD 控制车辆,Q 退出...")
while not cyber.is_shutdown():
key = getKey()
if key == 'w':
self.throttle = min(self.throttle + derta_speed, self.max_throttle)
self.brake = 0.0
elif key == 's':
self.brake = min(self.brake + derta_speed, self.max_throttle)
self.throttle = 0.0
if key == 'a':
self.steering = max(self.steering - self.steering_rate, -1.0)
elif key == 'd':
self.steering = min(self.steering + self.steering_rate, 1.0)
else:
self.steering *= 0.9
if key == 'q':
break
self.send_control_command()
time.sleep(0.1)
if __name__ == '__main__':
controller = CarController()
controller.keyboard_listener()
cyber.shutdown()