임베디드를 좋아하는 조금 특이한 개발자?

[Quadruped Robot] Yertle 로봇 관절 제어 확인 본문

Project/Quadruped Robot 제작

[Quadruped Robot] Yertle 로봇 관절 제어 확인

Gordon_ 2026. 9. 1. 20:12
반응형

1. 서론

  지금까지 pyBullet으로 Yertle로봇을 Load하는 것 까지 성공하였습니다. 그리고 pyBullet을 동작하기 위한 최소한의 개발 환경을 구축하였습니다. 이제 실제 로봇을 pyBullet 시뮬레이션에서 보행(Gait)하기 위해서는 먼저 Yertle 로봇에 어떤 관절이 있으며 해당 관절이 어떻게 움직이는지를 확인할 필요가 있습니다. 그러므로 이번에는 Yertle 로봇의 관절을 제어하고, 제어 가능한 각도를 확인 할 것입니다. 

 

2. pyBullet으로 관절(Joint) 정보 확인

  pyBullet에서 URDF로 정의된 로봇 모델을 Load하였습니다. URDF에서는 해당 로봇의 각 Part를 정의하고 각 파트가 어떻게 연결되었는지 정의 되어 있습니다. 이를 바탕으로 pyBullet에서 어떻게 로봇이 움직이는지를 확인 할수 있습니다.

 

getJointInfo 함수를 사용하여 해당 로봇이 가지고 있는 관절에 대한 정보를 확인 할 수 있습니다.

 

pyBullet에서 getJointInfo 함수에 대한 설명)

https://docs.google.com/document/d/10sXEhzFRSnvFcl3XxNGhnD4N2SedqwdAvK3dsihxVUA/edit?tab=t.0#heading=h.la294ocbo43o

 

PyBullet Quickstart Guide

PyBullet Quickstart Guide Erwin Coumans, Yunfei Bai, 2016-2023 Visit desktop doc, forums, github discussions and star Bullet! Introduction 2 Hello PyBullet World 3 connect, disconnect, bullet_client 3 setGravity 7 loadURDF, loadSDF, loadMJCF 8 saveState, s

docs.google.com

인덱스 이름 데이터 타입 설명
0 jointIndex int 관절(Joint)의 Index
해당 Index는 다른 함수에서 입력으로 사용
1 jointName string URDF에 명시되어 있는 관절(Joint)의 이름
2 jointType int 관절의 타입
0 : JOINT_REVOLUTE
1 : JOINT_PRISMATIC
2 : JOINT_SPHERICAL
3 : JOINT_PLANAR
4 : JOINT_FIXED
3 qIndex int Joint position이 상태 벡터에서 사용하는 인덱스
4 uIndex int Joint velocity가 상태 벡터에서 사용하는 인덱스
5 flags int 내부 플래그 (reserved)
6 jointDamping float URDF에 명시되어 있는 Joint 감쇠 계수
7 jointFriction float URDF에 명시되어 있는 Joint 마찰 계수
8 jointLowerLimit float URDF에 명시되어 있는 Joint 위치의 최소 제한값
9 jointUpperLimit float URDF에 명시되어 있는 Joint 위치의 최대 제한값
10 jointMaxForce float URDF에 명시되어 있는 최대 힘 또는 토크
11 jointMaxVelocity float URDF에 명시되어 있는  최대 속도
12 linkName string 이 Joint에 연결된 child link 이름
13 jointAxis vec3 Joint 회전축 또는 이동축
14 parentFramePos vec3 부모 프레임 기준 Joint 프레임 위치
15 parentFrameOrn vec4 부모 프레임 기준 Joint 프레임 방향 quaternion
16 parentIndex int Parent link의 인덱스 (-1 이면 base)

Yertle의 각 관절의 정보

  

  Yertle에서는 4개의 다리가 3개의 관절로 이루어져 있습니다. 그러므로 베이스 1개 + (다리 개수 4개 x 각 다리의 관절 개수 3개) 이므로 전체 관절이 13개로 나오는 것입니다.

 

 관절에 대한 정보가 너무 많지만 실제로 여기서 우리가 필요로 하는 정보는 5개 입니다.

 

2.1. jointIndex

  각 관절의 인덱스를 나타냅니다. 해당 관절 인덱스는 다른 메소드에서 관절을 제어하기 위해 해당 관절을 나타내기 위한 입력값(인자)로 사용됩니다.

 

  예를들어, resetJointState 메소드의 입력값으로 JointIndex가 사용됩니다.

 

2.2. jointName

  URDF에서 명시된 관절의 이름을 나타냅니다. 실제로 움직이려는 관절이 URDF에서 해당 관절이 맞는지 확인 할 수 있습니다.

 

 

 

2.3. jointType

  해당 관절이 어떻게 동작하는지 나타냅니다. Yertle 로봇에는 1축으로 회전하는 모터만을 사용하므로 대부분의 관절이  "JOINT_REVOLUTE" 타입입니다. 단, 모든 관절의 기준이 되는 Base 관절만 "JOINT_FIXED"입니다.

 

2.4. jointLowerLimit, jointUpperLimit

  관절(Joint)의 회전 범을 결정하는 값입니다. 해당 값은 raidan 값으로 되어 있습니다.

 

  예를 들어 lf_shoulder의 경우 -0.7854 rad ~ 0.7854 rad 의 범위를 가지고 있습니다. 이를 각도로 변환하면 -45도 ~ 45도의 범위입니다.

 

주의점)

  관절의 초기 각도는 0으로 설정되어 있습니다. 만약 관절의 범위에 0도가 포함되지 않는 경우 resetJointState 함수로 초기 각도를 범위내 들어도록 설정해야합니다.

 

 

3. pyBullet으로 관절 제어

  pyBullet에서는 2가지 방법(reset, set)으로 관절을 제어합니다. 이번에는 해당 방법으로 관절을 제어하는 방법을 확인해보겠습니다. 

3.1. reset을 통한 관절 제어

https://docs.google.com/document/d/10sXEhzFRSnvFcl3XxNGhnD4N2SedqwdAvK3dsihxVUA/edit?tab=t.0#heading=h.p3s2oveabizm

  reset은 "(원래 상태로) 되돌리다"라는 의미를 사용되고 있습니다. 특히, 컴퓨터 공학에서는 "초기화하다"라는 의미로 사용하기도 합니다. 그러므로 reset은 실제 시뮬레이션을 하기전 로봇의 각 관절의 위치를 초기화하는 메소드입니다. 

 

  관절의 상태를 reset를 할때는 물리 엔진의 영향을 받지 않고 즉각적으로 상태가 변하게 됩니다.

  그러므로 시뮬레이션을 초기화 하는 과정에서 관절을 reset을 합니다.

 

reset으로 관절 제어

 

3.2. set을 통한 관절 제어

https://docs.google.com/document/d/10sXEhzFRSnvFcl3XxNGhnD4N2SedqwdAvK3dsihxVUA/edit?tab=t.0#heading=h.jxof6bt5vhut

  set은 "(어떤 상태에 있게)하다"라는 의미를 가지고 있습니다. pyBullet에서는 관절의 상태를 특정 상태(각도, 힘, 속도)로 설정하는 메소드입니다. 그러므로 시뮬레이션 중 관절의 상태를 변하게 하여 로봇을 움직일때 사용하는 메소드입니다.

 

  해당 메소드는 물리 인젠의 영향을 받기 때문에 설정한 각도로 선형적으로 움직이게 됩니다. 하지만, 속도가 비선형적으로 움직여야 하는 경우 시간에 따라 set 메소드를 순차적으로 호출하여 속도를 제어할 수 있습니다.

 

4. Yertle의 각 관절 제한 각도 확인

 Yertle의 각 다리는 3개의 관절을 가지고 있습니다. 그리고 해당 관절들은 움직일 수 있는 각도 제한이 있습니다. 보행(Gait)을 구현하기전 해당 관절이 어느정도 움직을 수 있는지 파악하는 것은 중요합니다.

4.1. 어깨(Shoulder) 각도 범위

4.2. 허벅지 관절(Thigh) 각도 범위

 

4.3. 정강이 관절(Shin) 각도 범위

 

5. 결론

  지금까지 pyBullet을 통해 Yertle 로봇을 Load한 후 각 관절의 제한 범위 까지 확인하였습니다. 드디어 보행(Gait)을 구현하기 위한 모든 단계가 끝났다고 생각합니다. 다음에는 pyBullet 시뮬레이션에서 Yertle 로봇이 전진 하는 기능을 구현하는 것을 목표로 개발을 진행하려고 합니다. 

반응형