본문 바로가기

Simulator/Unity

Implementation of Summit-XL + UR5e (Robotiq 2F-85) in Unity (3) Controlling mobile robot in Unity with ROS

 챕터(3)에선 ROS로 Unity 로봇을 이동시킵니다.

 

* 이번 챕터 진행하기 전에 아래 페이지에서 Unity와 ROS 통신 튜토리얼을 통해 ROS-Unity 통신 원리를 이해해 주시기를 바랍니다.

https://github.com/Unity-Technologies/Unity-Robotics-Hub/tree/main/tutorials/ros_unity_integration

 

GitHub - Unity-Technologies/Unity-Robotics-Hub: Central repository for tools, tutorials, resources, and documentation for roboti

Central repository for tools, tutorials, resources, and documentation for robotics simulation in Unity. - GitHub - Unity-Technologies/Unity-Robotics-Hub: Central repository for tools, tutorials, re...

github.com

 

 

* 두 대의 컴퓨터에서 Window, Ubuntu를 각각 실행하는 경우가 아닌, 가상 머신에서 Ubuntu를 실행하시는 경우에는 다음과 같이 네트워크 설정을 '어댑터에 브리지'로 연결해야 Ubuntu와 Window Unity의 ROS 통신이 가능합니다.

 

 

 

1. ROS 환경 셋업

 

 Ubuntu에서 ROS-Unity 통신 및 이번 챕터를 진행하기 위해 필요한 패키지를 설치하고 ROS IP 주소를 설정합니다.

 

1. 'ROS-TCP-Endpoint' 패키지를 설치합니다.

 

cd ~/unity_ws/src
git clone https://github.com/Unity-Technologies/ROS-TCP-Endpoint.git

 

 

2. Teleop key 패키지를 설치합니다.

 

cd ~/unity_ws/src
git clone https://github.com/beomjoonlee/unity_teleop_key.git

 

 

3. 그 외 필요한 패키지들을 설치합니다.

 

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install python3-pip ros-noetic-robot-state-publisher ros-noetic-moveit ros-noetic-rosbridge-suite ros-noetic-joy ros-noetic-ros-control ros-noetic-ros-controllers
sudo -H pip3 install rospkg jsonpickle

 

 

4. workspace를 build 합니다.

 

cd ~/unity_ws
catkin_make && source devel/setup.bash

 

 

5. Ubuntu 환경의 IP 주소를 확인합니다.

 

ifconfig

 

* Ubuntu 특정 버전 이후는 ifconfig 명령어가 설치되어있지 않아 'Command not found'가 출력되는 경우가 있습니다. net-tools 패키지를 설치합니다.

 

sudo apt-get install net-tools

 

 

 

6. 홈 디렉터리에 위치한 '.bashrc' 파일 내 'ROS_MASTER_URI'와 'ROS_HOSTNAME'의 IP 주소가 맞는지 확인하고 다르면 '5.'에서 확인한 주소로 설정합니다.

 

6-1. Editor에서 '~/.bashrc'을 엽니다.

 

nano ~/.bashrc # editor open

 

 

6-2. IP 주소를 변경합니다.

 

 

 

6-3. 변경 후 'ctrl' + ' x' -> 'y' -> 'enter',

Editor에서 빠져나온 후 아래 명령어를 입력하여 변경사항을 적용합니다.

 

source ~/.bashrc

 

 

2. Unity 환경 셋업

 

 Unity에서도 ROS 통신을 위한 패키지를 설치합니다. 다음 페이지를 참고하여도 좋고, 아래 방법대로 진행하셔도 됩니다.

 

 

1. 상단 메뉴에 'Window' 클릭 -> 'Package Manager' 클릭

 

 

 

2. 'Package Manager' 상단 왼쪽 '+' 버튼 클릭 -> 'Add package from git URL...' 선택

 

 

 

3. 'https://github.com/Unity-Technologies/ROS-TCP-Connector.git?path=/com.unity.robotics.ros-tcp-connector' 입력 -> 'Add' 클릭

 

 

 

4. 상단 메뉴 'Robotics' 클릭 -> 'ROS Settings' 클릭

 

 

5. 저희는 Ubuntu 20.04, ROS1 Noetic으로 튜토리얼을 진행하고 있기 때문에 'Protocol'은 'ROS1'을 선택합니다.

 

 

 

6. 'ROS IP Address'는 '1.5.' 에서 확인한 Ubuntu 환경의 IP 주소를 입력합니다.

 

 

 

3. Subscriber node 작성

 

Ubuntu ROS에서 publish하는 topic과 message를 subscribe 하기 위한 script를 작성합니다.

 

1. 프로젝트 내 Assets 폴더 안에 'Scripts' 폴더를 생성합니다.

 

 

 

 

2. 'Project' 상단 왼쪽 '+' 버튼 클릭 -> 'C# Script' 선택 -> 파일 이름 'TeleopKey'로 변경

 

* 처음 'C# Script'를 생성했을 때, 그 순간 바로 이름을 변경할 것을 추천드립니다. 아래 사진 속 체크 부분과 같이 파일 이름으로 class가 생성되기 때문입니다.

 

 

 

3. 'TeleopKey' script를 열어 아래 파일의 내용을 붙여 넣습니다.

https://github.com/beomjoonlee/unity_teleop_key/blob/main/unity/TeleopKey.cs

 

GitHub - beomjoonlee/unity_teleop_key

Contribute to beomjoonlee/unity_teleop_key development by creating an account on GitHub.

github.com

 

 

4. Unity 화면으로 돌아오면 compile이 진행됩니다. (에러 메시지가 발생하지 않아야 됩니다.)

 

 

4. Teleop Key 로봇에 적용

 

 '3.'에서 작성한 script는 'Rigidbody' component를 포함한 물체를 이동시킵니다. 현재 로봇에는 'Rigidbody' component를 포함한 link가 없기 때문에 추가하거나 새로 생성해야 합니다. 모든 link는 'Articulation Body'가 포함되어 있기 때문에 'Rigidbody'를 추가할 수 없습니다.

 

 

따라서, 가상의 link인 'summit_xl_base_footprint'을 이용합니다.

 

1. 'Hierarchy'에서 'summit_xl_base_footprint'을 선택합니다.

 

 

 

2. 'summit_xl_base_footprint'에 'Rigidbody' component를 추가합니다.

'Inspector'에서 'Add Component' 클릭 -> 'Rigidbody' 검색 후 클릭

 

 

 

3. 'summit_xl_base_footprint'와 'summit_xl_base_link'를 fixed joint로 연결합니다.

'Hierarchy'에서 'summit_xl_base_footprint' 선택 -> 'Inspector'에서 'Add Component' 클릭 -> 'Fixed Joint' 검색 후 클릭 -> 'Connected Articulation Body'에 'summit_xl_base_link' 드래그해서 추가

 

 

 

 

4. 'Project/Assets/Scripts'에 생성한 'TeleopKey' script를 드래그하여 'summit_xl_base_footprint'에 추가합니다.

 

 

 

5. 'summit_xl_base_footprint'는 가상의 link이지만 'Rigidbody' component를 추가했기 때문에 질량을 포함한 property가 추가되었습니다. 로봇의 움직임을 향상시키기 위해 'Rigidbody'의 파라미터들을 변경해야 합니다.

'Rigidbody'의 자세한 사항은 다음 페이지를 참고하세요.

https://docs.unity3d.com/2021.3/Documentation/Manual/class-Rigidbody.html

 

 

5-1. 실험 결과 'Mass'를 18로 설정하는 것이 입력 속도와 로봇의 속도 사이에 오차가 적었습니다. (운동량 보존 법칙과 관련)

'Hierarchy'에서 'summit_xl_base_footprint' 선택 -> 'Inspector' 내 'Rigidbody'에서 'Mass'를 18로 설정

 

 

 

5-2. 'Drag'와 'Angular Drag'를 무한대로 설정하여 공기의 저항을 높여 입력 속도와 Unity 로봇의 속도의 차이를 최소화합니다.

'Hierarchy'에서 'summit_xl_base_footprint' 선택 -> 'Inspector' 내 'Rigidbody'에서 'Drag'와 'Angular Drag'를 Infinity로 설정

 

 

 

5-3. 물리 현상을 무시하기 위해 'Is Kinematic'을 체크하셔도 됩니다.

'Hierarchy'에서 'summit_xl_base_footprint' 선택 -> 'Inspector' 내 'Rigidbody'에서 'Is Kinematic' -> Empty or Check

Empty: 물리 현상 영향을 받음

Check: 물리 현상의 영향을 받지 않음. 물체의 'Transform'로만 물체 이동 가능

 

 

 

5-4. 로봇이 공중으로 뜨거나 (y축 방향으로 이동 및 x축, z축을 중심으로 회전) 입력되는 y축 중심 회전 외 다른 회전을 방지하기 위해 'Constraints'를 설정합니다.

'Hierarchy'에서 'summit_xl_base_footprint' 선택 -> 'Inspector' 내 'Rigidbody'에서 'Freeze Position'은 'Y' 체크, 'Freeze Rotation'은 'X', 'Y', 'Z' 체크

 

 

 

4. ROS Teleop Key로 로봇 컨트롤

 이제 ROS 파트에서 로봇의 속도를 publish하는 node를 실행시켜 Unity의 로봇을 이동시킵니다.

 

1. Ubuntu에서 다음 명령어를 입력하여 Teleop Key를 실행합니다.

 

roslaunch unity_teleop_key teleop_key.launch

 

 

2. Unity에서 재생 버튼을 눌러 재생합니다.

 

 

 

3. 게임 화면에서 화살표가 다음과 같이 파란색, 초록색이라면 통신이 정상적임을 의미합니다.

 

 

 

4. Ubuntu에서 Teleop Key를 실행한 터미널 창에서 key를 눌러 로봇의 속도를 변화시킵니다.