rigidBodyJoint
조인트 생성
설명
rigidBodyJoint
객체는 연결점을 기준으로 강체가 움직이는 방식을 정의합니다. 트리 구조의 로봇에서 조인트는 항상 특정 강체에 속하며 각 강체는 1개의 조인트를 갖습니다.
rigidBodyJoint
객체는 다양한 유형의 조인트를 설명할 수 있습니다. rigidBodyTree
를 사용하여 강체 트리 구조를 만들 때 rigidBody
클래스를 사용하여 강체에 Joint
객체를 할당해야 합니다.
지원되는 다양한 조인트 유형은 다음과 같습니다.
fixed
— 두 바디 사이의 상대 운동을 방지하는 고정 조인트입니다.revolute
— 주어진 축을 중심으로 회전하는 단일 자유도(DOF) 조인트입니다. 핀 조인트 또는 힌지 조인트라고도 합니다.prismatic
— 주어진 축을 따라 미끄러지는 단일 DOF 조인트입니다. 슬라이딩 조인트라고도 합니다.floating
- 모든 평행 이동과 회전을 지원하는 6 DOF 조인트입니다.
각 조인트 유형은 정의된 기하 도형에 따라 다양한 차원의 다양한 속성을 갖습니다.
생성
설명
입력 인수
jname
— 조인트 이름
string형 스칼라 | 문자형 벡터
조인트 이름으로, string형 스칼라 또는 문자형 벡터로 지정됩니다. 강체 트리 외부에서 조인트 이름에 액세스하려면 조인트 이름이 고유해야 합니다.
예: "elbow_right"
데이터형: char
| string
jtype
— 조인트 유형
"fixed"
(디폴트 값) | string형 스칼라 | 문자형 벡터
조인트 유형으로, string형 스칼라 또는 문자형 벡터로 지정됩니다. 조인트 유형은 조인트를 생성할 때 특정 속성을 미리 정의합니다.
지원되는 다양한 조인트 유형은 다음과 같습니다.
"fixed"
— 두 바디 사이의 상대 운동을 방지하는 고정 조인트입니다."revolute"
— 주어진 축을 중심으로 회전하는 단일 자유도(DOF) 조인트입니다. 핀 조인트 또는 힌지 조인트라고도 합니다."prismatic"
— 주어진 축을 따라 미끄러지는 단일 DOF 조인트입니다. 슬라이딩 조인트라고도 합니다."floating"
— 자유로운 평행 이동과 회전을 지원하는 6 DOF 조인트입니다.
예: "prismatic"
데이터형: char
| string
속성
Type
— 조인트 유형
"fixed"
(디폴트 값) | string형 스칼라 | 문자형 벡터
읽기 전용 속성입니다.
조인트 유형으로, string형 스칼라 또는 문자형 벡터로 반환됩니다. 조인트 유형은 조인트를 생성할 때 특정 속성을 미리 정의합니다.
지원되는 다양한 조인트 유형은 다음과 같습니다.
"fixed"
— 두 바디 사이의 상대 운동을 방지하는 고정 조인트입니다."revolute"
— 주어진 축을 중심으로 회전하는 단일 자유도(DOF) 조인트입니다. 핀 조인트 또는 힌지 조인트라고도 합니다."prismatic"
— 주어진 축을 따라 미끄러지는 단일 DOF 조인트입니다. 슬라이딩 조인트라고도 합니다."floating"
— 자유로운 평행 이동과 회전을 지원하는 6 DOF 조인트입니다.
이 조인트를 포함하는 강체가 로봇 모델에 추가되면 replaceJoint
를 사용해 조인트를 대체하여 조인트 유형을 변경해야 합니다.
예: "prismatic"
데이터형: char
| string
Name
— 조인트 이름
string형 스칼라 | 문자형 벡터
조인트 이름으로, string형 스칼라 또는 문자형 벡터로 반환됩니다. 강체 트리 외부에서 조인트 이름에 액세스하려면 조인트 이름이 고유해야 합니다. 이 조인트를 포함하는 강체가 로봇 모델에 추가되면 replaceJoint
를 사용해 조인트를 대체하여 조인트 이름을 변경해야 합니다.
예: "elbow_right"
데이터형: char
| string
PositionLimits
— 조인트의 위치 제한
요소를 2개 가진 행 벡터 | 7×2 행렬
조인트의 위치 제한으로, 조인트 유형에 따라 [min max]
값으로 구성된 요소를 2개 가진 행 벡터 또는 [min max]
값으로 구성된 7×2 행렬로 지정됩니다.
fixed
—[NaN NaN]
(디폴트 값). 고정 조인트는 조인트 제한이 없습니다. 바디는 서로 고정된 상태로 유지됩니다.revolute
—[-pi pi]
(디폴트 값). 제한은 축을 중심으로 한 회전 각도(단위: 라디안)를 정의합니다.prismatic
—[-0.5 0.5]
(디폴트 값). 제한은 축을 따라 선형 모션(단위: 미터)을 정의합니다."floating"
—[NaN(4,2); repmat([-5 5],3,1)]
(디폴트 값). 쿼터니언으로 표현된 회전으로, 조인트 제한이 없습니다. 위치 제한의 각 행은 각각 x축, y축, z축상의 선형 모션을 정의합니다.
예: [-pi/2 pi/2]
HomePosition
— 조인트의 홈 위치
스칼라 | 요소를 7개 가진 행 벡터
조인트의 홈 위치로, 조인트 유형에 따라 스칼라 또는 요소를 7개 가진 행 벡터로 지정됩니다. 홈 위치는 PositionLimits
에 의해 설정된 범위에 속해야 합니다. homeConfiguration
은 전체 강체 트리에 대해 미리 정의된 홈 컨피규레이션을 생성하기 위해 이 속성을 사용합니다.
조인트 유형에 따라 홈 위치의 정의가 다릅니다.
fixed
—0
(디폴트 값). 고정 조인트는 관련된 홈 위치가 없습니다.revolute
—0
(디폴트 값). 회전 조인트에는 조인트 축을 중심으로 한 회전 각도(단위: 라디안)로 정의된 홈 위치가 있습니다.prismatic
—0
(디폴트 값). 직선 조인트에는 조인트 축을 따라 선형 모션(단위: 미터)으로 정의된 홈 위치가 있습니다.floating
—[1 0 0 0 0 0 0]
(디폴트 값). 플로팅 조인트는 항등 쿼터니언과 xyz 위치로 정의된 홈 위치를 가집니다.
예: revolute
조인트에서 pi/2
라디안
JointAxis
— 조인트의 모션 축
[NaN
NaN
NaN
] (디폴트 값) | 요소를 3개 가진 단위 벡터
조인트의 모션 축으로, 요소를 3개 가진 단위 벡터로 지정됩니다. 벡터는 로컬 좌표의 3차원 공간에서 어떤 방향도 될 수 있습니다.
조인트 유형에 따라 조인트 축의 정의가 다릅니다.
fixed
— 고정 조인트는 관련된 모션 축이 없습니다.revolute
— 회전 조인트는 조인트 축에 수직인 평면에서 바디를 회전시킵니다.prismatic
— 직선 조인트는 조인트 축 방향을 따라 선형 모션으로 바디를 움직입니다.floating
— 플로팅 조인트는 공간에서 바디를 자유롭게 회전시킵니다. 플로팅 조인트에는JointAxis
속성을 설정할 수 없습니다.
예: revolute
조인트의 x축을 중심으로 한 모션에서 [1 0 0]
JointToParentTransform
— 조인트에서 부모 프레임으로의 고정 변환
eye(4)
(디폴트 값) | 4×4 동차 변환 행렬
읽기 전용 속성입니다.
조인트에서 부모 프레임으로의 고정 변환으로, 4×4 동차 변환 행렬로 반환됩니다. 이 변환은 조인트 선행 프레임의 점 좌표를 부모 바디 프레임으로 변환합니다.
예: eye(4)
ChildToJointTransform
— 자식 바디에서 조인트 프레임으로의 고정 변환
eye(4)
(디폴트 값) | 4×4 동차 변환 행렬
읽기 전용 속성입니다.
자식 바디에서 조인트 프레임으로의 고정 변환으로, 4×4 동차 변환 행렬로 반환됩니다. 이 변환은 자식 바디 프레임의 점 좌표를 조인트 후속 프레임으로 변환합니다.
예: eye(4)
객체 함수
copy | Create 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) --------------------
Denavit-Hartenberg 파라미터를 사용하여 매니퓰레이터 로봇 빌드하기
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;
첫 번째 강체를 만들고 로봇에 추가합니다. 강체를 추가하려면 다음을 수행하십시오.
rigidBody
객체를 만들고 고유한 이름을 지정합니다.rigidBodyJoint
객체를 만들고 고유한 이름을 지정합니다.setFixedTransform
으로 DH 파라미터를 사용하여 바디-바디 변환을 지정합니다. DH 파라미터의 마지막 요소인theta
의 경우 이에 해당하는 각도는 조인트 위치에 따라 달라지므로 무시됩니다.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);
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 Filename link_4.stl'} Collisions: {'Mesh Filename 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);
수정된 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) --------------------
플로팅 조인트를 사용하여 플로팅 베이스 로봇 모델링하기
이 예제에서는 고정 베이스에서 유형이 "floating"
인 rigidBodyJoint
로 표현되는 플로팅 조인트를 사용하여 플로팅 로봇을 강체 트리로 모델링하는 방법을 보여줍니다. 정기구학과 정동역학 같은 대부분의 응용 사례에서 이 접근 방식을 사용합니다. 그러나 플로팅 베이스의 로봇에 역기구학 솔버 또는 모션 모델을 사용해야 하는 경우에는 "floating"
조인트를 사용할 수 없습니다. 역기구학 또는 모션 모델의 플로팅 베이스 로봇을 모델링하려면 Inverse Kinematics for Robots with Floating Base 항목을 참조하십시오.
먼저 고정 베이스를 비어 있는 강체 트리로 만듭니다. 그런 다음 강체 트리를 만들고 강체에 유형이 "floating"
인 강체 조인트를 추가합니다.
rbt = rigidBodyTree(DataFormat="row"); floatingBaseBody = rigidBody("floatingBase"); floatingBaseBody.Joint = rigidBodyJoint("j1","floating");
오른쪽 바디를 고정 베이스 강체 트리에 추가합니다. 이제 강체와 고정 베이스가 플로팅 조인트에서 결합되어 xyz축 내부에서 그리고 그러한 축을 따라 자유로운 평행 이동과 회전이 가능합니다.
addBody(rbt,floatingBaseBody,rbt.BaseName);
ABB IRB 120 로봇 팔의 강체 트리 모델을 불러온 다음, 불러온 강체 트리를 플로팅 베이스 강체 트리에 추가합니다. 이름 충돌을 방지하기 위해 플로팅 베이스 강체 트리의 BaseName
속성 이름을 'world'
로 변경합니다. 두 강체 트리가 모두 디폴트 베이스 이름 'base_link'
를 사용하면 이름 충돌이 발생합니다.
abbirb = loadrobot("abbIrb120",DataFormat="row"); rbt.BaseName = 'world'; addSubtree(rbt,"floatingBase",abbirb,ReplaceBase=false);
강체 트리가 공간에서 자유롭게 평행 이동 및 회전할 수 있음을 입증하기 위해 고정 베이스 프레임에서 방향이 [0 pi/2 pi/3]
인 xyz 좌표 [-1.1, 0.2, 0.3]
에 로봇 팔의 베이스를 시각화합니다.
baseOrientation = eul2quat([0 pi/3 pi/3]); % ZYX Euler rotation order
basePosition = [-1.1 0.2 0.3];
floatingRBTConfig = [baseOrientation,basePosition,homeConfiguration(abbirb)]
floatingRBTConfig = 1×13
0.7500 0.4330 0.4330 -0.2500 -1.1000 0.2000 0.3000 0 0 0 0 0 0
show(rbt,floatingRBTConfig); axis equal title(["Robot Joint Configuration With Base", "at Desired Position and Orientation"])
이제 이 플로팅 베이스 로봇을 정기구학과 정동역학 응용 사례에 사용할 수 있습니다. 앞서 언급한 바와 같이 inverseKinematics
를 사용하거나 이에 대한 모션 계획을 수행하려는 경우 이러한 방식으로 플로팅 베이스 로봇을 모델링할 수 없습니다. 그러한 시도를 하면 역기구학 함수에서 오류가 발생합니다. 역기구학 및 모션 계획을 위한 플로팅 베이스 로봇을 모델링하려면 Inverse Kinematics for Robots with Floating Base 항목을 참조하십시오.
제한 사항
다음의 객체와 함수는
"floating"
조인트가 포함된 강체 트리를 지원하지 않습니다.다음의 블록은
"floating"
조인트가 포함된 강체 트리를 지원하지 않습니다.역기구학 디자이너는
"floating"
조인트가 포함된 강체 트리를 지원하지 않습니다.Simscape™ Multibody™는 플로팅 조인트가 포함된 강체 트리 가져오기를 지원하지 않습니다.
이러한 제한 사항에 대한 자세한 내용과 플로팅 베이스 로봇을 이러한 객체, 함수, 블록과 함께 사용하여 모델링하는 방법은 Inverse Kinematics for Robots with Floating Base 항목을 참조하십시오.
참고 문헌
[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에 개발됨R2024a: 플로팅 조인트 지원
이제 rigidBodyJoint
객체가 플로팅 조인트 유형을 지원합니다. 이를 통해 동역학, 정기구학, 모션 계획을 위해 플로팅 베이스의 로봇을 모델링할 수 있습니다.
R2019b: rigidBodyJoint
로 이름이 변경됨
객체 이름이 robotics.Joint
에서 rigidBodyJoint
로 바뀌었습니다. 모든 객체 생성에 rigidBodyJoint
를 사용하십시오.
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)