Skip to content

[로보메이션] 브라우저 연결 기능 - 삐오봇, 라쿤봇 추가 - #3107

Open
RobomationRnD wants to merge 2 commits into
entrylabs:develop-hwfrom
RobomationRnD:submit/pio-raccoon-hwlite
Open

RobomationRnD wants to merge 2 commits into
entrylabs:develop-hwfrom
RobomationRnD:submit/pio-raccoon-hwlite

Conversation

@RobomationRnD

@RobomationRnD RobomationRnD commented Sep 28, 2026 •

Copy link
Copy Markdown

어떤 하드웨어 인가요?

  • (주)로보메이션 - 삐오봇(Pio), 라쿤봇(Raccoon)
    • 브라우저 연결 기능(하드웨어Lite, Web Serial + 로보메이션 전용 동글)

두 로봇의 설치형 블록은 #3098로 머지되었습니다. 이 PR은 같은 두 로봇에 대한 브라우저 연결하기 기능 구현입니다.

변경 사항

  • 브라우저 연결 하드웨어 목록에 삐오(022001)와 라쿤(023001) 항목 추가. 블록은 설치형(entry-hw)과 1:1입니다(삐오 42개, 라쿤 67개).
  • 설치형은 entry-hw 모듈과 entryjs 로봇 계층이 두 프로세스로 나뉘어 IPC로 motoring과 sensory를 주고받습니다. 브라우저 연결은 프로세스가 하나여서 두 계층을 한 클래스로 합쳤습니다. 메서드 본문은 원문을 유지했습니다.
  • 연결 안정화: 이름에 의존하지 않는 정체 파싱, 핸드셰이크 타임아웃과 실패 시 포트 정리, 연결 유지 중 로봇 교체 감지, 다른 기종이 붙었을 때 센서 오염 차단.
  • 덮어써진 명령의 대기 블록 해소: 두 스크립트(시작 블록이 각각 달린 두 묶음)가 한 장치를 같이 쓸 때, 앞 명령이 덮어써져도 그 명령을 기다리던 블록이 멈추지 않고 다음으로 넘어갑니다. 설치형과 다른 점이라 참고사항에 따로 적었습니다.

파일 6개(block_pio_lite.js, metadata_pio_lite.json, piolite.png, block_raccoon_lite.js, metadata_raccoon_lite.json, raccoonlite.png)만 바뀌고 공용 파일은 건드리지 않았습니다.

블록 109개(삐오 42개, 라쿤 67개)를 하나씩 실행해 보고 입력 경계값도 확인했습니다. 연결과 거부, 로봇 교체도 함께 확인했습니다. 설치형 모듈과 프레임 단위로 대조하는 검사도 함께 진행하였습니다.

참고사항

기준(develop-hw) 대비 무엇이 달라지는지, 그리고 알고 있는 차이를 함께 적었습니다.

  • 핸드셰이크는 5초 안에 응답이 없으면 실패로 처리하고 포트를 정리합니다. #3096과 같은 값입니다. 동글을 처음 꽂으면 페어링에 5초에 가까운 시간이 걸리기도 해서 여유가 넉넉하지는 않습니다. 로봇이 붙지 않은 동글은 그동안 다른 줄을 계속 흘리는데, 그 수만큼 재요청이 나갑니다(최대 124회 관측).
  • 로봇 교체 감지가 삐오와 라쿤이 다릅니다. 삐오는 같은 정보를 2회 확인한 뒤 전환합니다. 라쿤은 여기에 더해 장치 주소를 매 프레임 대조합니다. 동글이 상대 로봇을 바꿔도 정보를 다시 보내지 않는 경우가 있었고, 그때 다른 기종의 데이터가 라쿤 센서 값으로 해석돼 관절 한계를 크게 벗어난 값이 제어에 쓰였습니다. 삐오에도 같은 보강이 필요하면 별도 PR로 내겠습니다.
  • 앞 명령이 덮어써져도 기다리던 블록이 멈추지 않습니다. 바퀴나 소리처럼 하나뿐인 장치를 두 스크립트가 같이 쓰면(예: 시작하기를 클릭했을 때 와 q 키를 눌렀을 때 아래에 로봇 블록을 각각 둔 경우) 나중 명령이 앞 명령을 덮어씁니다. 설치형에서는 앞 명령을 기다리던 블록이 그 자리에 멈춰 실행이 끝날 때까지 진행하지 않습니다. #3096에서 햄스터에 넣은 것과 같은 처리이고, 설치형도 별도 PR로 맞추겠습니다.
  • 대신 끝나지 않은 동작이 완료로 표시됩니다. 대기 블록이 코어에 전할 수 있는 것은 "계속 기다림"과 "다음으로" 둘뿐이라, 덮어써진 명령을 기다리던 블록은 영영 멈추거나 넘어가거나 둘 중 하나입니다. 기다리기 위해 멈추는 것이 더 나쁘기 때문에 다음 블록으로 이동하도록 결정하였습니다. 한 스크립트만(예: 시작하기를 클릭했을 때 아래에서만) 그 장치를 쓰는 동안에는 나타나지 않습니다.
  • 기본 자세로 돌아가기가 팔이 도달하지 않았는데 성공으로 끝날 수 있습니다. 이 블록은 집게를 편 뒤 팔을 접는 두 단계입니다. 집게를 펴는 동안 다른 스크립트(예: q 키를 눌렀을 때 아래)가 집게 블록을 실행하면 팔을 접지 않은 채 끝납니다. 실측으로 확인했습니다.
  • 말판 이동을 두 스크립트가 겹쳐 실행하면 나중 블록이 곧바로 끝난 것으로 처리됩니다. 방해 없이 실행하면 한 칸 이동에 약 4.7초가 걸리는데, 앞 이동이 진행 중일 때 실행하면 약 0.12초에 끝납니다(2회 측정). 완료 신호가 어느 명령에 대한 것인지 구분하지 않아, 앞 명령의 완료를 뒤 블록이 자기 것으로 읽는 것으로 보입니다.
  • 초 단위 이동만 완료 판정에 엔진 실행 상태를 함께 봅니다. 브라우저 연결은 프레임 생성과 전송이 한 프로세스라, 이 조건이 없으면 실행 중이 아닐 때 버려질 프레임이 완료를 발화시켜 다음 실행의 대기 블록이 조기 완료됩니다. 설치형에는 이 경로가 없습니다(entry-hw가 별 프로세스에서 자기 주기로 돕니다).
  • 라쿤은 정지 패킷을 한 프레임이 아니라 네 프레임으로 내보냅니다. 주변장치 슬롯 넷을 프레임마다 하나씩 돌려 싣기 때문에, 한 번만 보내면 컨베이어와 그리퍼와 소리 정지 중 그 순간 차례인 하나만 장치에 닿습니다. 설치형은 entry-hw가 엔진 상태와 무관하게 돌아 이 문제가 없습니다. 삐오와 햄스터는 슬롯 순환이 없어 그대로 한 번만 보냅니다.
  • 블록 도움말(Helper)은 설치형과 동일하게 구성하였습니다. 삐오는 ko와 en에만 있고, 라쿤은 없습니다. 설치형 block_pio.js와 block_raccoon.js가 각각 같은 상태입니다.
  • 센서 모니터 좌표는 설치형(entry-hw)이 같은 사진에 쓰는 값을 그대로 가져왔습니다.
스크린샷 2026-09-28 16 43 45

- 하드웨어Lite 목록에 삐오(022001) 추가. 블록은 설치형과 1:1 로 42개
- 설치형은 entry-hw 모듈과 entryjs 로봇 계층이 두 프로세스로 나뉘어 IPC 로
  motoring 과 sensory 를 주고받는다. 브라우저 연결은 프로세스가 하나여서
  두 계층을 한 클래스로 합쳤다. 메서드 본문은 원문을 유지했다
- 연결 계층: 이름에 의존하지 않는 정체 파싱, 핸드셰이크 타임아웃과 실패 시
  포트 정리, 같은 정체 2회 확인 뒤 로봇 교체, 받지 않는 기종이 붙은 동안
  센서 프레임 해석 차단
- 정지 시 완료를 기다리던 블록을 해소한다. 정지 패킷은 라쿤과 동작을 맞춰
  네 프레임으로 내보낸다
- 취소와 완료를 가른다. `__cancel*` 은 상태만 비우고 `__finish*` 이 비운 뒤
  알린다. 앞 대기가 밀려나는 호출부만 후자로 보낸다. 한쪽으로 통일하면
  반대편이 깨진다 - 전부 알리면 완료 지점이 두 번 발화하고, 전부 안 알리면
  다른 스크립트의 정지가 앞 대기를 영영 안 끝낸다
- 말판은 블록 진입점에서 앞 대기를 깨운다. 완료 판정이 구간을 이어 달 때
  같은 손잡이를 다시 넘기므로 `__board()` 안에서 해소하면 안 된다
- 무효 입력은 앞 대기를 깨우지 않는다. 새 명령을 내보내지 않으므로 앞 명령을
  밀어내지 않는다
- 하드웨어Lite 목록에 라쿤(023001) 추가. 블록은 설치형과 1:1 로 67개
- 삐오와 같은 이유로 프레임 계층과 로봇 계층을 한 클래스로 합쳤다
- 주소 관문: 프레임 꼬리에 실려 오는 장치 주소를 매 프레임 대조한다.
  동글이 페어링 상대를 바꿔도 정체 라인을 다시 보내지 않는 경우가 있고,
  그때 다른 기종 프레임이 라쿤 센서로 해석돼 관절 한계 밖 값이 기구학으로
  흘러들었다. 불일치가 30프레임 이어지면 정체를 다시 묻는다
- 꼬리를 못 읽은 프레임은 이 스트림이 꼬리를 싣는다고 한 번이라도 확인된
  뒤에만 버린다. 무조건 통과시키면 꼬리 형식 하나로 관문이 우회되고,
  무조건 버리면 꼬리를 안 쓰는 스트림에서 통신이 통째로 끊긴다
- 정지 패킷을 네 프레임으로 내보낸다. 주변장치 슬롯 넷을 프레임마다 하나씩
  돌려 싣기 때문에 한 번만 보내면 컨베이어와 그리퍼와 소리 정지가 장치에
  닿지 않는다
- 취소와 완료를 삐오와 같은 계약으로 가른다. 관절 각도와 그리퍼는 이름 규칙
  밖이지 정책 밖이 아니다. 덮어쓰는 쪽이 직접 해소하는 구조를 그대로 둔다
- 무효 입력은 앞 대기를 깨우지 않는다. 컨베이어 속도 블록이 그 자리다
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants