키보드 조종 / RC 조종 / E-stop

초등 주변 — Bluetooth 미니 키보드 기본 · ELRS RC transmitter optional
Cite as: mecha4wd control v26.06a · wiki/control

1. 컨트롤 모드 3가지

모드입력 디바이스적용
BT 키보드 (기본)Bluetooth mini keyboard (Rii i8 등)교실 안 안전 plays
RF RC transmitterExpressLRS 2.4 GHz 333 Hz + Matek R24-P6 RX교실 밖 야외 시연
Block-code 자동필요 없음학생이 upload한 코드 자동 실행

2. BT 키보드 — wasd mapping

W전진 (0.4 m/s)
S후진 (0.4 m/s)
A좌회전 (-1.0 rad/s)
D우회전 (1.0 rad/s)
QStop
EE-stop
RReset zero
FFront flip
SpaceSpeed burst 0.8 m/s
TabToggle block-mode

3. ELRS RC transmitter 채널 매핑

Channel전송기 입력의미코드 매핑
1좌측 스틱 Yvx-1 ~ +1 m/s
2좌측 스틱 Xvy (streafe, 미지원 4WD)0 또는 효과 없음
4우측 스틱 Xyaw rate ω-3.0 ~ +3.0 rad/s
5SA 3단 (전 mode/gait)Mode 0: BT 키보드, 1: 속도 약, 2: 속도 강0..2
6SB 2단 (E-stop)OFF=정지force_stop()
7SC 다얼·LED 색상 4개led.color(red/orange/teal/green)
8SD 다얼·Block-code auto / manualboolean

4. E-stop / failsafe

5. 키보드 → ROS2 node 구현

# file: mecha4wd_control/keyboard_control.py
import rclpy, asyncio, evdev
from rclpy.node import Node
from geometry_msgs.msg import Twist

class KeyboardCtrl(Node):
    def __init__(self):
        super().__init__('mecha4wd_keyboard')
        self.pub = self.create_publisher(Twist, '/cmd_vel_in', 10)
        self.last_cmd = None
        self.kb_handle = self.find_kb()
        asyncio.ensure_future(self.watch_keyboard())

    def find_kb(self):
        from evdev import list_devices, InputDevice
        for path in list_devices():
            dev = InputDevice(path)
            if 'Keyboard' in dev.name or 'BT' in dev.name:
                self.get_logger().info('Found keyboard: ' + dev.name)
                return dev
        return None

    async def watch_keyboard(self):
        if self.kb_handle is None: return
        from evdev import categorize, ecodes
        while True:
            async for event in self.kb_handle.async_read_loop():
                if event.type != ecodes.EV_KEY or event.value != 1:
                    continue
                key = ecodes.KEY[event.code]
                cmd = Twist()
                if   key == 'KEY_W': cmd.linear.x = 0.4
                elif key == 'KEY_S': cmd.linear.x = -0.4
                elif key == 'KEY_A': cmd.angular.z = 1.0
                elif key == 'KEY_D': cmd.angular.z = -1.0
                elif key == 'KEY_Q':
                    cmd.linear.x = 0.0; cmd.angular.z = 0.0
                elif key == 'KEY_E': self.publish_emergency_stop()
                self.pub.publish(cmd)

    def publish_emergency_stop(self):
        # E-stop
        pass

rclpy.init()
rclpy.spin(KeyboardCtrl())

6. ELRS CRSF 파서 (mechadog와 동일 첫 부분)

# file: mecha4wd_control/crsf_bridge.py
# (mechadog와 동일 · CH1=vx, CH2=vy無効, CH4=ω, CH5=mode, CH6=E-stop)

7. 안전 시 권장 흐름

  1. USB 전원으로 먼저 Boot (LiPo 없이) → i2cdetect 로 ToF/BNO055 확인
  2. LiPo 연결·테스트·Drive 0.1 m/s force
  3. BT 키보드 연결·메뉴 안전 BT-Pair (just work)
  4. Race 교탁 위 empty box 안에서부터 시작
  5. BT 또는 RC 한 단어 명령· 실제 automotive pecific release 후 0.1 m/s→ real play
  6. 차별: 학생은 block-coding 평가 feed
⚠ 안전 유의 자동차 깨끗 시 주의면 부터 이 시키 위·empty·empty공간 그래야·동하는·우통·동자 + 그 어디 부·보 대해서지다 옆세요·턱소 함께 보 여 호 . 시와 부에서와 일자 의 학습·때·야습니다어· 시 ‘우결고가 으 개발 위 'as입니다

8. 다음 단계