GAZEBO와 ROS 통합

저작권: 쿼드(QUAD) 드론연구소 https://www.youtube.com/@quad-robotics

ROS와 통합하여Gazebo를 실행하기 전에 잠시 시간을 내어 서로 다른 부분이 어떻게 결합되는지 이해해 봅시다.

Gazebo를 로봇 구조와 맞추기

이전 자습서에서 우리는 변환을 브로드캐스트하고 URDF의 복사본을 토픽에 에코하는 joint_state_publisher_gui 를 이용하여조인트 상태 값을 생성했습니다. RViz를 사용하여 이 모든 것을 시각화했습니다.robot_state_publisher, robot_description

우리는 Gazebo를 소개하면서 다양한 방식으로 상호 작용할 물리적 로봇인 "실제 세계"를 나타내기를 원합니다. 예를 들어 일부 제어 입력에 따라 로봇이 이동하고 센서에서 데이터를 읽고 액추에이터에서 상태 피드백을 제공합니다. 아래 다이어그램은 이 새로운 구조를 보여줍니다. 지금은 Gazebo를 큰 "blob"으로 취급할 수 있으며 세부 사항(플러그인, 스포너 등)은 나중에 학습할 것입니다.

URDF/SDF/World 파일

지난 튜토리얼에서 로봇용 URDF 파일을 생성하고 위의 다이어그램에 표시된 대로 통합하는 방법을 배웠습니다. 그러나 Gazebo는 기본적으로 URDF 파일을 사용하지 않고 대신 SDF라는 다른(그러나 유사한) 형식을 사용합니다. URDF는 로봇만 설명하지만 SDF는 로봇, 세계 또는 세계의 모든 모델을 설명할 수 있습니다.

좋은 소식은 시뮬레이션을 위해 로봇에 대해 SDF와 URDF 파일을 변환 작성할 필요가 없다는 것입니다. Gazebo에는 자동으로 URDF를 SDF로 변환하는 기능이 있습니다( 이를 실험하기 위해 gz sdf -p명령을 사용할 수 있음 ). 이 변환은 자동이지만 결과 파일에는 일반적으로 Gazebo가 제대로 실행되는 데 필요한 모든 것이 포함되어 있지 않습니다. 이 튜토리얼의 나머지 부분에서는 URDF 파일이 Gazebo와 올바르게 작동하는지 확인하기 위해 URDF 파일을 추가하거나 체크인해야 하는 몇 가지 사항을 다룰 것이며 여기에서 공식 튜토리얼을 확인할 수도 있습니다 .

로봇 외에도 SDF 파일은 여전히 ​​유용합니다. 이를 사용하여 모델(큐브, 자동차, 집, 로봇 등 스폰될 수 있는 모든 개체) 또는 세계(모델 모음을 포함하는 환경)를 정의할 수 있습니다. 테스트를 위해 로봇을 다양한 모델 및 환경과 혼합하고 일치시킬 수 있기 때문에 이것은 가상환경을 만들기에 훌륭니다.

Gazebo 태그

Gazebo 고유의 URDF에 추가 정보를 추가하기 위해 gazebo태그를 추가할 수 있습니다. Gazebo는 이러한 태그의 내용을 사용하여 SDF 파일을 생성하지만 URDF를 읽는 다른 것들은 무시할 수 있습니다. 이러한 가제보 태그는 <gazebo reference="some_name">구문을 사용하여 이름(예: a robot,link 또는 joint) 으로 URDF 의 구성 요소를 참조하거나 구성 요소에 연결되지 않았지만 방금 사용하는 <gazebo>와 관련이 있는 항목을 참조할 수 있습니다.

플러그인(Plugin)

Gazebo는 ROS(또는 해당 문제에 대한 다른 외부 소프트웨어)와 상호 작용해야 할 때마다 플러그인을 사용해야 합니다 . 이들은 우리가 설치할 수 있는 추가 코드 라이브러리이며 Gazebo가 필요에 따라 실행할 URDF에서 참조할 수 있습니다.

ROS 주제를 사용하여 Gazebo 로봇을 제어하고 싶습니까? 플러그인을 사용하십시오.

Gazebo 공동 상태가 토픽에 게시되기를 원하십니까? 시뮬레이션된 센서의 데이터에 액세스하고 싶습니까? 모두끝 Gazebo 플러그인을에사용할 수있있으며, 예제 코드에는 이러한 플러그인의 많은 예제가 있습니다.

시뮬레이션 타임

알아야 할 한 가지 요령은 ROS가 시뮬레이션할 때 시간을 약간 다르게 취급하고 모든 노드에 /use_sim_time 매개변수를 true로 설정 해야 한다는 것입니다. 일부 노드(예 robot_state_publisher: )가 없어도 작동하는 것처럼 보일 수 있지만 동작에 미묘한 차이가 있을 수 있으므로 설정하는 것이 가장 좋습니다. 다음은 개념에 대한 자세한설명입니다(ROS 1, 하지만 아이디어는 동일함). 기본적으로 Gazebo는 시뮬레이션을 더 빠르게 또는 더 느리게 실행하고 사물이 동기화되도록 "제어 시간"을 원합니다. ROS의 시간은 일반적으로 "Unix 시간"(1970년 1월 1일 이후 초)으로 측정되지만 시뮬레이션 중에는 시뮬레이션 시작 이후 초 단위로 측정됩니다.

ROS 1에서는 /use_sim_time 을전역적으로 설정하는 것으로 충분했지만 ROS 2에서는 노드별로 설정해야 합니다. launch 파일을 사용하면 한 곳(실행 시)에서 켜고 끌 수 있고 모든 노드에 적절하게 인수를 전달할 수 있으므로 이를 크게 지원할 수 있습니다.

추가 참고 사항

Gazebo로 작업하고 시뮬레이션을 위해 URDF 파일을 준비할 때 기억하면 좋은 몇 가지 다른 사항이 있습니다.

  • 이름 - 지난 튜토리얼에서 간단히 다루었지만 간단하게 하기 위해 모든 관절과 링크가 (고유한) 이름을 가지고 있는지 확인하면 되고 Gazebo는 그것에 문제가 없어야 합니다.

  • 링크 병합 - Gazebo는 fixed조인트로 연결된 모든 URDF 링크를 가져와 단일 SDF 링크로 결합합니다. 이는 문제가 되지 않지만 때때로 혼란스러울 수 있습니다.

  • 관성 속성 - Gazebo는 모든 링크에 연결된 inertial태그가 있어야 합니다. 이것은 고정 조인 링크 를 결합하기 때문에 URDF의 모든 링크가 관성 태그를 가질 필요는 없으며 모든 고정 조인 링크 그룹에서 관성 태그를 갖기 위해 적어도 하나가 필요하다는 것을 의미합니다 (여러 개가 있는 경우 Gazebo에 의해 병합됩니다).

  • 세계 링크 - 로봇이 지면에 고정되어 있는 경우 첫 번째 world링크를 호출해야 하며 Gazebo는 나머지 물리학에 관계없이 해당 링크를 고정된 상태로 유지해야 한다는 것을 알게 됩니다. 움직이는로봇의 경우 첫 번째 링크를 world라고 해서는 안 됩니다.

  • 재료/색상 - 아래에서 자세히 살펴보겠지만 기술적인 이유로 Gazebo는 URDF에 지정된 재료를 사용할 수 없습니다. 대신 링크에 대한 gazebo태그를 추가하고 거기에 적절한 자료를 지정해야 합니다.

Last updated