手动控制机械狗行走
导入一系列与参数有关的模块。
import datetime import os import cv2 import numpy as np from src.actions import MoveForward, SetServo, Stop, MoveBack, BaseAction from src.scenes.base_scene import BaseScene from src.utils import log
手动控制行走模式功能定义。
class Manual(BaseScene): def __init__(self, memory_name, camera_info, msg_queue): super().__init__(memory_name, camera_info, msg_queue) # 初始速度设置为100 self.speed = 100 self.save_dir = os.path.join(os.getcwd(), 'capture') if not os.path.exists(self.save_dir): os.makedirs(self.save_dir, exist_ok=True) def init_state(self): # 初始化状态,执行设置Servo的动作 self.ctrl.execute(SetServo(servo=[91, 10])) def loop(self): # 循环执行该场景 ret = self.init_state() if ret: log.error(f'{self.__class__.__name__} init failed.') return frame = np.ndarray((self.height, self.width, 3), dtype=np.uint8, buffer=self.broadcaster.buf) log.info(f'{self.__class__.__name__} loop start') # 设置摄像头的角度为91,10 last_action = SetServo(servo=[91, 10]) while True: try: if not self.msg_queue.empty(): key = self.msg_queue.get() else: continue except KeyboardInterrupt: self.ctrl.execute(Stop()) break # degree为z轴的角度数,正数为左转,负数为右转 degree = 0 if key == 'up': self.speed = min(self.speed + 1, 100) elif key == 'down': self.speed = max(self.speed - 1, 100) elif key == 'right': last_action = SetServo(servo=[91, 10]) elif key == 'left': last_action = SetServo(servo=[91, 90]) elif key == 'w': last_action = MoveForward(x=self.speed) elif key == 'a': last_action = MoveForward() degree = 40 elif key == 's': last_action = MoveBack(x=self.speed) elif key == 'd': last_action = MoveForward() degree = -40 elif key == 'space': last_action = Stop() elif key == 'esc': self.ctrl.execute(Stop()) break elif key == 'c': save_img = frame.copy() cv2.imwrite(os.path.join(self.save_dir, f'{datetime.datetime.now()}.jpg'), save_img) log.info(f'image saved.') else: continue if isinstance(last_action, BaseAction): last_action.update_z_speed = False last_action.update_x_speed = False # 设置动作中z轴的角度变化 last_action.z_speed = degree last_action.speed_setting = last_action.generate_speed_setting(self.speed, degree) self.ctrl.execute(last_action)
父主题: 代码实现