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의 내부 상태 재설정

예제

모두 축소

Robotics System Toolbox™ loadrobot에서 PUMA 560 매니퓰레이터를 불러와 Figure에 로봇 모델을 표시합니다.

puma = loadrobot("puma560");
show(puma,homeConfiguration(puma),PreservePlot=false);
axis([-1 1 -1 1 0 2])
title("PUMA 560 Home Configuration")

Figure contains an axes object. The axes object with title PUMA 560 Home Configuration, 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.

로봇의 엔드 이펙터가 도달해야 하는 목표 자세는 [-0.5 0.5 0.75]입니다. 역기구학은 목표 자세를 사용하여 조인트 컨피규레이션을 구하므로 먼저 목표 평행 이동을 사용하여 위치를 SE(3) 동차 변환 행렬로 변환합니다. 그런 다음 자세 변환을 플로팅합니다.

pos = [-0.5 0.5 0.75];
poseTF = trvec2tform(pos);
hold on
plotTransforms(pos,eul2quat([0 0 0]),FrameSize=0.2);
title("PUMA 560 and End-Effector Target Position")

Figure contains an axes object. The axes object with title PUMA 560 and End-Effector Target Position, xlabel X, ylabel Y contains 24 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 System object™를 만듭니다. 자세의 회전과 위치에 대한 가중치를 지정합니다. 엔드 이펙터가 방향에 대한 제약 조건 없이 해당 위치에 도달하는 것이 목표이므로, 방향 각도의 가중치를 0으로 설정하여 IK 솔버에서 방향에 대한 해가 영향을 미치지 않도록 합니다. 로봇의 홈 컨피규레이션을 초기 추측값으로 사용합니다.

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

ik System object를 사용하여 조인트 위치를 계산합니다. 로봇 모델에서 마지막 링크 link7을 엔드 이펙터로 사용합니다.

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

생성된 해 컨피규레이션을 표시해 보면 목표 위치에 도달하는 것을 확인할 수 있습니다.

show(puma,configSoln,PreservePlot=false);
title("End-Effector Target Position Achieved")

Figure contains an axes object. The axes object with title End-Effector Target Position Achieved, xlabel X, ylabel Y contains 24 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.

한 가지 유의할 점은 대부분의 IK 문제에서 목표 자세에 도달하는 컨피규레이션이 여러 개 있을 수 있다는 것입니다. 솔버는 최적화 기반이기 때문에 솔버가 접근하는 해가 실제로는 목표 자세에 도달하지 않을 수 있습니다. 이 경우 솔버는 자동으로 재시작되고 무작위 컨피규레이션을 초기 추측값으로 사용합니다. 이는 동일한 자세 타깃에 대해 함수를 두 번 이상 실행하면 각각이 모두 목표 자세에 도달하는 서로 다른 컨피규레이션을 생성할 수 있다는 의미입니다. 임의성을 피하려면 난수 생성기 시드값을 설정할 수도 있고, AllowRandomRestart를 비활성화한 상태에서 해에 더 가까운 초기 추측값을 사용할 수도 있습니다.

ik.SolverParameters.AllowRandomRestart = false

가능한 해를 모두 구해야 하는 경우 analyticalInverseKinematics 객체를 사용하십시오.

참고 문헌

[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에 개발됨

모두 확장