NVIDIA Isaac ROS GEM는 NVIDIA GPU 및 Jetson 플랫폼에서 실행되도록 AI 기반 로봇 애플리케이션을 최적화하는 ROS 패키지입니다.자율 로봇이 동적인 환경을 성공적으로 탐색할 수 있도록 이 패키지를 Nav2 프로젝트와 통합하는 일에 대한 관심이 높아지고 있습니다.
통합은 완전히 시뮬레이션 내에서 이루어지며, 로보틱스 기능을 시뮬레이션에서 실제 세계로(Sim2Real) 전이하기 위한 출발점으로 활용될 수 있습니다.
이 게시물에서는 실제 세계의 창고에서 로봇이 지게차 포크와 충돌하여 손상되는 문제에 집중합니다. 지게차는 무거운 물체를 멀지 않은 곳으로 옮기는 용도의 산업용 트럭입니다. 지게차에는 물체 아래로 집어넣어 물체를 들어 올리는 포크라는 부분이 있습니다.

로봇에 주로 사용되는 센서(라이다)는 지게차의 본체를 감지할 수 있지만, 지면에 가까운 포크는 감지할 수 없습니다. 그래서 포크를 감지할 수 있는 다른 센서가 필요합니다. 이 프로젝트에서는 로봇에 두 대의 RGB 카메라를 탑재하여 시뮬레이션합니다. 이 카메라의 이미지를 사용하여 Isaac ROS 스테레오 GEM으로 차이를 계산합니다.
스테레오 GEM은 차이를 통해 카메라의 시야에 들어오는 모든 물체의 환경 내 위치 정보가 포함된 포인트 클라우드를 생성합니다. 이 정보를 사용하여 충돌 가능성이 있으면 로봇의 경로를 변경하도록 탐색 노드가 업데이트됩니다.

그림 3은 프로젝트의 기본 워크플로우를 보여줍니다.

자세한 내용은 NVIDIA-AI-IOT/Nav2-with-Isaac-ROS-GEMs GitHub 리포지토리를 확인하세요.
NVIDIA Isaac Sim 설정
Carter 로봇과 지게차가 있는 NVIDIA Isaac Sim의 창고 환경을 사용합니다. ROS2 탐색 예제에 따라 선반과 같은 정적인 장애물을 피하기 위해 Nav2 스택에서 사용하는 점유율 맵을 생성합니다. 점유율 맵을 생성한 후 지게차와 트롤리 등의 동적인, 즉 움직이는 장애물을 환경에 추가합니다. 로봇이 인식하지 못하는 사이에 환경의 물체가 바뀌는 실제 세계를 모방하기 위해서입니다.
NVIDIA Isaac ROS Stereo GEM이 차이를 올바르게 생성하려면 NVIDIA Isaac Sim에서 Carter 로봇의 왼쪽과 오른쪽 스테레오 카메라 사이 오프셋을 확인하는 것이 중요합니다. 시뮬레이션을 시작하기 전에 NVIDIA Isaac Sim에서 ROS2 브리지를 활성화해야 합니다. 그래야 ROS2 메시지가 NVIDIA Isaac Sim 외부로 전달될 수 있습니다.
NVIDIA Isaac ROS 스테레오 GEM과 Nav2
Nav2 스택은 글로벌 및 로컬 코스트맵을 사용하여 장애물을 피하도록 로봇을 조종합니다. 로컬 코스트맵은 환경의 새롭거나 움직이는 장애물을 기반으로 업데이트되며, 로봇 센서의 입력으로는 레이저 스캔과 포인트 클라우드를 사용할 수 있습니다.
라이다 레이저 스캔은 실제 시나리오에서 지게차 포크를 포착하지 못하기 때문에, Nav2에 전달되는 스테레오 이미지의 포인트 클라우드를 사용하여 이 문제를 해결하면 됩니다. 포인트 클라우드는 NVIDIA Isaac ROS 스테레오 GEM을 사용하여 생성됩니다.

그림 4의 오른쪽에서 포크 아래의 하늘색 영역은 Nav2 로컬 코스트맵이 장애물을 표시하도록 업데이트된 것을 보여줍니다. 이제 로봇은 그 영역을 피할 수 있습니다. NVIDIA Isaac Sim 이미지의 평균 속도는 20FPS이며, 스테레오 GEM의 포인트 클라우드 이미지의 평균 속도는 16FPS입니다.
스테레오 GEM은 차이 이미지를 생성한 다음 로봇 카메라의 왼쪽과 오른쪽 이미지에 보이는 모든 물체의 포인트 클라우드를 생성합니다. Isaac ROS 분할 GEM을 사용하면 이러한 차이를 필터링하여 관심 물체(예: 지게차 포크)에 속한 포인트만 포함하는 포인트 클라우드를 생성할 수 있습니다.
다음 섹션에서는 이 필터링을 더 자세히 살펴보겠습니다.
NVIDIA Isaac ROS 분할 GEM으로 차이 필터링하기
다음은 합성을 통해 생성된 데이터로 훈련한 딥 러닝 모델을 NVIDIA Isaac ROS 추론 GEM과 함께 사용하는 방법입니다. 달성할 목표는 위와 같이 Nav2 스택과 GEM을 함께 사용하여 시뮬레이션에서 로봇이 지게차 포크를 피하게 하는 것입니다.
하지만 로봇 카메라의 시야에 들어오는 모든 물체의 포인트 클라우드를 생성하지 않고, 필터링을 통해 지게차 포크에만 집중된 포인트 클라우드를 생성합니다.

저는 지게차 포크 이미지로 훈련된 분할 모델을 사용했습니다. 시뮬레이션에서 NVIDIA Isaac ROS 분할 GEM은 그 모델을 사용하여 로봇에게서 RGB 이미지를 가져오고 거기 대응하는 분할 이미지를 생성합니다.
어떤 모델이든 이 파이프라인과 함께 사용하면 특정 물체를 사용 사례에 따라 필터링할 수 있습니다. 생성(Replicator Composer)하고 관심 있는 데이터로 훈련(TAO)하기만 하면 됩니다!

원본 분할 이미지의 각 픽셀은 이미지의 해당 위치에 있는 물체의 클래스 레이블을 나타냅니다. 관심 레이블을 알고 있으면, 예를 들어 2가 지게차 포크를 나타낸다면 스테레오 GEM으로 생성된 해당 차이 이미지에서 비관심 포인트를 유효하지 않음으로 설정합니다. 그 결과 생성된 포인트 클라우드에는 비관심 포인트가 포함되지 않습니다. 이러면 포인트 클라우드의 노이즈를 줄이기 좋습니다.

그림 4의 포인트 클라우드와 달리 여기에는 지게차 포크에 해당하는 포인트만 있습니다.
ROS 도메인 ID
NVIDIA Isaac ROS GEM은 컨테이너 내에서 실행되고 NVIDIA Isaac Sim은 호스트에서 실행되므로, 호스트와 컨테이너 간에 ROS 토픽이 전달될 수 있어야 합니다.
그러려면 모든 프로세스의 ROS 도메인 ID를 동일한 번호로 설정합니다. 동일한 도메인 ID를 사용하는 ROS2 노드끼리는 모두 전달할 수 있지만, 다른 도메인 ID를 사용하는 노드끼리는 전달할 수 없습니다. 자세한 내용은 The ROS_DOMAIN_ID을 참조하세요.
참고
이 프로젝트에서 설명하는 워크플로우로 피할 수 있는 장애물은 라이더와 카메라에 감지되는 것들입니다. 너무 작거나 가려진 장애물을 피하려면 다른 센서를 찾아 보세요.
이 방식은 차이 계산과 그 결과로 생성되는 포인트 클라우드의 품질에 민감합니다. 차이 계산은 까다로운 작업이므로, 포인트 클라우드에 노이즈가 많아서 Nav2가 코스트맵을 부정확하게 업데이트할 수도 있습니다.
차이 필터링은 분할 모델의 성능에 좌우됩니다. 모델이 정확한 분할 마스크를 생성하지 못하면 차이와 포인트 클라우드의 필터링 품질이 떨어집니다.
이 블로그에 열거된 SDK의 대부분의 독점 액세스, 얼리 액세스, 기술 세션, 데모, 교육 과정, 리소스는 NVIDIA 개발자 프로그램 회원은 무료로 혜택을 받으실 수 있습니다. 지금 무료로 가입하여 NVIDIA의 기술 플랫폼에서 구축하는 데 필요한 도구와 교육에 액세스하시고 여러분의 성공을 가속화 하세요.