Unity 검색

다루는 주제
공유

로봇 개발 워크플로에서는 주로 시뮬레이션을 통해 테스트와 훈련을 시행합니다. 이번 시리즈에서는 로보틱스 분야에서 Unity를 활용하는 방법을 살펴보겠습니다. 새 블로그 시리즈 중 첫 번째인 이번 포스팅에서는 일반적으로 사용되는 로보틱스 개발 워크플로를 설명합니다. 또한 Unity에서 한층 더 쉽고 빠르며 효율적으로 로보틱스 시뮬레이션을 수행할 수 있는 새로운 툴 세트도 소개해 드릴 예정입니다.

로보틱스에 Unity를 활용하는 방법

실제 로봇을 사용하여 애플리케이션을 개발하고 테스트하려면 많은 비용과 시간이 필요하므로, 로봇 애플리케이션 개발에서 시뮬레이션이 점점 중요성해지고 있습니다. 로봇에 배포하기 전에 시뮬레이션을 통해 애플리케이션을 테스트하면 잠재적인 문제를 조기에 발견하여 반복 작업 시간을 단축할 수 있습니다. 시뮬레이션을 활용하면 실제로 테스트하기에 너무 위험할 수 있는 극단적인 사례나 시나리오를 보다 쉽게 테스트할 수 있습니다.효과적인 로보틱스 시뮬레이션의 핵심 요소에는 로봇의 물리적 속성, 로봇이 작동하는 씬이나 환경 및 실제 로봇에서 실행되는 소프트웨어 등이 포함됩니다. 유효한 테스트와 훈련을 실시하려면 이 세 가지 요소를 최대한 실제 세계와 유사하게 설정해야 합니다.로봇 소프트웨어 개발에서 가장 널리 사용되는 프레임워크 중 하나는 ROS(Robot Operating System)입니다. ROS는 산업 조립 공정, 자율 차량, 엔터테인먼트에 이르기까지 매우 다양한 사용 사례에 대해 전 세계 수천 명의 로봇 공학자가 사용하는 로봇 설명, 메시지, 데이터 유형에 대한 표준 형식을 제공합니다. 활발한 활동이 이루어지는 사용자 커뮤니티에서는 새로운 시스템 개발에 도움이 될 수 있는 일반적인 기능이 포함된 다양한 오픈 소스 패키지를 지원합니다. 로보틱스에서는 로봇 애플리케이션을 시뮬레이터와 접속하는 실제 로봇 및 컴퓨터에 배포 가능한 모듈형 ROS 노드 세트로 설계하는 경우가 많습니다. 시뮬레이션에서 개발자는 실제 로봇의 사용 사례가 그대로 반영된 가상 세계를 구축합니다. 이러한 시뮬레이션 생태계에서 먼저 로봇을 테스트하면서 사용자는 빠르게 반복적으로 설계를 수정한 후 실제 세계에서 테스트를 진행하고 프로덕션 단계에 최종 배포할 수 있습니다.

실제 세계에서 테스트하기 전에 시뮬레이션으로 먼저 테스트하는 일반적인 로보틱스 개발 워크플로

이번 블로그 포스팅에서는 간단한 픽 앤 플레이스(pick-and-place) 작업을 예로 들어 사용자가 이 시뮬레이션 워크플로에서 어떻게 Unity를 활용할 수 있는지 설명합니다.

1: 로봇의 작업 정의

위 워크플로를 따라, 이번 예시의 로봇이 오브젝트를 집어 올려 지정된 위치로 옮기는 작업을 수행한다고 가정해 보겠습니다. 6개의 축을 가진 Niryo One 교육 로봇이 로봇 팔 역할을 수행합니다. 환경은 빈 방, 로봇이 배치될 테이블, 육면체(즉 대상 오브젝트) 등 최소한으로 구성됩니다. 이번 작업의 모션 플래닝 부분은 MoveIt이라는 이름으로 널리 사용되는 모션 플래닝 ROS 패키지 세트를 사용합니다. 작업을 시작할 준비가 끝나면 시뮬레이터에서 MoveIt으로 플래닝 요청을 전송합니다. 해당 요청에는 로봇이 가진 모든 조인트의 위치와 방향, 육면체의 위치와 방향, 육면체의 대상 위치가 포함됩니다. 요청을 받은 MoveIt은 모션 계획을 산출하여 실행을 위해 시뮬레이터로 다시 전송합니다. 이제 작업을 정의했으니 시뮬레이션 워크플로에서 어떻게 Unity를 활용하는지 살펴보겠습니다.

2: 로봇을 시뮬레이션에 적용

로보틱스 시뮬레이션에는 가상 환경을 설정하는 단계가 포함됩니다. 이번 예시에서는 단순한 방이지만 컨베이어 벨트, 통, 도구, 부품이 즐비한 공장 현장 등 보다 복잡한 환경일 수도 있습니다. 그리고 환경에 훈련이나 테스트를 진행할 로봇의 가상 표현형을 추가하게 됩니다. Unity 에디터를 사용하면 무한히 많은 가상 환경 순열을 생성할 수 있습니다. 그렇다면 이러한 환경에 어떻게 로봇을 적용해야 할까요? 시뮬레이션에 로봇을 모델링하려면 로봇의 시각적 메시, 충돌 메시 및 물리적 속성을 표현해야 합니다. 시각적 메시는 로봇을 실제와 같은 모습으로 렌더링하기 위해 필요합니다. 충돌 메시는 조인트를 서로 연결하는 단단한 요소인 로봇의 ‘링크’ 사이의 충돌, 환경에 배치된 다른 오브젝트과의 충돌 및 로봇 자체의 충돌을 계산하기 위해 필요합니다. 충돌 메시는 충돌을 빠르게 확인할 수 있도록 일반적으로 시각적 메시보다 덜 복잡하며, 많은 컴퓨팅 작업이 필요할 수 있습니다. 마지막으로 관성, 접촉 계수, 조인트 동역학과 같은 물리적 속성은 정확한 물리 시뮬레이션을 위해 필요합니다. 즉 어느 정도의 힘을 가해야 로봇의 상태(예: 위치와 방향, 속도, 가속도)가 바뀌는지 계산하기 위한 것입니다. ROS 개발 워크플로를 사용하면 이 모든 속성을 설명하는 표준화된 방식인 (URDF)Universal Robot Description Format을 활용할 수 있습니다. URDF 파일은 시각적 속성과 충돌 및 물리적 속성을 사람이 읽을 수 있는 마크업 언어로 지정하는 XML 파일입니다. URDF 파일은 복잡한 지오메트리 지정에 필요한 메시 파일을 포함할 수도 있습니다. 아래에서 Niryo One 로봇의 URDF 파일에서 발췌한 예시를 확인할 수 있습니다.

Niryo One 로봇의 URDF

로보틱스 연구자가 로봇을 더 간편하게 Unity로 임포트할 수 있도록 유니티에서는 URDF Importer를 출시할 예정입니다. URDF Importer는 로봇의 URDF 파일을 사용하여 해당 로봇을 Unity 씬으로 임포트하기 위한 오픈 소스 유니티 패키지입니다. 이 패키지는 PhysX 4.1의 개선으로 가능해진 Unity의 새로운 ‘관절(articulation)’ 지원을 활용합니다. 이번 업데이트로 로봇의 물리적 특성을 정확하게 모델링할 수 있으며, 이를 통해 한층 사실적인 키네마틱 시뮬레이션을 수행할 수 있습니다. URDF Importer를 Unity 에디터에 설치하면 임포트할 URDF 파일을 선택할 수 있습니다. 패키지는 XML 파일을 파싱하고 링크와 조인트를 적절한 C# 클래스에 저장합니다. 그런 다음 게임 오브젝트의 계층 구조를 설정합니다. 여기에서 각 게임 오브젝트는 ArticulationBody 컴포넌트이며 로봇의 특정 링크를 나타냅니다. 패키지는 URDF의 속성을 ArticulationBody 내 해당 필드에 할당합니다. 사용자가 Unity에 로봇을 추가하면 URDF Importer가 기본적인 키보드 조인트 컨트롤러를 자동으로 생성합니다. 사용자는 ArticulationBody API를 사용하여 이 컨트롤러를 커스텀 컨트롤러로 교체할 수 있습니다.예를 들어 다음은 위의 URDF 파일을 임포트한 후 생성된 Niryo One Unity 에셋입니다.

URDF Importer를 통해 임포트된 Unity의 가상 Niryo One 로봇

3: 시뮬레이션을 ROS에 연결

로봇을 Unity 에디터로 가져온 후에 ROS 노드 세트에서 실행되는 모션 플래닝 알고리즘을 테스트합니다. 먼저 Unity와 ROS 간에 커뮤니케이션 인터페이스를 설정해야 합니다. Unity는 ROS에 상태 정보, 즉 로봇의 위치와 방향, 대상 오브젝트, 대상 위치를 포함하는 메시지와 무버 서비스(Mover Service)에 대한 플래닝 요청을 전달해야 합니다. 반대로 ROS는 Unity에 모션 플랜에 상응하는 궤적 메시지(즉 픽 앤 플레이스 작업을 완료하기 위해 필요한 조인트 위치의 배열)를 반환해야 합니다. 이제 새로운 ROS-Unity 통합 패키지 2가지로 Unity와 ROS를 더 쉽게 연결할 수 있습니다. 패키지를 통해 낮은 지연 시간으로 ROS 노드와 Unity 간에 ROS 메시지를 전달할 수 있습니다. 단일 머신에서 테스트했을 때 단순한 텍스트 기반 메시지의 경우 수 밀리초 만에 Unity에서 ROS 구독자(subscriber)로 전달되었으며 1036x1698 크기의 이미지의 전달에는 수백 밀리초가 소요되었습니다.ROS에서 커뮤니케이션은 발행/구독(pub/sub) 모델을 사용하므로, ROS-Unity 커뮤니케이션에서 첫 번째 요구 사항은 ROS 메시지 유형에 상응하는 Unity 클래스입니다. Unity 에디터에 ROS-TCP-Connector Unity 패키지를 추가하면 사용자는 MessageGeneration 플러그인을 사용하여 ROS .msg와 .srv 파일로부터 직렬화와 역직렬화 함수를 포함한 C# 클래스를 생성할 수 있습니다. ROS-TCP-Connector 패키지에는 스크립트가 포함되어 사용자가 확장을 통해 Unity에서 ROS 주제(topic)로 메시지를 발행하고, Unity에서 ROS 주제의 메시지를 구독하며, ROS 서비스 요청과 응답을 생성할 수 있습니다. ROS 측에서 사용할 수 있는 ROS-TCP-Endpoint라는 ROS 패키지는 ROS-TCP-Connector 스크립트를 사용하여 ROS 노드와 Unity 씬 간의 커뮤니케이션을 가능하게 하는 엔드포인트를 생성합니다. 이제 ROS-Unity 통합 패키지를 작업에 활용하는 방법을 살펴보겠습니다. 먼저 ROS-Unity 통합 패키지를 사용하여 Unity에서 발행자(Publisher)를 생성하고 TCP를 통해 위치와 방향 데이터를 ROS로 전송합니다. ROS 측에서는 ROS-TCP-Endpoint를 설정하여 이러한 위치와 방향 메시지를 구독합니다.이제 OnClick 콜백과 함께 Unity 씬에 ‘발행’ 버튼을 만듭니다. 이 콜백 함수는 MoveIt 모션 플래너에 서비스를 요청합니다. 해당 서비스 요청에는 로봇의 현재 위치와 방향, 대상 오브젝트의 위치와 방향, 그리고 대상 위치 정보가 포함됩니다. MoveIt이 플래닝 요청을 수신하면 모션 플래닝을 계산합니다. 계산에 성공한 경우 서비스는 해당 플랜, 즉 조인트 위치의 배열을 반환하며, Unity 스크립트는 ArticulationBody API를 사용하여 궤적을 실행합니다. 계산에 실패한 경우 실패 메시지를 반환합니다. 아래 gif에서 Niryo One 팔의 Unity 시뮬레이션이 픽 앤 플레이스 작업을 성공적으로 수행하는 모습을 확인할 수 있습니다.

모션 플래닝에 ROS와 MoveIt을 사용한 Niryo One 로봇의 픽 앤 플레이스 작업 시뮬레이션

이번 예시에서는 기본적인 기능만 구현해보았습니다. 개발자는 이 데모를 토대로 더 복잡한 Unity 씬을 제작하고, 다른 로봇을 추가하거나 다른 ROS 패키지를 통합할 수 있습니다. 추후 포스팅에서는 컴퓨터 비전과 머신러닝 지향 작업을 로보틱스 시뮬레이션 프레임워크로 통합하는 방법을 다룰 예정입니다.

마무리

이러한 툴은 시뮬레이션을 사용한 차세대 테스트와 훈련의 기반을 조성하며, 더 쉽게 Unity를 로보틱스 시뮬레이션에 활용할 수 있도록 지원합니다. 유니티 팀에서는 로보틱스용 머신러닝 훈련, 센서 모델링, 대규모 테스트와 같은 차세대 사용 사례를 지원하기 위해 많은 노력을 기울이고 있습니다. 이번 블로그 시리즈의 다음 포스팅을 기대하세요. 픽 앤 플레이스 작업에서 대상 오브젝트의 위치와 방향을 추정하도록 시각 기반 머신러닝 모델을 훈련하는 방법에 대해 설명할 예정입니다.

다음 단계

Unity 로보틱스 시뮬레이션 툴을 무료로 사용하고 GitHub에서 픽 앤 플레이스 튜토리얼을 확인하세요. 더 많은 로보틱스 프로젝트를 살펴보려면 GitHub의 Unity Robotics Hub를 방문하세요. 유니티 팀이 어떻게 Unity를 활용하여 컴퓨터 비전 훈련을 더 손쉽게 만드는지 확인하고 싶다면 컴퓨터 비전 블로그 시리즈를 읽어보세요.Unity를 활용하여 진행 중인 프로젝트의 로보틱스 시뮬레이션 요구 사항을 충족하는 방법을 알고 싶다면 공식 로보틱스 페이지를 방문하여 확인할 수 있습니다.유니티 팀에 질문이나 피드백, 의견을 직접 전달하고 싶다면 unity-robotics@unity3d.com으로 이메일을 보내주세요.

다루는 주제