1. 프로젝트 개요
- 기간: 2024.09 ~ 2024.12
- 형태: 석사과정 로봇공학 팀프로젝트
- 목표:
- Dynamixel 기반 4족 보행 로봇 직접 제작
- IK 기반 보행 모션 구현
- YOLO 기반 목표 인식 및 추종
- 목표 지점까지 이동하는 통합 로봇 시스템 구현
2. 시스템 구성 요소
2.1 Hardware
- 3D 프린팅 기반 로봇 프레임
- Dynamixel 모터
- OpenCR 제어보드
- Jetson 보드
- Depth Camera
- 배터리 및 전원 시스템
2.2 Software / Control
- C++
- Python
- ROS
- Inverse Kinematics
- Dynamixel 제어
- YOLO 기반 target detection
- Jetson 고수준 제어
- OpenCR 저수준 제어
3. 팀 역할 분담
팀원 1
- 로봇 외형 3D 설계
- 프레임 제작 및 조립
본인 역할
- 로봇 조립
- 다리 관절 IK 기반 보행 모션 생성
- OpenCR 기반 Dynamixel 저수준 제어
- 보행 시퀀스 구현 및 테스트
팀원 3, 4
- YOLO 타겟 학습
- Depth Camera 기반 목표 인식
- Jetson 고수준 제어
- 이동 알고리즘 구현
4. 내가 담당한 주요 작업
4.1 IK 기반 보행 모션 생성
- 한쪽 다리를 2-link 구조로 단순화
- 발끝 목표 위치를 기준으로 hip, knee 관절각 계산
- 계산된 관절각을 시간 순서에 따라 시퀀스로 정리
- 보행 중 다리의 swing phase와 stance phase를 고려하여 모션 구성
| index | phase | x[cm] | z[cm] | q1[deg] | q2[deg] |
|---|---|---|---|---|---|
| 1 | stance | 3.000 | 14.000 | -14.414 | 53.018 |
| 2 | stance | 2.333 | 14.000 | -18.030 | 54.985 |
| 3 | stance | 1.667 | 14.000 | -21.426 | 56.430 |
| 4 | stance | 1.000 | 14.000 | -24.604 | 57.380 |
| 5 | stance | 0.333 | 14.000 | -27.562 | 57.851 |
| 6 | stance | -0.333 | 14.000 | -30.290 | 57.851 |
| 7 | stance | -1.000 | 14.000 | -32.776 | 57.380 |
| 8 | stance | -1.667 | 14.000 | -35.004 | 56.430 |
| 9 | stance | -2.333 | 14.000 | -36.955 | 54.985 |
| 10 | stance | -3.000 | 14.000 | -38.604 | 53.018 |
| 11 | swing | -3.000 | 14.000 | -38.604 | 53.018 |
| 12 | swing | -2.333 | 12.974 | -44.720 | 69.050 |
| 13 | swing | -1.667 | 12.072 | -48.252 | 80.783 |
| 14 | swing | -1.000 | 11.402 | -49.340 | 88.655 |
| 15 | swing | -0.333 | 11.046 | -48.046 | 92.635 |
| 16 | swing | 0.333 | 11.046 | -44.589 | 92.635 |
| 17 | swing | 1.000 | 11.402 | -39.315 | 88.655 |
| 18 | swing | 1.667 | 12.072 | -32.531 | 80.783 |
| 19 | swing | 2.333 | 12.974 | -24.329 | 69.050 |
| 20 | swing | 3.000 | 14.000 | -14.414 | 53.018 |
4.2 OpenCR 기반 Dynamixel 저수준 제어
#include <DynamixelWorkbench.h>
/* -------------------------------------------------------------------------- */
/* Hardware / communication settings */
/* -------------------------------------------------------------------------- */
#if defined(**OPENCM904**)
#define DEVICE_NAME "3"
#elif defined(**OPENCR**)
#define DEVICE_NAME ""
#endif
#define BAUDRATE 57600
#define VEL_STAND 50
#define VEL_GAIT 80
#define GAIT_DT 25
/* Leg joint IDs: upper = hip, lower = knee */
#define DXL_ID_1 1 // FL hip
#define DXL_ID_2 2 // FL knee
#define DXL_ID_3 3 // FR hip
#define DXL_ID_4 4 // FR knee
#define DXL_ID_5 5 // RR hip
#define DXL_ID_6 6 // RR knee
#define DXL_ID_7 7 // RL hip
#define DXL_ID_8 8 // RL knee
/* Shoulder joints are fixed during planar gait control. */
#define DXL_ID_9 9
#define DXL_ID_10 10
#define DXL_ID_11 11
#define DXL_ID_12 12
#define MX64_P_GAIN 850
#define MX64_I_GAIN 0
#define MX64_D_GAIN 0
#define MX28_P_GAIN 850
#define MX28_I_GAIN 0
#define MX28_D_GAIN 0
#define SHOULDER_FIXED_DEG 0.0
/* -------------------------------------------------------------------------- */
/* Precomputed IK gait table */
/* -------------------------------------------------------------------------- */
#define N_GAIT 20
/* Knee trajectory is shared by forward and backward gait. */
const float gait_L[N_GAIT] = {
-53.0, -55.0, -56.4, -57.4, -57.9,
-57.9, -57.4, -56.4, -55.0, -53.0,
-53.0, -69.0, -80.8, -88.7, -92.6,
-92.6, -88.7, -80.8, -69.0, -53.0
};
/* Hip trajectory for forward motion. */
const float gaitF_U[N_GAIT] = {
14.4, 18.0, 21.4, 24.6, 27.6,
30.3, 32.8, 35.0, 37.0, 38.6,
38.6, 44.7, 48.3, 49.3, 48.0,
44.6, 39.3, 32.5, 24.3, 14.4
};
/* Hip trajectory for backward motion. */
const float gaitB_U[N_GAIT] = {
38.6, 37.0, 35.0, 32.8, 30.3,
27.6, 24.6, 21.4, 18.0, 14.4,
14.4, 24.3, 32.5, 39.3, 44.6,
48.0, 49.3, 48.3, 44.7, 38.6
};
/* Neutral standing pose from the same IK convention. */
#define STAND_U 29.0
#define STAND_L -58.0- OpenCR에서 Dynamixel 모터 ID별 제어
- IK로 계산된 관절각을 Dynamixel 목표 위치로 변환
- 관절각 시퀀스를 순차적으로 실행하여 보행 동작 구현
4.3 보행 테스트 및 수정
- 실제 로봇에서 보행 시퀀스 반복 테스트
- 발끝 궤적과 실제 다리 움직임 비교
- 관절각 범위, 보행 주기, 속도 조정
- 전압 강하와 모터 부하 문제 확인
5. 문제 상황: V1 로봇 실패
발생한 문제

- 초기 V1 검정 로봇은 전체 무게가 과도했음
- Dynamixel 모터에 걸리는 부하가 커짐
- 보행 중 순간적으로 전류 요구량 증가
- 전압 강하 발생
- 로봇이 보행 중 셧다운되는 문제 발생
원인 판단
- 단순한 코드 오류가 아니라 기구부 무게와 모터 출력 한계가 주요 원인
- 보행 모션을 수정하는 것만으로는 문제 해결이 어려웠음
- 하드웨어 구조 자체를 수정해야 한다고 판단
6. 해결 과정: V2 로봇으로 변경
수정 방향

- 로봇 외형 재설계
- 3D 프린팅 infill 감소
- 프레임 경량화 (기존: 5kg → 변경: 2.7kg)
- 모터 부하 감소
- 보행 시퀀스 재검증
결과
- V2 초록 로봇에서 보행 안정성 개선
- 전압 강하 문제 완화
- 실제 보행 동작 구현 성공
- 목표 인식 및 이동 시나리오까지 통합 성공
7. 최종 통합
- 팀원이 구현한 YOLO 기반 목표 인식 모듈과 보행 제어부를 통합
- Jetson에서 목표 인식 및 이동 방향 판단
- OpenCR에서 보행 명령 실행
- 로봇이 목표를 인식한 뒤 방향을 전환하고 목적지까지 이동하도록 구성
8. 최종 결과
영상 링크
https://youtu.be/MM9K6MfgT6s- V2 로봇에서 4족 보행 구현 성공
- 목표 인식 후 이동 시나리오 수행
- 팀 경쟁에서 가장 빠르게 목표를 인식하고 도착
- 최종 1위 달성
9. 이 프로젝트를 통해 배운 점
- 로봇 구현에서는 알고리즘뿐 아니라 무게, 전원, 모터 부하 같은 하드웨어 조건이 매우 중요함
- 시뮬레이션이나 수식상 가능한 보행이라도 실제 로봇에서는 전압 강하, 기구적 간섭, 모터 한계가 발생할 수 있음
- 문제 원인을 소프트웨어와 하드웨어 양쪽에서 함께 분석해야 함
- IK 기반 관절각 계산을 실제 Dynamixel 제어로 연결하면서 수학적 모델과 실제 로봇 사이의 차이를 경험함
- 빠른 변경과 반복 테스트가 실물 로봇 프로젝트에서 중요하다는 것을 배움