Main Content

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

rigidBodyJoint

설명

rigidBodyJoint 객체는 연결점을 기준으로 강체가 움직이는 방식을 정의합니다. 트리 구조의 로봇에서 조인트는 항상 특정 강체에 속하며 각 강체는 1개의 조인트를 갖습니다.

rigidBodyJoint 객체는 다양한 유형의 조인트를 설명할 수 있습니다. rigidBodyTree를 사용하여 강체 트리 구조를 만들 때 rigidBody 클래스를 사용하여 강체에 Joint 객체를 할당해야 합니다.

지원되는 다양한 조인트 유형은 다음과 같습니다.

  • fixed — 두 바디 사이의 상대 운동을 방지하는 고정 조인트입니다.

  • revolute — 주어진 축을 중심으로 회전하는 단일 자유도(DOF) 조인트입니다. 핀 조인트 또는 힌지 조인트라고도 합니다.

  • prismatic — 주어진 축을 따라 미끄러지는 단일 DOF 조인트입니다. 슬라이딩 조인트라고도 합니다.

각 조인트 유형은 정의된 기하 도형에 따라 다양한 차원의 다양한 속성을 갖습니다.

생성

설명

jointObj = rigidBodyJoint(jname)은 지정된 이름으로 고정 조인트를 만듭니다.

예제

jointObj = rigidBodyJoint(jname,jtype)은 지정된 이름으로 지정된 유형의 조인트를 만듭니다.

입력 인수

모두 확장

조인트 이름으로, string형 스칼라 또는 문자형 벡터로 지정됩니다. 강체 트리 외부에서 조인트 이름에 액세스하려면 조인트 이름이 고유해야 합니다.

예: "elbow_right"

데이터형: char | string

조인트 유형으로, string형 스칼라 또는 문자형 벡터로 지정됩니다. 조인트 유형은 조인트를 생성할 때 특정 속성을 미리 정의합니다.

지원되는 다양한 조인트 유형은 다음과 같습니다.

  • fixed — 두 바디 사이의 상대 운동을 방지하는 고정 조인트입니다.

  • revolute — 주어진 축을 중심으로 회전하는 단일 자유도(DOF) 조인트입니다. 핀 조인트 또는 힌지 조인트라고도 합니다.

  • prismatic — 주어진 축을 따라 미끄러지는 단일 DOF 조인트입니다. 슬라이딩 조인트라고도 합니다.

예: "prismatic"

데이터형: char | string

속성

모두 확장

읽기 전용 속성입니다.

조인트 유형으로, string형 스칼라 또는 문자형 벡터로 반환됩니다. 조인트 유형은 조인트를 생성할 때 특정 속성을 미리 정의합니다.

지원되는 다양한 조인트 유형은 다음과 같습니다.

  • fixed — 두 바디 사이의 상대 운동을 방지하는 고정 조인트입니다.

  • revolute — 주어진 축을 중심으로 회전하는 단일 자유도(DOF) 조인트입니다. 핀 조인트 또는 힌지 조인트라고도 합니다.

  • prismatic — 주어진 축을 따라 미끄러지는 단일 DOF 조인트입니다. 슬라이딩 조인트라고도 합니다.

이 조인트를 포함하는 강체가 로봇 모델에 추가되면 replaceJoint를 사용해 조인트를 대체하여 조인트 유형을 변경해야 합니다.

예: "prismatic"

데이터형: char | string

조인트 이름으로, string형 스칼라 또는 문자형 벡터로 반환됩니다. 강체 트리 외부에서 조인트 이름에 액세스하려면 조인트 이름이 고유해야 합니다. 이 조인트를 포함하는 강체가 로봇 모델에 추가되면 replaceJoint를 사용해 조인트를 대체하여 조인트 이름을 변경해야 합니다.

예: "elbow_right"

데이터형: char | string

조인트의 위치 제한으로, [min max] 값으로 구성된 벡터로 지정됩니다. 조인트의 유형에 따라 이러한 값의 정의가 다릅니다.

  • fixed[NaN NaN](디폴트 값). 고정 조인트는 조인트 제한이 없습니다. 바디는 서로 고정된 상태로 유지됩니다.

  • revolute[-pi pi](디폴트 값). 제한은 축을 중심으로 한 회전 각도(단위: 라디안)를 정의합니다.

  • prismatic[-0.5 0.5](디폴트 값). 제한은 축을 따라 선형 모션(단위: 미터)을 정의합니다.

예: [-pi/2, pi/2]

조인트의 홈 위치로, 조인트 유형에 따른 스칼라로 지정됩니다. 홈 위치는 PositionLimits에 의해 설정된 범위에 속해야 합니다. homeConfiguration은 전체 강체 트리에 대해 미리 정의된 홈 컨피규레이션을 생성하기 위해 이 속성을 사용합니다.

조인트 유형에 따라 홈 위치의 정의가 다릅니다.

  • fixed0(디폴트 값). 고정 조인트는 관련된 홈 위치가 없습니다.

  • revolute0(디폴트 값). 회전 조인트에는 조인트 축을 중심으로 한 회전 각도(단위: 라디안)로 정의된 홈 위치가 있습니다.

  • prismatic0(디폴트 값). 직선 조인트에는 조인트 축을 따라 선형 모션(단위: 미터)으로 정의된 홈 위치가 있습니다.

예: revolute 조인트에서 pi/2 라디안

조인트의 모션 축으로, 요소를 3개 가진 단위 벡터로 지정됩니다. 벡터는 로컬 좌표의 3차원 공간에서 어떤 방향도 될 수 있습니다.

조인트 유형에 따라 조인트 축의 정의가 다릅니다.

  • fixed — 고정 조인트는 관련된 모션 축이 없습니다.

  • revolute — 회전 조인트는 조인트 축에 수직인 평면에서 바디를 회전시킵니다.

  • prismatic — 직선 조인트는 조인트 축 방향을 따라 선형 모션으로 바디를 움직입니다.

예: revolute 조인트의 x축을 중심으로 한 모션에서 [1 0 0]

읽기 전용 속성입니다.

조인트에서 부모 프레임으로의 고정 변환으로, 4×4 동차 변환 행렬로 반환됩니다. 이 변환은 조인트 선행 프레임의 점 좌표를 부모 바디 프레임으로 변환합니다.

예: eye(4)

읽기 전용 속성입니다.

자식 바디에서 조인트 프레임으로의 고정 변환으로, 4×4 동차 변환 행렬로 반환됩니다. 이 변환은 자식 바디 프레임의 점 좌표를 조인트 후속 프레임으로 변환합니다.

예: eye(4)

객체 함수

copyCreate copy of joint
setFixedTransform조인트의 고정 변환 속성 설정

예제

모두 축소

강체 트리에 강체와 해당 조인트를 추가합니다. 각 rigidBody 객체는 rigidBodyJoint 객체를 포함하며 addBody를 사용하여 rigidBodyTree에 추가되어야 합니다.

강체 트리를 만듭니다.

rbtree = rigidBodyTree;

고유한 이름을 가진 강체를 만듭니다.

body1 = rigidBody('b1');

회전 조인트를 만듭니다. 기본적으로 rigidBody 객체에는 고정 조인트가 포함되어 있습니다. body1.Joint 속성에 새 rigidBodyJoint 객체를 할당하여 조인트를 바꿉니다.

jnt1 = rigidBodyJoint('jnt1','revolute');
body1.Joint = jnt1;

강체를 트리에 추가합니다. 강체를 연결할 바디 이름을 지정합니다. 이 바디가 첫 번째 바디이므로 트리의 베이스 이름을 사용합니다.

basename = rbtree.BaseName;
addBody(rbtree,body1,basename)

트리에서 showdetails를 사용하여 강체와 조인트가 제대로 추가되었는지 확인합니다.

showdetails(rbtree)
--------------------
Robot: (1 bodies)

 Idx    Body Name   Joint Name   Joint Type    Parent Name(Idx)   Children Name(s)
 ---    ---------   ----------   ----------    ----------------   ----------------
   1           b1         jnt1     revolute             base(0)   
--------------------

Puma560® 로봇의 DH(Denavit-Hartenberg) 파라미터를 사용하여 로봇을 빌드합니다. 각 강체는 한 번에 하나씩 추가되며, joint 객체로 자식-부모 변환이 지정됩니다.

DH 파라미터는 각 강체가 부모에 연결되는 관계를 나타내는 로봇의 기하를 정의합니다. 편의를 위해 Puma560 로봇의 파라미터를 행렬로 설정합니다[1]. Puma 로봇은 직렬 체인 매니퓰레이터입니다. DH 파라미터는 이전 조인트 연결에 해당하는 행렬의 이전 행을 기준으로 합니다.

dhparams = [0   	pi/2	0   	0;
            0.4318	0       0       0
            0.0203	-pi/2	0.15005	0;
            0   	pi/2	0.4318	0;
            0       -pi/2	0   	0;
            0       0       0       0];

로봇을 빌드할 강체 트리 객체를 만듭니다.

robot = rigidBodyTree;

첫 번째 강체를 만들고 로봇에 추가합니다. 강체를 추가하려면 다음을 수행하십시오.

  1. rigidBody 객체를 만들고 고유한 이름을 지정합니다.

  2. rigidBodyJoint 객체를 만들고 고유한 이름을 지정합니다.

  3. setFixedTransform으로 DH 파라미터를 사용하여 바디-바디 변환을 지정합니다. DH 파라미터의 마지막 요소인 theta의 경우 이에 해당하는 각도는 조인트 위치에 따라 달라지므로 무시됩니다.

  4. addBody를 호출하여 로봇의 베이스 프레임에 첫 번째 바디 조인트를 연결합니다.

body1 = rigidBody('body1');
jnt1 = rigidBodyJoint('jnt1','revolute');

setFixedTransform(jnt1,dhparams(1,:),'dh');
body1.Joint = jnt1;

addBody(robot,body1,'base')

나머지 강체를 만들고 로봇에 추가합니다. addBody 호출하여 연결할 때 이전 바디 이름을 지정합니다. 각 고정 변환은 이전 조인트 좌표 프레임을 기준으로 합니다.

body2 = rigidBody('body2');
jnt2 = rigidBodyJoint('jnt2','revolute');
body3 = rigidBody('body3');
jnt3 = rigidBodyJoint('jnt3','revolute');
body4 = rigidBody('body4');
jnt4 = rigidBodyJoint('jnt4','revolute');
body5 = rigidBody('body5');
jnt5 = rigidBodyJoint('jnt5','revolute');
body6 = rigidBody('body6');
jnt6 = rigidBodyJoint('jnt6','revolute');

setFixedTransform(jnt2,dhparams(2,:),'dh');
setFixedTransform(jnt3,dhparams(3,:),'dh');
setFixedTransform(jnt4,dhparams(4,:),'dh');
setFixedTransform(jnt5,dhparams(5,:),'dh');
setFixedTransform(jnt6,dhparams(6,:),'dh');

body2.Joint = jnt2;
body3.Joint = jnt3;
body4.Joint = jnt4;
body5.Joint = jnt5;
body6.Joint = jnt6;

addBody(robot,body2,'body1')
addBody(robot,body3,'body2')
addBody(robot,body4,'body3')
addBody(robot,body5,'body4')
addBody(robot,body6,'body5')

showdetails 함수 또는 show 함수를 사용하여 로봇이 올바르게 빌드되었는지 확인합니다. showdetails 함수는 MATLAB® 명령 창에 모든 바디를 나열합니다. show 함수는 주어진 컨피규레이션에서의(기본적으로 홈 컨피규레이션) 로봇을 표시합니다. axis 호출로 축 제한을 수정하고 축 레이블을 숨깁니다.

showdetails(robot)
--------------------
Robot: (6 bodies)

 Idx    Body Name   Joint Name   Joint Type    Parent Name(Idx)   Children Name(s)
 ---    ---------   ----------   ----------    ----------------   ----------------
   1        body1         jnt1     revolute             base(0)   body2(2)  
   2        body2         jnt2     revolute            body1(1)   body3(3)  
   3        body3         jnt3     revolute            body2(2)   body4(4)  
   4        body4         jnt4     revolute            body3(3)   body5(5)  
   5        body5         jnt5     revolute            body4(4)   body6(6)  
   6        body6         jnt6     revolute            body5(5)   
--------------------
show(robot);
axis([-0.5,0.5,-0.5,0.5,-0.5,0.5])
axis off

참고 문헌

[1] Corke, P. I., and B. Armstrong-Helouvry. “A Search for Consensus among Model Parameters Reported for the PUMA 560 Robot.” Proceedings of the 1994 IEEE International Conference on Robotics and Automation, IEEE Computer. Soc. Press, 1994, pp. 1608–13. DOI.org (Crossref), doi:10.1109/ROBOT.1994.351360.

기존 rigidBodyTree 객체를 변경합니다. 강체 트리에서 조인트, 바디, 하위 트리를 바꿀 수 있습니다.

Robotics System Toolbox™ loadrobot 함수를 사용하여 ABB IRB-120T 매니퓰레이터를 불러옵니다. 이는 rigidBodyTree 객체로 지정됩니다.

manipulator = loadrobot("abbIrb120T");

show를 사용해서 로봇을 표시하고 showdetails.를 사용해서 로봇의 세부 정보를 읽습니다.

show(manipulator);

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 24 objects of type patch, line. These objects represent base_link, base, link_1, link_2, link_3, link_4, link_5, link_6, tool0, link_1_mesh, link_2_mesh, link_3_mesh, link_4_mesh, link_5_mesh, link_6_mesh, base_link_mesh.

showdetails(manipulator)
--------------------
Robot: (8 bodies)

 Idx     Body Name            Joint Name            Joint Type     Parent Name(Idx)   Children Name(s)
 ---     ---------            ----------            ----------     ----------------   ----------------
   1          base        base_link-base                 fixed         base_link(0)   
   2        link_1               joint_1              revolute         base_link(0)   link_2(3)  
   3        link_2               joint_2              revolute            link_1(2)   link_3(4)  
   4        link_3               joint_3              revolute            link_2(3)   link_4(5)  
   5        link_4               joint_4              revolute            link_3(4)   link_5(6)  
   6        link_5               joint_5              revolute            link_4(5)   link_6(7)  
   7        link_6               joint_6              revolute            link_5(6)   tool0(8)  
   8         tool0          joint6-tool0                 fixed            link_6(7)   
--------------------

속성을 검사할 바디를 가져옵니다. link_3 바디의 자식은 link_4 바디뿐입니다. 특정 바디를 복사할 수도 있습니다.

body3 = getBody(manipulator,"link_3");
childBody = body3.Children{1}
childBody = 
  rigidBody with properties:

            Name: 'link_4'
           Joint: [1x1 rigidBodyJoint]
            Mass: 1.3280
    CenterOfMass: [0.2247 1.5000e-04 4.1000e-04]
         Inertia: [0.0028 0.0711 0.0723 1.3052e-05 -1.3878e-04 -6.6037e-05]
          Parent: [1x1 rigidBody]
        Children: {[1x1 rigidBody]}
         Visuals: {'Mesh:link_4.stl'}
      Collisions: {'Mesh Filename /mathworks/devel/bat/filer/batfs2503-0/BR2023bd.2354825.BR2023bd.2351501.pass/build/matlab/toolbox/robotics/robotmanip/data/abb_irb120_support/meshes/irb120_3_58/collision/link_4.stl'}

body3Copy = copy(body3);

link_3 바디의 조인트를 바꿉니다. 다운스트림 바디의 기하 도형이 영향을 받지 않도록 하려면 새 Joint 객체를 만들고 replaceJoint를 사용해야 합니다. 바디 간의 변환을 정의하기 위해 필요한 경우 디폴트 단위 행렬을 사용하는 대신 setFixedTransform을 호출합니다.

newJoint = rigidBodyJoint("prismatic");
replaceJoint(manipulator,"link_3",newJoint);

showdetails(manipulator)
--------------------
Robot: (8 bodies)

 Idx     Body Name            Joint Name            Joint Type     Parent Name(Idx)   Children Name(s)
 ---     ---------            ----------            ----------     ----------------   ----------------
   1          base        base_link-base                 fixed         base_link(0)   
   2        link_1               joint_1              revolute         base_link(0)   link_2(3)  
   3        link_2               joint_2              revolute            link_1(2)   link_3(4)  
   4        link_3             prismatic                 fixed            link_2(3)   link_4(5)  
   5        link_4               joint_4              revolute            link_3(4)   link_5(6)  
   6        link_5               joint_5              revolute            link_4(5)   link_6(7)  
   7        link_6               joint_6              revolute            link_5(6)   tool0(8)  
   8         tool0          joint6-tool0                 fixed            link_6(7)   
--------------------

removeBody를 사용하여 전체 바디를 제거하고, 결과로 생성된 하위 트리를 가져옵니다. 제거된 바디는 하위 트리에 포함됩니다.

subtree = removeBody(manipulator,"link_4")
subtree = 
  rigidBodyTree with properties:

     NumBodies: 4
        Bodies: {[1x1 rigidBody]  [1x1 rigidBody]  [1x1 rigidBody]  [1x1 rigidBody]}
          Base: [1x1 rigidBody]
     BodyNames: {'link_4'  'link_5'  'link_6'  'tool0'}
      BaseName: 'link_3'
       Gravity: [0 0 0]
    DataFormat: 'struct'

show(subtree);

Figure contains an axes object. The axes object with xlabel X, ylabel Y contains 12 objects of type patch, line. These objects represent link_3, link_4, link_5, link_6, tool0, link_4_mesh, link_5_mesh, link_6_mesh.

수정된 link_3 바디를 제거합니다. 복사한 원래 link_3 바디를 link_2 바디에 추가한 다음, 반환된 하위 트리를 추가합니다. 로봇 모델은 동일하게 유지됩니다. 자세한 비교는 showdetails를 통해 확인하십시오.

removeBody(manipulator,"link_3");
addBody(manipulator,body3Copy,"link_2")
addSubtree(manipulator,"link_3",subtree)

showdetails(manipulator)
--------------------
Robot: (8 bodies)

 Idx     Body Name            Joint Name            Joint Type     Parent Name(Idx)   Children Name(s)
 ---     ---------            ----------            ----------     ----------------   ----------------
   1          base        base_link-base                 fixed         base_link(0)   
   2        link_1               joint_1              revolute         base_link(0)   link_2(3)  
   3        link_2               joint_2              revolute            link_1(2)   link_3(4)  
   4        link_3               joint_3              revolute            link_2(3)   link_4(5)  
   5        link_4               joint_4              revolute            link_3(4)   link_5(6)  
   6        link_5               joint_5              revolute            link_4(5)   link_6(7)  
   7        link_6               joint_6              revolute            link_5(6)   tool0(8)  
   8         tool0          joint6-tool0                 fixed            link_6(7)   
--------------------

참고 문헌

[1] Craig, John J. Introduction to Robotics: Mechanics and Control. Reading, MA: Addison-Wesley, 1989.

[2] Siciliano, Bruno. Robotics: Modelling, Planning and Control. London: Springer, 2009.

확장 기능

C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

버전 내역

R2016b에 개발됨

모두 확장