- 로봇 동역학 모델이 계산한 엔드이펙터 위치를 UDP로 받아 두 가지 방식으로 동시에 보여주는 Unity 환경
- 화면 위쪽 절반은 파지한 물체를 대신하는 큐브가 움직이는 3D 뷰, 아래쪽 절반은 X, Y, Z 좌표를 나타내는 그래프
- 왼쪽 그래프에는 X, Y, Z를 겹쳐 그리고, 오른쪽 그래프에는 축별로 나타냄.
- 로봇 본체는 나타내지 않고 엔드이펙터의 움직임만 표시함.
Assets/Scenes/VibrationScene.unity를 열고 Play- Game 뷰 그래프 헤더에
waiting for data on UDP 5005가 표시됨 - 진동 신호 sender 파일 실행
python3 Tools/vibration_sender.py --rate 1000현재 임의의 감쇄 진동이 포함된 궤적 움직임을 송신하도록 설정
sender에서는 절대 위치(목표 궤적 + 진동)를 보내고, Unity 쪽에서 목표 궤적을 필터링하여 진동만 남김.
-
그래프의 X, Y, Z: 모델 기준 좌표계 축
-
큐브는 과장, 그래프는 실제값: 진동은 수 밀리미터라 그대로 그리면 큐브의 움직임이 잘 보이지 않으므로
Displacement Gain(기본 100배)으로 오른쪽 큐브의 움직임을 부풀림. 그래프에서는 실제 값 표기. -
좌/우 큐브 움직임
위치 내용 왼쪽 목표 궤적까지 포함한 전체 움직임. 실제 크기 오른쪽 목표 궤적을 필터링하고 진동만. 100배로 부풀림 -
조작
입력 동작 우클릭 드래그 회전 휠 드래그 이동 스크롤 확대/축소 R기준선 재설정 및 그래프 초기화
: sender를 가져다 쓰고, 계산 한 스텝마다 send 호출.
from Tools.vibration_sender import VibrationSender
with VibrationSender("127.0.0.1", 5005) as tx:
for t, (x, y, z) in my_model.run(): # 시간: 초, 위치: 미터
tx.send(t, x, y, z)- 보내는 값은 엔드이펙터의 위치, 속도나 가속도 아님.
- 시간은 모델 안의 시간을 그대로 넣으면 됨.
- 좌표계도 모델이 쓰는 것 그대로 사용하며, Unity 쪽에서
Source Frame설정에 맞춰 변경해줌.
: 두 가지 설정 존재, Unity 쪽 Format을 Auto로 두면 알아서 구분.
-
숫자 그대로 전송 (기본)
- 샘플 하나가
t, x, y, z숫자 네 개, 32바이트. - 실제 스트림에서는 이 형식을 사용
- 샘플 하나가
-
글자로 전송 (JSON)
-
한 줄에 하나씩, 사람이 읽을 수 있는 형태.
{"t": 0.001, "x": 0.4501, "y": 0.1000, "z": 0.6199} -
속도 느림. 값이 제대로 나가고 있는지 눈으로 확인할 때만 사용.
-
- Unity scene 내 오브젝트:
Vibration Rig - scene 변경사항 적용: Tools ▸ Vibration ▸ Build Visualization Scene -> 코드 변경 후 해당 메뉴를 실행하면 변경사항이 Unity에 적용되며, 인스펙터에서 손으로 바꾼 값은 사라짐.
: 모델로부터 데이터 수신
| 필드 | 설명 |
|---|---|
Port |
송신기와 같아야 함. 기본 5005. |
Bind Address |
비워두면 어느 경로로 오든 다 받음. |
Format |
Auto면 알아서 구분, Binary / Json으로 고정할 수도 있음. |
Max Queued Samples |
아직 화면에 반영하지 못하고 쌓아두는 데이터의 최대 개수. 넘치면 오래된 것부터 버림. |
: 엔드이펙터 움직임에서 진동만 추출
| 필드 | 설명 |
|---|---|
Source Frame |
내 모델이 쓰는 좌표계. 기본은 ZUpRightHanded (ROS 방식: X 앞, Y 왼쪽, Z 위). YUpRightHanded, UnityLeftHanded로 변경 가능. |
Baseline |
무엇을 "진동 없음"으로 볼지 — 아래 참고. |
Baseline Cutoff Hz |
목표 궤적과 진동을 가르는 경계 — 아래 참고. |
Displacement Gain |
큐브 움직임을 몇 배로 부풀릴지. 기본 100배. |
Max Visual Offset |
값이 튀어도 큐브가 화면 밖으로 날아가지 않게 막는 한계값. |
-
기준선 설정: 큐브는 "기준 자세에서 얼마나 벗어났는가"를 보여주는데, 이 기준을 무엇으로 삼을지 정하는 설정.
None— 원점 기준. 모델이 엔드이펙터의 절대 위치가 아닌 "얼마나 벗어났는지"만 보내는 경우 사용.FirstSample— 맨 처음 받은 값 기준. 로봇이 제자리에 서 있을 경우 사용.LowPass— 기준이 목표 궤적을 따라다님. 로봇이 움직이는 중이면 이 설정을 사용.
-
경계값(
Baseline Cutoff Hz) 정하기: 목표 궤적은 느리고 크며, 진동은 빠르고 작음.Baseline Cutoff Hz를 설정(기본 3 Hz)하여 목표 궤적은 필터링하고 진동만 남김.
: 그래프
| 필드 | 설명 |
|---|---|
Viewport Rect |
그래프 패널의 위치와 크기. 화면 왼쪽 위를 기준으로 한 비율. 기본은 아래쪽 절반. |
Small Multiples |
축별 그래프를 함께 그릴지. 끄면 겹친 그래프가 전체 폭을 씀. |
Overlay Width Fraction |
겹친 그래프가 차지하는 가로 비율. |
Time Window |
화면에 보이는 시간 범위(초). |
Capacity |
보관하는 값의 개수. 위 시간 범위를 채울 만큼은 되어야 함. |
Unit Scale / Unit Label |
1000 / mm이면 들어온 미터 값을 밀리미터로 바꿔 보여줌. |
Auto Scale |
큰 값이 들어오면 세로축을 늘리고, 잦아들면 천천히 되돌림. |
Fixed Span / Min Span |
Auto Scale을 껐을 때의 세로축 크기와, 켰을 때 더는 줄어들지 않는 하한. |