
지난번에는 제스처 인식 기능을 활용한 AI 페널티 킥 골키퍼 게임을 만들었는데, 그 과정에서 AI 비전 자세 및 제스처 센서가 사용자 정의 포즈도 학습할 수 있다는 사실을 알게 되었습니다. 그러다 문득 이런 생각이 들었습니다. 손 제스처로 게임을 조종할 수 있다면, 온몸을 활용하는 건 어떨까? 그래서 몸을 왼쪽으로 기울이기, 오른쪽으로 기울이기, 공중 회전, 가속하기 등 모든 동작을 실제 몸의 움직임으로 수행하는 모션 센서 기반 스키 미니 게임을 만들기로 했습니다. 키보드, 마우스, 게임 컨트롤러는 전혀 사용하지 않습니다. 이 프로젝트에서는 센서에 6가지의 서로 다른 포즈를 가르치고, 각 포즈 ID를 게임 명령에 매핑한 뒤, 모든 것을 HTML 스키 게임에 연결한 과정을 보여드리겠습니다. 이 과정을 마치면 여러분도 센서 앞에 서서 자신의 몸으로 가상 스키 선수를 조종할 수 있게 될 것입니다.
STEP 1. 준비물

1개 SEN0670 AI 비전 자세 및 제스처 센서
USB 케이블 1개
공식 학습 도구가 설치된 컴퓨터 1대
1개의 포즈 스키 게임 HTML 파일
STEP 2. 6가지 게임 포즈 이해하기

시작하기 전에, 어떤 몸동작이 어떤 게임 동작을 유발하는지 미리 알아두세요. 이 게임에서는 다음 여섯 가지 몸동작을 사용합니다: '왼쪽으로 기울이기'는 캐릭터가 왼쪽으로 미끄러지도록 하고, '오른쪽으로 기울이기'는 오른쪽으로 미끄러지도록 하며, '앞구르기'는 360° 앞구르기를, '왼쪽 앞구르기'는 360° 왼쪽 앞구르기를, '오른쪽 앞구르기'는 360° 오른쪽 앞구르기를, '가속'은 가속 상태로 진입하게 합니다. 각 자세를 명확하게 유지할 수 있게 되면, 센서에 이를 가르칠 준비가 된 것입니다.
STEP 3. 공식 학습 도구를 열어보세요

SEN0670 AI 비전 자세 및 제스처 센서와 함께 제공되는 공식 소프트웨어를 다운로드하십시오. 이 소프트웨어는 본 문서 마지막 부분의 ‘첨부 파일 1’에 있습니다. 압축 파일을 해제한 후, .exe 파일을 더블클릭하여 소프트웨어를 실행하십시오. USB 케이블을 사용하여 컴퓨터를 SEN0670에 연결하면 소프트웨어가 센서의 시리얼 포트를 자동으로 감지합니다. 올바른 시리얼 포트를 선택하고 열십시오.
STEP 4. 맞춤형 포즈 배우기


소프트웨어에서 자세 추정 모드를 선택하세요. 센서에서 약 2미터 떨어진 곳에 서서 원하는 자세를 취하세요. 여기서는 ‘왼쪽으로 기울이기’ 자세를 예로 들어보겠습니다. 자세를 취하면 왼쪽 화면에서 인체 키포인트와 인체 감지 박스를 확인할 수 있습니다. 학습이 완료되기 전까지는 인체 키포인트가 녹색으로 표시됩니다.
몸을 왼쪽으로 기울인 자세를 취한 후, 학습 버튼을 클릭하고 약 3초 동안 자세를 유지하세요. 신체 관절 지점의 색상이 녹색에서 다른 색상으로 바뀌면 학습이 성공한 것입니다. 그런 다음 제스처 이름을 직접 지정하여 “왼쪽”이라고 명명할 수 있습니다. 하단의 실시간 데이터 표시창에는 각 관절 지점의 좌표가 표시됩니다.
같은 방법을 사용하여 ‘오른쪽’, ‘파워’, ‘왼쪽 360’, ‘오른쪽 360’, ‘빠름’을 차례로 익혀, 총 6가지 게임 조작 동작을 모두 익힐 때까지 계속하세요.
다음은 구체적인 포즈 학습 과정입니다. 공식 포즈 학습 튜토리얼도 참고하실 수 있습니다: https://wiki.dfrobot.com/sen0670/docs/23979
STEP 5. 센서를 게임에 연결하세요

포즈 학습이 끝나면, 다음 단계는 웹 게임이 SEN0670에서 반환한 포즈 추정 결과를 수신하도록 하는 것입니다. 완성된 스키 포즈 게임 프로그램은 본문 말미의 첨부 파일 2에 있습니다. HTML 파일을 열어 전체 소스 코드를 확인하세요.
이 프로그램은 액세스 계층, 인식 계층, 의사결정 계층, 표현 계층의 네 부분으로 나뉩니다. 액세스 계층에서 프로그램은 SEN0670과 통신을 설정하고 센서가 반환한 데이터를 수신합니다. 센서가 사람의 자세를 인식하면, 해당 자세 ID를 반환합니다. 프로그램이 이 ID를 확보하면 의사 결정 단계로 넘어갈 수 있습니다.
STEP 6. 포즈 ID를 게임 액션에 매핑하기
지각 레이어에서 프로그램은 원시 포즈 ID를 게임에서 사용할 수 있는 형태로 변환해야 합니다. 예를 들어, 센서가 현재 인식하고 있는 포즈 ID가 다음과 같다고 가정해 봅시다:
let poseId = detectedPoseId;
여기서 detectedPoseId는 센서가 현재 인식한 인체 자세를 나타냅니다. 숫자 ID를 직접 사용하는 것은 직관적이지 않으므로, 자세 ID와 게임 액션 이름 간의 대응표를 만들었습니다.
// Create a mapping between SEN0670 pose IDs and game actions
// Each ID corresponds to a learned human body pose
const POSE_MAP = new Map([
[1, "left"], // ID 1: Move left
[2, "right"], // ID 2: Move right
[3, "power"], // ID 3: Front flip 360°
[4, "left360"], // ID 4: Left-side front flip 360°
[5, "right360"], // ID 5: Right-side front flip 360°
[6, "fast"] // ID 6: Accelerate
]);
// Get the current pose ID detected by SEN0670
let poseId = detectedPoseId;
// Find the corresponding game action based on the pose ID
// Example: ID 1 → left, ID 6 → fast
let currentAction = POSE_MAP.get(poseId);
이 매핑 테이블을 통해 센서가 반환하는 숫자 ID는 직관적인 게임 동작 이름으로 변환됩니다. 예를 들어, ID 1 → left → 왼쪽으로 미끄러지기; ID 2 → right → 오른쪽으로 미끄러지기; ID 6 → fast → 가속하기. 이 단계는 AI 인식 결과와 게임 제어 로직을 연결하는 가교 역할을 합니다.
STEP 7. 결정 로직 실행
의사결정 계층에서 프로그램은 플레이어가 수행하려는 동작을 결정합니다. 예를 들어, 왼쪽 및 오른쪽 활공은 다음 코드로 구현할 수 있습니다:
// ===== Left and right steering control =====
// When a left or right pose is detected and the confidence meets the threshold
if(steeringName && conf >= 35){
// left → move left
// right → move right
Game.setSteer(
steeringName === 'left' ? 1 : -1
);
}
여기서 프로그램은 먼저 유효한 조향 자세가 감지되었는지 확인하며, 인식 신뢰도 conf가 특정 임계값에 도달해야 합니다.
인식 결과가 왼쪽이면 캐릭터가 왼쪽으로 이동합니다.
인식 결과가 오른쪽이면 캐릭터가 오른쪽으로 이동합니다. 이처럼 플레이어가 해당 자세를 취하면 가상 스키 캐릭터가 그에 해당하는 동작을 수행하고, 플레이어의 좌우 신체 움직임이 게임 캐릭터의 좌우 이동으로 이어집니다.
사람의 다양한 자세는 서로 다른 게임 동작에 대응합니다. 궁극적으로 게임 전체가 하나의 완전한 데이터 흐름을 형성하며, 이것이 모션 인식 스키 게임 전체의 핵심 구현 개념입니다.
**The player performs a corresponding pose**
↓
**The AI sensor recognizes the human pose**
↓
**Returns the pose ID**
↓
**The pose ID is mapped to a game action**
↓
**The program checks confidence and action state**
↓
**Executes the game control logic**
↓
**The virtual skiing character performs the corresponding action**
STEP 8. 핵심 프로그램 분석
핵심 프로그램은 먼저 SEN0670에서 반환된 포즈 ID를 읽은 다음, 미리 설정된 포즈 매핑 테이블을 사용하여 다양한 포즈를 게임 제어 명령으로 변환합니다. ID 1과 2는 캐릭터의 좌우 활공을 제어하고, ID 3~5는 다양한 공중 회전 동작에 해당하며, ID 6은 가속을 유발합니다. 이를 통해 자체 학습된 인간의 자세와 가상 캐릭터의 동작 간에 직접적인 매핑이 이루어집니다.
// Create a mapping between SEN0670 pose IDs and game actions
// Each ID corresponds to a learned human body pose
const POSE_MAP = new Map([
[1, "left"], // ID 1: Move left
[2, "right"], // ID 2: Move right
[3, "power"], // ID 3: Front flip 360°
[4, "left360"], // ID 4: Left-side front flip 360°
[5, "right360"], // ID 5: Right-side front flip 360°
[6, "fast"] // ID 6: Accelerate
]);
// Get the current pose ID detected by SEN0670
let poseId = detectedPoseId;
// Find the corresponding game action based on the pose ID
// Example: ID 1 → left, ID 6 → fast
let currentAction = POSE_MAP.get(poseId);
플레이어가 해당 포즈를 취하고 센서가 이를 감지하면, 프로그램은 해당 게임 제어 로직으로 진입합니다. 여기서 ‘왼쪽’과 ‘오른쪽’은 스키를 타는 캐릭터의 이동 방향을 변경하고, ‘빠름’은 가속 상태를 제어하며, ‘파워’, ‘왼쪽 360’, ‘오른쪽 360’은 트릭 동작 결정 로직으로 진입합니다. 이를 통해 포즈 추정 결과를 실제 캐릭터 동작으로 변환하는 과정이 완료됩니다.
// ===== Left and right steering control =====
// When a left or right pose is detected and the confidence meets the requirement
if(steeringName && conf >= 35){
// left → steer the skiing character to the left
// right → steer the skiing character to the right
Game.setSteer(
steeringName === 'left' ? 1 : -1
);
}
// ===== Acceleration control =====
// Enable acceleration when the "fast" pose is detected
if(name === 'fast' && conf >= 40){
Game.setFast(true);
}else{
Game.setFast(false);
}
// ===== Trick action control =====
// Three poses that can trigger aerial tricks
const trickPose = [
'power',
'left360',
'right360'
];
// Execute the corresponding trick action when a valid pose is detected
if(trickPose.includes(name)){
Game.performTrick(name);
}
STEP 9. ‘스키 챌린지’를 즐겨보세요


도전하려는 게임 모드를 선택한 후 Sensor의 인식 범위 안에 서십시오. 실제 사용 시에는 Sensor에서 약 2미터 떨어진 거리가 적당합니다. 게임이 시작되면 화면의 안내에 따라 해당 포즈를 취하십시오. Sensor는 사용자의 신체 움직임을 실시간으로 감지하고 현재 인식된 포즈 ID를 반환합니다. 프로그램은 서로 다른 포즈를 게임 제어 명령으로 변환합니다.
예를 들어 몸을 왼쪽으로 기울이면 왼쪽으로 인식되어 게임 캐릭터가 왼쪽으로 활강하고, 몸을 오른쪽으로 기울이면 오른쪽으로 인식되어 캐릭터가 오른쪽으로 활강하며, 앞공중제비 포즈를 취하면 power로 인식되어 앞공중제비가 실행됩니다. 이로써 사람의 신체 움직임에서 AI 포즈 추정, 게임 명령, 가상 캐릭터의 동작으로 이어지는 완전한 상호작용 흐름이 만들어집니다.
아래에서 전체 게임플레이를 확인할 수 있습니다. 기사 마지막 부분에서 첨부 파일을 다운로드하고 동영상의 단계를 따라 포즈 추정 기반 스키 레벨 챌린지를 빠르게 체험해 보십시오.
전체 프로젝트 코드
완전한 포즈 스키 게임 프로그램은 기사 마지막 부분의 첨부 파일 2로 제공됩니다. HTML 파일을 열어 전체 소스 코드를 확인하십시오. 주요 코드 부분은 아래에 나와 있습니다.
let poseId = detectedPoseId;
// Create a mapping between SEN0670 pose IDs and game actions
// Each ID corresponds to a learned human body pose
const POSE_MAP = new Map([
[1, "left"], // ID 1: Move left
[2, "right"], // ID 2: Move right
[3, "power"], // ID 3: Front flip 360°
[4, "left360"], // ID 4: Left-side front flip 360°
[5, "right360"], // ID 5: Right-side front flip 360°
[6, "fast"] // ID 6: Accelerate
]);
// Get the current pose ID detected by SEN0670
let poseId = detectedPoseId;
// Find the corresponding game action based on the pose ID
// Example: ID 1 → left, ID 6 → fast
let currentAction = POSE_MAP.get(poseId);
// ===== Left and right steering control =====
// When a left or right pose is detected and the confidence meets the threshold
if(steeringName && conf >= 35){
// left → move left
// right → move right
Game.setSteer(
steeringName === 'left' ? 1 : -1
);
}
**The player performs a corresponding pose**
↓
**The AI sensor recognizes the human pose**
↓
**Returns the pose ID**
↓
**The pose ID is mapped to a game action**
↓
**The program checks confidence and action state**
↓
**Executes the game control logic**
↓
**The virtual skiing character performs the corresponding action**
// Create a mapping between SEN0670 pose IDs and game actions
// Each ID corresponds to a learned human body pose
const POSE_MAP = new Map([
[1, "left"], // ID 1: Move left
[2, "right"], // ID 2: Move right
[3, "power"], // ID 3: Front flip 360°
[4, "left360"], // ID 4: Left-side front flip 360°
[5, "right360"], // ID 5: Right-side front flip 360°
[6, "fast"] // ID 6: Accelerate
]);
// Get the current pose ID detected by SEN0670
let poseId = detectedPoseId;
// Find the corresponding game action based on the pose ID
// Example: ID 1 → left, ID 6 → fast
let currentAction = POSE_MAP.get(poseId);
// ===== Left and right steering control =====
// When a left or right pose is detected and the confidence meets the requirement
if(steeringName && conf >= 35){
// left → steer the skiing character to the left
// right → steer the skiing character to the right
Game.setSteer(
steeringName === 'left' ? 1 : -1
);
}
// ===== Acceleration control =====
// Enable acceleration when the "fast" pose is detected
if(name === 'fast' && conf >= 40){
Game.setFast(true);
}else{
Game.setFast(false);
}
// ===== Trick action control =====
// Three poses that can trigger aerial tricks
const trickPose = [
'power',
'left360',
'right360'
];
// Execute the corresponding trick action when a valid pose is detected
if(trickPose.includes(name)){
Game.performTrick(name);
}
최종
Sensor를 연결하고 HTML 페이지를 열면 게임을 플레이할 수 있습니다. Sensor 앞에서 약 2미터 떨어진 곳에 서서 모드를 선택하고 화면의 포즈 안내를 따르십시오. Sensor는 사용자의 신체 움직임을 실시간으로 감지하여 인식된 포즈 ID를 반환하고, 프로그램은 이를 게임 명령으로 변환합니다. 아래 동영상에서 전체 게임플레이를 확인할 수 있습니다.
STEP 10. 결론
이 프로젝트를 통해 자세 추정이 동작 감지 상호작용에 얼마나 자연스럽게 어울리는지 알게 되었습니다. SEN0670 AI 비전 자세 및 제스처 센서는 다양한 인간의 자세를 인식할 수 있으며, 맞춤형 학습을 통해 자체적인 동작 범주를 구축할 수 있습니다. 저는 실제 게임 플레이를 바탕으로 6가지 자세를 설계하고, 반환된 자세 ID를 게임 제어 명령에 매핑하며, 실시간 응답을 위해 안정성 검사, 데바운싱 및 동작 트리거 로직을 추가했습니다. 다음 단계로는 더 많은 자세 데이터와 스마트 기기 제어, 로봇 상호작용과 같은 적용 시나리오를 결합해 보고 싶습니다. 주의해야 할 점 한 가지: 센서에서 너무 가까이 서거나 너무 멀리 서면 인식이 불안정해지므로, 학습 시에는 대략 2미터의 거리를 유지하고 각 자세를 안정적으로 유지해야 합니다.
첨부 파일
첨부 파일 1: SEN0670 AI 비전 자세 및 제스처 센서 보조 학습 도구:
SEN0670AI 시각적 제스처 및 자세 센서 PC 소프트웨어.zip
첨부 파일 2: ‘Pose skiing’ 게임 HTML 파일:
트릭 스키 게임.zip
부록
GitHub 링크: https://github.com/mengyali878-jpg/trick_skiing_game
원문: https://www.instructables.com/No-Controller-Needed-Ski-With-Your-Body-Using-AI-P/