로봇운영체제(ROS)용 NVIDIA Isaac GEM으로 로봇 설계하기

by NVIDIA Korea

ROS용 NVIDIA Isaac GEM은 ROS2 애플리케이션을 위한 GPU 가속 패키지를 제공해 이미지 프로세싱의 처리량과 DNN 기반 인식 모델을 개선합니다. 이 ROS2 패키지는 로보틱스 커뮤니티가 출시한 최초의 장기 안정 버전(Long Stable Release)인 ROS2 폭시(Foxy)를 바탕으로 구축됐죠.

이번 블로그에서는 NVIDIA Isaac ROS GEM으로 로봇 배포를 가속하는 방법을 소개합니다. NVIDIA Jetson 플랫폼을 기반으로 하는 단순형 오픈 소스 로봇 ‘나노소어(nanosaur)’의 에이프릴태그(AprilTags) 감지를 집중 탐구합니다.

그에 앞서 ROS와 NVIDIA Isaac GEM의 역사, 나노소어의 구축법부터 살펴보도록 하겠습니다.

ROS ROS2의 역사

2007년에 윌로 개라지(Willow Garage)가 로봇운영체제(Robot Operating System, ROS)를 내놓았습니다. 이 프레임워크의 개발을 지속하고자 2012년에는 오픈 로보틱스(Open Robotics) 재단이 신설됐죠. 초창기의 ROS는 로보틱스 연구 커뮤니티에서 주로 사용됐지만, 점차 로보틱스 제작자와 기업 등 보다 넓은 개발자 커뮤니티로 확산되며 인기를 얻게 됩니다.

2015년에 접어들어 ROS 커뮤니티는 로봇을 지원하는 단일 컬렉션인 로스코어(roscore)의 불안정성, 더딘 실시간 지원 등 프로덕션 릴리스상의 단점들에 주목했습니다. 그때부터 안정성과 내부 통신, 신뢰도 개선에 집중하며 연구 커뮤니티와 기업용으로 새롭게 설계한 2세대 ROS의 토대가 만들어지기 시작했죠.

ROS의 마지막 공식 릴리스가 된 노에틱(Noetic) 이후에는 ROS2가 로보틱스 분야의 새로운 표준으로 자리잡고 있으며, 최초의 LTS(Long Term Support, 장기 지원) 버전이 출시되면서 커뮤니티 차원의 지원 또한 증가하는 추세입니다.

나노소어

나노소어(nanosaur)는 NVIDIA Jetson을 기반으로 구축된 단순형 오픈 소스 로봇입니다. 3D 인쇄가 가능하고, 책상 위를 자율적으로 돌아다닐 수 있으며, 간단한 카메라와 OLED 2개를 눈으로 사용하죠. 10x12x6cm의 조그만 크기에 무게는 500g에 불과합니다.

Image of the NVIDIA Jetson-based nanosaur robot
그림 1. NVIDIA Jetson 기반의 나노소어는 3D 인쇄가 가능한 로봇입니다.

나노소어의 하드웨어는 I2C OLED 디스플레이 2개를 사용하고 동일한 I2C 모터 드라이버를 공유하는 NVIDIA JetBot과 유사합니다. 하지만 나노소어 소프트웨어의 경우, 도커(Docker)를 기반으로 ROS2상에서 개발됐고, 시스템 일체의 가속을 GPU가 담당하죠.

나노소어는 로봇의 운전과 상태 표시를 위한 여러 노드를 갖추고 있습니다. 이때 모든 노드는 패키지별로 정렬됩니다.

  • nanosaur_base
    • nanosaur_base는 모터 제어기와 디스플레이를 활성화합니다.
    • joy2eyes는 조이스틱의 메시지를 로봇 눈의 토픽(topic)으로 변환합니다. 이 노드는 눈 토픽의 검증을 원할 때 작동됩니다.
  • nanosaur_camera
    • nanosaur_camera는 MIPI 카메라의 카메라 스트리머를 ROS2 토픽으로 실행합니다.
  • ros2_jetson_stats
    • ros2_jetson_statsjetson-stats패키지의 래퍼(wrapper)로 NVIDIA Jetson(Xavier NX 또는 Jetson AGX Xavier, Nano, TX1, TX2)의 모니터링과 제어를 담당합니다.

더 자세한 내용은 나노소어 깃허브(GitHub) 저장소를 확인하세요.

나노소어 시작 시 일반적인 ROS2 그래프(graph)는 다음과 같습니다.

A ROS2 graph of nanosaur divided by repository and package
그림 2. 저장소와 패키지로 분할된 나노소어 ROS2 그래프

나노소어는 NVIDIA Jetson ROS Foxy Docker 이미지와 함께 릴리스를 시작했습니다. 파이토치(PyTorch)와 NVIDIA TensorRT, DeepStream SDK 등의 AI 프레임워크와 더불어 ROS2 갤락틱(Galactic), 엘로퀀트(Eloquent), 멜로딕(Melodic), 노에틱도 지원합니다.

ROS2 폭시는 jetson 유틸리티와 함께 nanosaur_camera에서 컴파일링/사용되어 카메라 액세스의 속도를 높입니다.

Overview of the nanosaur docker
그림 3. 도커의 개괄. 나노소어는 dusty-nv/jetson-containers 가이드를 기반으로 구축됩니다.

나노소어의 구동 시 활용할 수 있는 일련의 토픽들이 있는데요. 가령 눈 토픽인 image_raw topic은 디스플레이에 맞춰 로봇의 눈을 움직이고, 네비게이션 명령은 로봇을 운전합니다.

ROSNVIDIA Isaac GEM

이처럼 새로운 ROS2 패키지의 주목적은 GPU 가속 알고리즘 배포의 단순화입니다. 로보틱스 커뮤니티에 오픈 소스로 제공되어 CPU 활용을 지원하는 한편, AI와 로보틱스 인식을 GPU상에서 곧장 사용해 로봇의 기능을 개선하죠. 이 GEM 일체는 ROS 폭시용으로 배포되어 NVIDIA Jetson과 연동됩니다.

Block diagram of Isaac GEMs for ROS
그림 4. ROS Isaac GEM은 GPU 가속 ROS2 패키지 세트로 로보틱스 커뮤니티와 NVIDIA Jetson 플랫폼용으로 출시됩니다.

NVIDIA Isaac GEM은 ROS 패키지에서 하드웨어 가속 로보틱스 기능을 제공하고, ROS2 미들웨어 내 통합을 다른 ROS에서 결합된 네이티브 노드 상태로 유지해줍니다. ROS용 NVIDIA Isaac GEM은 x86_ 64/dGPU(Ubuntu 20.04)와 Jetson Xavier NX/AGX Xavier용으로 최신 NVIDIA JetPack 4.6과 함께 배포됩니다.

ROS용 NVIDIA Isaac GEM에는 다음이 포함됩니다.

에이프릴태그

에이프릴태그(AprilTag)는 카메라의 신속한 디코딩과 원거리 인식에 최적화된 고유의 QR 코드입니다. 이 태그들은 로봇 운전의 기준점(fiducial), 또는 로봇이 특정 시점에 행위를 시작하거나 작업을 완료하게 하는 조작기로 작용하죠. 또한 증강 현실에도 사용되어 바이저(visor)의 주행거리를 측정하기도 합니다. 다양한 제품군이 출시되고 있지만 태그 자체의 형태가 간단해서 데스크톱 프린트로 인쇄가 가능합니다.

Image showing the various AprilTags, such as Tag36h11 and TagStandard41h12.
그림 5. 여러 유형의 에이프릴태그와 제품군의 명칭

ROS2 에이프릴태그 패키지는 NVIDIA GPU로 이미지 내 감지를 가속하고, 포즈(pose)와 ID를 비롯한 메타데이터를 발행합니다. 이 패키지는 CPU 에이프릴태그 감지용 ROS2 노드와 비슷합니다.

패키지 종속성(dependencies)은 다음과 같습니다.

  • isaac_ros_common
  • isaac_ros_image_pipeline
  • image_common
  • vision_cv
  • OpenCV 4.5+

저장소의 튜토리얼에 익숙해지면 사용자의 ROS2 로보틱스 프로젝트에서 자체적으로 정의, 구성해볼 수 있습니다.

Example pipeline for Isaac ROS, starting with image rectification to AprilTag detection
그림 6. 카메라 스트림, 이미지 수정, 에이프릴태그 감지로 이어지는 NVIDIA Isaac ROS 파이프라인의 예

일반적으로 파이프라인의 정의는 카메라나 스테레오 카메라가 보내는 스트림에서 시작됩니다. 이때 두 개의 토픽이 발행됩니다. 즉, 아웃풋이 곧 원시 카메라 스트림인 토픽, 해당 스트림을 카메라 캘리브레이션(calibration)과 구성 측면에서 정의한 camera_info 토픽이 만들어지는 것이죠.

이 단계를 거친 뒤 ros_image_proc를 써서 사용자의 ROS2 애플리케이션을 가속하고 이미지 수정을 진행합니다. 또한 에이프릴태그와 모퉁이의 포즈 예측(pose estimation) 수정도 가능합니다.

Side-by-side picture comparison of raw image and rectified version그림 7. 원시 이미지와 수정 버전의 비교

isaac_ros_apriltag는 스트림에서 감지한 에이프릴태그들로 구성된 ROS2 토픽입니다. 나열된 항목마다 여러 데이터 포인트가 존재하는데요. 여기에는 카메라상 세계의 중앙, 모퉁이 일체, ID, 포즈 등이 포함되죠. 이 토픽의 기본 명칭은 /tag_detections입니다. 다음은 tag_detections 메시지의 예제입니다.

---
header:
  stamp:
    sec: 1631573373
    nanosec: 24552192
  frame_id: camera_color_optical_frame
detections:
- family: 36h11
  id: 0
  center:
    x: 779.4064331054688
    y: 789.7901000976562
    z: 0.0
  corners:
  - x: 614.0
    y: 592.0
    z: 0.0
  - x: 971.0
    y: 628.0
    z: 0.0
  - x: 946.0
    y: 989.0
    z: 0.0
  
- x: 566.0
    y: 970.0
    z: 0.0
  pose:
    header:
      stamp:
        sec: 0
        nanosec: 0
      frame_id: ''
    pose:
      pose:
        position:
          x: -0.08404197543859482
          y: 0.11455488204956055
          z: 0.6107800006866455
        orientation:
          x: -0.10551299154758453
          y: -0.10030339658260345
          z: 0.04563025385141373
          w: 0.9882935285568237
      covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
---

나노소어와 에이프릴태그 감지

nanosaur_follower 노드가 초기화되어 있는 구성 파일의 경우 PID 게인(gain), 로봇이 따를 에이프릴태그 ID를 비롯한 파라미터들이 선택되어 있습니다. 메인 루프(loop)에서 이 노드는 Isaac_ros_apriltag가 보내는 메시지를 디코딩하고, 결과가 카메라 스트림에 나타나면 그에 따라 선형 속도와 방향 전환을 생성합니다.

그림 8의 각 프레임에서 Isaac_ros_apriltag는 태그 감지와 관련해 새로운 아웃풋을 생성하고 nanosaur_follower 노드가 로봇을 운전합니다.

A diagram of AprilTag closed loop navigation and detection
그림 8. 에이프릴태그의 폐쇄 루프(closed loop) 네비게이션과 감지

나노소어 운동학 모델의 최초 근사 모델인 외발 자전거 로봇의 경우, 분리형 PID 제어기를 활용해 태그에 맞춰 움직입니다. 그림 9에서 1차 제어기(A)는 모퉁이에 있는 에이프릴태그의 중심에서 가운데선까지의 오차를 0으로 만듭니다. 이 오차를 ROS2는 방향 전환 메시지로 읽죠. 동시에 카메라 디스턴스(distance)에서 나오는 두 번째 오차가 로봇의 속도(B)를 결정합니다.

Two images of the nanosaur and how the AprilTag corner placement drives the twist output and the AprilTag camera distance drives the speed.
그림 9. 에이프릴태그 감지 후 나노소어는 방향 전환의 아웃풋을 생성해 모터를 구동합니다.

실시간 웹 인터페이스

나노소어는 모든 토픽과 카메라 스트림을 실시간으로 확인할 수 있는 도커 이미지를 추가 제공합니다. 따라서 로봇이 움직일 때 무슨 일이 벌어지는지 실시간으로 관찰할 수 있죠. 그림 10은 사용자 인터페이스의 예입니다.

Screenshot of interface with image and running code.
그림 10. 로봇이 구동 중일 때 ROS2 웹 인터페이스의 예

요약

이번 포스팅에서는 NVIDIA Isaac ROS GEM으로 로봇 배포를 가속하는 방법을 살펴봤습니다. 이 솔루션은 NVIDIA Jetson 플랫폼 기반의 간단한 오픈 소스 로봇인 나노소어의 에이프릴태그 감지에 주안점을 두고 있습니다.

더 자세한 정보를 위해 깃허브의 Isaac ROS 나노소어 통합(Isaac ROS nanosaur integration)을 다운로드하세요.