챕터(2)에선 챕터(1)에서 구현한 로봇이 정상 작동되도록 여러 link와 joint들의 component, property를 변경합니다.
* 재생 버튼이 다음과 같은 상태에서 진행해야 합니다.

Unity를 재생한 상태에서 진행하지 않도록 주의해야 합니다. 재생된 상태에서 진행하고 정지를 할 경우 변경 사항들이 모두 초기화됩니다.
1. 바퀴 sphere collision 추가, Joint Type을 'Spherical'으로 변경
아시다시피 Summit-XL 로봇의 바퀴는 omni wheel로 평면 좌표계에서 어느 방향으로도 이동할 수 있습니다. 하지만 Unity에선 omni wheel 모델에 다음과 같이 cylinder collision과 revolute joint가 적용되어 앞 뒤 방향으로만 이동할 수 있습니다.

모든 방향으로 이동이 가능하도록 cylinder collision 대신 sphere collision을, revolute joint 대신 spherical joint를 적용합니다. visual은 변경하지 않기 때문에 시각적인 부분에선 달라지지 않습니다.
1. 'Hierarchy'에서 네 개의 바퀴의 기존 collision을 모두 제거합니다. 오른쪽 마우스로 클릭 후 'Delete'를 선택하시면 됩니다.

2. 'summit_xl_base_link' 하위에 4개의 link들을 만듭니다.
'Hierarchy'에서 'summit_xl_base_link' 선택 -> 'Inspector' 내 'Urdf Link (Script)'에서 'Child Joint Type'을 'Continuous'를 선택 -> 'Add child link (with joint)' 클릭 -> 4번 반복

3. '2.'에서 만들어준 link들의 이름을 각 다음과 같이 변경합니다.
- back_right_wheel_collision
- back_left_wheel_collision
- front_right_wheel_collision
- front_left_wheel_collision

4. 각각의 바퀴 collision link의 joint type을 spherical로 변경합니다.
'Hierarchy'에서 바퀴 collision link 선택 -> 'Inspector' 내 'Articulation Body'에서 'Articulation Joint Type'을 'Spherical'로 변경

5. 각각의 바퀴 collision link에 'Sphere Collider' component를 추가합니다.
'Hierarchy'에서 바퀴 collision link의 하위 항목 'Collisions' 선택 -> 'Inspector' 내 'Urdf Collisions (Script)'에서 'Type of collision'을 'Sphere' 선택 -> 'Add Collision' 클릭

6. '5.'에서 생성한 sphere collider의 반지름을 설정합니다.
'Hierarchy'에서 바퀴 collision link의 하위 항목 'Sphere' 선택 -> 'Inspector' 내 'Sphere Collider'에서 'Radius'를 0.127로 설정

7. 'Hierarchy'에서 보기 편하도록 바퀴 collision link들을 바퀴 link 아래에 짝지어 배치하고 'Transform'을 동일하게 변경합니다.

8. 다음과 같이 바퀴에 구 모양의 collision이 추가된 것을 확인하실 수 있습니다.

9. 로봇의 바퀴에 collision이 잘 추가 됐는지 확인하기 위해 바닥을 만들어줍니다.
'Hierarchy' 상단 왼 '+' 버튼 클릭 -> '3D Object' 선택 -> 'Plane' 선택 -> 'Inspector'에서 'Transform'의 'Position' X, Y, Z를 모두 0으로 설정, 'Scale' X, Z는 10으로 설정하고 Y는 변경하지 않습니다.

10. 가운데 상단에 재생 버튼을 누르면 로봇이 추락하지 않는 것을 보실 수 있습니다.
2. Gripper collision 추가
Gripper의 collision은 가끔 추가되지 않는 경우가 발생합니다. gripper의 collision이 아래 '6.'과 같이 나타나지 않는다면 unity에서 직접 collision을 추가해야 합니다.
gripper finger는 다음 8개의 link로 구성되어 있습니다. 각각의 Link에 collision을 추가합니다.
- gripper_finger1_inner_knuckle_link
- gripper_finger1_finger_tip_link
- gripper_finger1_knuckle_link
- gripper_finger1_finger_link
- gripper_finger2_inner_knuckle_link
- gripper_finger2_finger_tip_link
- gripper_finger2_knuckle_link
- gripper_finger2_finger_link
1. 'gripper_finger1_inner_knuckle_link'와 'gripper_finger2_inner_knuckle_link'
1-1. 두 link의 하위 항목은 다음과 같습니다.

1-2. 'unnamed'의 하위 항목인 'robotiq_85_inner_knuckle_link'를 선택합니다.

1-3. 'Inspector'에서 'Add Component'를 클릭 -> 'Mesh Collider' 검색 후 추가 -> 'Convex' 체크

2. 'gripper_finger1_finger_tip_link'와 'gripper_finger2_finger_tip_link'
2-1. 두 link의 하위 항목은 다음과 같습니다.
'unnamed'의 하위 항목인 'robotiq_85_finger_tip_link' 선택

2-2. 'Inspector'에서 'Add Component'를 클릭 -> 'Mesh Collider' 검색 후 추가 -> 'Convex' 체크

3. 'gripper_finger1_knuckle_link'와 'gripper_finger2_knuckle_link'
3-1. 두 link의 하위 항목은 다음과 같습니다. 'robotiq_85_knuckle_link' 선택

3-2. 'Inspector'에서 'Add Component'를 클릭 -> 'Mesh Collider' 검색 후 추가 -> 'Convex' 체크

4. 'gripper_finger1_finger_link'와 'gripper_finger2_finger_link'
4-1. 두 link의 하위 항목은 다음과 같습니다. 'robotiq_85_finger_link' 선택

4-2. 'Inspector'에서 'Add Component'를 클릭 -> 'Mesh Collider' 검색 후 추가 -> 'Convex' 체크

5. 추가로 'camera_bracket' link에도 collsion을 추가해야 합니다.
'camera_bracket_link' 가장 하위에 'camera_bracket_0' 선택 ->
'Inspector'에서 'Add Component'를 클릭 -> 'Mesh Collider' 검색 후 추가 -> 'Convex' 체크

6. Gripper의 모든 link에 collision이 추가된 것을 확인할 수 있습니다.

3. Revolute Joint들의 Parameter 조정
재생시켜 보면 아시겠지만, 현재 revolute joint들의 stiffness와 damping 값이 모두 0이라 로봇이 고정되지 않고 힘없이 쓰러집니다. 로봇의 payload를 설정하기 위해서 stiffness와 damping 값을 변경해야 합니다.
Revolute Joint가 부착된 link들은 다음과 같습니다.
- ur5e_shoulder_link
- ur5e_upper_arm_link
- ur5e_forearm_link
- ur5e_wrist_1_link
- ur5e_wrist_2_link
- ur5e_wrist_3_link
- gripper_finger1_inner_knuckle_link
- gripper_finger1_finger_tip_link
- gripper_finger1_knuckle_link
- gripper_finger2_inner_knuckle_link
- gripper_finger2_finger_tip_link
- gripper_finger2_knuckle_link
1. 'Hierarchy'에서 위 link들을 하나씩 선택합니다. 'Inspector'에서 'Articulation Body'를 살펴봅니다.

2. 'Articulation Body'의 'Angular Damping'과 'Joint Friction'을 10으로 설정합니다.

3. 'Articulation Body'의 'Stiffness'는 10000으로 'Damping'을 100으로 설정합니다.

4. 모든 link들에 대해 똑같이 적용합니다.
5. 'Hierarchy'에서 'summit_xl'의 Component를 살펴보면 'Controller (Script)'가 존재합니다. 이 script는 urdf importer로 summit을 생성했을 때 자동으로 생성된 joint 각도를 변경할 수 있는 script입니다.
이번 튜토리얼에서 이 script를 사용하지 않기 때문에 체크를 해제합니다. 체크를 해제하지 않으면 재생하는 동안 이 script에서 설정된 값이 적용됩니다.
(이 script를 사용하기 위해선 마찬가지로 property를 변경해야 합니다. 여기서 설정한 값은 모든 joint에 동일하게 적용됩니다.)

6. 재생하면 로봇이 쓰러지지 않고 고정된 것을 확인할 수 있습니다.
다음 링크에서 Unity의 Articulation Body에 대해 읽어보신 후 각자 연구 환경에 맞게 변경하셔도 됩니다.
https://docs.unity3d.com/Manual/class-ArticulationBody.html
Unity - Manual: Articulation Body component reference
Introduction to physics articulations Articulation Body component reference Switch to Scripting Articulation Bodies enable you to build physics articulations such as robotic arms or kinematic chains with GameObjectsThe fundamental object in Unity scenes, w
docs.unity3d.com
Next) Implementation of Summit-XL + UR5e (Robotiq 2F-85) in Unity (3)
Controlling mobile robot in Unity with ROS