Main Content

inverseDynamics

주어진 모션에 필요한 조인트 토크

설명

jointTorq = inverseDynamics(robot)은 외력이 적용되지 않은 상태에서 로봇의 홈 컨피규레이션을 정적으로 유지하기 위해 로봇에 필요한 조인트 토크를 계산합니다.

예제

jointTorq = inverseDynamics(robot,configuration)은 지정된 로봇 컨피규레이션을 유지하기 위한 조인트 토크를 계산합니다.

jointTorq = inverseDynamics(robot,configuration,jointVel)은 가속도가 0이고 외력이 없는 상태에서, 지정된 조인트 컨피규레이션과 조인트 속도에 대한 조인트 토크를 계산합니다.

jointTorq = inverseDynamics(robot,configuration,jointVel,jointAccel)은 외력 없는 상태에서, 지정된 조인트 컨피규레이션, 조인트 속도, 조인트 가속도에 대한 조인트 토크를 계산합니다. 홈 컨피규레이션을 지정하거나 조인트 속도 또는 가속도를 0으로 지정하려면 입력 인수에 []을 사용하십시오.

jointTorq = inverseDynamics(robot,configuration,jointVel,jointAccel,fext)는 지정된 조인트 컨피규레이션, 조인트 속도, 조인트 가속도, 외력에 대한 조인트 토크를 계산합니다. externalForce 함수를 사용하여 fext를 생성합니다.

예제

모두 축소

inverseDynamics 함수를 사용하여 특정 로봇 컨피규레이션을 정적으로 유지하기 위해 필요한 조인트 토크를 계산합니다. 기타 구문을 사용하여 조인트 속도, 조인트 가속도, 외력을 지정할 수도 있습니다.

Robotics System Toolbox™ loadrobot 함수를 사용하여 Omron eCobra-600을 rigidBodyTree 객체로 불러옵니다. 중력 속성을 설정하고 데이터 형식을 "row"로 설정합니다. 모든 동역학 계산에서 데이터 형식은 "row" 또는 "column"이어야 합니다.

robot = loadrobot("omronEcobra600", DataFormat="row", Gravity=[0 0 -9.81]);

robot의 무작위 컨피규레이션을 생성합니다.

q = randomConfiguration(robot);

robot이 해당 컨피규레이션을 정적으로 유지하기 위해 필요한 조인트 토크를 계산합니다.

tau = inverseDynamics(robot,q)
tau = 1×4

    0.0000    0.0000  -19.6200         0

externalForce 함수를 사용하여 강체 트리 모델에 적용할 힘 행렬을 생성합니다. 힘 행렬은 m×6 벡터이며 각 행은 로봇의 각 조인트에 작용하는 요소가 6개인 렌치를 표현합니다. externalForce 함수를 사용하고 엔드 이펙터를 지정하여 렌치를 행렬의 올바른 행에 할당합니다. 여러 힘 행렬을 함께 추가하여 하나의 로봇에 여러 힘을 적용할 수 있습니다.

이러한 외력을 상쇄하는 조인트 토크를 계산하기 위해 inverseDynamics 함수를 사용합니다.

Robotics System Toolbox™ loadrobot 함수를 사용하여 Universal Robots UR5e를 rigidBodyTree 객체로 불러옵니다. 중력을 업데이트하고 데이터 형식을 "row"로 설정합니다. 모든 동역학 계산에서 데이터 형식은 "row" 또는 "column"이어야 합니다.

manipulator = loadrobot("universalUR5e", DataFormat="row", Gravity=[0 0 -9.81]);
showdetails(manipulator)
--------------------
Robot: (10 bodies)

 Idx                Body Name                         Joint Name                         Joint Type                Parent Name(Idx)   Children Name(s)
 ---                ---------                         ----------                         ----------                ----------------   ----------------
   1                     base         base_link-base_fixed_joint                              fixed                    base_link(0)   
   2        base_link_inertia        base_link-base_link_inertia                              fixed                    base_link(0)   shoulder_link(3)  
   3            shoulder_link                 shoulder_pan_joint                           revolute            base_link_inertia(2)   upper_arm_link(4)  
   4           upper_arm_link                shoulder_lift_joint                           revolute                shoulder_link(3)   forearm_link(5)  
   5             forearm_link                        elbow_joint                           revolute               upper_arm_link(4)   wrist_1_link(6)  
   6             wrist_1_link                      wrist_1_joint                           revolute                 forearm_link(5)   wrist_2_link(7)  
   7             wrist_2_link                      wrist_2_joint                           revolute                 wrist_1_link(6)   wrist_3_link(8)  
   8             wrist_3_link                      wrist_3_joint                           revolute                 wrist_2_link(7)   flange(9)  
   9                   flange                     wrist_3-flange                              fixed                 wrist_3_link(8)   tool0(10)  
  10                    tool0                       flange-tool0                              fixed                       flange(9)   
--------------------

manipulator의 홈 컨피규레이션을 가져옵니다.

q = homeConfiguration(manipulator);

shoulder_link에 외력을 설정합니다. 입력 렌치 벡터는 베이스 프레임에서 표현됩니다.

fext1 = externalForce(manipulator,"shoulder_link",[0 0 0.0 0.1 0 0]);

엔드 이펙터 tool0에 외력을 설정합니다. 입력 렌치 벡터는 tool0 프레임에서 표현됩니다.

fext2 = externalForce(manipulator,"tool0",[0 0 0.0 0.1 0 0],q);

외력의 균형을 맞추는 데 필요한 조인트 토크를 계산합니다. 힘을 결합하기 위해 힘 행렬을 함께 더합니다. 조인트 속도와 조인트 가속도는 0으로 가정합니다([]로 입력).

tau = inverseDynamics(manipulator,q,[],[],fext1+fext2)
tau = 1×6

   -0.0233  -52.4189  -14.4896   -0.0100    0.0100   -0.0000

입력 인수

모두 축소

로봇 모델로, rigidBodyTree 객체로 지정됩니다. inverseDynamics 함수를 사용하려면 DataFormat 속성을 'row' 또는 'column'으로 설정합니다.

로봇 컨피규레이션으로, 로봇 모델의 모든 비고정 조인트에 대한 위치 값을 나타내는 벡터로 지정됩니다. homeConfiguration(robot), randomConfiguration(robot)을 사용하거나 조인트 위치를 직접 지정하여 컨피규레이션을 생성할 수 있습니다. 벡터 형식의 configuration을 사용하려면 robotDataFormat 속성을 'row' 또는 'column'으로 설정합니다.

조인트 속도로, 벡터로 지정됩니다. 조인트 속도의 개수는 로봇의 속도 자유도와 같습니다. 벡터 형식의 jointVel을 사용하려면 robotDataFormat 속성을 'row' 또는 'column'으로 설정합니다.

조인트 가속도로, 벡터로 반환됩니다. 조인트 가속도 벡터의 차원은 로봇의 속도 자유도와 같습니다. 각 요소는 robot의 특정 조인트에 대응합니다. 벡터 형식의 jointAccel을 사용하려면 robotDataFormat 속성을 'row' 또는 'column'으로 설정합니다.

외력 행렬로, n×6 행렬 또는 6×n 행렬로 지정됩니다. 여기서 n은 로봇의 속도 자유도입니다. 형태는 robotDataFormat 속성에 따라 다릅니다. 'row' 데이터 형식은 n×6 행렬을 사용합니다. 'column' 데이터 형식은 6×n 행렬을 사용합니다.

행렬은 지정된 바디와 관련된 위치에서 0이 아닌 값만 나열합니다. 힘 행렬을 함께 추가하여 여러 바디에 여러 힘을 지정할 수 있습니다.

지정된 힘 또는 토크에 대한 행렬을 생성하려면 externalForce 항목을 참조하십시오.

출력 인수

모두 축소

조인트 토크로, 벡터로 반환됩니다. 각 요소는 특정 조인트에 가해지는 토크에 대응합니다.

세부 정보

모두 축소

동역학 속성

로봇 동역학을 사용하여 작업하는 경우 rigidBody 객체의 다음 속성을 사용하여 매니퓰레이터 로봇의 개별 바디에 대한 정보를 지정합니다.

  • Mass — 강체의 질량(단위: 킬로그램).

  • CenterOfMass — 강체의 무게 중심 위치로, [x y z] 형식의 벡터로 지정됩니다. 이 벡터는 바디 프레임을 기준으로 강체의 무게 중심 위치를 설명합니다(단위: 미터). centerOfMass 객체 함수는 로봇의 무게 중심을 계산할 때 이 강체 속성값을 사용합니다.

  • Inertia — 강체의 관성으로, [Ixx Iyy Izz Iyz Ixz Ixy] 형식의 벡터로 지정됩니다. 이 벡터는 바디 프레임을 기준으로 합니다(단위: 킬로그램 제곱미터). 관성 텐서는 양의 정부호 행렬로, 형식은 다음과 같습니다.

    A 3-by-3 matrix. The first row contains Ixx, Ixy, and Ixz. The second contains Ixy, Iyy, and Iyz. The third contains Ixz, Iyz, and Izz.

    Inertia 벡터의 처음 세 요소는 관성 모멘트이며, 관성 텐서의 대각선 요소입니다. 벡터의 마지막 세 요소는 관성의 곱이며, 관성 텐서의 비대각선 요소입니다.

전체 매니퓰레이터 로봇 모델과 관련된 정보의 경우 다음 rigidBodyTree 객체 속성을 지정합니다.

  • Gravity — 로봇에 작용하는 중력 가속도로, [x y z] 벡터로 지정됩니다(단위: m/s2). 기본적으로 중력 가속도는 없습니다.

  • DataFormat — 기구학 함수와 동역학 함수의 입력/출력 데이터 형식으로, "struct", "row" 또는 "column"으로 지정됩니다.

동역학 방정식

매니퓰레이터 강체 동역학은 다음 방정식에 의해 결정됩니다.

ddt[qq˙]=[q˙M(q)1(C(q,q˙)q˙G(q)J(q)TFExt+τ)]

또는 다음과 같이 표기합니다.

M(q)q¨=C(q,q˙)q˙G(q)J(q)TFExt+τ

각 요소는 다음과 같습니다.

  • M(q) — 현재의 로봇 컨피규레이션에 기반한 조인트-공간 질량 행렬입니다. 이 행렬은 massMatrix 객체 함수를 사용하여 계산합니다.

  • C(q,q˙) — 속도 곱을 계산하기 위해 q˙를 곱한 코리올리 항입니다. 속도 곱은 velocityProduct 객체 함수를 사용하여 계산합니다.

  • G(q) — 모든 조인트가 지정된 중력 Gravity에서 위치를 유지하는 데 필요한 중력 토크와 중력 힘입니다. 중력 토크는 gravityTorque 객체 함수를 사용하여 계산합니다.

  • J(q) — 지정된 조인트 컨피규레이션에 대한 기하 야코비 행렬입니다. 기하 야코비 행렬은 geometricJacobian 객체 함수를 사용하여 계산합니다.

  • FExt — 강체에 가해지는 외력의 행렬입니다. 외력은 externalForce 객체 함수를 사용하여 생성합니다.

  • τ — 각 조인트에 벡터로 직접 가해지는 조인트 토크와 조인트 힘입니다.

  • q,q˙,q¨ — 개별 벡터로, 각각 조인트 컨피규레이션, 조인트 속도, 조인트 가속도입니다. 회전 조인트의 경우 각각 라디안, rad/s, rad/s2 단위로 값을 지정합니다. 직선 조인트의 경우 미터, m/s, m/s2 단위로 지정합니다.

동역학을 직접 계산하려면 forwardDynamics 객체 함수를 사용합니다. 이 함수는 상기 입력값들의 지정된 조합에 대한 조인트 가속도를 계산합니다.

일련의 특정 모션을 구현하려면 inverseDynamics 객체 함수를 사용합니다. 이 함수는 지정된 컨피규레이션, 속도, 가속도, 외력을 구현하는 데 필요한 조인트 토크를 계산합니다.

참고 문헌

[1] Featherstone, Roy. Rigid Body Dynamics Algorithms. Springer US, 2008. DOI.org (Crossref), doi:10.1007/978-1-4899-7560-7.

확장 기능

버전 내역

R2017a에 개발됨