키를 누른 의도와 실제 움직임은 다른 기록이다
키보드 텔레옵은 사람이 누른 입력을 로봇/가상 도구의 목표로 바꾸는 과정이다. M25.05의 이미지/라벨처럼 여기서도 한 행이 무엇을 의미하는지 먼저 정한다. W를 눌렀음, 제한 후 속도를 전송했음, 제어기가 수락했음, 실제 도구/물체가 움직였음은 서로 다른 근거다.
이번에는 W/S를 tool localX의 양/음 방향 속도±0.02m/s로 대응시키고 별도의 활성 키를 유지해야 명령을 허용하는 교육용 계약을 쓴다. W/S가 모두 눌리거나 활성 입력이 없으면0이다. 이 숫자는 실제 장비의 안전 정격이나 권장 운전 속도가 아니다. 실제 키보드/모터 프로그램을 실행하는 활동도 아니다.
데드맨(deadman)/enable 입력은 조작자가 계속 활성 상태를 유지해야 움직임을 허용하는 조건이다. ROS teleop_twist_joy 공식 개요도 활성 버튼과 축의 속도 매핑을 구분한다. 이 예는 조이스틱 패키지를 키보드/접촉 감독기라고 주장하지 않는다. 아래 heartbeat/TTL·접촉 조건은 별도로 정한 교육 계약이다.
반복 키 이벤트 대신 제어 시각과 입력 상태를 기록한다
운영체제의 key-repeat 횟수마다 거리를 더하면 같은 시간 눌러도 설정에 따라 이동량이 달라질 수 있다. 눌림 상태와 활성 입력을 유지하되 제어 주기의 실제 dt로 목표를 계산하고 기록한다. heartbeat는 입력 경로가 여전히 유효한지를 갱신하는 신호다. 오래된 W눌림 상태를 영구 유지하지 않는다.
키 해제나 포커스 상실이 확인되면 활성 상태를 해제하고0명령 판정을 남긴다. 해제 이벤트가 누락될 가능성에 대비한 신선도 검사도 필요하다. 단순히 “keyup이 올 것”만 기대하지 않는다. 웹 입력이라면 다른 입력창에서 글을 쓰는 키를 로봇 제어로 해석하지 않는 경계도 설계해야 한다.
이번 속도 인터페이스에서0은 새 속도 명령의 값이다. 기존 3.5 위치 텔레옵의 “측정된 현재 자세를 HOLD 목표로 사용”과는 명령 종류가 다르다.0속도를 전송했어도 실제 제어기/통신·물리 상태를 관측하기 전에는 정지나 접촉힘0을 확정하지 않는다.
도구 속도와 물체 상태의 프레임을 나눈다
제안 속도는 tool 프레임, 실제 위치/속도 관측은 world 프레임, 서랍 열림량q는 고정 rail 프레임의 m로 정의한다. 현재 합성 표에서는 도구 방향이 고정되고 toolX와 worldX/railX가 일치한다고 가정한다. 회전한 도구를 쓰면 같은 시각의 변환으로 속도 벡터를 바꾸어야 한다. toolX를 언제나 worldX라고 읽지 않는다.
도구 이동과 서랍q도 같은 값이 아니다. 도구가 미끄러지거나 접촉이 끊기면 도구만 움직일 수 있다. tool pose/velocity·서랍q/속도·물체/접촉 상태를 분리한다. 힘은 제공된 같은 시각의 접촉 측정 N이며 센서/접촉 모델의 출처도 남긴다. 이 기본 표는 실제 힘 센서/충돌 엔진을 구현하지 않는다.
모든 시간은 ClockA의 단조 증가 ms다. 입력 발생/heartbeat stamp, 상태 취득 stamp, 수신 시각, 명령 생성/전송·ack, 다음 관측 시각을 나눈다. rosbag2 공식 README는 기록/재생과 시뮬레이션 시간 경로를 설명하지만, bag 수신 시각이 센서의 원 취득 시각을 자동으로 대신하지는 않는다. 시계 ID/단위와 원본 stamp를 함께 보존한다.
먼저 정한 관문으로 명령을 판정한다
이번 명세는 입력 나이0~100ms, 상태 나이0~50ms까지 유효하다. 경계는 포함한다. 미래 stamp·다른 시계·역전/누락·잘못된 프레임은 무효다. 필요한 상태를 검사할 수 없으면 추가 동작을 허가하지 않고 원인을 기록한다.
신선하고 유효한 입력/상태에서만 활성 키와 W/S를 해석한다. 접촉힘≤5N은 이 예의 허용 범위이고5N 초과면 중단 판정이다. 문턱은 실제 접촉 안전을 인증하는 값이 아니다. 중단/무효 후 자동 재개는 기본 범위 밖이며 새 전제 확인 없이 이전 키 상태를 재사용하지 않는다.
아래 행은 각각 독립적으로 초기화한 합성 사례다. 실제 한 에피소드의 연속 기록으로 연결하지 않는다. 별도 표시가 없으면 enable+W·ClockA·올바른 프레임과 상태를 가정한다.
| 사례 | now/input stamp/state stamp·제공 힘 | 제한 후 전송 판정 |
|---|---|---|
| N | 200/100/150ms·5N | 입력100ms·상태50ms 경계 유효, +0.02m/s |
| L | 201/100/201ms·2N | 입력101ms로0, INPUT_STALE |
| S | 200/200/149ms·2N | 상태51ms로0, STATE_STALE. 현재 힘/정지 미확인 |
| R | 200/200/200ms·2N, enable해제 | 0, INPUT_RELEASED |
| C | 200/200/200ms·5.1N | 0, CONTACT_LIMIT 중단. 부분성과 보존 |
| X | 200/200/200ms·상태 시계가ClockB | 0, CLOCK_MISMATCH. 상태를ClockA로 붙이지 않음 |
R에서 측정 속도가 여전히0.01m/s라면 “0명령을 보냈으니 정지했다”는 결론은 틀리다. C도 이전에 서랍이 조금 열렸다는 사실을 지울 필요는 없지만 완료로 승격하지 않는다. 명령 판정과 현재 상태/미확인을 함께 기록한다.
상태·행동·다음 관측을 시간으로 연결한다
한 유효 구간에서 제한 후 속도 명령+0.02m/s를50ms=0.05s 동안 유지했다고 가정하면 단순 기하 예측 이동량은0.001m다. 다음 관측의 실제 도구 이동이0.0008m라고 제공됐다면 차이는0.0002m다. 이는 명령×시간과 제공 관측의 차이이며 실제 물리 추종 성능을 측정한 것은 아니다.
이 행에서 관측ot는 행동을 선택할 때 사용할 수 있었던 상태, 행동at는 제한 후 전송한 속도 명령으로 선언한다. 다음 관측ot+1은 실행 결과다. 실제 다음 위치0.0008m를 명령 속도0.02m/s 칸에 넣으면 의미/단위가 바뀐다.50ms 뒤 관측을 먼저 보고 이전 행동을 선택한 것처럼 학습 행을 만들면 미래 정보 누수가 된다.
수집 행에는 episode/attempt ID·seq·현재 자산/모델/보정/소스 지문, 관측 원시각/유효성·도구/서랍/힘, 키/enable·제안 속도·제한 이유·전송 속도/시각·ack와 다음 관측 연결을 남긴다. ack도 실제 이동/물체 성공의 관측을 대신하지 않는다. shape가 같은 배열이라도 절대 위치/증분/속도·제한 전후를 선언하지 않고 합치지 않는다.
접촉과 부분성과를 완료로 바꾸지 않는다
이번 서랍 과업의 제공 완료 기준은 목표q=0.25m의 오차≤0.005m, 서랍 속도 크기≤0.01m/s, 접촉힘≤5N이0.2초 동안 신선한 관측으로 확인되고 중단/미상이 없는 것이다. 속도는 크기로 비교한다. M25.02의 위치/정지에 힘 조건을 추가한 현재 과업의 명세이지 모든 서랍의 보편 기준이 아니다.
q=0.247m만 있으면 위치오차0.003m는 맞지만 속도/유지시간·힘/신선도가 없으므로 완료는 미확인이다. 접촉이 한 번 발생했거나 명령이 수락됐다는 사실도 전체 성공이 아니다. 접촉힘 중단 후 물체가 놓였는지·잔류 움직임/힘이 어떤지는 별도 관측으로 확인한다.
학습 자료에 쓸 행과 전체 평가 분모도 구분한다. BC의 정상 시연만 선택할 수 있지만 중단/무효 에피소드를 원본에서 삭제해 성공률을 높이면 안 된다. 선택 규칙·누락 이유·원래 시도/재시도와 terminal 상태를 보존한다. 중단·관측 누락을 성공0/힘0으로 채우지 않는다. 실제 수집이 없다면 이번 표의 분석 결과로 표시한다.
기존 5.4 데이터 수집과 M20.03의 행동 계약으로 이어 읽는다. 다음 M27.01에서는 이 입력/행동 계약을 유지하면서 실행 환경과 배포 경계를 살펴본다.