Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

inverseKinematics

역기구학 솔버 만들기

설명

inverseKinematics System object™는 역기구학(IK) 솔버를 만들어 지정된 강체 트리 모델을 기반으로 원하는 엔드 이펙터 자세에 대한 조인트 컨피규레이션을 계산합니다. rigidBodyTree 클래스를 사용하여 로봇의 강체 트리 모델을 만듭니다. 이 모델은 솔버가 적용하는 모든 조인트 제약 조건을 정의합니다. 해를 구하는 것이 가능한 경우 로봇 모델에 지정된 조인트 제한을 준수합니다.

엔드 이펙터 자세 외에 조준 제약 조건, 위치 경계, 방향 타깃 등 더 많은 제약 조건을 지정하려면 generalizedInverseKinematics를 사용해 보십시오. 이 객체를 사용하면 다중 제약 조건이 있는 IK 해를 계산할 수 있습니다.

닫힌 형식의 해석적 IK 해에 관해서는 analyticalInverseKinematics 항목을 참조하십시오.

원하는 엔드 이펙트 자세를 위한 조인트 컨피규레이션을 계산하려면 다음을 수행합니다.

  1. inverseKinematics 객체를 만들고 속성을 설정합니다.

  2. 함수를 호출하는 것처럼 인수를 사용하여 객체를 호출합니다.

System object의 작동 방식에 대해 자세히 알아보려면 System Object란? 항목을 참조하십시오.

생성

설명

예제

ik = inverseKinematics는 역기구학 솔버를 만듭니다. 솔버를 사용하려면 RigidBodyTree 속성에 강체 트리 모델을 지정합니다.

ik = inverseKinematics(Name,Value)는 하나 이상의 Name,Value 쌍 인수를 사용하여 역기구학 솔버를 만듭니다. 여기서 Name은 속성 이름이고 Value는 대응하는 값입니다. Name은 작은따옴표('')로 묶어야 합니다. Name1,Value1,...,NameN,ValueN과 같이 여러 개의 이름-값 쌍 인수를 임의의 순서로 지정할 수 있습니다.

속성

모두 확장

별도의 표시가 없는 한, 속성은 조정 불가형입니다. 즉 객체를 호출한 후 해당 값을 변경할 수 없습니다. 객체를 호출하면 객체가 잠기며, 잠긴 객체는 release 함수로 해제합니다.

속성이 조정 가능형이면 언제든지 해당 값을 변경할 수 있습니다.

속성값 변경에 대한 자세한 내용은 MATLAB에서 System Object를 사용하는 시스템 설계 항목을 참조하십시오.

강체 트리 모델로, rigidBodyTree 객체로 지정됩니다. 강체 트리 모델을 수정하는 경우 이 속성에 강체 트리를 재할당하십시오. 예를 들면 다음과 같습니다.

IK 솔버를 만들고 강체 트리를 지정합니다.

ik = inverseKinematics('RigidBodyTree',rigidbodytree)

강체 트리 모델을 수정합니다.

addBody(rigidbodytree,rigidBody('body1'),'base')

IK 솔버에 강체 트리를 재할당합니다. 강체 트리 모델을 수정하기 전에 솔버 또는 step 함수가 호출되면 release를 사용하여 속성을 변경할 수 있도록 하십시오.

ik.RigidBodyTree = rigidbodytree;

역기구학의 해를 구하기 위한 알고리즘으로, 'BFGSGradientProjection' 또는 'LevenbergMarquardt'로 지정됩니다. 각 알고리즘에 대한 세부 정보는 역기구학 알고리즘 항목을 참조하십시오.

지정된 알고리즘과 연결된 파라미터로, 구조체로 지정됩니다. 구조체의 필드는 알고리즘에 따라 다릅니다. 솔버 파라미터 항목을 참조하십시오.

사용

설명

예제

[configSol,solInfo] = ik(endeffector,pose,weights,initialguess)는 지정된 엔드 이펙터 자세를 구현하는 조인트 컨피규레이션을 구합니다. 컨피규레이션에 대한 초기 추측값과 pose의 6개 성분의 허용오차에 대해 원하는 가중치를 지정합니다. 알고리즘 실행과 관련된 해 정보 solInfo는 조인트 컨피규레이션 해 configSol과 함께 반환됩니다.

입력 인수

모두 확장

엔드 이펙터 이름으로, 문자형 벡터로 지정됩니다. 엔드 이펙터는 inverseKinematics System object에 지정된 rigidBodyTree 객체의 바디여야 합니다.

엔드 이펙터 자세로, 4×4 동차 변환으로 지정됩니다. 이 변환은 endeffector 속성에 지정된 강체의 원하는 위치와 방향을 정의합니다.

자세 허용오차의 가중치로, 요소를 6개 가진 벡터로 지정됩니다. 처음 세 요소는 원하는 자세의 방향 오차에 대한 가중치에 대응합니다. 마지막 세 요소는 원하는 자세의 xyz 위치 오차에 대한 가중치에 대응합니다.

로봇 컨피규레이션의 초기 추측값으로, 구조체형 배열 또는 벡터로 지정됩니다. 이 초기 추측값을 사용해서 솔버가 원하는 로봇 컨피규레이션에 도달하도록 합니다. 해가 이 초기 추측값에 가까울 것이라는 보장은 없습니다.

벡터 형식을 사용하기 위해, RigidBodyTree 속성에 할당된 객체의 DataFormat 속성을 'row' 또는 'column'으로 설정합니다.

출력 인수

모두 확장

로봇 컨피규레이션으로, 구조체형 배열로 반환됩니다. 구조체형 배열에는 다음과 같은 필드가 포함되어 있습니다.

  • JointNameRigidBodyTree 로봇 모델에 지정된 조인트 이름에 대한 문자형 벡터

  • JointPosition — 해당 조인트의 위치

이 조인트 컨피규레이션은 해 허용오차 내에서 원하는 엔드 이펙터 자세를 구현하도록 계산된 해입니다.

참고

회전 조인트의 경우 조인트 제한이 2*pi 범위를 초과하여 조인트 위치 래핑이 발생하면 조인트의 하한에 가장 가까운 조인트 위치가 반환됩니다.

벡터 형식을 사용하기 위해, RigidBodyTree 속성에 할당된 객체의 DataFormat 속성을 'row' 또는 'column'으로 설정합니다.

해 정보로, 구조체로 반환됩니다. 해 정보 구조체에는 다음과 같은 필드가 포함되어 있습니다.

  • Iterations — 알고리즘에 의해 실행되는 반복 횟수입니다.

  • NumRandomRestarts — 알고리즘이 국소 최솟값에 고착되었을 때 무작위로 재시작하는 횟수입니다.

  • PoseErrorNorm — 해의 자세를 원하는 엔드 이펙터 자세와 비교했을 때의 자세 오차의 크기입니다.

  • ExitFlag — 알고리즘 실행과 그 반환 원인의 세부 정보를 알려주는 코드입니다. 각 알고리즘 유형의 종료 플래그는 종료 플래그 항목을 참조하십시오.

  • Status — 해가 허용오차 내에 있는지('success') 아니면 알고리즘이 구할 수 있는 최선해인지('best available') 설명하는 문자형 벡터입니다.

객체 함수

객체 함수를 사용하려면 System object를 첫 번째 입력 인수로 지정하십시오. 예를 들어 obj라는 System object의 시스템 리소스를 해제하려면 다음 구문을 사용합니다.

release(obj)

모두 확장

stepSystem object 알고리즘 실행
release리소스 해제 및 System object 속성값과 입력 특성 변경 허용하기
resetSystem object의 내부 상태 재설정

예제

모두 축소

원하는 엔드 이펙터 위치를 구현하기 위한 로봇 모델의 조인트 위치를 생성합니다. inverseKinematics System Object는 역기구학 알고리즘을 사용하여 유효한 조인트 위치를 구합니다.

Robotics System Toolbox™ loadrobot에서 PUMA 560 매니퓰레이터를 불러옵니다. 로봇은 6개의 회전 조인트가 있는 6축 로봇 팔을 나타내는 rigidBodyTree 모델입니다.

puma = loadrobot("puma560");
showdetails(puma)
--------------------
Robot: (6 bodies)

 Idx    Body Name   Joint Name   Joint Type    Parent Name(Idx)   Children Name(s)
 ---    ---------   ----------   ----------    ----------------   ----------------
   1        link2           j1     revolute            link1(0)   link3(2)  
   2        link3           j2     revolute            link2(1)   link4(3)  
   3        link4           j3     revolute            link3(2)   link5(4)  
   4        link5           j4     revolute            link4(3)   link6(5)  
   5        link6           j5     revolute            link5(4)   link7(6)  
   6        link7           j6     revolute            link6(5)   
--------------------

무작위 컨피규레이션을 생성합니다. 이 무작위 컨피규레이션에 대해, 엔드 이펙터(link7)에서 베이스까지의 변환을 구합니다. 이 변환을 엔드 이펙터의 목표 자세로 사용합니다. 해당 컨피규레이션을 표시합니다.

randConfig = puma.randomConfiguration;
tform = getTransform(puma,randConfig,"link7","link1");

show(puma,randConfig);

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 20 objects of type patch, line. These objects represent link1, link2, link3, link4, link5, link6, link7, link2_mesh, link3_mesh, link4_mesh, link5_mesh, link6_mesh, link7_mesh, link1_mesh.

puma 모델에 대한 inverseKinematics 객체를 만듭니다. 자세의 여러 성분에 가중치를 지정합니다. 방향 각도에 대한 크기 가중치를 위치 성분에 대한 가중치보다 낮게 지정합니다. 로봇의 홈 컨피규레이션을 초기 추측값으로 사용합니다.

ik = inverseKinematics("RigidBodyTree",puma);
weights = [0.25 0.25 0.25 1 1 1];
initialguess = homeConfiguration(puma);

ik 객체를 사용하여 조인트 위치를 계산합니다.

[configSoln,solnInfo] = ik("link7",tform,weights,initialguess);

새롭게 생성된 해 컨피규레이션을 표시합니다. 이 해는 동일한 엔드 이펙터 위치를 구현하는 약간 다른 조인트 컨피규레이션입니다. ik 객체를 여러 번 호출해 보면 조인트 컨피규레이션이 비슷하게 나오기도 하고 매우 다르게 나올 수도 있습니다.

show(puma,configSoln);

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 20 objects of type patch, line. These objects represent link1, link2, link3, link4, link5, link6, link7, link2_mesh, link3_mesh, link4_mesh, link5_mesh, link6_mesh, link7_mesh, link1_mesh.

참고 문헌

[1] Badreddine, Hassan, Stefan Vandewalle, and Johan Meyers. "Sequential Quadratic Programming (SQP) for Optimal Control in Direct Numerical Simulation of Turbulent Flow." Journal of Computational Physics. 256 (2014): 1–16. doi:10.1016/j.jcp.2013.08.044.

[2] Bertsekas, Dimitri P. Nonlinear Programming. Belmont, MA: Athena Scientific, 1999.

[3] Goldfarb, Donald. "Extension of Davidon’s Variable Metric Method to Maximization Under Linear Inequality and Equality Constraints." SIAM Journal on Applied Mathematics. Vol. 17, No. 4 (1969): 739–64. doi:10.1137/0117067.

[4] Nocedal, Jorge, and Stephen Wright. Numerical Optimization. New York, NY: Springer, 2006.

[5] Sugihara, Tomomichi. "Solvability-Unconcerned Inverse Kinematics by the Levenberg–Marquardt Method." IEEE Transactions on Robotics Vol. 27, No. 5 (2011): 984–91. doi:10.1109/tro.2011.2148230.

[6] Zhao, Jianmin, and Norman I. Badler. "Inverse Kinematics Positioning Using Nonlinear Programming for Highly Articulated Figures." ACM Transactions on Graphics Vol. 13, No. 4 (1994): 313–36. doi:10.1145/195826.195827.

확장 기능

버전 내역

R2016b에 개발됨

모두 확장